Генерация модели обозначений из модели предметной области
В настоящее время я работаю над проектом, который требует преобразования одной модели в другую с использованием qvto. Исходная модель - это конечный автомат, представленный в виде таблицы. Целевая модель также является машиной состояний, которая имеет узлы и ребра. Исходная модель имеет только метамодель домена, но целевая модель имеет метамодели как домена, так и нотации. Мета-модель обозначений: http://www.eclipse.org/gmf/runtime/1.0.2/notation. Я трансформировался из модели исходного домена в модель целевого домена, но моя целевая модель не имеет модели обозначений. Я хотел создать модель обозначения из целевой модели и сериализовать ее в тот же файл xmi. Я прочитал документацию по EMF и GMF и попытался сделать это, но не смог. Я также гуглил, это тоже не помогло. В заголовке целевой модели упоминаются метамодели как домена, так и нотации. Для ясности посмотрите на файл xmi ниже.
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:n1="http://www.target.com/EMF/1/SimpleStatechart" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation">
<n1:statemachine xmi:id="_QvItUPMjEeS6mNxtIz5_4Q" s_name="Sensor">
<transitions xmi:type="n1:Transition" xmi:id="_RzqFYPMjEeS6mNxtIz5_4Q" body="" from="_RNakwPMjEeS6mNxtIz5_4Q" to="_RzcqAPMjEeS6mNxtIz5_4Q"/>
<transitions xmi:type="n1:Transition" xmi:id="_BJd-wAeuEeaf_-AtraPkfA" body="in_ISensor:Activate/out_ISensor.send(sensorReply());" from="_RzcqAPMjEeS6mNxtIz5_4Q" to="_7UnrQAetEeaf_-AtraPkfA"/>
<transitions xmi:type="n1:Transition" xmi:id="_DaWcQAeuEeaf_-AtraPkfA" body="in_InternalOptional:DetectedMovement/out_ISensor_NI.send(detectedMovement());" from="_7UnrQAetEeaf_-AtraPkfA" to="_7Q_IcAetEeaf_-AtraPkfA"/>
<transitions xmi:type="n1:Transition" xmi:id="_EWLLUAeuEeaf_-AtraPkfA" body="in_ISensor:Deactivate/out_ISensor.send(sensorReply());" from="_7UnrQAetEeaf_-AtraPkfA" to="_7OB7EAetEeaf_-AtraPkfA"/>
<transitions xmi:type="n1:Transition" xmi:id="_F9AmQAeuEeaf_-AtraPkfA" body="in_ISensor:Deactivate/out_ISensor.send(sensorReply());" from="_7Q_IcAetEeaf_-AtraPkfA" to="_7OB7EAetEeaf_-AtraPkfA"/>
<transitions xmi:type="n1:Transition" xmi:id="_GXe7wAeuEeaf_-AtraPkfA" body="in_InternalInevitable:Deactivated/
out_ISensor_NI.send(deactivated());" from="_7OB7EAetEeaf_-AtraPkfA" to="_RzcqAPMjEeS6mNxtIz5_4Q"/>
<states xmi:type="n1:InitialState" xmi:id="_RNakwPMjEeS6mNxtIz5_4Q" name="InitialState"/>
<states xmi:type="n1:BasicState" xmi:id="_RzcqAPMjEeS6mNxtIz5_4Q" name="Deactivated"/>
<states xmi:type="n1:BasicState" xmi:id="_7OB7EAetEeaf_-AtraPkfA" name="Deactivating" internal=""/>
<states xmi:type="n1:BasicState" xmi:id="_7Q_IcAetEeaf_-AtraPkfA" name="Triggered"/>
<states xmi:type="n1:BasicState" xmi:id="_7UnrQAetEeaf_-AtraPkfA" name="Activated"/>
</n1:statemachine>
<notation:Diagram xmi:id="_QvItUfMjEeS6mNxtIz5_4Q" type="ConformiqStateChart" element="_QvItUPMjEeS6mNxtIz5_4Q" measurementUnit="Pixel">
<children xmi:type="notation:Node" xmi:id="_RNwjAPMjEeS6mNxtIz5_4Q" type="2007" element="_RNakwPMjEeS6mNxtIz5_4Q">
<children xmi:type="notation:DecorationNode" xmi:id="_RNxKEPMjEeS6mNxtIz5_4Q" type="5022"/>
<styles xmi:type="notation:DescriptionStyle" xmi:id="_RNwjAfMjEeS6mNxtIz5_4Q"/>
<styles xmi:type="notation:FontStyle" xmi:id="_YRV_NegaEeSg-pTEoxDT6g" fontName="Segoe UI"/>
<styles xmi:type="notation:LineStyle" xmi:id="_RNwjA_MjEeS6mNxtIz5_4Q" lineColor="0"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_YRWmQegaEeSg-pTEoxDT6g" x="496" y="57"/>
</children>
<children xmi:type="notation:Node" xmi:id="_RzhigPMjEeS6mNxtIz5_4Q" type="2012" element="_RzcqAPMjEeS6mNxtIz5_4Q">
<children xmi:type="notation:DecorationNode" xmi:id="_RziJkvMjEeS6mNxtIz5_4Q" type="5017"/>
<children xmi:type="notation:DecorationNode" xmi:id="_RziJk_MjEeS6mNxtIz5_4Q" type="5018"/>
<children xmi:type="notation:DecorationNode" xmi:id="_RziJlPMjEeS6mNxtIz5_4Q" type="5019"/>
<children xmi:type="notation:DecorationNode" xmi:id="_RziwoPMjEeS6mNxtIz5_4Q" type="7001">
<styles xmi:type="notation:SortingStyle" xmi:id="_RziwofMjEeS6mNxtIz5_4Q"/>
<styles xmi:type="notation:FilteringStyle" xmi:id="_RziwovMjEeS6mNxtIz5_4Q"/>
</children>
<styles xmi:type="notation:DescriptionStyle" xmi:id="_RzhigfMjEeS6mNxtIz5_4Q"/>
<styles xmi:type="notation:FontStyle" xmi:id="_YRXNUOgaEeSg-pTEoxDT6g" fontName="Segoe UI"/>
<styles xmi:type="notation:HintedDiagramLinkStyle" xmi:id="_RziJkPMjEeS6mNxtIz5_4Q"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_YRXNUugaEeSg-pTEoxDT6g" x="420" y="192" width="225" height="109"/>
</children>
<children xmi:type="notation:Shape" xmi:id="_TAN_IPMjEeS6mNxtIz5_4Q" type="Note" fontName="Ubuntu" fontHeight="11" description="Describe the behavior of the
Sensor in this state machine." fillColor="0" transparency="0" lineColor="0" lineWidth="1">
<children xmi:type="notation:BasicDecorationNode" xmi:id="_TARCcPMjEeS6mNxtIz5_4Q" type="DiagramName">
<element xsi:nil="true"/>
</children>
<children xmi:type="notation:BasicDecorationNode" xmi:id="_TARpgPMjEeS6mNxtIz5_4Q" type="Description">
<element xsi:nil="true"/>
</children>
<styles xmi:type="notation:TextStyle" xmi:id="_TAN_IfMjEeS6mNxtIz5_4Q"/>
<styles xmi:type="notation:LineTypeStyle" xmi:id="_TAOmMPMjEeS6mNxtIz5_4Q"/>
<element xsi:nil="true"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_YRYbcOgaEeSg-pTEoxDT6g" x="708" y="36" width="293" height="98"/>
</children>
<children xmi:type="notation:Node" xmi:id="_7OMTIAetEeaf_-AtraPkfA" type="2012" element="_7OB7EAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_7OOIUAetEeaf_-AtraPkfA" type="5017"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7OOIUQetEeaf_-AtraPkfA" type="5018"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7OOIUgetEeaf_-AtraPkfA" type="5019"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7OOIUwetEeaf_-AtraPkfA" type="7001">
<styles xmi:type="notation:SortingStyle" xmi:id="_7OOIVAetEeaf_-AtraPkfA"/>
<styles xmi:type="notation:FilteringStyle" xmi:id="_7OOIVQetEeaf_-AtraPkfA"/>
</children>
<styles xmi:type="notation:DescriptionStyle" xmi:id="_7OMTIQetEeaf_-AtraPkfA"/>
<styles xmi:type="notation:FontStyle" xmi:id="_7OMTIgetEeaf_-AtraPkfA" fontName="Segoe UI"/>
<styles xmi:type="notation:HintedDiagramLinkStyle" xmi:id="_7OMTIwetEeaf_-AtraPkfA"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_7OMTJAetEeaf_-AtraPkfA" x="552" y="756" width="225" height="109"/>
</children>
<children xmi:type="notation:Node" xmi:id="_7RAWkAetEeaf_-AtraPkfA" type="2012" element="_7Q_IcAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_7RA9oAetEeaf_-AtraPkfA" type="5017"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7RA9oQetEeaf_-AtraPkfA" type="5018"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7RA9ogetEeaf_-AtraPkfA" type="5019"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7RA9owetEeaf_-AtraPkfA" type="7001">
<styles xmi:type="notation:SortingStyle" xmi:id="_7RA9pAetEeaf_-AtraPkfA"/>
<styles xmi:type="notation:FilteringStyle" xmi:id="_7RA9pQetEeaf_-AtraPkfA"/>
</children>
<styles xmi:type="notation:DescriptionStyle" xmi:id="_7RAWkQetEeaf_-AtraPkfA"/>
<styles xmi:type="notation:FontStyle" xmi:id="_7RAWkgetEeaf_-AtraPkfA" fontName="Segoe UI"/>
<styles xmi:type="notation:HintedDiagramLinkStyle" xmi:id="_7RAWkwetEeaf_-AtraPkfA"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_7RAWlAetEeaf_-AtraPkfA" x="324" y="588" width="225" height="109"/>
</children>
<children xmi:type="notation:Node" xmi:id="_7Uo5YAetEeaf_-AtraPkfA" type="2012" element="_7UnrQAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_7Uo5ZQetEeaf_-AtraPkfA" type="5017"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7UpgcAetEeaf_-AtraPkfA" type="5018"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7UpgcQetEeaf_-AtraPkfA" type="5019"/>
<children xmi:type="notation:DecorationNode" xmi:id="_7UpgcgetEeaf_-AtraPkfA" type="7001">
<styles xmi:type="notation:SortingStyle" xmi:id="_7UpgcwetEeaf_-AtraPkfA"/>
<styles xmi:type="notation:FilteringStyle" xmi:id="_7UpgdAetEeaf_-AtraPkfA"/>
</children>
<styles xmi:type="notation:DescriptionStyle" xmi:id="_7Uo5YQetEeaf_-AtraPkfA"/>
<styles xmi:type="notation:FontStyle" xmi:id="_7Uo5YgetEeaf_-AtraPkfA" fontName="Segoe UI"/>
<styles xmi:type="notation:HintedDiagramLinkStyle" xmi:id="_7Uo5YwetEeaf_-AtraPkfA"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_7Uo5ZAetEeaf_-AtraPkfA" x="264" y="384" width="225" height="109"/>
</children>
<styles xmi:type="notation:DiagramStyle" xmi:id="_QvItUvMjEeS6mNxtIz5_4Q"/>
<edges xmi:type="notation:Edge" xmi:id="_Rzr6kPMjEeS6mNxtIz5_4Q" type="4002" element="_RzqFYPMjEeS6mNxtIz5_4Q" source="_RNwjAPMjEeS6mNxtIz5_4Q" target="_RzhigPMjEeS6mNxtIz5_4Q">
<children xmi:type="notation:DecorationNode" xmi:id="_RzshoPMjEeS6mNxtIz5_4Q" type="6002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_RzshofMjEeS6mNxtIz5_4Q" x="19" y="-12"/>
</children>
<styles xmi:type="notation:RoutingStyle" xmi:id="_X39ZA9krEeSNSYp_vqikKg" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_YRX0YugaEeSg-pTEoxDT6g" fontName="Segoe UI"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_YRX0Y-gaEeSg-pTEoxDT6g" points="[0, 0, 0, -94]$[0, 94, 0, 0]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_53a-Yfi3EeSDRc6--mGWrg" id="(0.48,1.0)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_YRX0ZOgaEeSg-pTEoxDT6g" id="(0.5,0.0)"/>
</edges>
<edges xmi:type="notation:Edge" xmi:id="_BJkFYAeuEeaf_-AtraPkfA" type="4002" element="_BJd-wAeuEeaf_-AtraPkfA" source="_RzhigPMjEeS6mNxtIz5_4Q" target="_7Uo5YAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_BJkscAeuEeaf_-AtraPkfA" type="6002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_BJkscQeuEeaf_-AtraPkfA" x="-3" y="24"/>
</children>
<styles xmi:type="notation:RoutingStyle" xmi:id="_BJkFYQeuEeaf_-AtraPkfA" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_BJkFYgeuEeaf_-AtraPkfA" fontName="Segoe UI"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_BJkFYweuEeaf_-AtraPkfA" points="[-39, 35, 117, -137]$[-159, 118, -3, -54]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_BJnIsAeuEeaf_-AtraPkfA" id="(0.17777777777777778,0.6788990825688074)"/>
</edges>
<edges xmi:type="notation:Edge" xmi:id="_DaXDUAeuEeaf_-AtraPkfA" type="4002" element="_DaWcQAeuEeaf_-AtraPkfA" source="_7Uo5YAetEeaf_-AtraPkfA" target="_7RAWkAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_DaXqYAeuEeaf_-AtraPkfA" type="6002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_DaXqYQeuEeaf_-AtraPkfA" x="29" y="6"/>
</children>
<styles xmi:type="notation:RoutingStyle" xmi:id="_DaXDUQeuEeaf_-AtraPkfA" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_DaXDUgeuEeaf_-AtraPkfA" fontName="Segoe UI"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_DaXDUweuEeaf_-AtraPkfA" points="[4, 22, 17, -161]$[65, 129, 78, -54]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_DaY4gAeuEeaf_-AtraPkfA" id="(0.5555555555555556,0.7981651376146789)"/>
</edges>
<edges xmi:type="notation:Edge" xmi:id="_EWLyYAeuEeaf_-AtraPkfA" type="4002" element="_EWLLUAeuEeaf_-AtraPkfA" source="_7Uo5YAetEeaf_-AtraPkfA" target="_7OMTIAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_EWLyZAeuEeaf_-AtraPkfA" type="6002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_EWLyZQeuEeaf_-AtraPkfA" y="40"/>
</children>
<styles xmi:type="notation:RoutingStyle" xmi:id="_EWLyYQeuEeaf_-AtraPkfA" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_EWLyYgeuEeaf_-AtraPkfA" fontName="Segoe UI"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_EWLyYweuEeaf_-AtraPkfA" points="[27, 27, -323, -315]$[335, 351, -15, 9]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_EWNnkAeuEeaf_-AtraPkfA" id="(0.10666666666666667,0.7522935779816514)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_EWOOoAeuEeaf_-AtraPkfA" id="(0.1688888888888889,0.9174311926605505)"/>
</edges>
<edges xmi:type="notation:Edge" xmi:id="_F9BNUAeuEeaf_-AtraPkfA" type="4002" element="_F9AmQAeuEeaf_-AtraPkfA" source="_7RAWkAetEeaf_-AtraPkfA" target="_7OMTIAetEeaf_-AtraPkfA">
<children xmi:type="notation:DecorationNode" xmi:id="_F9B0YAeuEeaf_-AtraPkfA" type="6002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_F9B0YQeuEeaf_-AtraPkfA" y="40"/>
</children>
<styles xmi:type="notation:RoutingStyle" xmi:id="_F9BNUQeuEeaf_-AtraPkfA" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_F9BNUgeuEeaf_-AtraPkfA" fontName="Segoe UI"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_F9BNUweuEeaf_-AtraPkfA" points="[54, 21, -125, -49]$[165, 67, -14, -3]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_F9DpkAeuEeaf_-AtraPkfA" id="(0.76,0.6605504587155964)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_F9DpkQeuEeaf_-AtraPkfA" id="(0.06222222222222222,0.3119266055045872)"/>
</edges>
<edges xmi:type="notation:Edge" xmi:id="_GXfi0AeuEeaf_-AtraPkfA" type="4002" element="_GXe7wAeuEeaf_-AtraPkfA" source="_7OMTIAetEeaf_-AtraPkfA" target="_RzhigPMjEeS6mNxtIz5_4Q">
<children xmi:type="notation:DecorationNode" xmi:id="_GXfi1AeuEeaf_-AtraPkfA" type="6002">
<layoutConstraint xmi:type="notation:Location" xmi:id="_GXfi1QeuEeaf_-AtraPkfA" y="40"/>
</children>
<styles xmi:type="notation:RoutingStyle" xmi:id="_GXfi0QeuEeaf_-AtraPkfA" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_GXfi0geuEeaf_-AtraPkfA" fontName="Segoe UI"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_GXfi0weuEeaf_-AtraPkfA" points="[-10, -54, 76, 427]$[-74, -461, 12, 20]"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_GXhYAAeuEeaf_-AtraPkfA" id="(0.5955555555555555,0.8165137614678899)"/>
</edges>
</notation:Diagram>
</xmi:XMI>
От преобразования у меня есть верхняя часть целевой модели до n1:statemachine, который является моделью предметной области. Начиная с n1:statemachine, по-прежнему продолжается графическое представление верхней части, которое я хочу сгенерировать. Как я могу сгенерировать модель обозначений для модели предметной области, которую я получаю из преобразования модели?
1 ответ
Я не знаком с обработкой ресурсов EMF в QVT, но я стараюсь изо всех сил описывать, что нужно делать на уровне EMF и GMF.
Технически модель обозначений - это тот же тип модели EMF, что и модель предметной области, которую вы уже успешно сгенерировали, просто она соответствует другой метамодели, называемой http://www.eclipse.org/gmf/runtime/1.0.2/notation
и доступны из соответствующего плагина GMF org.eclipse.gmf.runtime.notation
,
Вы должны сделать так, чтобы ваше преобразование знало об этой метамодели, затем вы можете сгенерировать ее экземпляры аналогично исходной модели. Преобразование должно связать модель нотации с элементами модели целевой области на основе определения модели нотации; но это тот же тип перекрестных ссылок, который уже поддерживается вашей доменной моделью.
Наконец, чтобы сериализовать и целевую модель, и модель записи в одном и том же файле xmi, необходимо добавить оба к одному и тому же ресурсу EMF, что-то вроде следующего:
EObject targetDomain = ...; //root element of the target domain model
EObject targetNotation = ...; //root element of the target notation model
EList<EObject> contents = targetResource.getContents();
contents.add(targetDomain);
contents.add(targetNotation);
Эти шаги вместе должны позволить вам генерировать модель обозначения соответственно.