4

我正在为一门课程编写一个 Java 程序,该程序将作为元模型的 UML 类图作为输入,并允许用户创建元模型中指定类型的图。然后,用户应该能够对该图表建模的实例进行建模。

因此,我正在解析生成的表示 UML 的 XML 文件并提取所有类和关联。到目前为止,一切都很好。

但是当用户违反它们时,我需要了解并警告一些约束。但是,我不知道如何进行 OCL 解析。我已经研究过德累斯顿的 OCL ,但我不确定这是否是我想要的,因为我需要在运行时解析 OCL,而不是使用 eclipse 导入模型并从 OCL 生成 java 代码。

因此,如果有人能指出一种解析 OCL 并提取其基本语法的方法,我将不胜感激。

最好的问候,若昂·费尔南德斯

4

2 回答 2

5

Eclipse OCL 项目提供独立使用(只是 Eclipse 中的一个 java 程序),并且有一些关于如何做到这一点的文档和示例。

具体见以下链接:

一些 Jave 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 回答
2

看一下 Eclipse OCL 组件(它提供了一个验证器功能,用于评估模型/实例是否满足元模型/模型的良构规则)和 USE 工具(专门创建的目的是让人们玩和通过让他们在实例集上评估 OCL 表达式以查看表达式的效果来学习 OCL)。两者都是开源的。

于 2013-11-02T07:21:05.950 回答