Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xtext验证在多个插件上拆分_Java_Validation_Dependency Injection_Eclipse Plugin_Xtext - Fatal编程技术网

Java Xtext验证在多个插件上拆分

Java Xtext验证在多个插件上拆分,java,validation,dependency-injection,eclipse-plugin,xtext,Java,Validation,Dependency Injection,Eclipse Plugin,Xtext,我希望根据加载的插件有不同的验证活动 mylang.database插件应该提供如下警告 mylangElement { id = "helloWorld" //Warning id should start with an upper case } 而mylang.server插件应该像 mylangElement { id = "helloWorld" //Warning id must not exceed 8 letters

我希望根据加载的插件有不同的验证活动

mylang.database
插件应该提供如下警告

    mylangElement {
       id = "helloWorld"  //Warning id should start with an upper case
    }
mylang.server
插件应该像

    mylangElement {
       id = "helloWorld"  //Warning id must not exceed 8 letters
    }
(如果两个插件都存在,则可能两者都有)

推荐的方法是什么

  • 如果插件存在,root
    mylang
    validator会改变行为(yikes)
  • 使用基本的eclipse验证扩展点(慢?)
  • 编写API,以便插件可以向根
    mylang
    validator注册额外的验证
  • 有一种方法是由
    xtext
    提供的,带有整洁的
    @Check
    注释

是否考虑简单地挂入XTeX已经使用的验证机制中。我假设你所说的“加载”是指包含验证器的插件被激活(因此插件被激活)

然后您可以执行类似的操作(在activator start中)

使用myvalidator

public class MyValidator extends AbstractDeclarativeValidator {

    public static final String INVALID_NAME = "invalidName";

    @Override
    protected List<EPackage> getEPackages() {
        return Collections.singletonList(MyDslPackage.eINSTANCE);
    }

    @Check
    public void checkGreeting(Greeting g) {
        if (!Character.isUpperCase(g.getName().charAt(0))) {
            warning("Name should start with a capital", MyDslPackage.Literals.GREETING__NAME, INVALID_NAME);
        }
    }

}
公共类MyValidator扩展了AbstractDeclarativeValidator{
公共静态最终字符串无效\u NAME=“invalidName”;
@凌驾
受保护的列表getEPackages(){
返回集合.singletonList(MyDslPackage.eINSTANCE);
}
@检查
公共空支票问候语(问候语g){
if(!Character.isUpperCase(g.getName().charAt(0))){
警告(“名称应以大写字母开头”,MyDslPackage.Literals.GREETING\u Name,无效的\u Name);
}
}
}
或者,您可以创建如下所示的类

public class MyValidator extends AbstractDeclarativeValidator {

    public static final String INVALID_NAME = "invalidName";

    @Override
    protected List<EPackage> getEPackages() {
        return Collections.singletonList(MyDslPackage.eINSTANCE);
    }

    @Check(CheckType.FAST)
    public void checkFast(EObject g) {
        // TODO
    }
    @Check(CheckType.NORMAL)
    public void checkNormal(EObject g) {
        // TODO
    }
    @Check(CheckType.EXPENSIVE)
    public void checkExpensive(EObject g) {
        // TODO
    }

}
公共类MyValidator扩展了AbstractDeclarativeValidator{
公共静态最终字符串无效\u NAME=“invalidName”;
@凌驾
受保护的列表getEPackages(){
返回集合.singletonList(MyDslPackage.eINSTANCE);
}
@检查(CheckType.FAST)
公共无效检查快速(EObject g){
//待办事项
}
@检查(检查类型。正常)
公共无效检查正常(EOObject g){
//待办事项
}
@支票(支票类型。昂贵)
公共无效检查(EOObject g){
//待办事项
}
}
在MyDslRuntime或类似的首选uimodule中绑定它

class MyDslUiModule extends AbstractMyDslUiModule {

    @SingletonBinding(eager=true) def Class<? extends MyValidator> bindMyValidator() {
        return MyValidator
    }
}
类MyDslUiModule扩展了AbstractMyDslUiModule{
@SingletonBinding(eager=true)def类
class MyDslUiModule extends AbstractMyDslUiModule {

    @SingletonBinding(eager=true) def Class<? extends MyValidator> bindMyValidator() {
        return MyValidator
    }
}