我必须开发一个 API,将元模型(类图)和他的实例(对象图)作为输入,但我不知道如何以编程方式做到这一点。
我做了一些研究,我发现我可以玩EMF API,但我不确定如何做到这一点以及如何在验证之前插入我的图表。
我是初学者,迷失在互联网上存在的所有文档之间,所以如果我的主题不清楚,请原谅我
我只需要一些方向,建议了解我必须做什么。
编辑:主题是针对使用Magic Draw创建的元模型验证实例。所以我必须导出文件(生态?XMI?我不知道谁是最好的)然后创建一个解析这两个文件的 Java API(我还需要弄清楚如何注入/导入它们)并返回有关验证的布尔值。这是第一步,之后我想我会添加 OCL 约束来验证实例,但现在我需要专注于简单的验证。如果需要,我如何使用EMF或其他工具做到这一点
您的问题可以在两个层面上得到回答:概念和实施。 我不确定您正在寻求哪个帮助,所以我将尝试涵盖两者。 如果其中一个是多余的,请道歉(希望不是两个!
首先:对于您给出的示例,将类图称为"模型"并将对象图称为该模型的实例会更正常。 严格来说,"元模型"用于描述反过来具有实例的模型。 我将坚持使用下面的术语,但可能值得注意。
概念级别
通过"概念",我的意思是回答"根据元模型验证模型意味着什么"的问题?
答案很简单。 元模型是一个模式或一组规则,用于定义构成有效模型的内容。 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 将引发异常。
对不起,如果这有点长。 这里有一篇很好的文章,如果需要,可以更详细地介绍一个示例。
编辑
对修正问题的补充:
主题是针对他的元模型验证一个实例,该实例是 用魔术绘制创建。
还行。 我对MagicDraw的导出功能了解不多,但如果它可以导出ecore,那么这应该是一个很好的起点:
- 将类图("元模型")导出为核心并加载到 EMF 中以创建模型。 这应该很简单。 同样,将
- 对象图导出为ecore和加载,让EMF在加载时进行验证。 如果您需要添加进一步的验证,@Charles的帖子提供了指向EMF验证框架的良好链接。
如果你有很多工作要做,那么可能值得投资EMF这本书。 它不是最容易访问的,但它确实提供了对 EMF 各种元素的体面覆盖。
呵呵。
如果您使用 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我从来没有用过它,所以我不能帮你。不好意思。
我希望它有所帮助。
查尔斯