3

日食検証フレームワークがどのように機能するかを理解する方法:

  • ファクトリでオブジェクトを生成する
  • このオブジェクトの属性に値を設定します
  • 検証を確認する

例えば:

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;
  }
}

ただし、属性のセッターを呼び出すに、モデルの値が有効かどうかを確認したいと思います。これはEclipseEMF検証フレームワークで可能ですか?誰かが例を挙げてもらえますか?

4

1 に答える 1

3

これが可能な一般的な使用例を 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());
于 2012-07-25T21:41:22.477 に答える