Простое преобразование ATL - создайте новые классы как дети определенного класса
Я практикую использование ATL, поэтому я пытаюсь выполнить очень простое преобразование модели, как показано ниже.
АТЛ:
module Form2NewForm;
create OUT : Form refining IN : Form;
-- @path Form=/Form2Form/Form.ecore
--parameter
helper def : subjectName : String = 'address';
helper def : newHeight : Integer = 500;
helper def : newWidth : Integer = 300;
helper context Form!ScreenItem def : isSbj() : Boolean =
if self.itemName = thisModule.subjectName
then true else false endif;
rule NewScreem{
from
s : Form!Screen
to
t : Form!Screen(
height <- thisModule.newHeight,
width <- thisModule.newWidth
)
}
--new three class are created below "address" class
rule Refinement{
from
s : Form!ScreenItem(s.isSbj())
to
t : Form!ScreenItem(
--
),
t1 : Form!SubScreenItem(
itemName <- 'City',
height <- s.height,
width <- (s.width-20) div 3,
x <- s.x - (s.width div 2) + (s.width-20) div 6,
y <- s.y
),
t2 : Form!SubScreenItem(
itemName <- 'Prefecture',
height <- s.height,
width <- (s.width-20) div 3,
x <- s.x,
y <- s.y
),
t3 : Form!SubScreenItem(
itemName <- 'Number',
height <- s.height,
width <- (s.width-20) div 3,
x <- s.x + (s.width div 2) - (s.width-20) div 6,
y <- s.y
)
}
Модель ввода:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="http://form/1.0">
<Screen height="250" width="600">
<screenItem itemName="lastName" width="200" height="30" x="150" y="65"/>
<screenItem itemName="firstName" width="200" height="30" x="450" y="65"/>
<screenItem itemName="address" width="500" height="30" x="300" y="145"/>
</Screen>
</xmi:XMI>
Я хочу получить эту ожидаемую модель из входной модели и ATL.
ожидаемая модель:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:Form="http://form/1.0">
<Form:Screen height="500" width="300">
<screenItem itemName="lastName" height="30" width="200" x="150" y="65"/>
<screenItem itemName="firstName" height="30" width="200" x="450" y="65"/>
<screenItem itemName="address" height="30" width="500" x="300" y="145">
<children itemName="City" height="30" width="160" x="130" y="145"/>
<children itemName="Prefecture" height="30" width="160" x="300" y="145"/>
<children itemName="Number" height="30" width="160" x="470" y="145"/>
</screenItem>
</Form:Screen>
</xmi:XMI>
Но практически эта модель ниже была создана.
модель выхода:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:Form="http://form/1.0">
<Form:Screen height="500" width="300">
<screenItem itemName="lastName" height="30" width="200" x="150" y="65"/>
<screenItem itemName="firstName" height="30" width="200" x="450" y="65"/>
<screenItem itemName="address" height="30" width="500" x="300" y="145"/>
</Form:Screen>
<Form:SubScreenItem itemName="City" height="30" width="160" x="130" y="145"/>
<Form:SubScreenItem itemName="Prefecture" height="30" width="160" x="300" y="145"/>
<Form:SubScreenItem itemName="Number" height="30" width="160" x="470" y="145"/>
</xmi:XMI>
В этом преобразовании я хочу создать новые классы, чьи itemName - "Город", "Префектура" и "Число" - как потомки класса "адрес", как и ожидалось. Но практически эти три класса не располагаются как дети "адресного" класса.
Я думаю, что отношение между классом "address" и этими тремя классами должно быть записано в t: Form! ScreenItem (...) в правиле уточнения, но я не могу придумать, как писать.
Пожалуйста, скажите мне, как написать код ATL, который может создать ожидаемую модель.
Form.ecore:
<?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:ecore="http://www.eclipse.org/emf/2002/Ecore">
<ecore:EPackage name="Form" nsURI="http://form/1.0" nsPrefix="Form">
<eClassifiers xsi:type="ecore:EClass" name="Screen">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="height" lowerBound="1"
eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="width" lowerBound="1"
eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="screenItem" upperBound="-1"
eType="#/0/ScreenItem" containment="true" eOpposite="#/0/ScreenItem/screen"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ScreenItem">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="itemName" eType="#/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="screen" lowerBound="1"
eType="#/0/Screen" changeable="false" eOpposite="#/0/Screen/screenItem"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="x" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="y" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="children" upperBound="-1"
eType="#/0/SubScreenItem" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SubScreenItem">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="itemName" eType="#/1/String"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="height" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="width" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="x" eType="#/1/Integer"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="y" eType="#/1/Integer"/>
</eClassifiers>
</ecore:EPackage>
<ecore:EPackage name="PrimitiveTypes">
<eClassifiers xsi:type="ecore:EDataType" name="String"/>
<eClassifiers xsi:type="ecore:EDataType" name="Integer"/>
<eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
</ecore:EPackage>
</xmi:XMI>
1 ответ
Вы должны добавить:
t: Form! ScreenItem (
children <- t1,
children <- t2,
children <- t3
)
С Уважением,
Изабел