【问题标题】:Is it possible to validate a value before it is set with Eclipse EMF validation framework?是否可以在使用 Eclipse EMF 验证框架设置值之前对其进行验证?
【发布时间】:2016-10-21 17:07:07
【问题描述】:

我理解 eclipse 验证框架如何工作的方式:

  • 使用工厂生成对象
  • 为此对象中的属性设置值
  • 检查验证

例如:

public class ValidateNameTest {
public static void main(String[] args) {

    ExtlibraryPackageImpl.init();
    ExtlibraryFactory factory = ExtlibraryFactory.eINSTANCE;
    Writer writer = factory.createWriter();
    // comment next line for false result in console
    writer.setName("test");
    writer.setFirstName("test");
    writer.setLastName("test");

    boolean isNull = (writer.getName() == null) ? true : false;
    System.out.println("writer name is null : " + isNull);

    boolean result = validateObject(writer);
    System.err.println("result = " + result);

    boolean result2 = validateObject2(writer);
    System.err.println("result2 = " + result2);

    boolean result3 = validateObject3(writer);
    System.err.println("result3 = " + result3);

    boolean result4 = validateObject5(writer);
    System.out.println("result4 = " + result4);
}

public static boolean validateObject(Writer writer) {
    ExtlibraryValidator validator = ExtlibraryValidator.INSTANCE;
    if (!validator.validateWriter_hasValidName(writer, null, null)) {
        return false;
    }
    return true;
}

public static boolean validateObject2(EObject eObject) {
    EValidator validator = EValidator.Registry.INSTANCE
            .getEValidator(eObject.eClass().getEPackage());
    if (validator != null) {
        if (!validator.validate(eObject, null, null)) {
            return false;
        }
    }
    return true;
}

public static boolean validateObject3(EObject eObject) {
    Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject);
    return diagnostic.getSeverity() == Diagnostic.OK;
}

public static boolean validateObject5(EObject eObject)
  {
    Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject);

    if (diagnostic.getSeverity() == Diagnostic.ERROR || diagnostic.getSeverity() == Diagnostic.WARNING)
    {
      System.err.println(diagnostic.getMessage());
      for (Diagnostic childDiagnostic : diagnostic.getChildren())
      {
        switch (childDiagnostic.getSeverity())
        {
          case Diagnostic.ERROR:
          case Diagnostic.WARNING:
            System.err.println("\t" + childDiagnostic.getMessage());
        }
      }
      return false;
    }
    return true;
  }
}

但我想检查一个值是否对模型有效我调用属性的设置器之前。 Eclipse EMF 验证框架可以做到这一点吗?有人可以举个例子吗?

【问题讨论】:

    标签: eclipse-emf


    【解决方案1】:

    我知道一种常见的使用案例:模型和 UI 控件之间的数据绑定。

    当您在模型和用户界面之间建立 EMF 数据绑定时,您可以验证用户输入,如下所示。创建更新策略(目标到模型)并覆盖方法 validateBeforeSet(Object)。这是一个例子:

        EMFDataBindingContext ctx = new EMFDataBindingContext();
        ISWTObservableValue notesObservableValue = prop.observe(swtTextViewer);
        IEMFValueProperty notesValueProperty = EMFProperties.value(ModelPackage.Literals.THING__NOTES);
        UpdateValueStrategy targetToModel = new UpdateValueStrategy() {
    
            @Override
            public IStatus validateBeforeSet(Object value) {
                if ("".equals(value)) {
                    MessageDialog.openError(Display.getCurrent()
                            .getActiveShell(), "Error",
                            "You should supply a description");
                    return ValidationStatus
                            .error("You should supply a description");
                }
                return super.validateBeforeSet(value);
            }
    
        };
    
        ctx.bindValue(notesObservableValue,
                notesValueProperty.observe(thing), targetToModel,
                new UpdateValueStrategy());
    

    【讨论】:

    • 正是我想要的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2013-12-07
    • 2017-02-20
    相关资源
    最近更新 更多