首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法访问Acceleo中的SysML构造型及其属性

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

Stack Overflow用户
提问于 2016-01-30 04:43:09
回答 1查看 628关注 0票数 0

我正在用(在Eclipse中) Acceleo开发一个M2T生成器。该模型基本上是一个带有在Papyrus中创建的SysML概要文件的UML模型。它包括块和FlowPorts。我必须访问这些构造型,但似乎无法检索任何SysML对象,即使它们出现在list (代码建议)中。实际上,我必须访问与端口关联的FlowPort的‘方向’属性。我已经尝试了各种论坛(包括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。

代码语言:javascript
复制
...
[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]

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

代码语言:javascript
复制
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()。

代码语言:javascript
复制
    // 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(""));

任何形式的帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2016-02-11 18:56:26

我也有同样的问题,但用的是UML/MARTE,而不是SysML。

我敢打赌,无论发生什么,port.getAppliedStereotypes()总是返回空列表(当然,即使端口是构造型的)。我还尝试了您所做的一切,但都没有成功,包括再次检查registerPackages方法的javadoc中是否有@generated NOT (每次都会重新生成它)。

我用一些变通方法修复了这个问题。我假设您(和我一样)使用由Papyrus生成的model.uml文件作为转换的输入。这实际上可能是问题的原因,尽管我看不到替代方案。如果您使用文本编辑器打开该文件,您会发现<FlowPort>标记位于<uml:Model>标记之外。这意味着,由于我仍然不能理解的原因,stereotype()方法不能“看到”构造型,并且总是返回null或空列表。这可能是因为他们无法将构造型base_NamedElement<uml:Model>标记中的xmi:id匹配。

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

代码语言:javascript
复制
[template public generateElement(aFlowPort: FlowPort)]
[comment @main /]
[comment here you can access to the aFlowPort fields]
[/template]

其中,您还可以访问构造型的base_NamedElement属性(即,在您的模型中是构造型FlowPortPort ),并且您可以使用基本元素的qualifiedName属性来将构造型映射回您的Model中的Port。在实践中,这意味着您必须手动将构造型链接到它们的构造型实体。

笨拙和恼人,但仍然可以完成工作,直到有人提出了一个不那么“繁琐”的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35093700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档