我正在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(""));
感谢任何形式的帮助。
答案 0 :(得分:0)
我有一个相同的问题,但是使用UML / MARTE而不是SysML。
我敢打赌port.getAppliedStereotypes()
总是返回空列表,无论如何(即使当然,端口是原型)。我也尝试了你所做的一切,但没有成功,包括仔细检查@generated NOT
方法的javadoc中是否有registerPackages
(每次重新生成它)。
我解决了这个问题。我假设你(像我一样)使用Papyrus生成的model.uml文件进行转换。这可能实际上是问题的原因,即使我没有看到替代方案。如果您使用文本编辑器打开该文件,则会发现<FlowPort>
标记位于<uml:Model>
标记之外。这意味着,由于我仍然无法理解的原因,stereotype()
方法无法&#34;看到&#34;构造型并始终返回null或空列表。这可能是因为它们无法将原型base_NamedElement
与xmi: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
。实际上,这意味着您必须手工将构造型链接到其构造型实体。