Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Willink2015-06-16 21:28:20 +0000
committerEd Willink2015-06-18 10:40:30 +0000
commitb8aeda96a33047e008e112f622fc8b429b4a577c (patch)
tree0464c7cc5f62053695d58a4e353f38328e9afd00
parentdd55e7f6dcfda5ea36b20460f765dbd62b256273 (diff)
downloadorg.eclipse.qvtd-b8aeda96a33047e008e112f622fc8b429b4a577c.tar.gz
org.eclipse.qvtd-b8aeda96a33047e008e112f622fc8b429b4a577c.tar.xz
org.eclipse.qvtd-b8aeda96a33047e008e112f622fc8b429b4a577c.zip
[461314] IncrementalExecutor works for LAZY and INCREMENTAL modes
-rw-r--r--plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java12
-rw-r--r--plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java89
-rw-r--r--plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java2
-rw-r--r--plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java947
-rw-r--r--plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java2
-rw-r--r--plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java12
-rw-r--r--plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java124
-rw-r--r--tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java2
-rw-r--r--tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias378
-rw-r--r--tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java (renamed from tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java)2
-rw-r--r--tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java (renamed from tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java)2
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java (renamed from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java)2
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java (renamed from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java)2
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java (renamed from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java)2
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java (renamed from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java)2
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java (renamed from tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java)2
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java47
-rw-r--r--tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti38
18 files changed, 950 insertions, 717 deletions
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
index 869635f9f..9bc1855a1 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCG2JavaVisitor.java
@@ -25,7 +25,6 @@ import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.examples.codegen.analyzer.NameManager;
-import org.eclipse.ocl.examples.codegen.cgmodel.CGElementId;
import org.eclipse.ocl.examples.codegen.cgmodel.CGExecutorProperty;
import org.eclipse.ocl.examples.codegen.cgmodel.CGFinalVariable;
import org.eclipse.ocl.examples.codegen.cgmodel.CGIterator;
@@ -46,7 +45,6 @@ import org.eclipse.ocl.pivot.evaluation.Evaluator;
import org.eclipse.ocl.pivot.ids.ClassId;
import org.eclipse.ocl.pivot.ids.CollectionTypeId;
import org.eclipse.ocl.pivot.ids.ElementId;
-import org.eclipse.ocl.pivot.ids.PropertyId;
import org.eclipse.ocl.pivot.ids.TypeId;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.ocl.pivot.utilities.NameUtil;
@@ -322,7 +320,10 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem
}
protected @Nullable String doOppositePropertyIds(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
- Map<Property, Integer> opposites = transformationAnalysis.getSourceCaches();
+ return null;
+ // This code is no longer used, and since it is not used it generates undefined references
+ // It appears to have 'worked' only because a duplicate incomplete TransformationAnalysis was in use.
+/* Map<Property, Integer> opposites = transformationAnalysis.getSourceCaches();
if (opposites.size() <= 0) {
return null;
}
@@ -339,7 +340,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem
//
js.append("/*\n");
js.append(" * Array of the source PropertyIds of each Property for which unnavigable opposite property navigation may occur.\n");
- js.append(" */\n");
+ js.append(" * /\n");
String oppositeIndex2propertyIdName = nameManager.getGlobalSymbolName(null, "oppositeIndex2propertyId");
js.append("private static final ");
js.appendIsRequired(true);
@@ -362,7 +363,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem
}
js.popIndentation();
js.append("};\n");
- return oppositeIndex2propertyIdName;
+ return oppositeIndex2propertyIdName; */
}
protected void doRun(@NonNull CGTransformation cgTransformation) {
@@ -1020,6 +1021,7 @@ public class QVTiCG2JavaVisitor extends CG2JavaVisitor<QVTiCodeGenerator> implem
@Override
public @NonNull Boolean visitCGTransformation(@NonNull CGTransformation cgTransformation) {
+ js.appendClassHeader(cgTransformation.getContainingPackage());
@SuppressWarnings("null")@NonNull Transformation transformation = (Transformation) cgTransformation.getAst();
QVTiTransformationAnalysis transformationAnalysis = context.getTransformationAnalysis(transformation);
String className = cgTransformation.getName();
diff --git a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java
index 503edeaeb..f2dffac8f 100644
--- a/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java
+++ b/plugins/org.eclipse.qvtd.codegen/src/org/eclipse/qvtd/codegen/qvti/java/QVTiCodeGenerator.java
@@ -26,6 +26,7 @@ import org.eclipse.ocl.examples.codegen.analyzer.BoxingAnalyzer;
import org.eclipse.ocl.examples.codegen.analyzer.DependencyVisitor;
import org.eclipse.ocl.examples.codegen.analyzer.FieldingAnalyzer;
import org.eclipse.ocl.examples.codegen.analyzer.ReferencesVisitor;
+import org.eclipse.ocl.examples.codegen.cgmodel.CGClass;
import org.eclipse.ocl.examples.codegen.cgmodel.CGModelFactory;
import org.eclipse.ocl.examples.codegen.cgmodel.CGPackage;
import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
@@ -57,7 +58,8 @@ public class QVTiCodeGenerator extends JavaCodeGenerator
{
protected final @NonNull QVTiAnalyzer cgAnalyzer;
protected final @NonNull Transformation transformation;
- private/* @LazyNonNull */String javaSourceCode = null;
+ private/* @LazyNonNull*/ CGPackage cgPackage;
+ private/* @LazyNonNull*/ String javaSourceCode = null;
protected final @NonNull QVTiGlobalContext globalContext = new QVTiGlobalContext(this);
protected final @NonNull Map<Transformation, QVTiTransformationAnalysis> transformation2analysis = new HashMap<Transformation, QVTiTransformationAnalysis>();
@@ -88,14 +90,36 @@ public class QVTiCodeGenerator extends JavaCodeGenerator
}
protected @NonNull CGPackage createCGPackage() {
+ CGPackage cgPackage = createCGPackage(ClassUtil.nonNullModel(transformation.getOwningPackage()));
+ QVTiAS2CGVisitor pivot2CGVisitor = createAS2CGVisitor(cgAnalyzer, getGlobalContext());
+ CGTransformation cgTransformation = (CGTransformation) ClassUtil.nonNullState(transformation.accept(pivot2CGVisitor));
+ cgPackage.getClasses().add(cgTransformation);
+ while (cgPackage.eContainer() != null) {
+ cgPackage = (CGPackage)cgPackage.eContainer();
+ }
+ return cgPackage;
+ }
+
+ protected @NonNull CGPackage createCGPackage(@NonNull org.eclipse.ocl.pivot.Package asPackage) {
String packagePrefix = getOptions().getPackagePrefix();
+ CGPackage cgParentPackage;
+ org.eclipse.ocl.pivot.Package asParentPackage = asPackage.getOwningPackage();
+ if (asParentPackage != null) {
+ cgParentPackage = createCGPackage(asParentPackage);
+ }
+ else if (packagePrefix != null) {
+ cgParentPackage = CGModelFactory.eINSTANCE.createCGPackage();
+ cgParentPackage.setName(packagePrefix);
+ }
+ else {
+ cgParentPackage = null;
+ }
CGPackage cgPackage = CGModelFactory.eINSTANCE.createCGPackage();
- cgPackage.setName(packagePrefix);
- QVTiAS2CGVisitor pivot2CGVisitor = createAS2CGVisitor(cgAnalyzer,
- getGlobalContext());
- CGTransformation cgTransformation = (CGTransformation) ClassUtil
- .nonNullState(transformation.accept(pivot2CGVisitor));
- cgPackage.getClasses().add(cgTransformation);
+ String name = asPackage.getName();
+ cgPackage.setName((name != null) && (name.length() > 0)? name : "_" + transformation.getName());
+ if (cgParentPackage != null) {
+ cgParentPackage.getPackages().add(cgPackage);
+ }
return cgPackage;
}
@@ -131,11 +155,12 @@ public class QVTiCodeGenerator extends JavaCodeGenerator
public @NonNull String generateClassFile() {
String javaSourceCode2 = javaSourceCode;
if (javaSourceCode2 == null) {
- CGPackage cgPackage = createCGPackage();
- optimize(cgPackage);
+ CGPackage cgPackage2 = createCGPackage();
+ cgPackage = cgPackage2;
+ optimize(cgPackage2);
List<CGValuedElement> sortedGlobals = prepareGlobals();
- QVTiCG2JavaVisitor generator = createCG2JavaVisitor(cgPackage, sortedGlobals);
- generator.safeVisit(cgPackage);
+ QVTiCG2JavaVisitor generator = createCG2JavaVisitor(cgPackage2, sortedGlobals);
+ generator.safeVisit(cgPackage2);
Set<String> allImports = generator.getAllImports();
Map<String, String> long2ShortImportNames = ImportUtils.getLong2ShortImportNames(allImports);
javaSourceCode = javaSourceCode2 = ImportUtils.resolveImports(generator.toString(), long2ShortImportNames);
@@ -159,13 +184,18 @@ public class QVTiCodeGenerator extends JavaCodeGenerator
}
public @NonNull String getQualifiedName() {
- String className = ClassUtil.nonNullState(transformation.getName());
- String packagePrefix = getOptions().getPackagePrefix();
- if (packagePrefix != null) {
- return packagePrefix + "." + className;
- } else {
- return className;
+ StringBuilder s = new StringBuilder();
+ CGPackage cgPackage = this.cgPackage;
+ s.append(cgPackage.getName());
+ while (cgPackage.getPackages().size() > 0) {
+ cgPackage = cgPackage.getPackages().get(0);
+ s.append(".");
+ s.append(cgPackage.getName());
}
+ s.append(".");
+ s.append(transformation.getName());
+ @SuppressWarnings("null")@NonNull String string = s.toString();
+ return string;
}
public @NonNull QVTiTransformationAnalysis getTransformationAnalysis(@NonNull Transformation transformation) {
@@ -180,13 +210,22 @@ public class QVTiCodeGenerator extends JavaCodeGenerator
}
public void saveSourceFile(@NonNull String savePath) throws IOException {
- String javaCodeSource = generateClassFile();
- String qualifiedName = getQualifiedName();
- String saveDir = savePath + qualifiedName.replace('.', '/');
- String fileName = saveDir + ".java";
- new File(saveDir).getParentFile().mkdirs();
- Writer writer = new FileWriter(fileName);
- writer.append(javaCodeSource);
- writer.close();
+ saveSourceFiles(ClassUtil.nonNullState(cgPackage), new File(savePath));
+ }
+
+ public void saveSourceFiles(@NonNull CGPackage cgPackage, @NonNull File parentFolder) throws IOException {
+ File folder = new File(parentFolder, cgPackage.getName());
+ for (CGPackage cgChildPackage : cgPackage.getPackages()) {
+ if (cgChildPackage != null) {
+ saveSourceFiles(cgChildPackage, folder);
+ }
+ }
+ for (CGClass cgClass : cgPackage.getClasses()) {
+ folder.mkdirs();
+ String javaCodeSource = generateClassFile();
+ Writer writer = new FileWriter(new File(folder, cgClass.getName() + ".java"));
+ writer.append(javaCodeSource);
+ writer.close();
+ }
}
}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
index 2e9da7e39..5728febc6 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/BasicQVTiExecutor.java
@@ -250,7 +250,7 @@ public class BasicQVTiExecutor extends AbstractExecutor implements QVTiExecutor
if (calledMapping != null) {
calledMapping.accept(undecoratedVisitor);
}
- return null;
+ return true;
}
@Override
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
index d646ee310..909ca9e67 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiIncrementalExecutor.java
@@ -30,8 +30,8 @@ import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.CollectionType;
-import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.NavigationCallExp;
+import org.eclipse.ocl.pivot.OCLExpression;
import org.eclipse.ocl.pivot.Property;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.Variable;
@@ -42,6 +42,7 @@ import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment;
import org.eclipse.qvtd.pivot.qvtcorebase.RealizedVariable;
import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage;
+import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
import org.eclipse.qvtd.pivot.qvtimperative.MappingCall;
import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding;
import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.AssociationStatus;
@@ -52,368 +53,599 @@ import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.EvaluationStatusFac
import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.MappingStatus;
import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.PropertyStatus;
import org.eclipse.qvtd.pivot.qvtimperative.evaluationstatus.TransformationStatus;
-import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphMLBuilder;
/**
* An evaluator implementation for OCL expressions.
*/
public class QVTiIncrementalExecutor extends BasicQVTiExecutor
{
- private enum Mode {
- EXECUTE, // EvaluationStatus is created lazily where necessary
+ public enum Mode {
+ LAZY, // EvaluationStatus is created lazily where necessary
INCREMENTAL, // EvaluationStatus is created for all mapping elements
REPAIR // EvaluationStatus is updated for all mapping elements
};
- private enum Usage { IN, OUT, INOUT };
-
- protected final @NonNull TransformationStatus transformationStatus = EvaluationStatusFactory.eINSTANCE.createTransformationStatus();
- protected final @NonNull Map<Object, ClassStatus> object2ClassStatus = new HashMap<Object, ClassStatus>();
- protected final @NonNull Stack<MappingStatus> mappingStatusStack = new Stack<MappingStatus>();
-
- /**
- * Non-null list while accumulating damage.
- */
- private @Nullable Set<MappingStatus> dirtyMappingStatuses = new HashSet<MappingStatus>();
-
- /**
- * Mapping invocations that failed due to a not-ready value that is still not-ready.
- */
- private final @NonNull Set<MappingStatus> blockedMappingStatuses = new HashSet<MappingStatus>();
/**
- * Non-null while mapping invocations that failed due to a not-ready value that is now ready.
+ * EvaluationStatusManager creates and locates elements of the EvaluationStatus model.
*/
- private @Nullable Set<MappingStatus> unblockedMappingStatuses = null;
-
- private @NonNull Mode mode;
-
- public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI transformationURI) throws IOException {
- super(environmentFactory, transformationURI);
- mode = Mode.EXECUTE;
- }
+ private static class EvaluationStatusManager
+ {
+ protected final@NonNull MappingAnalysis mappingAnalysis;
+ protected final @NonNull TransformationStatus transformationStatus = EvaluationStatusFactory.eINSTANCE.createTransformationStatus();
- protected void allocateDirtyMappingStatuses(@NonNull List<Set<MappingStatus>> depth2dirtyMappingStatuses,
- @NonNull Set<MappingStatus> dirtyMappingStatuses) {
- for (MappingStatus mappingStatus : dirtyMappingStatuses) {
- if (mappingStatus != null) {
- int mappingDepth = EvaluationStatus2DepthVisitor.INSTANCE.visit(mappingStatus);
- while (depth2dirtyMappingStatuses.size() <= mappingDepth) {
- depth2dirtyMappingStatuses.add(null);
- }
- Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(mappingDepth);
- if (mappingStatuses == null) {
- mappingStatuses = new HashSet<MappingStatus>();
- depth2dirtyMappingStatuses.set(mappingDepth, mappingStatuses);
+ private final @NonNull Map<Object, ClassStatus> object2ClassStatus = new HashMap<Object, ClassStatus>();
+
+ /**
+ * Non-null list while accumulating damage.
+ */
+ private @Nullable Set<MappingStatus> dirtyMappingStatuses = new HashSet<MappingStatus>();
+
+ public EvaluationStatusManager(@NonNull MappingAnalysis mappingAnalysis) {
+ this.mappingAnalysis = mappingAnalysis;
+ }
+
+ private void allocateDirtyMappingStatuses(@NonNull List<Set<MappingStatus>> depth2dirtyMappingStatuses,
+ @NonNull Set<MappingStatus> dirtyMappingStatuses) {
+ for (MappingStatus mappingStatus : dirtyMappingStatuses) {
+ if (mappingStatus != null) {
+ int mappingDepth = EvaluationStatus2DepthVisitor.INSTANCE.visit(mappingStatus);
+ while (depth2dirtyMappingStatuses.size() <= mappingDepth) {
+ depth2dirtyMappingStatuses.add(null);
+ }
+ Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(mappingDepth);
+ if (mappingStatuses == null) {
+ mappingStatuses = new HashSet<MappingStatus>();
+ depth2dirtyMappingStatuses.set(mappingDepth, mappingStatuses);
+ }
+ mappingStatuses.add(mappingStatus);
}
- mappingStatuses.add(mappingStatus);
}
+ dirtyMappingStatuses.clear();
}
- dirtyMappingStatuses.clear();
- }
- protected void block(@NonNull MappingStatus mappingStatus) {
- assert !mappingStatus.isIsBlocked();
- mappingStatus.setIsBlocked(true);
- blockedMappingStatuses.add(mappingStatus);
- Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
- if (unblockedMappingStatuses2 != null) {
- unblockedMappingStatuses2.remove(mappingStatus);
+ public void checkForDamage(@NonNull Resource resource) {
+ for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) {
+ EObject eObject = tit.next();
+ ClassStatus classStatus = object2ClassStatus.get(eObject);
+ if (classStatus != null) {
+ for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
+ EStructuralFeature eFeature = attributeStatus.getEFeature();
+ Object newValue = eObject.eGet(eFeature);
+ setNewValue(attributeStatus, newValue);
+ }
+ }
+ }
}
- }
- public void checkForDamage(@NonNull Resource resource) {
- for (TreeIterator<EObject> tit = resource.getAllContents(); tit.hasNext(); ) {
- EObject eObject = tit.next();
- ClassStatus classStatus = object2ClassStatus.get(eObject);
- if (classStatus != null) {
- for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
- EStructuralFeature eFeature = attributeStatus.getEFeature();
- Object newValue = eObject.eGet(eFeature);
- setNewValue(attributeStatus, newValue);
+ private void computeAssociationRecursion(@NonNull EObject aThat, @NonNull EReference that2this, @NonNull Set<EObject> allThese, @NonNull EReference this2that, @NonNull Set<EObject> allThose) {
+ Object object = aThat.eGet(that2this);
+ if (!that2this.isMany()) {
+ allThese.add((EObject)object);
+ }
+ else {
+ @SuppressWarnings("unchecked") List<EObject> moreThese = (List<EObject>)object;
+ for (EObject aThis : moreThese) {
+ if ((aThis != null) && !allThese.contains(aThis)) {
+ allThese.add(aThis);
+ computeAssociationRecursion(aThis, this2that, allThose, that2this, allThese);
+ }
}
}
}
- }
+
+ private @NonNull ClassStatus createClassStatus(/*@NonNull*/ Type type, @NonNull EObject eObject) {
+ ClassStatus classStatus = EvaluationStatusFactory.eINSTANCE.createClassStatus();
+ classStatus.setType(type);
+ classStatus.setEObject(eObject);
+ object2ClassStatus.put(eObject, classStatus);
+ transformationStatus.getOwnedClassStatuses().add(classStatus);
+ return classStatus;
+ }
- private void computeAssociationRecursion(@NonNull EObject aThat, @NonNull EReference that2this, @NonNull Set<EObject> allThese, @NonNull EReference this2that, @NonNull Set<EObject> allThose) {
- Object object = aThat.eGet(that2this);
- if (!that2this.isMany()) {
- allThese.add((EObject)object);
+ public @NonNull MappingStatus createMappingStatus(@NonNull MappingCall mappingCall, @NonNull List<Object> boundValues) {
+ MappingStatus newMappingStatus = EvaluationStatusFactory.eINSTANCE.createMappingStatus();
+ newMappingStatus.setReferredMappingCall(mappingCall);
+ newMappingStatus.getBoundValues().addAll(boundValues);
+ transformationStatus.getOwnedMappingStatuses().add(newMappingStatus);
+ return newMappingStatus;
}
- else {
- @SuppressWarnings("unchecked") List<EObject> moreThese = (List<EObject>)object;
- for (EObject aThis : moreThese) {
- if ((aThis != null) && !allThese.contains(aThis)) {
- allThese.add(aThis);
- computeAssociationRecursion(aThis, this2that, allThose, that2this, allThese);
+
+ private @Nullable PropertyStatus findAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) {
+ EReference that2thisEReference = this2thatEReference.getEOpposite();
+ assert that2thisEReference != null;
+ //
+ // Return a pre-existing AssociationStatus
+ //
+ for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) {
+ EReference eReference = associationStatus.getForwardEReference();
+ if (eReference == this2thatEReference) {
+ if (associationStatus.getFromClassStatuses().contains(classStatus)) {
+ return associationStatus;
+ }
+ }
+ if (eReference == that2thisEReference) {
+ if (associationStatus.getToClassStatuses().contains(classStatus)) {
+ return associationStatus;
+ }
}
}
+ return null;
}
- }
-
- protected @NonNull ClassStatus createClassStatus(/*@NonNull*/ Type type, @NonNull EObject eObject) {
- ClassStatus classStatus = EvaluationStatusFactory.eINSTANCE.createClassStatus();
- classStatus.setType(type);
- classStatus.setEObject(eObject);
- object2ClassStatus.put(eObject, classStatus);
- transformationStatus.getOwnedClassStatuses().add(classStatus);
- return classStatus;
- }
-
- protected @NonNull MappingStatus createMappingStatus(@NonNull MappingCall mappingCall) {
- MappingStatus mappingStatus = EvaluationStatusFactory.eINSTANCE.createMappingStatus();
- mappingStatus.setReferredMappingCall(mappingCall);
- List<Object> boundValues = mappingStatus.getBoundValues();
- for (MappingCallBinding binding : mappingCall.getBinding()) {
- Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable());
- Object valueOrValues = getValueOf(boundVariable);
- boundValues.add(valueOrValues);
+
+ private @Nullable AttributeStatus findAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) {
+ //
+ // Return a pre-existing AttributeStatus
+ //
+ for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
+ if (attributeStatus.getEFeature() == eFeature) {
+ return attributeStatus;
+ }
+ }
+ return null;
}
- transformationStatus.getOwnedMappingStatuses().add(mappingStatus);
- return mappingStatus;
- }
- protected void flushUnblockedMappings(@NonNull EvaluationVisitor undecoratedVisitor) {
- while (unblockedMappingStatuses != null) {
- List<MappingStatus> unblockingMappingStatuses = new ArrayList<MappingStatus>(unblockedMappingStatuses);
- unblockedMappingStatuses = null;
- for (@SuppressWarnings("null")@NonNull MappingStatus unblockingMappingStatus : unblockingMappingStatuses) {
- internalExecuteMappingCallRetry(unblockingMappingStatus, undecoratedVisitor);
+ private @Nullable ClassStatus findClassStatus(@NonNull EObject eObject) {
+ return object2ClassStatus.get(eObject);
+ }
+
+ public @Nullable PropertyStatus findPropertyStatus(@NonNull EObject thisObject, @NonNull Property property) {
+ EObject eFeature = property.getESObject();
+ ClassStatus classStatus = findClassStatus(thisObject);
+ if (classStatus == null) {
+ return null;
+ }
+ if (eFeature instanceof EReference) {
+ EReference eReference = (EReference)eFeature;
+ if (eReference.getEOpposite() != null) {
+ return findAssociationStatus(classStatus, thisObject, eReference);
+ }
+ }
+ if (eFeature instanceof EStructuralFeature) {
+ return findAttributeStatus(classStatus, (EStructuralFeature)eFeature);
+ }
+ else if (property.isIsImplicit()) { // Workaround Bug 463966
+ throw new UnsupportedOperationException();
+ }
+ else {
+ throw new UnsupportedOperationException();
}
}
- }
- protected @NonNull PropertyStatus getAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) {
- EReference that2thisEReference = this2thatEReference.getEOpposite();
- assert that2thisEReference != null;
- //
- // Return a pre-existing AssociationStatus
- //
- for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) {
- EReference eReference = associationStatus.getForwardEReference();
- if (eReference == this2thatEReference) {
- if (associationStatus.getFromClassStatuses().contains(classStatus)) {
- return associationStatus;
- }
- }
- if (eReference == that2thisEReference) {
- if (associationStatus.getToClassStatuses().contains(classStatus)) {
- return associationStatus;
- }
- }
- }
- //
- // Identify the participating EObjects, recursing for M:N associations
- //
- Set<EObject> allThese = new HashSet<EObject>();
- allThese.add(thisObject);
- Set<EObject> allThose = new HashSet<EObject>();
- computeAssociationRecursion(thisObject, this2thatEReference, allThose, that2thisEReference, allThese);
- //
- // Create a new AssociationStatus
- //
- AssociationStatus associationStatus = EvaluationStatusFactory.eINSTANCE.createAssociationStatus();
- associationStatus.setForwardEReference(this2thatEReference);
- //
- List<ClassStatus> fromClassStatuses = associationStatus.getFromClassStatuses();
- for (EObject aThis : allThese) {
- ClassStatus fromClassStatus = object2ClassStatus.get(aThis);
- if (fromClassStatus != null) {
- fromClassStatuses.add(fromClassStatus);
- fromClassStatus.getAssociationStatuses().add(associationStatus);
- if (fromClassStatus.isIsInput()) {
- associationStatus.setIsInput(true);
- }
- if (fromClassStatus.isIsOutput()) {
- associationStatus.setIsOutput(true);
- associationStatus.setIsAssignable(true);
+ private @NonNull PropertyStatus getAssociationStatus(@NonNull ClassStatus classStatus, @NonNull EObject thisObject, @NonNull EReference this2thatEReference) {
+ EReference that2thisEReference = this2thatEReference.getEOpposite();
+ assert that2thisEReference != null;
+ //
+ // Return a pre-existing AssociationStatus
+ //
+ for (AssociationStatus associationStatus : classStatus.getAssociationStatuses()) {
+ EReference eReference = associationStatus.getForwardEReference();
+ if (eReference == this2thatEReference) {
+ if (associationStatus.getFromClassStatuses().contains(classStatus)) {
+ return associationStatus;
+ }
}
- else {
- associationStatus.setIsAssigned(true);
+ if (eReference == that2thisEReference) {
+ if (associationStatus.getToClassStatuses().contains(classStatus)) {
+ return associationStatus;
+ }
+ }
+ }
+ //
+ // Identify the participating EObjects, recursing for M:N associations
+ //
+ Set<EObject> allThese = new HashSet<EObject>();
+ allThese.add(thisObject);
+ Set<EObject> allThose = new HashSet<EObject>();
+ computeAssociationRecursion(thisObject, this2thatEReference, allThose, that2thisEReference, allThese);
+ //
+ // Create a new AssociationStatus
+ //
+ AssociationStatus associationStatus = EvaluationStatusFactory.eINSTANCE.createAssociationStatus();
+ associationStatus.setForwardEReference(this2thatEReference);
+ //
+ List<ClassStatus> fromClassStatuses = associationStatus.getFromClassStatuses();
+ for (EObject aThis : allThese) {
+ ClassStatus fromClassStatus = object2ClassStatus.get(aThis);
+ if (fromClassStatus != null) {
+ fromClassStatuses.add(fromClassStatus);
+ fromClassStatus.getAssociationStatuses().add(associationStatus);
+ if (fromClassStatus.isIsInput()) {
+ associationStatus.setIsInput(true);
+ }
+ if (fromClassStatus.isIsOutput()) {
+ associationStatus.setIsOutput(true);
+ associationStatus.setIsAssignable(true);
+ }
+ else {
+ associationStatus.setIsAssigned(true);
+ }
+ }
+ }
+ //
+ List<ClassStatus> toClassStatuses = associationStatus.getToClassStatuses();
+ for (EObject aThat : allThose) {
+ ClassStatus toClassStatus = object2ClassStatus.get(aThat);
+ if (toClassStatus != null) {
+ toClassStatuses.add(toClassStatus);
+ toClassStatus.getAssociationStatuses().add(associationStatus);
+ if (toClassStatus.isIsInput()) {
+ associationStatus.setIsInput(true);
+ }
+ if (toClassStatus.isIsOutput()) {
+ associationStatus.setIsOutput(true);
+ associationStatus.setIsAssignable(true);
+ }
+ else {
+ associationStatus.setIsAssigned(true);
+ }
}
}
+ //
+ transformationStatus.getOwnedAssociationStatuses().add(associationStatus);
+ return associationStatus;
+ }
+
+ private @NonNull AttributeStatus getAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) {
+ //
+ // Return a pre-existing AttributeStatus
+ //
+ for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
+ if (attributeStatus.getEFeature() == eFeature) {
+ return attributeStatus;
+ }
+ }
+ //
+ // Create a new AttributeStatus
+ //
+ AttributeStatus attributeStatus = EvaluationStatusFactory.eINSTANCE.createAttributeStatus();
+ attributeStatus.setEFeature(eFeature);
+ classStatus.getOwnedAttributeStatuses().add(attributeStatus);
+ if (classStatus.isIsOutput()) {
+ attributeStatus.setIsAssignable(true);
+ }
+ else {
+ attributeStatus.setIsAssigned(true);
+ }
+ return attributeStatus;
}
- //
- List<ClassStatus> toClassStatuses = associationStatus.getToClassStatuses();
- for (EObject aThat : allThose) {
- ClassStatus toClassStatus = object2ClassStatus.get(aThat);
- if (toClassStatus != null) {
- toClassStatuses.add(toClassStatus);
- toClassStatus.getAssociationStatuses().add(associationStatus);
- if (toClassStatus.isIsInput()) {
- associationStatus.setIsInput(true);
+
+ public @NonNull ClassStatus getClassStatus(@Nullable DomainUsage domainUsage, /*@NonNull*/ Type type, @NonNull EObject eObject) {
+ ClassStatus classStatus = object2ClassStatus.get(eObject);
+ if (classStatus == null) {
+ classStatus = createClassStatus(type, eObject);
+ if ((domainUsage == null) || !isOut(domainUsage)) {
+ classStatus.setIsInput(true);
+ }
+ if ((domainUsage == null) || !isIn(domainUsage)) {
+ classStatus.setIsOutput(true);
+ }
+ }
+ return classStatus;
+ }
+
+ public @NonNull PropertyStatus getPropertyStatus(@Nullable DomainUsage domainUsage, @NonNull EObject thisObject, @NonNull Property property) {
+ EObject eFeature = property.getESObject();
+ ClassStatus classStatus = getClassStatus(domainUsage, property.getOwningClass(), thisObject);
+ PropertyStatus propertyStatus = null;
+ if (eFeature instanceof EReference) {
+ EReference eReference = (EReference)eFeature;
+ if (eReference.getEOpposite() != null) {
+ propertyStatus = getAssociationStatus(classStatus, thisObject, eReference);
}
- if (toClassStatus.isIsOutput()) {
- associationStatus.setIsOutput(true);
- associationStatus.setIsAssignable(true);
+ }
+ if (propertyStatus == null) {
+ if (eFeature instanceof EStructuralFeature) {
+ propertyStatus = getAttributeStatus(classStatus, (EStructuralFeature)eFeature);
+ }
+ else if (property.isIsImplicit()) { // Workaround Bug 463966
+ throw new UnsupportedOperationException();
}
else {
- associationStatus.setIsAssigned(true);
+ throw new UnsupportedOperationException();
}
}
+ if ((domainUsage != null) && /*(propertyStatus != null) && */isIn(domainUsage) && !mappingAnalysis.isAssigned(property, domainUsage)) {
+ propertyStatus.setIsAssignable(false);
+ propertyStatus.setIsAssigned(true);
+ }
+ return propertyStatus;
}
- //
- transformationStatus.getOwnedAssociationStatuses().add(associationStatus);
- return associationStatus;
- }
-
- protected @NonNull AttributeStatus getAttributeStatus(@NonNull ClassStatus classStatus, @NonNull EStructuralFeature eFeature) {
- //
- // Return a pre-existing AttributeStatus
- //
- for (AttributeStatus attributeStatus : classStatus.getOwnedAttributeStatuses()) {
- if (attributeStatus.getEFeature() == eFeature) {
- return attributeStatus;
- }
- }
- //
- // Create a new AttributeStatus
- //
- AttributeStatus attributeStatus = EvaluationStatusFactory.eINSTANCE.createAttributeStatus();
- attributeStatus.setEFeature(eFeature);
- classStatus.getOwnedAttributeStatuses().add(attributeStatus);
- if (classStatus.isIsOutput()) {
- attributeStatus.setIsAssignable(true);
+
+ public @NonNull TransformationStatus getTransformationStatus() {
+ return transformationStatus;
}
- else {
- attributeStatus.setIsAssigned(true);
+
+ private boolean isIn(@NonNull DomainUsage domainUsage) {
+ return !domainUsage.isEnforceable();
}
- return attributeStatus;
- }
- protected @NonNull ClassStatus getClassStatus(@NonNull Usage usage, /*@NonNull*/ Type type, @NonNull EObject eObject) {
- ClassStatus classStatus = object2ClassStatus.get(eObject);
- if (classStatus == null) {
- classStatus = createClassStatus(type, eObject);
- if (usage != Usage.OUT) {
- classStatus.setIsInput(true);
+ private boolean isOut(@NonNull DomainUsage domainUsage) {
+ return domainUsage.isEnforceable() && !domainUsage.isCheckable();
+ }
+
+ /**
+ * Re-execute the dirtyMappingStatuses resulting from property value changes, and transitively any
+ * downstream mappingStatuses affected by the re-execution.
+ */
+ public void repairDamage() {
+ Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
+ if (dirtyMappingStatuses2 != null) {
+ List<Set<MappingStatus>> depth2dirtyMappingStatuses = new ArrayList<Set<MappingStatus>>();
+ for (int cleanDepth = 0; cleanDepth < depth2dirtyMappingStatuses.size(); cleanDepth++) {
+ if (dirtyMappingStatuses2.size() > 0) {
+ allocateDirtyMappingStatuses(depth2dirtyMappingStatuses, dirtyMappingStatuses2);
+ }
+ Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(cleanDepth);
+ if (mappingStatuses != null) {
+// for (MappingStatus mappingStatus : mappingStatuses) {
+// }
+ }
+ depth2dirtyMappingStatuses.set(cleanDepth, null);
+ }
+ dirtyMappingStatuses = null;
}
- if (usage != Usage.IN) {
- classStatus.setIsOutput(true);
+ }
+
+ protected void setNewValue(@NonNull PropertyStatus propertyStatus, @Nullable Object newValue) {
+ if (!propertyStatus.isIsDirty()) {
+ if (propertyStatus instanceof AttributeStatus) {
+ AttributeStatus attributeStatus = (AttributeStatus)propertyStatus;
+ Object oldValue = attributeStatus.getObject();
+ if (!ClassUtil.safeEquals(newValue, oldValue)) {
+ attributeStatus.setIsDirty(true);
+ attributeStatus.setObject(newValue);
+ }
+ }
+ else {
+ }
+ for (MappingStatus mappingStatus : propertyStatus.getTargets()) {
+ mappingStatus.setIsDirty(true);
+ Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
+ if (dirtyMappingStatuses2 == null) {
+ dirtyMappingStatuses = dirtyMappingStatuses2 = new HashSet<MappingStatus>();
+ }
+ dirtyMappingStatuses2.add(mappingStatus);
+ }
}
}
- return classStatus;
}
- public String getEvaluationStatusGraph() {
- GraphMLBuilder s = new GraphMLBuilder();
- transformationStatus.accept(new EvaluationStatus2GraphVisitor(s));
- return s.toString();
- }
+ /**
+ * MappingAnalysis manages additional properties determined by analysis of the Transformation or Mappings..
+ */
+ private static class MappingAnalysis
+ {
+ private final @NonNull QVTiTransformationAnalysis transformationAnalysis;
+ private final @NonNull Set<Property> hazardousProperties = new HashSet<Property>();
+ private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments;
+ private final @NonNull Map<Property, Set<PropertyAssignment>> property2propertyAssignments = new HashMap<Property, Set<PropertyAssignment>>();
- protected @Nullable MappingStatus getMappingStatus() {
- if (mappingStatusStack.isEmpty()) {
- return null;
- }
- MappingStatus mappingStatus = mappingStatusStack.peek();
- assert mappingStatus != null;
- return mappingStatus;
- }
-
- protected @NonNull PropertyStatus getPropertyStatus(@NonNull Usage usage, @NonNull EObject thisObject, @NonNull Property property) {
- EObject eFeature = property.getESObject();
- ClassStatus classStatus = getClassStatus(usage, property.getOwningClass(), thisObject);
- if (eFeature instanceof EReference) {
- EReference eReference = (EReference)eFeature;
- if (eReference.getEOpposite() != null) {
- return getAssociationStatus(classStatus, thisObject, eReference);
+ public MappingAnalysis(@NonNull QVTiTransformationAnalysis transformationAnalysis) {
+ this.transformationAnalysis = transformationAnalysis;
+ Set<Mapping> hazardousMappings = transformationAnalysis.getHazardousMappings();
+ for (Map.Entry<Mapping, Set<Property>> entry : transformationAnalysis.getMapping2Property().entrySet()) {
+ Mapping mapping = entry.getKey();
+ if (hazardousMappings.contains(mapping)) {
+ hazardousProperties.addAll(entry.getValue());
+ }
+ }
+ mapping2propertyAssignments = transformationAnalysis.getMapping2PropertyAssignments();
+ for (Set<PropertyAssignment> propertyAssignments : mapping2propertyAssignments.values()) {
+ for (PropertyAssignment propertyAssignment : propertyAssignments) {
+ Property property = propertyAssignment.getTargetProperty();
+ Set<PropertyAssignment> assignments = property2propertyAssignments.get(property);
+ if (assignments == null) {
+ assignments = new HashSet<PropertyAssignment>();
+ property2propertyAssignments.put(property, assignments);
+ }
+ assignments.add(propertyAssignment);
+ }
}
}
- if (eFeature instanceof EStructuralFeature) {
- return getAttributeStatus(classStatus, (EStructuralFeature)eFeature);
- }
- else if (property.isIsImplicit()) { // Workaround Bug 463966
- throw new UnsupportedOperationException();
- }
- else {
- throw new UnsupportedOperationException();
- }
- }
- protected @NonNull Usage getUsageForMetamodelElement(@NonNull Element element) {
-/* EObject eContainer = null;
- ExpressionInOCL expressionInOCL = null;
- EReference eFeature = null;
- for (EObject eChild = element; (eContainer = eChild.eContainer()) != null; eChild = eContainer) {
-// if (eContainer instanceof ExpressionInOCL) {
-// expressionInOCL = (ExpressionInOCL)eContainer;
-// eFeature = eChild.eContainmentFeature();
-// break;
-// }
- if (eContainer instanceof Operation) {
- DomainUsageAnalysis operationUsageAnalysis = usageAnalysis.analyzeOperation((Operation)eContainer);
- QVTiEvaluationEnvironment evaluationEnvironment = getEvaluationEnvironment();
- break;
+ public boolean hasHazardousRead(@NonNull MappingCall mappingCall) {
+ for (MappingCallBinding callBinding : mappingCall.getBinding()) {
+ if (callBinding.isIsPolled()) {
+ return true;
+ }
}
- if (eContainer instanceof Pattern) {
- break;
+ return false;
+ }
+
+ public boolean hasHazardousWrite(@NonNull MappingCall mappingCall) {
+ Mapping mapping = mappingCall.getReferredMapping();
+ Set<PropertyAssignment> propertyAssignments = mapping2propertyAssignments.get(mapping);
+ if (propertyAssignments == null) {
+ return false;
}
- if (eContainer instanceof Rule) {
- break;
+ for (PropertyAssignment propertyAssignment : propertyAssignments) {
+ Property assignedProperty = propertyAssignment.getTargetProperty();
+ if (hazardousProperties.contains(assignedProperty)) {
+ return true;
+ }
}
- if (eContainer instanceof org.eclipse.ocl.pivot.Class) {
- break;
+ return false;
+ }
+
+ public boolean isAssigned(@NonNull Property targetProperty, @NonNull DomainUsage domainUsage) {
+ Set<PropertyAssignment> propertyAssignments = property2propertyAssignments.get(targetProperty);
+ if (propertyAssignments == null) {
+ return false;
}
- if (eContainer instanceof org.eclipse.ocl.pivot.Package) {
- break;
+ for (PropertyAssignment propertyAssignment : propertyAssignments) {
+ OCLExpression slotExpression = propertyAssignment.getSlotExpression();
+ DomainUsage slotUsage = transformationAnalysis.getDomainUsageAnalysis().getUsage(slotExpression);
+ if (domainUsage == slotUsage) {
+ return true;
+ }
}
+ return false;
}
- if (expressionInOCL != null) {
- DomainUsage domainUsage1 = transformationAnalysis.get(element);
- DomainUsage domainUsage3 = transformationAnalysis.get(expressionInOCL);
- DomainUsage domainUsage2 = transformationAnalysis.get(eFeature);
-
- }
- DomainUsage domainUsage = transformationAnalysis.get(element); */
- DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(element);
- if (domainUsage == null) {
- return Usage.INOUT;
+
+ public boolean isHazardous(@NonNull Property targetProperty) {
+ return hazardousProperties.contains(targetProperty);
}
- else if (!domainUsage.isEnforceable()) {
- return Usage.IN;
+
+ }
+
+ /**
+ * MappingInvocations manages the potentially repested mapping invocations, ensuring that repetitions are suppressed.
+ */
+ private static class MappingInvocations
+ {
+ protected final @NonNull EvaluationStatusManager statusManager;
+
+ private final @NonNull Map<Integer, List<MappingStatus>> map = new HashMap<Integer, List<MappingStatus>>();
+
+ public MappingInvocations(@NonNull EvaluationStatusManager statusManager) {
+ this.statusManager = statusManager;
}
- else if (domainUsage.isCheckable()) {
- return Usage.INOUT;
+
+ /**
+ * Return a new MappingStatus if mappingCall and boundValues represent a new mapping invocation.
+ * Return null if they represent a repeated invocation.
+ */
+ public @Nullable MappingStatus createUnrepeatedMappingStatus(@NonNull MappingCall mappingCall, @NonNull List<Object> boundValues) {
+ Mapping referredMapping = mappingCall.getReferredMapping();
+ int newHashCode = referredMapping.hashCode();
+ for (Object boundValue : boundValues) {
+ newHashCode = 3 * newHashCode + (boundValue != null ? boundValue.hashCode() : null);
+ }
+ List<MappingStatus> mappingStatuses = map.get(newHashCode);
+ if (mappingStatuses != null) {
+ for (MappingStatus oldMappingStatus : mappingStatuses) {
+ if (oldMappingStatus.getReferredMappingCall() == referredMapping) {
+ List<Object> oldValues = oldMappingStatus.getBoundValues();
+ if (oldValues.equals(boundValues)) {
+ return null;
+ }
+ }
+ }
+ }
+ else {
+ mappingStatuses = new ArrayList<MappingStatus>();
+ map.put(newHashCode, mappingStatuses);
+ }
+ MappingStatus newMappingStatus = statusManager.createMappingStatus(mappingCall, boundValues);
+ mappingStatuses.add(newMappingStatus);
+ return newMappingStatus;
}
- else {
- return Usage.OUT;
+ }
+
+ /**
+ * PendingInvocations manges the Mapping invocations that are initially blockeed as a result of a failure to excute
+ * and then unblocked once the problme is resulved and theya rea ready for a re-invocation.
+ */
+ private static class PendingInvocations
+ {
+ /**
+ * Mapping invocations that failed due to a not-ready value that is still not-ready.
+ */
+ private final @NonNull Set<MappingStatus> blockedMappingStatuses = new HashSet<MappingStatus>();
+
+ /**
+ * Non-null while mapping invocations that failed due to a not-ready value that is now ready.
+ */
+ private @Nullable Set<MappingStatus> unblockedMappingStatuses = null;
+
+ public void block(@NonNull MappingStatus mappingStatus) {
+ assert !mappingStatus.isIsBlocked();
+ mappingStatus.setIsBlocked(true);
+ blockedMappingStatuses.add(mappingStatus);
+ Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
+ if (unblockedMappingStatuses2 != null) {
+ unblockedMappingStatuses2.remove(mappingStatus);
+ }
}
-/* org.eclipse.ocl.pivot.Package asPackage = PivotUtil.getContainingPackage(element);
- if (!checkablePackages.contains(asPackage)) {
- return Usage.OUT;
+
+ public void flush(@NonNull QVTiIncrementalExecutor executor, @NonNull EvaluationVisitor undecoratedVisitor) {
+ while (unblockedMappingStatuses != null) {
+ List<MappingStatus> unblockingMappingStatuses = new ArrayList<MappingStatus>(unblockedMappingStatuses);
+ unblockedMappingStatuses = null;
+ for (@SuppressWarnings("null")@NonNull MappingStatus unblockingMappingStatus : unblockingMappingStatuses) {
+ executor.internalExecuteMappingCallRetry(unblockingMappingStatus, undecoratedVisitor);
+ }
+ }
}
- else if (!enforceablePackages.contains(asPackage)) {
- return Usage.IN;
+
+ public void unblock(@NonNull MappingStatus mappingStatus) {
+ assert mappingStatus.isIsBlocked();
+ boolean didRemove = blockedMappingStatuses.remove(mappingStatus);
+ assert didRemove;
+ mappingStatus.setIsBlocked(false);
+ Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
+ if (unblockedMappingStatuses2 == null) {
+ unblockedMappingStatuses = unblockedMappingStatuses2 = new HashSet<MappingStatus>();
+ }
+ boolean didAdd = unblockedMappingStatuses2.add(mappingStatus);
+ assert didAdd;
}
- else {
- return Usage.INOUT;
- } */
+ }
+
+ protected final @NonNull Mode mode;
+ protected final @NonNull PendingInvocations pendingInvocations = new PendingInvocations();
+ protected final @NonNull MappingAnalysis mappingAnalysis;
+ protected final @NonNull Stack<MappingStatus> mappingStatusStack = new Stack<MappingStatus>();
+ protected final @NonNull EvaluationStatusManager statusManager;
+ protected final @NonNull MappingInvocations mappingInvocations;
+
+ public QVTiIncrementalExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull URI transformationURI, @NonNull Mode mode) throws IOException {
+ super(environmentFactory, transformationURI);
+ this.mode = mode;
+ QVTiTransformationAnalysis transformationAnalysis = getModelManager().getTransformationAnalysis();
+ this.mappingAnalysis = new MappingAnalysis(transformationAnalysis);
+ this.statusManager = new EvaluationStatusManager(mappingAnalysis);
+ this.mappingInvocations = new MappingInvocations(statusManager);
}
-// protected @NonNull Usage getUsageForTransformationElement(@NonNull Element element) {
-// Domain domain = QVTimperativeUtil.getContainingDomain(element);
-// return domain == null ? Usage.INOUT : Usage.OUT;
-// }
-
+ protected @Nullable MappingStatus findMappingStatus() {
+ if (mappingStatusStack.isEmpty()) {
+ return null;
+ }
+ MappingStatus mappingStatus = mappingStatusStack.peek();
+// assert mappingStatus != null;
+ return mappingStatus;
+ }
+
+ public @NonNull TransformationStatus getTransformationStatus() {
+ return statusManager.getTransformationStatus();
+ }
+
@Override
public @Nullable Object internalExecuteMappingCall(@NonNull MappingCall mappingCall, @NonNull EvaluationVisitor undecoratedVisitor) {
- MappingStatus mappingStatus = createMappingStatus(mappingCall);
+ List<Object> newBoundValues = new ArrayList<Object>();
+ for (MappingCallBinding binding : mappingCall.getBinding()) {
+ Variable boundVariable = ClassUtil.nonNullModel(binding.getBoundVariable());
+ Object valueOrValues = getValueOf(boundVariable);
+ newBoundValues.add(valueOrValues);
+ }
+ MappingStatus mappingStatus = null;
+ if (mappingCall.isIsInfinite()) {
+ mappingStatus = mappingInvocations.createUnrepeatedMappingStatus(mappingCall, newBoundValues);
+ if (mappingStatus == null) {
+ return false;
+ }
+ }
+ if ((mode != Mode.LAZY) || mappingAnalysis.hasHazardousRead(mappingCall) || mappingAnalysis.hasHazardousWrite(mappingCall)) {
+ mappingStatus = statusManager.createMappingStatus(mappingCall, newBoundValues);
+ }
mappingStatusStack.push(mappingStatus);
try {
- return super.internalExecuteMappingCall(mappingCall, undecoratedVisitor);
+ Object returnStatus = super.internalExecuteMappingCall(mappingCall, undecoratedVisitor);
+ mappingStatusStack.pop();
+ pendingInvocations.flush(this, undecoratedVisitor);
+ return returnStatus;
}
catch (NotReadyValueException e) {
+ mappingStatusStack.pop();
+ if (mappingStatus == null) { // If LAZY execution deferred creating the MappingStatus
+ mappingStatus = statusManager.createMappingStatus(mappingCall, newBoundValues);
+ }
if (!mappingStatus.isIsBlocked()) {
- block(mappingStatus);
+ pendingInvocations.block(mappingStatus);
}
+ return false;
}
- finally {
- mappingStatusStack.pop();
- }
- if (unblockedMappingStatuses != null) {
- flushUnblockedMappings(undecoratedVisitor);
- }
- return null;
}
protected void internalExecuteMappingCallRetry(@NonNull MappingStatus mappingStatus, @NonNull EvaluationVisitor undecoratedVisitor) {
@@ -434,7 +666,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
}
catch (NotReadyValueException e) {
if (!mappingStatus.isIsBlocked()) {
- block(mappingStatus);
+ pendingInvocations.block(mappingStatus);
}
}
finally {
@@ -444,30 +676,34 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
@Override
public @Nullable Object internalExecuteNavigationCallExp(@NonNull NavigationCallExp navigationCallExp, @NonNull Property referredProperty, @Nullable Object object) {
- Object propertyValue = super.internalExecuteNavigationCallExp(navigationCallExp, referredProperty, object); // FIXME values
- MappingStatus mappingStatus = getMappingStatus();
- if (mappingStatus == null) {
- return propertyValue;
- }
- assert object != null;
- Usage usage = getUsageForMetamodelElement(navigationCallExp);
- PropertyStatus propertyStatus = getPropertyStatus(usage, (EObject)object, referredProperty);
- if (usage == Usage.IN) {
+ MappingStatus mappingStatus = findMappingStatus();
+ PropertyStatus propertyStatus = null;
+ if ((mappingStatus != null) && mappingAnalysis.isHazardous(referredProperty)) {
+ assert object != null;
+ OCLExpression source = navigationCallExp.getOwnedSource();
+ DomainUsage domainUsage = source != null ? getEvaluationEnvironment().getUsageFor(source) : null;
+ propertyStatus = statusManager.getPropertyStatus(domainUsage, (EObject)object, referredProperty);
+ List<ElementStatus> mappingInputs = mappingStatus.getInputs();
+ if (!mappingInputs.contains(propertyStatus)) {
+ mappingInputs.add(propertyStatus);
+ }
+ if (!propertyStatus.isIsAssigned()) {
+ Type type = referredProperty.getType();
+ if (!(type instanceof CollectionType) || (((CollectionType)type).getLowerValue().signum() > 0)) {
+ propertyStatus.setIsError(true);
+ throw new NotReadyValueException("Reading unassigned value");
+ }
+ }
propertyStatus.setIsAssignable(false);
- propertyStatus.setIsAssigned(true);
}
- List<ElementStatus> mappingInputs = mappingStatus.getInputs();
- if (!mappingInputs.contains(propertyStatus)) {
- mappingInputs.add(propertyStatus);
+ Object propertyValue = super.internalExecuteNavigationCallExp(navigationCallExp, referredProperty, object); // FIXME values
+ if (mode == Mode.LAZY) {
+ return propertyValue;
}
- if (!propertyStatus.isIsAssigned()) {
- Type type = referredProperty.getType();
- if (!(type instanceof CollectionType) || (((CollectionType)type).getLowerValue().signum() > 0)) {
- propertyStatus.setIsError(true);
- throw new NotReadyValueException("Reading unassigned value");
- }
+// MappingStatus mappingStatus = findMappingStatus();
+ if (mappingStatus == null) {
+ return propertyValue;
}
- propertyStatus.setIsAssignable(false);
if (propertyStatus instanceof AttributeStatus) {
AttributeStatus attributeStatus = (AttributeStatus)propertyStatus;
@@ -508,13 +744,22 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
@Override
public @Nullable Object internalExecutePropertyAssignment(@NonNull PropertyAssignment propertyAssignment, @NonNull Object object, @Nullable Object ecoreValue) {
Object propertyValue = super.internalExecutePropertyAssignment(propertyAssignment, object, ecoreValue);
- Usage usage = getUsageForMetamodelElement(propertyAssignment);
Property targetProperty = propertyAssignment.getTargetProperty();
assert targetProperty != null;
- PropertyStatus propertyStatus = getPropertyStatus(usage, (EObject)object, targetProperty);
- MappingStatus mappingStatus = getMappingStatus();
- assert mappingStatus != null;
- mappingStatus.getOutputs().add(propertyStatus);
+ PropertyStatus propertyStatus;
+ if ((mode == Mode.LAZY) && !mappingAnalysis.isHazardous(targetProperty)) {
+ propertyStatus = statusManager.findPropertyStatus((EObject)object, targetProperty);
+ if (propertyStatus == null) {
+ return propertyValue;
+ }
+ }
+ else {
+ DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(propertyAssignment.getSlotExpression());
+ propertyStatus = statusManager.getPropertyStatus(domainUsage, (EObject)object, targetProperty);
+ MappingStatus mappingStatus = findMappingStatus();
+ assert mappingStatus != null;
+ mappingStatus.getOutputs().add(propertyStatus);
+ }
if (!propertyStatus.isIsAssignable()) { // Pure input
propertyValue = new InvalidValueException("Illegal assignment");
propertyStatus.setIsError(true);
@@ -524,7 +769,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
propertyStatus.setIsError(false);
for (MappingStatus targetMappingStatus : propertyStatus.getTargets()) {
if (targetMappingStatus.isIsBlocked()) {
- unblock(targetMappingStatus);
+ pendingInvocations.unblock(targetMappingStatus);
}
}
if (propertyStatus instanceof AttributeStatus) {
@@ -537,7 +782,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
if (!ClassUtil.safeEquals(propertyValue, oldValue)) {
for (MappingStatus targetMappingStatus : attributeStatus.getTargets()) {
targetMappingStatus.setIsDirty(true);
- unblock(targetMappingStatus);
+ pendingInvocations.unblock(targetMappingStatus);
}
}
}
@@ -563,14 +808,13 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
}
return propertyValue;
}
-
@Override
public @Nullable Object internalExecuteRealizedVariable(@NonNull RealizedVariable realizedVariable, @NonNull EvaluationVisitor undecoratedVisitor) {
Object element = super.internalExecuteRealizedVariable(realizedVariable, undecoratedVisitor);
- if (element != null) {
- Usage usage = getUsageForMetamodelElement(realizedVariable);
- ClassStatus classStatus = getClassStatus(usage, realizedVariable.getType(), (EObject)element);
- MappingStatus mappingStatus = getMappingStatus();
+ if ((element != null) && (mode == Mode.INCREMENTAL)) {
+ DomainUsage domainUsage = getEvaluationEnvironment().getUsageFor(realizedVariable);
+ ClassStatus classStatus = statusManager.getClassStatus(domainUsage, realizedVariable.getType(), (EObject)element);
+ MappingStatus mappingStatus = findMappingStatus();
assert mappingStatus != null;
mappingStatus.getOutputs().add(classStatus);
}
@@ -580,70 +824,7 @@ public class QVTiIncrementalExecutor extends BasicQVTiExecutor
@Override
public @Nullable Object internalExecuteTransformation(@NonNull Transformation transformation, @NonNull EvaluationVisitor undecoratedVisitor) {
Object returnStatus = super.internalExecuteTransformation(transformation, undecoratedVisitor);
- flushUnblockedMappings(undecoratedVisitor);
+ pendingInvocations.flush(this, undecoratedVisitor);
return returnStatus;
}
-
- public void printEvaluationStatus() {
- System.out.println(transformationStatus.toString());
- }
-
- /**
- * Re-execute the dirtyMappingStatuses resulting from property value changes, and transitively any
- * downstream mappingStatuses affected by the re-execution.
- */
- public void repairDamage() {
- Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
- if (dirtyMappingStatuses2 != null) {
- List<Set<MappingStatus>> depth2dirtyMappingStatuses = new ArrayList<Set<MappingStatus>>();
- for (int cleanDepth = 0; cleanDepth < depth2dirtyMappingStatuses.size(); cleanDepth++) {
- if (dirtyMappingStatuses2.size() > 0) {
- allocateDirtyMappingStatuses(depth2dirtyMappingStatuses, dirtyMappingStatuses2);
- }
- Set<MappingStatus> mappingStatuses = depth2dirtyMappingStatuses.get(cleanDepth);
- if (mappingStatuses != null) {
-// for (MappingStatus mappingStatus : mappingStatuses) {
-// }
- }
- depth2dirtyMappingStatuses.set(cleanDepth, null);
- }
- dirtyMappingStatuses = null;
- }
- }
-
- protected void setNewValue(@NonNull PropertyStatus propertyStatus, @Nullable Object newValue) {
- if (!propertyStatus.isIsDirty()) {
- if (propertyStatus instanceof AttributeStatus) {
- AttributeStatus attributeStatus = (AttributeStatus)propertyStatus;
- Object oldValue = attributeStatus.getObject();
- if (!ClassUtil.safeEquals(newValue, oldValue)) {
- attributeStatus.setIsDirty(true);
- attributeStatus.setObject(newValue);
- }
- }
- else {
- }
- for (MappingStatus mappingStatus : propertyStatus.getTargets()) {
- mappingStatus.setIsDirty(true);
- Set<MappingStatus> dirtyMappingStatuses2 = dirtyMappingStatuses;
- if (dirtyMappingStatuses2 == null) {
- dirtyMappingStatuses = dirtyMappingStatuses2 = new HashSet<MappingStatus>();
- }
- dirtyMappingStatuses2.add(mappingStatus);
- }
- }
- }
-
- protected void unblock(@NonNull MappingStatus mappingStatus) {
- assert mappingStatus.isIsBlocked();
- boolean didRemove = blockedMappingStatuses.remove(mappingStatus);
- assert didRemove;
- mappingStatus.setIsBlocked(false);
- Set<MappingStatus> unblockedMappingStatuses2 = unblockedMappingStatuses;
- if (unblockedMappingStatuses2 == null) {
- unblockedMappingStatuses = unblockedMappingStatuses2 = new HashSet<MappingStatus>();
- }
- boolean didAdd = unblockedMappingStatuses2.add(mappingStatus);
- assert didAdd;
- }
}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java
index f83ba32e1..2ff06b59c 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiNestedEvaluationEnvironment.java
@@ -63,7 +63,7 @@ public class QVTiNestedEvaluationEnvironment extends BasicEvaluationEnvironment
OperationCallExp operationCallExp = (OperationCallExp)callingObject;
Operation referredOperation = operationCallExp.getReferredOperation();
if (referredOperation != null) {
- usageAnalysis = usageAnalysis2 = getRootEvaluationEnvironment().getUsageAnalysis().getAnalysis(referredOperation);
+ usageAnalysis = usageAnalysis2 = getExecutor().getModelManager().getTransformationAnalysis().getDomainUsageAnalysis().getAnalysis(referredOperation);
// FIXME Surely we need to 'specialize' for the actual usage of callingObject
}
}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java
index bd600ec50..42c081e5d 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiRootEvaluationEnvironment.java
@@ -20,7 +20,7 @@ import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeDomainUsageAn
public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment implements QVTiEvaluationEnvironment
{
- private @Nullable QVTimperativeDomainUsageAnalysis usageAnalysis;
+// private @Nullable QVTimperativeDomainUsageAnalysis usageAnalysis;
public QVTiRootEvaluationEnvironment(@NonNull QVTiExecutor executor, @NonNull Transformation executableObject) {
super(executor, executableObject);
@@ -42,9 +42,15 @@ public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment im
assert executableObject2 != null;
return (Transformation) executableObject2;
}
-
+
@Override
public @Nullable DomainUsage getUsageFor(@NonNull Element element) {
+ QVTimperativeDomainUsageAnalysis usageAnalysis = getExecutor().getModelManager().getTransformationAnalysis().getDomainUsageAnalysis();;
+ return usageAnalysis.getUsage(element);
+ }
+
+/* @Override
+ public @Nullable DomainUsage getUsageFor(@NonNull Element element) {
QVTimperativeDomainUsageAnalysis usageAnalysis2 = usageAnalysis;
if (usageAnalysis2 == null) {
usageAnalysis2 = getUsageAnalysis();
@@ -59,5 +65,5 @@ public class QVTiRootEvaluationEnvironment extends BasicEvaluationEnvironment im
usageAnalysis2.analyzeTransformation(getTransformation());
}
return usageAnalysis2;
- }
+ } */
}
diff --git a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java
index f550988c2..a80cc3b8e 100644
--- a/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java
+++ b/plugins/org.eclipse.qvtd.pivot.qvtimperative/src/org/eclipse/qvtd/pivot/qvtimperative/evaluation/QVTiTransformationAnalysis.java
@@ -27,6 +27,7 @@ import org.eclipse.ocl.pivot.Operation;
import org.eclipse.ocl.pivot.OperationCallExp;
import org.eclipse.ocl.pivot.OppositePropertyCallExp;
import org.eclipse.ocl.pivot.Property;
+import org.eclipse.ocl.pivot.PropertyCallExp;
import org.eclipse.ocl.pivot.Type;
import org.eclipse.ocl.pivot.ids.IdManager;
import org.eclipse.ocl.pivot.ids.OperationId;
@@ -36,6 +37,8 @@ import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtcorebase.PropertyAssignment;
import org.eclipse.qvtd.pivot.qvtcorebase.analysis.DomainUsage;
+import org.eclipse.qvtd.pivot.qvtimperative.Mapping;
+import org.eclipse.qvtd.pivot.qvtimperative.MappingCallBinding;
import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperativeDomainUsageAnalysis;
/**
@@ -57,7 +60,6 @@ public class QVTiTransformationAnalysis
*/
private final @NonNull QVTimperativeDomainUsageAnalysis domainAnalysis;
-
/**
* Set of all types for which allInstances() is invoked.
*/
@@ -81,15 +83,27 @@ public class QVTiTransformationAnalysis
/**
* Map from oppositePropertyCallExp to the cache index identifying the relevant un-navigable lookup cache.
*/
- private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>();;
+ private final @NonNull Map<OppositePropertyCallExp, Integer> oppositePropertyCallExp2cacheIndex = new HashMap<OppositePropertyCallExp, Integer>();
/**
- * @deprecated Use EnvironmentFactoryInternal constructor
+ * Map from operation to the properties that it may access.
*/
- @Deprecated
- public QVTiTransformationAnalysis(@NonNull MetamodelManagerInternal metamodelManager) {
- this(metamodelManager.getEnvironmentFactory());
- }
+ private final @NonNull Map<Operation, Set<Property>> operation2property = new HashMap<Operation, Set<Property>>();
+
+ /**
+ * Map from mapping to the properties that it may access.
+ */
+ private final @NonNull Map<Mapping, Set<Property>> mapping2property = new HashMap<Mapping, Set<Property>>();
+
+ /**
+ * Map from mapping to the properties that it may assign.
+ */
+ private final @NonNull Map<Mapping, Set<PropertyAssignment>> mapping2propertyAssignments = new HashMap<Mapping, Set<PropertyAssignment>>();
+
+ /**
+ * Mappings that have an isPolled input.
+ */
+ private final @NonNull Set<Mapping> hazardousMappings = new HashSet<Mapping>();
public QVTiTransformationAnalysis(@NonNull EnvironmentFactoryInternal environmentFactory) {
this.environmentFactory = environmentFactory;
@@ -111,8 +125,73 @@ public class QVTiTransformationAnalysis
}
return cacheIndex;
}
+
+ private @NonNull Set<Property> analyzeMappingPropertyAccesses(@NonNull Mapping mapping) {
+ Set<Property> accessedProperties = mapping2property.get(mapping);
+ if (accessedProperties != null) {
+ return accessedProperties;
+ }
+ accessedProperties = new HashSet<Property>();
+ mapping2property.put(mapping, accessedProperties);
+ analyzeTree(accessedProperties, mapping.eAllContents());
+ return accessedProperties;
+ }
+
+ private @NonNull Set<PropertyAssignment> analyzeMappingPropertyAssignments(@NonNull Mapping mapping) {
+ Set<PropertyAssignment> assignedProperties = mapping2propertyAssignments.get(mapping);
+ if (assignedProperties == null) {
+ assignedProperties = new HashSet<PropertyAssignment>();
+ mapping2propertyAssignments.put(mapping, assignedProperties);
+ }
+ for (TreeIterator<EObject> treeIterator = mapping.eAllContents(); treeIterator.hasNext(); ) {
+ EObject eObject = treeIterator.next();
+ if (eObject instanceof PropertyAssignment) {
+ assignedProperties.add((PropertyAssignment) eObject);
+ }
+ }
+ return assignedProperties;
+ }
+
+ private @NonNull Set<Property> analyzeOperation(@NonNull Operation operation) {
+ Set<Property> operationProperties = operation2property.get(operation);
+ if (operationProperties != null) {
+ return operationProperties;
+ }
+ operationProperties = new HashSet<Property>();
+ operation2property.put(operation, operationProperties);
+ analyzeTree(operationProperties, operation.eAllContents());
+ return operationProperties;
+ }
+
+ protected void analyzeTree(@NonNull Set<Property> properties, /*@NonNull*/ TreeIterator<EObject> treeIterator) {
+ while (treeIterator.hasNext()) {
+ EObject eObject = treeIterator.next();
+ if (eObject instanceof OperationCallExp) {
+ Operation referredOperation = ((OperationCallExp)eObject).getReferredOperation();
+ if (referredOperation != null) {
+ properties.addAll(analyzeOperation(referredOperation));
+ }
+ }
+ else if (eObject instanceof PropertyCallExp) {
+ Property referredProperty = ((PropertyCallExp)eObject).getReferredProperty();
+ if (referredProperty != null) {
+ properties.add(referredProperty);
+ }
+ }
+ else if (eObject instanceof OppositePropertyCallExp) {
+ Property referredOppositeProperty = ((OppositePropertyCallExp)eObject).getReferredProperty();
+ if (referredOppositeProperty != null) {
+ Property referredProperty = referredOppositeProperty.getOpposite();
+ if (referredProperty != null) {
+ properties.add(referredProperty);
+ }
+ }
+ }
+ }
+ }
public void analyzeTransformation(@NonNull Transformation transformation) {
+ domainAnalysis.analyzeTransformation(transformation);
transformation.accept(QVTiTuneUpVisitor.INSTANCE);
//
// First pass
@@ -128,7 +207,18 @@ public class QVTiTransformationAnalysis
List<PropertyAssignment> propertyAssignments = new ArrayList<PropertyAssignment>();
for (TreeIterator<EObject> tit = transformation.eAllContents(); tit.hasNext(); ) {
EObject eObject = tit.next();
- if (eObject instanceof OppositePropertyCallExp) {
+ if (eObject instanceof Mapping) {
+ analyzeMappingPropertyAccesses((Mapping)eObject);
+ analyzeMappingPropertyAssignments((Mapping)eObject);
+ }
+ else if (eObject instanceof MappingCallBinding) {
+ MappingCallBinding mappingCallBinding = (MappingCallBinding)eObject;
+ if (mappingCallBinding.isIsPolled()) {
+ Mapping mapping = mappingCallBinding.getMappingCall().getReferredMapping();
+ hazardousMappings.add(mapping);
+ }
+ }
+ else if (eObject instanceof OppositePropertyCallExp) {
OppositePropertyCallExp oppositePropertyCallExp = (OppositePropertyCallExp)eObject;
Property navigableProperty = oppositePropertyCallExp.getReferredProperty();
if (navigableProperty != null) {
@@ -192,7 +282,7 @@ public class QVTiTransformationAnalysis
}
}
}
-
+
public @NonNull Set<org.eclipse.ocl.pivot.Class> getAllInstancesClasses() {
return allInstancesClasses;
}
@@ -212,6 +302,14 @@ public class QVTiTransformationAnalysis
public @NonNull Map<Property, Integer> getCaches() {
return property2cacheIndex;
}
+
+ public @NonNull QVTimperativeDomainUsageAnalysis getDomainUsageAnalysis() {
+ return domainAnalysis;
+ }
+
+ public @NonNull Set<Mapping> getHazardousMappings() {
+ return hazardousMappings;
+ }
/**
* Return a Map from each instanceClasses to the subset of instanceClasses that are transitive superClasses of the particular instanceClass.
@@ -238,6 +336,14 @@ public class QVTiTransformationAnalysis
return instancesClassAnalysis;
}
+ public @NonNull Map<Mapping, Set<Property>> getMapping2Property() {
+ return mapping2property;
+ }
+
+ public @NonNull Map<Mapping, Set<PropertyAssignment>> getMapping2PropertyAssignments() {
+ return mapping2propertyAssignments;
+ }
+
public @NonNull MetamodelManagerInternal getMetamodelManager() {
return environmentFactory.getMetamodelManager();
}
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
index d35306bc7..b686e372b 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/ExecutionBenchmarks.java
@@ -45,7 +45,7 @@ import org.eclipse.qvtd.xtext.qvtimperative.QVTimperativeStandaloneSetup;
import org.junit.Before;
import org.junit.Test;
-import cg.classescs2as_qvtp_qvtias;
+import cg._classescs2as_qvtp_qvtias.classescs2as_qvtp_qvtias;
/**
* @author asbh500
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias
index 8179e8c84..f28152239 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/src/org/eclipse/qvtd/cs2as/compiler/tests/models/example1/Source2Target.qvtias
@@ -9,12 +9,8 @@
<ownedImports importedNamespace="pivot:Model TargetLookup.ocl.oclas#/"/>
<ownedPackages xmi:id="P." name="">
<ownedClasses xsi:type="qvtb:Transformation" xmi:id="T..Source2Target_qvtp_qvtias" name="Source2Target_qvtp_qvtias">
- <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.leftCS" name="leftCS" usedPackage="SourceMM1.ecore.oclas#P.source">
- <ownedContext name="leftCS" type="pivot:Class http://www.eclipse.org/qvt/2015/QVTimperativeLibrary.oclas#T.qvtbaselibrary.Model"/>
- </modelParameter>
- <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.rightAS" name="rightAS" usedPackage="TargetMM1.ecore.oclas#P.target">
- <ownedContext name="rightAS" type="pivot:Class http://www.eclipse.org/qvt/2015/QVTimperativeLibrary.oclas#T.qvtbaselibrary.Model"/>
- </modelParameter>
+ <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.leftCS" name="leftCS" usedPackage="SourceMM1.ecore.oclas#P.source"/>
+ <modelParameter xmi:id="qT..Source2Target_qvtp_qvtias.rightAS" name="rightAS" usedPackage="TargetMM1.ecore.oclas#P.target"/>
<rule xsi:type="qvti:Mapping" xmi:id="m..Source2Target_qvtp_qvtias.cSRoot_2_TRoot" name="cSRoot_2_TRoot">
<domain xsi:type="qvtcb:CoreDomain" name="leftCS" isCheckable="true" isEnforceable="false" typedModel="#qT..Source2Target_qvtp_qvtias.leftCS">
<guardPattern>
@@ -262,18 +258,7 @@
</domain>
<guardPattern/>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.0"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.TRoot.ownedA">
<value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.0" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
<ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.1" referredProperty="SourceMM1.ecore.oclas#p.source.SRoot.ownedX">
<ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/>
@@ -282,17 +267,20 @@
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
<ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true"
- referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.8/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+ referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.8/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A"/>
</ownedBody>
<ownedIterators name="1_" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.OrderedSet.collect..T"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.TRoot.ownedA">
- <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.0" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.SRoot" referredVariable="#qV..Source2Target_qvtp_qvtias.uTRoot_ownedA.leftCS.guard.sRoot"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.TRoot"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -328,27 +316,18 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+ <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+ referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/>
+ </value>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
<ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1">
- <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.leftCS.guard.x"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_name.bottom._0"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -384,18 +363,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.2"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.leftCS.guard.x"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
<value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.2" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T">
<ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.3" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
<ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY">
@@ -403,7 +371,7 @@
</ownedSource>
<ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true"
- referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/>
+ referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y2"/>
</ownedBody>
@@ -412,17 +380,20 @@
<ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.10/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
</ownedBody>
<ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
- <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A3" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA3_ownsC.leftCS.guard.x"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A3"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -455,27 +426,18 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+ <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+ referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/>
+ </value>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
<ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1">
- <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.leftCS.guard.x"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_name.bottom._0"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -508,18 +470,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.2"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.leftCS.guard.x"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
<value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.2" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T">
<ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.3" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
<ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY">
@@ -527,7 +478,7 @@
</ownedSource>
<ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true"
- referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/>
+ referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y2"/>
</ownedBody>
@@ -536,17 +487,20 @@
<ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.12/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
</ownedBody>
<ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A2.ownsC">
- <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA2_ownsC.leftCS.guard.x"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -570,27 +524,18 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+ <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+ referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/>
+ </value>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
<ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1">
- <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredProperty="SourceMM1.ecore.oclas#p.source.X.name">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.leftCS.guard.x"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_name.bottom._0"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -614,18 +559,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1" name="_1" type="#//@ownedPackages.1/@ownedClasses.5"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.leftCS.guard.x"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A1.ownsB">
<value xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.5" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.Sequence.collect..T">
<ownedSource xsi:type="pivot:IteratorExp" name="collect" type="#//@ownedPackages.1/@ownedClasses.6" isImplicit="true" referredIteration="http://www.eclipse.org/ocl/2015/Library.oclas#i.ocl.OrderedSet.collect..T">
<ownedSource xsi:type="pivot:PropertyCallExp" type="#//@ownedPackages.1/@ownedClasses.4" referredProperty="SourceMM1.ecore.oclas#p.source.X.ownsY">
@@ -633,7 +567,7 @@
</ownedSource>
<ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y" isImplicit="true"
- referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.1/@value/@ownedSource/@ownedIterators.0"/>
+ referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.0/@value/@ownedSource/@ownedIterators.0"/>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class SourceMM1.ecore.oclas#T.source.Y1"/>
</ownedBody>
@@ -642,17 +576,20 @@
<ownedBody xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.1/@value/@ownedIterators.0"/>
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#//@ownedPackages.0/@ownedClasses.0/@rule.14/@bottomPattern/@assignment.0/@value/@ownedIterators.0"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class"
referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
</ownedBody>
<ownedIterators name="1_" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" representedParameter="http://www.eclipse.org/ocl/2015/Library.oclas#i0i.ocl.Sequence.collect..T"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.A1.ownsB">
- <value xsi:type="pivot:VariableExp" type="#//@ownedPackages.1/@ownedClasses.5" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.X" referredVariable="#qV..Source2Target_qvtp_qvtias.uA1_ownsB.leftCS.guard.x"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -669,18 +606,7 @@
</domain>
<guardPattern/>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1" name="_1" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.leftCS.guard.y1"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.B.ownsD">
<value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
@@ -690,10 +616,13 @@
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.B.ownsD">
- <value xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_ownsD.leftCS.guard.y1"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -710,27 +639,18 @@
</domain>
<guardPattern/>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uB_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+ <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+ referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/>
+ </value>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
<ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._1">
- <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y1" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.leftCS.guard.y1"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uB_name.bottom._0"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -747,18 +667,7 @@
</domain>
<guardPattern/>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1" name="_1" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.leftCS.guard.y2"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.C.ownsD">
<value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
@@ -768,10 +677,13 @@
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.C.ownsD">
- <value xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_ownsD.leftCS.guard.y2"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -788,27 +700,18 @@
</domain>
<guardPattern/>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_name.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uC_name.bottom._1" name="_1" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
+ <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
+ referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/>
+ </value>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
<ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/>
</ownedSource>
<ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._1">
- <value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredProperty="SourceMM1.ecore.oclas#p.source.Y.name">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Y2" isImplicit="true" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.leftCS.guard.y2"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.NamedElement.name">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:PrimitiveType http://www.eclipse.org/ocl/2015/Library.oclas#String"
- referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uC_name.bottom._0"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -839,18 +742,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.leftCS.guard.z"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
<value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredProperty="TargetMM1.ecore.oclas#p.target.C.toA2">
<ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -869,10 +761,13 @@
referredType="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
</ownedSource>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A2" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_toA.leftCS.guard.z"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -903,18 +798,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsC">
<value xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredOperation="TargetLookup.ocl.oclas#o.target.D.lookupC..source.Z">
<ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -926,10 +810,13 @@
</ownedSource>
<ownedArguments xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsC">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.C" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_0_refsC.leftCS.guard.z"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -956,18 +843,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.leftCS.guard.z"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
<value xsi:type="pivot:PropertyCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredProperty="TargetMM1.ecore.oclas#p.target.B.toA1">
<ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -986,10 +862,13 @@
referredType="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
</ownedSource>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.toA">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.A1" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_toA.leftCS.guard.z"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -1016,18 +895,7 @@
</predicate>
</guardPattern>
<bottomPattern>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0" name="_0" type="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- <variable xmi:id="qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1" name="_1" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B"/>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0">
- <value xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
- <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
- referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
- <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/>
- </ownedSource>
- <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
- </value>
- </assignment>
- <assignment xsi:type="qvtcb:VariableAssignment" targetVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1">
+ <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsB">
<value xsi:type="pivot:OperationCallExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredOperation="TargetLookup.ocl.oclas#o.target.D.lookupB..source.Z">
<ownedSource xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
<ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
@@ -1039,10 +907,13 @@
</ownedSource>
<ownedArguments xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/>
</value>
- </assignment>
- <assignment xsi:type="qvtcb:PropertyAssignment" isDefault="false" targetProperty="TargetMM1.ecore.oclas#p.target.D.refsB">
- <value xsi:type="pivot:VariableExp" isRequired="false" type="pivot:Class TargetMM1.ecore.oclas#T.target.B" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._1"/>
- <slotExpression xsi:type="pivot:VariableExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.bottom._0"/>
+ <slotExpression xsi:type="pivot:OperationCallExp" type="pivot:Class TargetMM1.ecore.oclas#T.target.D" referredOperation="http://www.eclipse.org/ocl/2015/Library.oclas#o.ocl.OclAny.oclAsType..TT">
+ <ownedSource xsi:type="pivot:PropertyCallExp" type="pivot:Class http://www.eclipse.org/emf/2002/Ecore.oclas#T.ecore.EObject"
+ referredProperty="SourceMM1.ecore.oclas#p.source.SElement.ast">
+ <ownedSource xsi:type="pivot:VariableExp" type="pivot:Class SourceMM1.ecore.oclas#T.source.Z" referredVariable="#qV..Source2Target_qvtp_qvtias.uD_1_refsB.leftCS.guard.z"/>
+ </ownedSource>
+ <ownedArguments xsi:type="pivot:TypeExp" type="pivot:Class http://www.eclipse.org/ocl/2015/Library.oclas#T.ocl.Class" referredType="pivot:Class TargetMM1.ecore.oclas#T.target.D"/>
+ </slotExpression>
</assignment>
</bottomPattern>
</rule>
@@ -1351,7 +1222,6 @@
</mappingStatements>
</mappingStatement>
</rule>
- <ownedContext name="this"/>
</ownedClasses>
</ownedPackages>
<ownedPackages xmi:id="P.$$" name="$$" URI="http://www.eclipse.org/ocl/2015/Orphanage" nsPrefix="orphanage">
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java
index 399644b48..e3f3be3a3 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/Source2Target_qvtp_qvtias.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_Source2Target_qvtp_qvtias/Source2Target_qvtp_qvtias.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg._Source2Target_qvtp_qvtias;
import example1.source.PathElementCS;
import example1.source.PathNameCS;
diff --git a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java
index 6c32eaea2..618b88f43 100644
--- a/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/classescs2as_qvtp_qvtias.java
+++ b/tests/org.eclipse.qvtd.cs2as.compiler.tests/tests-gen/cg/_classescs2as_qvtp_qvtias/classescs2as_qvtp_qvtias.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg._classescs2as_qvtp_qvtias;
import example2.classes.ClassesFactory;
import example2.classes.ClassesPackage;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java
index acc8518c8..71db8ee5f 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/ManualUML2RDBMS.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_ManualUML2RDBMS/ManualUML2RDBMS.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg._ManualUML2RDBMS;
import java.util.Collections;
import java.util.HashMap;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java
index da91ef1ba..b9c3fc178 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as/classescs2as.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg._classescs2as;
import classes.ClassesFactory;
import classes.ClassesPackage;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java
index 1bd49efda..1b80047bc 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/classescs2as_Bug459225.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_classescs2as_Bug459225/classescs2as_Bug459225.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg._classescs2as_Bug459225;
import classes.ClassesFactory;
import classes.ClassesPackage;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java
index 0f155cc46..b65d536ac 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/hsv2hls.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/_hsv2hls/hsv2hls.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg._hsv2hls;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java
index 8105203a0..92198e52f 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/SimpleUML2RDBMS.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src-gen/cg/test/SimpleUML2RDBMS.java
@@ -7,7 +7,7 @@
* Do not edit it.
********************************************************************************/
-package cg;
+package cg.test;
import java.util.HashMap;
import java.util.Iterator;
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
index 170aa7fda..2ef9e5633 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/QVTiInterpreterTests.java
@@ -41,8 +41,10 @@ import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
import org.eclipse.qvtd.pivot.qvtcorebase.QVTcoreBasePackage;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.BasicQVTiExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.evaluation.EvaluationStatus2GraphVisitor;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiEnvironmentFactory;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiIncrementalExecutor;
+import org.eclipse.qvtd.pivot.qvtimperative.utilities.GraphMLBuilder;
import org.eclipse.qvtd.pivot.qvtimperative.utilities.QVTimperative;
import org.eclipse.qvtd.xtext.qvtbase.tests.LoadTestCase;
import org.eclipse.qvtd.xtext.qvtbase.tests.utilities.TestsXMLUtil;
@@ -69,6 +71,10 @@ public class QVTiInterpreterTests extends LoadTestCase
return new MyQvtiExecutor(getEnvironmentFactory(), fileNamePrefix, transformationFileName);
}
+ public @NonNull MyQvtiExecutor createEvaluator(@NonNull String fileNamePrefix, @NonNull String transformationFileName, @NonNull QVTiIncrementalExecutor.Mode mode) throws IOException {
+ return new MyQvtiExecutor(getEnvironmentFactory(), fileNamePrefix, transformationFileName, mode);
+ }
+
public @NonNull QVTiEnvironmentFactory getEnvironmentFactory() {
return (QVTiEnvironmentFactory) super.getEnvironmentFactory();
}
@@ -95,7 +101,10 @@ public class QVTiInterpreterTests extends LoadTestCase
* @throws IOException Signals that an I/O exception has occurred.
*/
public MyQvtiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull String fileNamePrefix, @NonNull String transformationFileName) throws IOException {
- super(environmentFactory, getProjectFileURI(fileNamePrefix + "/" + transformationFileName));
+ this(environmentFactory, fileNamePrefix, transformationFileName, QVTiIncrementalExecutor.Mode.INCREMENTAL);
+ }
+ public MyQvtiExecutor(@NonNull QVTiEnvironmentFactory environmentFactory, @NonNull String fileNamePrefix, @NonNull String transformationFileName, @NonNull Mode mode) throws IOException {
+ super(environmentFactory, getProjectFileURI(fileNamePrefix + "/" + transformationFileName), mode);
this.fileNamePrefix = fileNamePrefix + "/";
}
@@ -172,11 +181,12 @@ public class QVTiInterpreterTests extends LoadTestCase
}
}
finally {
- String s = getEvaluationStatusGraph();
+ GraphMLBuilder s = new GraphMLBuilder();
+ getTransformationStatus().accept(new EvaluationStatus2GraphVisitor(s));
File projectFile = getProjectFile();
- File graphFile = new File(projectFile.toString() + "/" + fileNamePrefix + "EvaluationStatus.graphml");
+ File graphFile = new File(projectFile.toString() + "/" + fileNamePrefix + transformation.getName() + "_" + mode + ".graphml");
FileWriter writer = new FileWriter(graphFile);
- writer.append(s);
+ writer.append(s.toString());
writer.close();
}
}
@@ -307,15 +317,34 @@ public class QVTiInterpreterTests extends LoadTestCase
}
/**
- * Test hsv 2 hls.
- *
- * @throws Exception the exception
+ * Test tree2talltree using the INCREMENTAL evaluator.
+ */
+ @Test
+ public void testTree2TallTreeIncremental() throws Exception {
+ MyQVT myQVT = createQVT();
+ myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
+ MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti", QVTiIncrementalExecutor.Mode.INCREMENTAL);
+ testEvaluator.saveTransformation(null);
+ testEvaluator.loadModel("tree", "Tree.xmi");
+ testEvaluator.createModel("tree2talltree", "Tree2TallTree.xmi");
+ testEvaluator.createModel("talltree", "TallTree.xmi");
+ testEvaluator.loadReference("talltree", "TallTreeValidate.xmi");
+ testEvaluator.test();
+ testEvaluator.dispose();
+
+ URI txURI = ClassUtil.nonNullState(testEvaluator.getTransformation().eResource().getURI());
+ assertLoadable(txURI);
+ myQVT.dispose();
+ }
+
+ /**
+ * Test tree2talltree using the LAZY evaluator.
*/
@Test
- public void testTree2TallTree() throws Exception {
+ public void testTree2TallTreeLazy() throws Exception {
MyQVT myQVT = createQVT();
myQVT.getEnvironmentFactory().setEvaluationTracingEnabled(true);
- MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti");
+ MyQvtiExecutor testEvaluator = myQVT.createEvaluator("Tree2TallTree", "Tree2TallTree.qvti", QVTiIncrementalExecutor.Mode.LAZY);
testEvaluator.saveTransformation(null);
testEvaluator.loadModel("tree", "Tree.xmi");
testEvaluator.createModel("tree2talltree", "Tree2TallTree.xmi");
diff --git a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
index 534e4e4a4..2e3985d17 100644
--- a/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
+++ b/tests/org.eclipse.qvtd.xtext.qvtimperative.tests/src/org/eclipse/qvtd/xtext/qvtimperative/tests/SimpleUML2RDBMS/SimpleUML2RDBMS.qvti
@@ -2,14 +2,14 @@ import simplerdbms : 'SimpleRDBMS.ecore#/';
import simpleuml : 'SimpleUML.ecore#/';
import umltordbms : 'SimpleUML2RDBMS.ecore#/';
-transformation SimpleUML2RDBMS
+transformation test::SimpleUML2RDBMS
{
uml imports simpleuml;
rdbms imports simplerdbms;
middle imports umltordbms;
}
-map packageToSchema_LM in SimpleUML2RDBMS
+map packageToSchema_LM in test::SimpleUML2RDBMS
{
check uml(p : Package) {}
enforce middle() {
@@ -21,7 +21,7 @@ map packageToSchema_LM in SimpleUML2RDBMS
}
}
-map packageToSchema_MR in SimpleUML2RDBMS
+map packageToSchema_MR in test::SimpleUML2RDBMS
{
enforce rdbms() {
realize s : Schema
@@ -33,7 +33,7 @@ map packageToSchema_MR in SimpleUML2RDBMS
}
}
-map integerToNumber_LM in SimpleUML2RDBMS
+map integerToNumber_LM in test::SimpleUML2RDBMS
{
check uml(p : Package,
prim : PrimitiveDataType) {}
@@ -49,7 +49,7 @@ map integerToNumber_LM in SimpleUML2RDBMS
}
}
-map integerToNumber_MR in SimpleUML2RDBMS
+map integerToNumber_MR in test::SimpleUML2RDBMS
{
enforce rdbms() {}
check middle(p2s : PackageToSchema,
@@ -61,7 +61,7 @@ map integerToNumber_MR in SimpleUML2RDBMS
}
}
-map booleanToBoolean_MR in SimpleUML2RDBMS
+map booleanToBoolean_MR in test::SimpleUML2RDBMS
{
enforce rdbms() {}
check middle(p2s : PackageToSchema,
@@ -74,7 +74,7 @@ map booleanToBoolean_MR in SimpleUML2RDBMS
}
}
-map booleanToBoolean_LM in SimpleUML2RDBMS
+map booleanToBoolean_LM in test::SimpleUML2RDBMS
{
check uml(p : Package,
prim : PrimitiveDataType) {}
@@ -90,7 +90,7 @@ map booleanToBoolean_LM in SimpleUML2RDBMS
}
}
-map stringToVarchar_MR in SimpleUML2RDBMS
+map stringToVarchar_MR in test::SimpleUML2RDBMS
{
enforce rdbms() {}
check middle(p2s : PackageToSchema,
@@ -102,7 +102,7 @@ map stringToVarchar_MR in SimpleUML2RDBMS
}
}
-map stringToVarchar_LM in SimpleUML2RDBMS
+map stringToVarchar_LM in test::SimpleUML2RDBMS
{
check uml(p : Package,
prim : PrimitiveDataType) {}
@@ -118,7 +118,7 @@ map stringToVarchar_LM in SimpleUML2RDBMS
}
}
-map classToTable_MR in SimpleUML2RDBMS
+map classToTable_MR in test::SimpleUML2RDBMS
{
enforce rdbms(s : Schema) {
realize t : Table,
@@ -146,7 +146,7 @@ map classToTable_MR in SimpleUML2RDBMS
}
}
-map classToTable_LM in SimpleUML2RDBMS
+map classToTable_LM in test::SimpleUML2RDBMS
{
check uml(p : Package,
c : Class) {}
@@ -162,7 +162,7 @@ map classToTable_LM in SimpleUML2RDBMS
}
}
-map associationToForeignKey_MR in SimpleUML2RDBMS
+map associationToForeignKey_MR in test::SimpleUML2RDBMS
{
enforce rdbms(s : Schema,
st : Table,
@@ -196,7 +196,7 @@ map associationToForeignKey_MR in SimpleUML2RDBMS
}
}
-map associationToForeignKey_LM in SimpleUML2RDBMS
+map associationToForeignKey_LM in test::SimpleUML2RDBMS
{
check uml(p : Package,
sc : Class,
@@ -237,7 +237,7 @@ map associationToForeignKey_LM in SimpleUML2RDBMS
}
}
-map classPrimitiveAttributes_LM in SimpleUML2RDBMS
+map classPrimitiveAttributes_LM in test::SimpleUML2RDBMS
{
check uml(t : PrimitiveDataType,
c : Class,
@@ -262,7 +262,7 @@ map classPrimitiveAttributes_LM in SimpleUML2RDBMS
}
}
-map classComplexAttributes_LM in SimpleUML2RDBMS
+map classComplexAttributes_LM in test::SimpleUML2RDBMS
{
check uml(t : Class,
c : Class,
@@ -283,7 +283,7 @@ map classComplexAttributes_LM in SimpleUML2RDBMS
}
}
-map complexAttributePrimitiveAttributes_LM in SimpleUML2RDBMS
+map complexAttributePrimitiveAttributes_LM in test::SimpleUML2RDBMS
{
check uml(ca : Attribute,
c : Class,
@@ -311,7 +311,7 @@ map complexAttributePrimitiveAttributes_LM in SimpleUML2RDBMS
}
}
-map complexAttributeComplexAttributes_LM in SimpleUML2RDBMS
+map complexAttributeComplexAttributes_LM in test::SimpleUML2RDBMS
{
check uml(ca : Attribute,
c : Class,
@@ -336,7 +336,7 @@ map complexAttributeComplexAttributes_LM in SimpleUML2RDBMS
}
}
-map attributeColumns_MR in SimpleUML2RDBMS
+map attributeColumns_MR in test::SimpleUML2RDBMS
{
enforce rdbms(t : Table,
ct : String) {
@@ -358,7 +358,7 @@ map attributeColumns_MR in SimpleUML2RDBMS
}
}
-map __root__ in SimpleUML2RDBMS
+map __root__ in test::SimpleUML2RDBMS
{
where () {}
for p : simpleuml::Package in uml.objectsOfKind(Package) {

Back to the top