【问题标题】:How to validate an Object Diagram (aka "Instance Diagram") against a Meta Model?如何针对元模型验证对象图(又名“实例图”)?
【发布时间】:2012-04-12 14:33:37
【问题描述】:

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

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

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

我只是需要一些指导,建议了解我必须做什么。

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

【问题讨论】:

    标签: uml eclipse-emf metamodel object-diagram


    【解决方案1】:

    您的问题可以从两个层面回答:概念和实施。我不确定您要寻求哪方面的帮助,因此我将尝试涵盖两者。如果其中任何一个是多余的,请道歉(希望两者都不是!)。

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

    概念层面

    我所说的“概念”是指回答“根据元模型验证模型意味着什么”这个问题?

    答案很简单。元模型是一个模式或一组规则,用于定义构成有效模型的内容。 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 的六个实例(每个属性一个)
    • EReference 用于 Class.owner,EReferences 用于 Person.dogs 的集合

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

    对不起,如果有点长。如果需要,有一篇很好的文章 here 会更详细地介绍示例。

    编辑

    对修正问题的补充:

    主题是根据他的元模型验证一个实例 使用 Magic Draw 创建。

    好的。我对 MagicDraw 的导出功能了解不多,但如果它可以导出 ecore,那应该是一个不错的起点:

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

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

    hth.

    【讨论】:

    • 感谢您的宝贵时间和这篇精彩的帖子,它回答了我的主要问题,但有些地方我不清楚。我不必使用 xml,也不必使用 Eclipse GUI 工具来设计我的模型,而且我必须使用 EMF。我编辑了我的问题以获得更详细的信息,你能看到吗?再次感谢您的时间和帮助
    【解决方案2】:

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

    如果您的模型是由另一个应用程序创建的,并且您想根据单独创建的元模型对其进行验证,首先您可以尝试使用 EMF 从您的元模型生成的编辑器打开您的模型。如果它不合规,您将遇到一些错误,这对于第一次尝试可能就足够了。 如果我没记错的话,这也是一个默认验证器,您可以通过右键单击生成的编辑器并选择“验证”来运行它。

    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 我从来没有使用过它,所以我无法帮助你。对不起。

    希望对你有帮助。

    查尔斯

    【讨论】:

    • 我还没有使用ECore定义元模型,我使用了图形工具Magic Draw,但是他可以将模型导出到ecore文件或XMI,所以重点是拿那些文件(一个用于为实例建模另一个)并使用 EMF 验证它们。那可能吗?一种自动解析和验证。
    猜你喜欢
    • 2021-07-15
    • 2015-12-29
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多