无法在Acceleo中访问SysML构造型及其属性

时间:2016-01-29 20:43:09

标签: acceleo sysml

我正在Acceleo(在Eclipse中)开发M2T生成器。该模型基本上是一个UML模型,在Papyrus中创建了SysML配置文件。它包括Blocks和FlowPorts。我必须访问这些构造型,但似乎我无法检索任何SysML对象,即使它们出现在列表中(代码建议)。实际上我必须访问与Port关联的FlowPort的'Direction'属性。我已经尝试过各种论坛的建议和答案(包括https://www.eclipse.org/forums/index.php/t/452587/)但是徒劳无功。

代码如下。我按照https://www.eclipse.org/forums/index.php?t=msg&th=1060450&goto=1693765&的建议创建了java服务,但是port.hasStereotype('FlowPort')总是返回false。我也试过'SysML :: PortAndFlows :: FlowPort'而不是'FlowPort'。我在Eclipse Mars上使用Acceleo 3.6.2。

...
[template public generateElement(model : Model)]
[comment @main/]

[file ('created.txt', false, 'UTF-8')]
[for(port: Port | model.eAllContents(Port))]
    [if(port.hasStereotype('FlowPort'))]
        OK
    [else]
        NOT OK
    [/if]
[/for]
[/file]
[/template]

我在创建模块时在模块中包含以下元模型:

http://www.eclipse.org/uml2/5.0.0/UML
http://www.eclipse.org/papyrus/0.7.0/SysML
http://www.eclipse.org/papyrus/0.7.0/SysML/Blocks
http://www.eclipse.org/papyrus/0.7.0/SysML/Constraints
http://www.eclipse.org/papyrus/0.7.0/SysML/PortAndFlows
http://www.eclipse.org/emf/2002/Ecore

另外,我按照上面提到的链接建议注册所需的包,包括在Generate.java的registerPackages()中。

    // UML2 profiles
    URI uri = URI.createURI("platform:/plugin/org.eclipse.uml2.uml.resources");
    uriMap.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP), uri.appendSegment("libraries").appendSegment(""));
    uriMap.put(URI.createURI(UMLResource.METAMODELS_PATHMAP), uri.appendSegment("metamodels").appendSegment(""));
    uriMap.put(URI.createURI(UMLResource.PROFILES_PATHMAP), uri.appendSegment("profiles").appendSegment(""));  

    // SysML profiles
    uri = URI.createURI("platform:/plugin/org.eclipse.papyrus.sysml");
    uriMap.put(URI.createURI(SysmlResource.LIBRARIES_PATHMAP), uri.appendSegment("librairies").appendSegment(""));
    uriMap.put(URI.createURI("pathmap://SysML_PROFILES/"), uri.appendSegment("SysML.profile.uml").appendSegment("")); 
    uriMap.put(URI.createURI("pathmap://SysML_PROFILES/"), uri.appendSegment("model").appendSegment(""));

感谢任何形式的帮助。

1 个答案:

答案 0 :(得分:0)

我有一个相同的问题,但是使用UML / MARTE而不是SysML。

我敢打赌port.getAppliedStereotypes()总是返回空列表,无论如何(即使当然,端口原型)。我也尝试了你所做的一切,但没有成功,包括仔细检查@generated NOT方法的javadoc中是否有registerPackages(每次重新生成它)。

我解决了这个问题。我假设你(像我一样)使用Papyrus生成的model.uml文件进行转换。这可能实际上是问题的原因,即使我没有看到替代方案。如果您使用文本编辑器打开该文件,则会发现<FlowPort>标记位于<uml:Model>标记之外。这意味着,由于我仍然无法理解的原因,stereotype()方法无法&#34;看到&#34;构造型并始终返回null或空列表。这可能是因为它们无法将原型base_NamedElementxmi:id标记内的<uml:Model>匹配。

另一方面,如果您定义一个模板,该模板将FlowPort(而不是模型)作为输入,您将能够获得您的构造型元素及其所有属性。

[template public generateElement(aFlowPort: FlowPort)]
[comment @main /]
[comment here you can access to the aFlowPort fields]
[/template]

除此之外,您还可以访问构造型的base_NamedElement属性(即模型中定型Port的{​​{1}}),并且可以使用{{1基本元素的属性,用于将构造型映射回FlowPort中的qualifiedName。实际上,这意味着您必须手工将构造型链接到其构造型实体。

闷闷不乐,但仍然可以完成工作,直到有人带来更少的&#34;解决方法&#34;溶液