This repository has been archived on 2025-12-25. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
tcommon-studio-se/main/plugins/org.talend.model.migration/transformation/development/EModelCopyGenerator.atl

124 lines
4.0 KiB
ATL

-- @atlcompiler atl2006
-- $Id$
-- Generates an ATL transformation that copies models using the given Ecore meta-model
query EModelCopyGenerator = ECORE!EClass.allInstancesFrom('IN')->iterate(e; acc : String =
'-- @atlcompiler atl2006\n' +
'-- Generated by: $Id$\n' +
'module EModelCopy;\n\n' +
'create OUT : OUTMODEL from IN : INMODEL;\n\n' +
'helper def : inElements : Set(INMODEL!"ecore::EObject") = INMODEL!"ecore::EObject".allInstancesFrom(\'IN\');\n\n' +
'helper context OclAny def : isInElement : Boolean =\n' +
' thisModule.inElements->includes(self);\n\n'|
acc + e.toRuleString()).
writeTo('EModelCopyOfTos.atl'.path);
uses Config;
helper context ECORE!EReference def : assignable : Boolean =
not (self."derived" or self.container)
and self.changeable;
helper context ECORE!EAttribute def : assignable : Boolean =
not (self."derived") and self.changeable;
helper context ECORE!ENamedElement def : qName : String =
self.name;
helper context ECORE!EClassifier def : qName : String =
if self.ePackage.oclIsUndefined() then
self.name
else
self.ePackage.qName + '::' + self.name
endif;
helper context ECORE!EPackage def : qName : String =
if self.eSuperPackage.oclIsUndefined() then
self.name
else
self.eSuperPackage.qName + '::' + self.name
endif;
helper context ECORE!ENamedElement def : cname : String =
if self.useQualifiedName then
'"' + self.qName + '"'
else
if self.name.isKeyword then
'"' + self.name + '"'
else
self.name
endif
endif;
helper context ECORE!ENamedElement def : rulename : String =
if self.useQualifiedRuleName then
'"' + self.qName + '"'
else
if self.name.isKeyword then
'"' + self.name + '"'
else
self.name
endif
endif;
helper context ECORE!EClass def : toRuleString() : String =
if not self."abstract" and self.inclusionCondition then
'rule ' + self.rulename + ' {\n' +
' from s : INMODEL!' + self.cname + self.inputConstraint() + '\n' +
' to t : OUTMODEL!' + self.cname + ' (' +
self.contentsToString() + ')\n' +
'}\n\n'
else
''
endif;
helper context ECORE!EClass def : inputConstraint() : String =
let inElementCondition : String =
if self.useIsInElementHelper then 's.isInElement'
else 'thisModule.inElements->includes(s)' endif
in
if self.hasConcreteSubclasses then
' (\n' +
' if s.oclIsTypeOf(INMODEL!' + self.cname + ') then\n' +
' ' + inElementCondition + '\n' +
' else false endif)'
else
' (' + inElementCondition + ')'
endif;
helper context ECORE!EClass def : hasConcreteSubclasses : Boolean =
not ECORE!EClass.allInstances()->select(e|
e.eSuperTypes->includes(self) and not e."abstract")->isEmpty();
helper context ECORE!EClass def : contentsToString() : String =
self.referencesToString(self.attributesToString(
if self.copyXmiID then '\n' + '__xmiID__'.toAssignString() else '' endif));
helper context ECORE!EClass def : attributesToString(head : String) : String =
self.featuresToString(head, self.eAllAttributes->select(a|a.assignable));
helper context ECORE!EClass def : referencesToString(head : String) : String =
self.featuresToString(head, self.eAllReferences->select(r|r.assignable));
helper context ECORE!EClass def : featuresToString(head : String, feature : Sequence(ECORE!EStructuralFeature)) : String =
feature->iterate(e; acc : String = head |
if acc.size() = 0 then
'\n' + e.name.toAssignString()
else
acc + ',\n' + e.name.toAssignString()
endif);
helper context String def : toAssignString() : String =
if self.isKeyword then
' "' + self + '" <- s."' + self + '"'
else
' ' + self + ' <- s.' + self
endif;
helper context String def : isKeyword : Boolean =
Set{'module', 'create', 'from', 'rule', 'to', 'using', 'helper', 'context',
'def', 'and', 'or', 'not', 'if', 'then', 'else', 'endif', 'query',
'library', 'mapsTo', 'String', 'Boolean', 'Integer', 'Real', 'Bag',
'Set', 'OrderedSet', 'Sequence', 'abstract', 'derived', 'refining',
'foreach', 'distinct', 'in', 'do', 'uses', 'let', 'TupleType',
'entrypoint', 'endpoint', 'lazy', 'extends'}->includes(self);