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

这样,我将解析代表UML的生成的XML文件,并提取所有类和关联。到目前为止,一切都很好。

但是还有一些约束,我需要了解,并在用户违反约束时发出警告。但是,我不知道如何进行OCL解析。我研究了dresden OCL
但是我不确定这是否是我想要的,因为我需要在运行时解析OCL,而不是导入模型并使用eclipse从OCL生成Java代码。

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

最好的祝福,
若昂·费尔南德斯

最佳答案

Eclipse OCL project提供了独立的用法(只是Eclipse之外的Java程序),还有一些documentation and examples关于如何使用它。

具体来说,请参见以下有关以下链接:

  • 如何以编程方式创建和评估OCL constraints and queries in java
  • 如何在standalone mode中使用Eclipse OCL
  • 如何download OCL。在该Wiki中,您还有其他一些有用的信息,而这些信息不在Eclipse帮助中。

  • 从帮助中获取的一些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);
       }
    }
    

    10-01 00:08