Не удается получить доступ к стереотипам SysML и их свойствам в Acceleo
Я разрабатываю генератор M2T в Acceleo (в Eclipse). Модель в основном представляет собой модель UML с профилем SysML, созданным в Papyrus. Включает в себя блоки и FlowPorts. Мне нужно получить доступ к этим стереотипам, но мне кажется, что я не могу извлечь ни один объект SysML, даже если они появляются в списке (предложение кода). На самом деле я должен получить доступ к свойству "Направление" FlowPort, связанного с портом. Я уже попробовал предложения и ответы на различных форумах (включая https://www.eclipse.org/forums/index.php/t/452587/), но тщетно.
Код приведен ниже. Я создал java-сервисы в соответствии с предложением https://www.eclipse.org/forums/index.php?t=msg&th=1060450&goto=1693765&; но port.hasStereotype('FlowPort') всегда возвращает false. Я также попытался "SysML::PortAndFlows::FlowPort" вместо "FlowPort". Я использую Acceleo 3.6.2 на Eclipse Mars.
...
[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
Кроме того, я регистрирую необходимые пакеты, в том числе следующие в registerPackages() Generate.java, как предлагается по ссылке, только что упомянутой выше.
// 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 ответ
У меня была идентичная проблема, но с UML/MARTE, а не с SysML.
Могу поспорить, что port.getAppliedStereotypes()
всегда возвращает пустой список, несмотря ни на что (даже если, конечно, порт имеет стереотип). Я также попытался все, что вы сделали, безуспешно, включая двойную проверку, если был @generated NOT
в javadoc из registerPackages
метод (чтобы он генерировался каждый раз).
Я исправил проблему с помощью небольшого обходного пути. Я предполагаю, что вы (как и я) использовали в качестве входных данных для преобразования файл model.uml, сгенерированный Papyrus. Это может быть причиной проблемы, хотя я не вижу альтернативы. Если вы откроете этот файл в текстовом редакторе, вы обнаружите, что <FlowPort>
теги находятся за пределами <uml:Model>
тег. Это означает, что по причинам, которые я до сих пор не понимаю, stereotype()
методы не могут "видеть" стереотипы и всегда возвращают нулевые или пустые списки. Это возможно потому, что они не соответствуют стереотипу 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
это стереотипно FlowPort
в вашей модели), и вы можете использовать qualifiedName
свойство базового элемента для сопоставления стереотипа с Port
в вашем Model
, На практике это означает, что вы должны вручную связать стереотипы с их стереотипными сущностями.
Неуклюжий и раздражающий, но все же выполняет свою работу, пока кто-то не придет с менее "обходным" решением.