| /** |
| * Copyright (c) 2014 Fraunhofer FOKUS |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Max Bureck |
| */ |
| modeltype UML "strict" uses uml('http://www.eclipse.org/uml2/4.0.0/UML'); |
| modeltype ECORE "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore'); |
| |
| |
| /** |
| * This transformation does NOT actually perform a package merge according to the rules specified in the |
| * UML standard. Instead it takes all PackageMerge elements from the root packages and moves the content |
| * of the merged package (skipping nested packages), without merging any elements, to the package declaring the merge. |
| * This transformation is used to inplace transform bpmn. |
| */ |
| transformation SimplePackageMerge(inout input : UML); |
| |
| main() { |
| input.rootObjects()[Package]->forEach(p) { |
| map simpleMerge(p); |
| }; |
| } |
| |
| mapping simpleMerge(inout p : Package) { |
| // add eAnotation with info what was merged |
| var a := p.map toMergedInfoAnnotation(); |
| p.eAnnotations += a; |
| p.packageMerge->forEach(pm) { |
| pm.mergedPackage->forEach(mergedPack){ |
| // move all elements |
| map moveInto(a, mergedPack, p); |
| }; |
| }; |
| // empty package merge declaration |
| p.packageMerge := Set{}; |
| } |
| |
| /** |
| * Move elements (except for packages) over from "_from" to "to" |
| */ |
| mapping moveInto(inout a:EAnnotation, inout _from:Package, inout to:Package) { |
| to.packagedElement += _from.packagedElement[not oclIsKindOf(Package)]; |
| |
| // add details entry to annotation for "merged" package |
| a.eAnnotations += _from.map toMergedPackageDetails(to.packagedElement); |
| } |
| |
| mapping Package::toMergedInfoAnnotation() : EAnnotation { |
| source := "http://www.eclipse.org/uml2/2.0.0/UML"; |
| } |
| |
| mapping Package::toMergedPackageDetails(data:Set(PackageableElement)) : EAnnotation { |
| source := self.qualifiedName; |
| _references += data[EObject]; |
| } |