用Java解析OCL?

用Java解析OCL?,java,parsing,uml,metamodel,ocl,Java,Parsing,Uml,Metamodel,Ocl,我正在为一门课程编写一个Java程序,该课程将UML类图(一个元模型)作为输入,并允许用户创建元模型中指定类型的图。然后,用户应该能够对该图所建模的对象的实例进行建模 因此,我正在解析生成的表示UML的XML文件,并提取所有类和关联。到目前为止,一切顺利 但是,还有一些约束,我需要了解这些约束,并在用户违反这些约束时发出警告。但是,我不知道如何进行OCL解析。我已经调查过了 但我不确定这是否是我想要的,因为我需要在运行时解析OCL,而不是使用eclipse导入模型并从OCL生成java代码 因此

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

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

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

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

致以最良好的祝愿,
João Fernandes

看一下Eclipse OCL组件(它提供了一个验证器功能,用于评估模型/实例是否满足元模型/模型的良好格式规则)和使用工具(创建OCL的目的是让人们通过在一组实例上评估OCL表达式来了解表达式的效果,从而使用OCL进行游戏和学习)。两者都是开源的。

提供了独立的用法(只是Eclipse中的一个java程序),并介绍了如何使用

具体而言,请参见以下有关的链接:

  • 如何以编程方式创建和评估
  • 如何在中使用Eclipse 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);
   }
}
OCL-OCL=OCL.newInstance(新数据透视环境工厂());
OCLHelper=ocl.createOCLHelper(EXTLibraryPackage.Literals.LIBRARY);
ExpressionInOCL invariant=helper.createInvariant(
“书籍->全部(b1,b2 | b1 b2意味着b1.title b2.title)”;
expressionIOCL query=helper.createQuery(
“图书->收藏(b:Book | b.category)->资产()”;
//创建查询以计算查询表达式
queryqueryeval=ocl.createQuery(查询);
//创建另一个以检查约束
Query constraintEval=ocl.createQuery(不变量);
List libraries=getLibraries();//假定的库源
//仅打印有效库的图书类别集
对于(库下一步:库){
如果(约束值检查(下一步)){
//已设置查询表达式的OCL结果类型(BookCategory)
@抑制警告(“未选中”)
集合类别=(集合)queryEval.evaluate(下一步);
System.out.printf(“%s:%s%n”,next.getName(),categories);
}
}

非常感谢您的广泛响应,我想我现在可以自己处理:)最好直接发布链接,例如,万一goo.gl有一天停止服务。