4

メタモデルである UML クラス図を入力として取り、ユーザーがメタモデルで指定されたタイプの図を作成できるようにするコース用の Java プログラムを作成しています。ユーザーは、このダイアグラムがモデル化したもののインスタンスをモデル化できるはずです。

そのため、UML を表す生成された XML ファイルを解析し、すべてのクラスと関連付けを抽出しています。ここまでは順調ですね。

ただし、ユーザーが違反した場合に知って警告する必要がある制約があります。ただし、OCL 解析の方法がわかりません。ドレスデンOCLを調べまし たが、モデルをインポートしてEclipseを使用してOCLからJavaコードを生成するのではなく、実行時にOCLを解析する必要があるため、これが必要かどうかはわかりません。

そのため、誰かが OCL を解析してその基本的な構文を抽出する方法を教えていただければ幸いです。

よろしく、 ジョアン・フェルナンデス

4

2 に答える 2

5

Eclipse OCL プロジェクトはスタンドアロンでの使用 (Eclipse からの単なる Java プログラム) を提供し、その方法に関するドキュメントと例がいくつかあります。

具体的には、次のリンクを参照してください。

不変条件とクエリを作成して評価する方法を明らかにするために、ヘルプから抜粋した Java API の使用例をいくつか示します。

OCL ocl = OCL.newInstance(new PivotEnvironmentFactory());
OCLHelper helper = ocl.createOCLHelper(EXTLibraryPackage.Literals.LIBRARY);
ExpressionInOCL invariant = helper.createInvariant(
    "books->forAll(b1, b2 | b1 <> b2 implies b1.title <> b2.title)");
ExpressionInOCL query = helper.createQuery(
    "books->collect(b : Book | b.category)->asSet()");

// create a Query to evaluate our query expression
Query queryEval = ocl.createQuery(query);
// create another to check our constraint
Query constraintEval = ocl.createQuery(invariant);

List<Library> libraries = getLibraries();  // hypothetical source of libraries
// only print the set of book categories for valid libraries
for (Library next : libraries) {
   if (constraintEval.check(next)) {
      // the OCL result type of our query expression is Set(BookCategory)
      @SuppressWarnings("unchecked")
      Set<BookCategory> categories = (Set<BookCategory>) queryEval.evaluate(next);

      System.out.printf("%s: %s%n", next.getName(), categories);
   }
}
于 2013-11-03T18:49:21.317 に答える