如何针对元模型验证对象图(又名“实例图”)?

时间:2012-04-12 14:33:38

标签: uml eclipse-emf metamodel object-diagram

我必须开发一个API,将一个元模型(类图)和他的实例(对象图)作为输入,但我不知道如何以编程方式进行。

我做了一些研究,我发现我可以使用EMF API,但我不知道如何做以及如何在验证之前插入我的图表。

我是初学者,在互联网上出现的所有文件中丢失,如果我的主题不清楚,请原谅我

我只需要一些指导,建议理解我必须做的事情。

修改: 主题是针对使用Magic Draw创建的元模型验证实例。所以我必须导出文件(ecore?XMI?我不知道谁是最好的)然后创建一个解析这两个文件的Java API(我需要弄清楚如何注入/导入它们)并返回一个布尔值关于验证。这是第一步,之后我想我会添加OCL约束来验证实例,但是现在我需要专注于简单的验证。如果需要,我如何使用EMF或其他工具

2 个答案:

答案 0 :(得分:4)

您的问题可以在两个层面回答:概念和实施。我不确定你在寻找哪些帮助,所以我会尽力覆盖两者。道歉,如果其中任何一个是多余的(希望不是两个!)。

首先:对于您给出的示例,将类图称为“模型”并将对象图作为该模型的实例引用更为正常。严格来说,“元模型”用于描述模型,而模型又具有实例。我会坚持你的术语,但可能值得注意。

概念级别

通过'概念',我的意思是回答“根据元模型验证模型意味着什么”这个问题?

答案很简单。元模型是一种模式或一组规则,用于定义构成有效模型的内容。 xml提供了一个很好的例子。 xml模式定义了某些主题的结构和规则:允许哪些类型,它们可以具有哪些属性,属性是否可以具有多个值,属性可以包含的可能值集。等等。如果 - 并且仅当 - 它不违反模式中定义的任何规则时,xml文档符合模式。

推广到模型:如果 - 并且仅当 - 它不违反元模型中定义的任何规则时,模型符合其元模型。

实施水平

您没有详细说明'API'将用于什么。可能最简单的解决方案就是使用xml:元模型只是xml模式,模型是符合这些模式的xml文档。然后,您的“实现”将涉及选择许多验证xml解析器库中的一个并从客户端代码中调用它。

但是你提到EMF所以也许你需要使用它。为简化起见,假设我们要按如下方式定义元模型:

Class Dog {
  name: String
  gender: String
  owner: Person
}

Class Person {
  name: String
  address: Address
  dogs: Set<Dog>
}

EMF提供了一个API - eCore API - 用于定义此类内容。可以把它想象成java的反射API。您可以通过创建eCore API的实例(以编程方式或通过其中一个编辑器)来定义元模型。所以你要创建:

  • EClass的两个实例(一个用于人,一个用于狗)
  • EAttribute的六个实例(每个属性一个)
  • Class.owner的EReference和Person.dogs的EReferences集合

等等。 eCore API还提供了使用API​​创建模型实例的功能。 (如果需要,它还将自动生成一个编辑器,以便在eclipse GUI中创建实例)。您还可以使用各种具体语法读取模型的实例。如果您正在阅读的模型不符合元模型,则EMF将引发异常。

对不起,如果那有点长。有一篇好文章here,如果需要,可以更详细地介绍一个例子。

修改

回应修正后的问题:

  

主题是针对他的元模型验证实例   用Magic Draw创建。

行。我对MagicDraw的导出功能了解不多,但是如果能够导出ecore,那么这应该是一个很好的起点:

  • 将类图('metamodel')导出为ecore并加载到EMF中以创建模型。这应该非常简单。
  • 同样将对象图导出为ecore和load,让EMF在加载时验证。如果您需要添加进一步的验证,@ Charles的帖子提供了一个到EMF验证框架的良好链接。

如果你有很多工作要做,可能值得投资EMF book。它不是最容易获得的,但它确实提供了对EMF的各种元素的适当覆盖。

第h

答案 1 :(得分:2)

如果您使用ECore定义了元模型,EMF将生成用于创建定义的EClass的实例(模型)的Java API。因此,根据定义,您的模型将符合其元模型。

如果您的模型是由另一个应用程序创建的,并且您希望针对单独创建的元模型对其进行验证,那么首先您可以尝试使用EMF从您的元模型生成的编辑器打开您的模型。如果它不符合要求,您将有somme错误,这可能足以让您第一次尝试。 如果我记得很清楚,thare也是一个默认验证器,您可以通过右键单击生成的编辑器并选择“验证”来运行。

EMF提供了另一种解决方案:EMF验证框架。该框架允许您定义将针对您的实例进行验证的约束。

public class MyConstraint extends AbstractModelConstraint{
   @Override
   public IStatus validate(IValidationContext ctx) {
      try{
         //Get the object that will be validated
         Object obj = ctx.getTarget();
         //Here you can run you validation
         //Create Validation Status
         return validationStatus
      } catch (Exception e) {
         return ctx.createFailureStatus(e);
      }
   }
}

有关详细信息,请参阅本教程:http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.emf.validation.doc%2Ftutorials%2FvalidationTutorial.html

我非常确定您可以在元模型上定义OCL约束,但这是另一个项目的一部分。看看这个:http://www.eclipse.org/modeling/mdt/?project=ocl#ocl 我从来没用过它所以我无法帮助你。遗憾。

我希望它有所帮助。

查尔斯