Model­trans­for­mationen mit QVT Operational

EcoreReflect

Möchte man mit einer QVTo-Transformation ein Ecore-Metamodel erzeugen, dann könnte eine solche Transformation bspw. so anfangen:

modeltype UML uses 'http://www.eclipse.org/qvt/1.0.0/Operational/examples/simpleuml';
modeltype ECORE "strict" uses "http://www.eclipse.org/emf/2002/Ecore";

transformation Simpleuml_To_Ecore(in uml : UML, out ecore: ECORE);

Nun muss man immer ganz genau aufpassen, da ECORE nicht nur die Sprache für das Ausgangsmodell ecore ist, sondern eben immer auch die Sprache für beide Metamodelle.

Es ist leider nur mit Klimmzügen möglich mit QVTo-Bordmitteln im Ausgangsmodell Verweise auf die vordefinierten Ecore-Typen einzusetzen, wie EString, EInt, aber auch EClass, EDataType.

Dies wird auch im QVTo Forum festgehalten:

Der im zweiten Thread vorgeschlagen Weg einer blackbox Bibliothek, die entsprechende Funktionalität bereitstellt, erscheint mir am flexibelsten. Daher habe ich für meine Zwecke ein solche implementiert.

Zur Verwendung muss diese importiert werden.

import de.uwe_ritzmann.qvt.oml.lib.ecore.reflect.EcoreReflect;

Die Nutzung kann dann bspw. so aussehen:

helper JAVA::PrimitiveType::primitiveType2dataType(): ECORE::EDataType
{
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeBoolean) ) return getEDataTypeForName("EBoolean");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeByte) ) return getEDataTypeForName("EByte");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeChar) ) return getEDataTypeForName("EChar");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeDouble) ) return getEDataTypeForName("EDouble");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeShort) ) return getEDataTypeForName("EShort");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeFloat) ) return getEDataTypeForName("EFloat");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeInt) ) return getEDataTypeForName("EInt");
    if ( self.oclIsTypeOf(JAVA::PrimitiveTypeLong) ) return getEDataTypeForName("ELong");
    return null;
}

Copyright © 2016 Uwe Ritzmann - Erstellt mit Pelican, Python und Skeleton.