我有特殊的.xml文件,我需要通过自己的eclipse编辑器打开。所以我添加了一个自定义内容类型并与我的编辑器绑定。
这是我的Describer类。
public class TEPFileContentDescriber implements IContentDescriber {
@Override
public int describe(InputStream contents, IContentDescription description)
throws IOException {
try{
XmlUtil.parseSuite(contents);
System.out.println("VALID");
return IContentDescriber.VALID;
}
catch(Exception e){
System.out.println("INVALID");
return IContentDescriber.INVALID;
}
}
@Override
public QualifiedName[] getSupportedOptions() {
// TODO Auto-generated method stub
return null;
}
}
在控制台中我可以看到触发了正确的状态,但Project Explorer仍然将所有xml文件视为我的类型,因此编辑器在尝试打开时会抱怨其他文件。
1)我需要覆盖其他任何方法吗?
2)我是否也可以使用单独的文件图标,仅适用于我的内容类型?
答案 0 :(得分:3)
如果XML对您的应用程序实际上是正确的,则describe
方法只能返回VALID
。
因此,如果您的应用的XML不正确,则代码XmlUtil.parseSuite
必须抛出异常。因此,例如,如果您的描述符被赋予Ant构建脚本XML,则必须拒绝它。
如果输入看起来像XML但不适合您的应用,则还应返回INDETERMINATE
。
您可以延长XMLContentDescriber
为您完成一些工作。
例如,这是Ant插件内容描述符:
public final class AntBuildfileContentDescriber extends XMLContentDescriber {
private int checkCriteria(InputSource contents) throws IOException {
AntHandler antHandler = new AntHandler();
try {
if (!antHandler.parseContents(contents)) {
return INDETERMINATE;
}
}
catch (SAXException e) {
// we may be handed any kind of contents... it is normal we fail to parse
return INDETERMINATE;
}
catch (ParserConfigurationException e) {
// some bad thing happened - force this describer to be disabled
String message = "Internal Error: XML parser configuration error during content description for Ant buildfiles"; //$NON-NLS-1$
throw new RuntimeException(message);
}
// Check to see if we matched our criteria.
if (antHandler.hasRootProjectElement()) {
if (antHandler.hasProjectDefaultAttribute() || antHandler.hasTargetElement() || antHandler.hasAntElement()) {
// project and default attribute or project and target element(s)
// or project and top level ant element(s) (classpath, import, macrodef, path, property, taskdef, typedef)
return VALID;
}
// only a top level project element...maybe an Ant buildfile
return INDETERMINATE;
}
return INDETERMINATE;
}
@Override
public int describe(InputStream contents, IContentDescription description) throws IOException {
// call the basic XML describer to do basic recognition
if (super.describe(contents, description) == INVALID) {
return INVALID;
}
// super.describe will have consumed some chars, need to rewind
contents.reset();
// Check to see if we matched our criteria.
return checkCriteria(new InputSource(contents));
}
public int describe(Reader contents, IContentDescription description) throws IOException {
// call the basic XML describer to do basic recognition
if (super.describe(contents, description) == INVALID) {
return INVALID;
}
// super.describe will have consumed some chars, need to rewind
contents.reset();
// Check to see if we matched our criteria.
return checkCriteria(new InputSource(contents));
}
}
您可以将此作为基础并更改checkCriteria
来进行检查。
答案 1 :(得分:0)