diff options
Diffstat (limited to 'deprecated/org.atl.engine.repositories.mdr4atl/src/org/atl/engine/repositories/mdr4atl/ASMMDRModelElement.java')
-rw-r--r-- | deprecated/org.atl.engine.repositories.mdr4atl/src/org/atl/engine/repositories/mdr4atl/ASMMDRModelElement.java | 571 |
1 files changed, 0 insertions, 571 deletions
diff --git a/deprecated/org.atl.engine.repositories.mdr4atl/src/org/atl/engine/repositories/mdr4atl/ASMMDRModelElement.java b/deprecated/org.atl.engine.repositories.mdr4atl/src/org/atl/engine/repositories/mdr4atl/ASMMDRModelElement.java deleted file mode 100644 index c638dfdd..00000000 --- a/deprecated/org.atl.engine.repositories.mdr4atl/src/org/atl/engine/repositories/mdr4atl/ASMMDRModelElement.java +++ /dev/null @@ -1,571 +0,0 @@ -package org.atl.engine.repositories.mdr4atl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.jmi.model.Classifier; -import javax.jmi.reflect.RefAssociation; -import javax.jmi.reflect.RefEnum; -import javax.jmi.reflect.RefException; -import javax.jmi.reflect.RefObject; -import javax.jmi.reflect.RefPackage; -import javax.jmi.reflect.RefStruct; - -import org.atl.engine.vm.ClassNativeOperation; -import org.atl.engine.vm.StackFrame; -import org.atl.engine.vm.nativelib.ASMBag; -import org.atl.engine.vm.nativelib.ASMBoolean; -import org.atl.engine.vm.nativelib.ASMCollection; -import org.atl.engine.vm.nativelib.ASMEnumLiteral; -import org.atl.engine.vm.nativelib.ASMInteger; -import org.atl.engine.vm.nativelib.ASMModel; -import org.atl.engine.vm.nativelib.ASMModelElement; -import org.atl.engine.vm.nativelib.ASMOclAny; -import org.atl.engine.vm.nativelib.ASMOclType; -import org.atl.engine.vm.nativelib.ASMOclUndefined; -import org.atl.engine.vm.nativelib.ASMReal; -import org.atl.engine.vm.nativelib.ASMSequence; -import org.atl.engine.vm.nativelib.ASMSet; -import org.atl.engine.vm.nativelib.ASMString; -import org.atl.engine.vm.nativelib.ASMTuple; - -/** - * @author Frédéric Jouault - */ -public class ASMMDRModelElement extends ASMModelElement { - - private static ASMModelElement getMetaobject(ASMMDRModel model, RefObject object) { - ASMModelElement ret = null; - - RefObject mo = object.refMetaObject(); - if(!mo.equals(object)) { - ret = ((ASMMDRModel)model.getMetamodel()).getASMModelElement(object.refMetaObject()); - } - - return ret; - } - - public ASMMDRModelElement(Map modelElements, ASMMDRModel model, RefObject object) { - super(model, getMetaobject(model, object)); - modelElements.put(object, this); - this.object = object; - try { - String name = (String)object.refGetValue("name"); - if(name == null) { - name = "<notnamedyet>"; - } - setName(name); - } catch(Exception e) { - setName("<unnamed>"); - } - -//new Exception(this + " : " + getMetaobject()).printStackTrace(System.out); - if(getMetaobject() == null) { - setMetaobject(this); - } - setType(getMetaobject()); -// if((model.equals(ASMMDRModel.getMOF()) && (getName().equals("Class") || getName().equals("Classifier"))) || object.refIsInstanceOf(getClassifier(), true)) { - if(object instanceof Classifier) { - addSupertype(ASMOclType.myType); - for(Iterator i = ((Collection)object.refGetValue("supertypes")).iterator() ; i.hasNext() ; ) { - RefObject ro = (RefObject)i.next(); - ASMModelElement ame = ((ASMMDRModel)model).getASMModelElement(ro); - addSupertype(ame); - } - } - } - - - private static void registerMOFOperation(String modelelementName, String methodName, Class args[]) throws Exception { - List realArgs = new ArrayList(Arrays.asList(args)); - realArgs.add(0, ASMMDRModelElement.class); - realArgs.add(0, StackFrame.class); - ClassNativeOperation no = new ClassNativeOperation(ASMMDRModelElement.class.getMethod(methodName, (Class[])realArgs.toArray(args))); - ASMModelElement amme = ASMMDRModel.getMOF().findModelElement(modelelementName); -// System.out.println("Registering on " + amme + " : " + no); - amme.registerVMOperation(no); - } - - static { - try { - // Force creation of MOF!Class before any other (otherwise MOF!Classifier gets created twice) - ASMMDRModel.getMOF().findModelElement("Class"); - - // Operations on MOF!Classifier - registerMOFOperation("Classifier", "allInstances", new Class[] {}); - registerMOFOperation("Classifier", "allInstancesFrom", new Class[] {ASMString.class}); - registerMOFOperation("Classifier", "newInstance", new Class[] {}); - registerMOFOperation("Classifier", "getElementBy", new Class[] {ASMString.class, ASMOclAny.class}); - registerMOFOperation("Classifier", "getElementsBy", new Class[] {ASMString.class, ASMOclAny.class}); - - // Operations on MOF!GeneralizableElement - registerMOFOperation("GeneralizableElement", "findElementsByTypeExtended", new Class[] {ASMMDRModelElement.class, ASMBoolean.class}); - registerMOFOperation("GeneralizableElement", "lookupElementExtended", new Class[] {ASMString.class}); - - // Operations on MOF!AssociationEnd - registerMOFOperation("AssociationEnd", "otherEnd", new Class[] {}); - } catch(Exception e) { - e.printStackTrace(System.out); - } - } - - public static ASMModelElement otherEnd(StackFrame frame, ASMMDRModelElement self) { - RefObject ret = null; - - try { - ret = (RefObject)self.object.refInvokeOperation("otherEnd", new ArrayList()); - } catch(RefException re) { - re.printStackTrace(System.out); - } - - return (ASMModelElement)java2ASM(frame, self.getModel(), ret); - } - - public static ASMModelElement lookupElementExtended(StackFrame frame, ASMMDRModelElement self, ASMString name) { - RefObject ret = null; - - try { - ret = (RefObject)self.object.refInvokeOperation("lookupElementExtended", Arrays.asList(new Object[] {name.getSymbol()})); - } catch(RefException re) { - re.printStackTrace(System.out); - } - - return (ASMModelElement)java2ASM(frame, self.getModel(), ret); - } - - public static ASMSequence findElementsByTypeExtended(StackFrame frame, ASMMDRModelElement self, ASMMDRModelElement ofType, ASMBoolean includeSubtypes) { - List ret = null; - - try { - ret = (List)self.object.refInvokeOperation("findElementsByTypeExtended", Arrays.asList(new Object[] {ofType.object, new Boolean(includeSubtypes.getSymbol())})); - } catch(RefException re) { - re.printStackTrace(System.out); - } - - return (ASMSequence)java2ASM(frame, self.getModel(), ret); - } - - public static ASMModelElement getElementsBy(StackFrame frame, ASMMDRModelElement self, ASMString propName, ASMOclAny value) { - return (ASMModelElement)getMap(frame, self, propName).get(value); // TODO : return collection if several - } - - public static ASMModelElement getElementBy(StackFrame frame, ASMMDRModelElement self, ASMString propName, ASMOclAny value) { - return (ASMModelElement)getMap(frame, self, propName).get(value); - } - - private static Map propMapMap = new HashMap(); - private static Map getMap(StackFrame frame, ASMMDRModelElement self, ASMString propName) { - Map propMap = (Map)propMapMap.get(self); - - if(propMap == null) { - propMap = new HashMap(); - propMapMap.put(self, propMap); - } - Map ret = (Map)propMap.get(propName); - - if(ret == null) { - ret = new HashMap(); - String propNames = propName.getSymbol(); - for(Iterator i = allInstances(frame, self).iterator() ; i.hasNext() ; ) { - ASMModelElement ame = (ASMModelElement)i.next(); - ret.put(ame.get(frame, propNames), ame); - } - - propMap.put(propName, ret); - } - - return ret; - } - - public static ASMSet allInstances(StackFrame frame, ASMMDRModelElement self) { - return allInstancesFrom(frame, self, null); - } - - public static ASMSet allInstancesFrom(StackFrame frame, ASMMDRModelElement self, ASMString sourceModelName) { -final boolean debug = false; - Set ret = new HashSet(); - -if(debug) System.out.println(self + ".allInstancesFrom(" + ((sourceModelName == null) ? "null" : "\"" + sourceModelName + "\"") + ")"); - if(self.object.refMetaObject().refIsInstanceOf(getClassifier(), true)) { - for(Iterator i = frame.getModels().keySet().iterator() ; i.hasNext() ; ) { - String mname = (String)i.next(); -if(debug) System.out.println("\ttrying: " + mname); - if((sourceModelName != null) && !mname.equals(sourceModelName.getSymbol())) continue; - ASMModel am = (ASMModel)frame.getModels().get(mname); -if(debug) System.out.println("\t\tfound: " + am.getName()); -if(debug) System.out.println("\t\tam.getMetamodel() = " + am.getMetamodel().hashCode()); -if(debug) System.out.println("\t\tself.getModel() = " + self.getModel().hashCode()); -if(debug) System.out.println("\t\tam.getMetamodel().equals(self.getModel()) = " + am.getMetamodel().equals(self.getModel())); - if(!am.getMetamodel().equals(self.getModel())) continue; -if(debug) System.out.println("\t\t\tsearching on: " + am.getName()); - Set elems = am.getElementsByType(self); - ret.addAll(elems); -if(debug) System.out.println("\t\t\t\tfound: " + elems); - } - } - - return new ASMSet(ret); - } - - public static ASMModelElement newInstance(StackFrame frame, ASMMDRModelElement self) { - ASMModelElement ret = null; - - if(self.object.refMetaObject().refIsInstanceOf(getClassifier(), true)) { - for(Iterator i = self.getModel().getSubModels().values().iterator() ; i.hasNext() ; ) { - ASMModel am = (ASMModel)i.next(); - if(am.isTarget()) { - ret = am.newModelElement(self); - break; - } - } - } - - return ret; - } - - public ASMOclAny get(StackFrame frame, String name) { - ASMOclAny ret = null; - - if((frame != null) && isHelper(frame, name)) { - ret = getHelper(frame, name); - } else if("__xmiID__".equals(name)) { - String id = ((ASMMDRModel)getModel()).xmiIdByElement(object); - ret = java2ASM(frame, getModel(), id); - } else { - try { - Object o = object.refGetValue(name); - ret = java2ASM(frame, getModel(), o); - } catch(Exception e) { - if(frame != null) - frame.printStackTrace("this = " + this + " ; name = " + name, e); - } catch(Error e) { - if(frame != null) - frame.printStackTrace("this = " + this + " ; name = " + name + " ; " + e.toString()); - } - } - - return ret; - } - - private static ASMOclAny java2ASM(StackFrame frame, ASMModel model, Object o) { - ASMOclAny ret = null; - - if(o instanceof String) { - ret = new ASMString((String)o); - } else if(o instanceof Integer) { - ret = new ASMInteger(((Integer)o).intValue()); - } else if(o instanceof Boolean) { - ret = new ASMBoolean(((Boolean)o).booleanValue()); - } else if(o instanceof Double) { - ret = new ASMReal(((Double)o).doubleValue()); - } else if(o instanceof RefObject) { - ret = ((ASMMDRModel)model).getASMModelElement((RefObject)o); - } else if(o instanceof Collection) { - ASMCollection col; - if(o instanceof List) - col = new ASMSequence(); - else if(o instanceof Set) - col = new ASMSet(); - else - col = new ASMBag(); - - for(Iterator i = ((Collection)o).iterator() ; i.hasNext() ; ) { - col.add(java2ASM(frame, model, i.next())); - } - - ret = col; - } else if(o instanceof RefStruct) { - ASMTuple t = new ASMTuple(); - for(Iterator i = ((RefStruct)o).refFieldNames().iterator() ; i.hasNext() ; ) { - String name = (String)i.next(); - ASMOclAny e = java2ASM(frame, model, ((RefStruct)o).refGetValue(name)); - t.set(frame, name, e); - } - ret = t; - } else if(o instanceof RefEnum) { - ret = new ASMEnumLiteral(o.toString()); - } else if(o == null) { - ret = new ASMOclUndefined(); - } else { - frame.printStackTrace("ERROR: could not convert " + o + " : " + o.getClass()); - } - - return ret; - } - - public void set(StackFrame frame, String name, ASMOclAny value) { - super.set(frame, name, value); -/* System.out.println(this + " : " + getMetaobject() + "." + name + " <- " + value + " : " + value.getType() + " (old value is " + object.refGetValue(name) + ")"); - if(object.refGetValue(name) instanceof Collection) - System.out.println(new ArrayList((Collection)object.refGetValue(name))); -*/ - Object valueToSet = asm2Java(frame, getModel(), value, name); - Object oldValue = null; - if(valueToSet == null) return; - try { - if(((ASMMDRModelElement)getMetaobject()).isNNAcquaintance(name)) { -//System.out.println("WARNING: AssociationEnd " + name + " is not navigable."); - ASMMDRModelElement ae = (ASMMDRModelElement)((ASMMDRModelElement)getMetaobject()).getAcquaintance(name).get(frame, "container"); - RefAssociation aec = ((ASMMDRModel)getModel()).findRefAssociation(ae.getObject()); - if(((ASMMDRModelElement)getMetaobject()).isAcquaintanceFirst(name)) { - aec.refAddLink(((ASMMDRModelElement)value).object, object); - } else { - aec.refAddLink(object, ((ASMMDRModelElement)value).object); - } - } else { - oldValue = object.refGetValue(name); - - if(oldValue instanceof Collection) { - if(valueToSet instanceof Collection) { - for(Iterator i = ((Collection)valueToSet).iterator() ; i.hasNext() ; ) { - ((Collection)oldValue).add(i.next()); - } - } else { - ((Collection)oldValue).add(valueToSet); - } - } else { - if(valueToSet instanceof Collection) { - frame.printStackTrace("Warning: trying to set a Collection (" + valueToSet + ")to a single-valued property, using first element"); - if(((Collection)valueToSet).size() >= 1) { - valueToSet = ((Collection)valueToSet).iterator().next(); - object.refSetValue(name, valueToSet); - } - } else { - object.refSetValue(name, valueToSet); - } - } - } - } catch(Exception e) { - String msg = "Cannot set property " + name + " on element " + this + " : " + getMetaobject() + " to " + value + " : " + value.getType() + " (old value is " + oldValue + ")"; - if(frame != null) { - frame.printStackTrace(msg, e); - } else { - System.out.println(msg); - e.printStackTrace(System.out); - } - } - } - - private Object asm2Java(StackFrame frame, ASMModel model, ASMOclAny asmValue, String propertyName) { - Object ret = null; - - if(asmValue instanceof ASMString) { - ret = ((ASMString)asmValue).getSymbol(); - } else if(asmValue instanceof ASMInteger) { - ret = new Integer(((ASMInteger)asmValue).getSymbol()); - } else if(asmValue instanceof ASMBoolean) { - ret = new Boolean(((ASMBoolean)asmValue).getSymbol()); - } else if(asmValue instanceof ASMReal) { - ret = new Double(((ASMReal)asmValue).getSymbol()); - } else if(asmValue instanceof ASMModelElement) { - if(((ASMModelElement)asmValue).getModel().equals(model)) { - ret = ((ASMMDRModelElement)asmValue).getObject(); - } else { -// frame.printStackTrace("Warning: trying to set " + o + " : " + ((ASMModelElement)o).getType() + " from " + ((ASMModelElement)o).getModel() + " to an element off model " + model); - ret = null; - } - } else if(asmValue instanceof ASMCollection) { - ret = new ArrayList(); - for(Iterator i = ((ASMCollection)asmValue).iterator() ; i.hasNext() ; ) { - Object v = asm2Java(frame, model, (ASMOclAny)i.next(), propertyName); - if(v != null) - ((List)ret).add(v); - } - } else if(asmValue instanceof ASMEnumLiteral) { - ASMMDRModelElement type = (ASMMDRModelElement)lookupElementExtended(frame, (ASMMDRModelElement)getMetaobject(), new ASMString(propertyName)).get(frame, "type"); - if(((ASMString)type.getMetaobject().get(frame, "name")).getSymbol().equals("EnumerationType")) { // already checked by semantic analysis ? - RefObject typeObject = type.getObject(); - RefObject typeObjectPackage = (RefObject)typeObject.refImmediateComposite(); - RefPackage pack = ((ASMMDRModel)model).getPackage(); - if(!pack.refMetaObject().equals(typeObjectPackage)) { - pack = pack.refPackage(typeObjectPackage); - } - ret = pack.refGetEnum(typeObject, ((ASMEnumLiteral)asmValue).getName()); - } else { - frame.printStackTrace("ERROR: could not convert " + asmValue); - } - } else if(asmValue instanceof ASMTuple) { - ret = asm2JavaStructure(frame, model, asmValue, (ASMMDRModelElement)getMetaobject(), propertyName); - } else if(asmValue instanceof ASMOclUndefined) { - ret = null; // TODO: means unset ? - } else { - frame.printStackTrace("ERROR: could not convert " + asmValue); - } - - return ret; - } - - private Object asm2JavaStructure(StackFrame frame, ASMModel model, ASMOclAny asmValue, ASMMDRModelElement contextType, String propertyName) { - Object ret = null; - ASMMDRModelElement type = (ASMMDRModelElement)lookupElementExtended(frame, contextType, new ASMString(propertyName)).get(frame, "type"); - if(((ASMString)type.getMetaobject().get(frame, "name")).getSymbol().equals("StructureType")) { // already checked by semantic analysis ? - List args = new ArrayList(); - for(Iterator i = ((ASMCollection)type.get(frame, "contents")).iterator() ; i.hasNext() ; ) { - ASMModelElement ame = (ASMModelElement)i.next(); - if(((ASMString)ame.getMetaobject().get(frame, "name")).getSymbol().equals("StructureField")) { - String fieldName = ((ASMString)ame.get(frame, "name")).getSymbol(); - ASMOclAny v = ((ASMTuple)asmValue).get(frame, fieldName); - Object value; - if(v instanceof ASMTuple) { - value = asm2JavaStructure(frame, model, v, type, fieldName); - } else { - value = asm2Java(frame, model, v, propertyName); - } - args.add(value); - } - } - RefObject pack = ((ASMMDRModelElement)type.get(frame, "container")).getObject(); - RefPackage rp = ((ASMMDRModel)model).getPackage(); - if(rp.refMetaObject() != pack) { - rp = rp.refPackage(pack); - } - ret = rp.refCreateStruct(type.getObject(), args); - } else { - frame.printStackTrace("ERROR: could not convert " + asmValue); - } - return ret; - } - - public RefObject getObject() { - return object; - } - - // only for metamodels...? - public ASMBoolean conformsTo(ASMOclType other) { - boolean ret = false; - -//System.out.println(this + ".conformsTo(" + other); - if(other instanceof ASMMDRModelElement) { - RefObject o = ((ASMMDRModelElement)other).object; - RefObject t = object; - - if(o.refIsInstanceOf(getClassifier(), true) && t.refIsInstanceOf(getClassifier(), true)) { - try { - ret = o.equals(t) || ((Collection)t.refInvokeOperation("allSupertypes", new ArrayList())).contains(o); - } catch(Exception e) { - e.printStackTrace(System.out); - } - } - } - - return new ASMBoolean(ret); - } - - public ASMOclAny refImmediateComposite() { - ASMOclAny ret = null; - - Object ic = object.refImmediateComposite(); - if((ic == null) || !(ic instanceof RefObject)) { - ret = super.refImmediateComposite(); - } else { - ret = ((ASMMDRModel)getModel()).getASMModelElement((RefObject)ic); - } - - return ret; - } - - // only for metamodels...? - public ASMModelElement getPropertyType(String name) { - ASMModelElement ret = null; - - ASMModelElement p = getProperty(name); - if(p != null) { - ret = (ASMModelElement)p.get(null, "type"); - } - - return ret; - } - - // only for metamodels...? - public ASMModelElement getProperty(String name) { - ASMModelElement ret = null; - - RefObject t = object; - - if(t.refIsInstanceOf(getClassifier(), true)) { - try { - List args = new ArrayList(); - args.add(name); - ret = ((ASMMDRModel)getModel()).getASMModelElement((RefObject)t.refInvokeOperation("lookupElementExtended", args)); - } catch(Exception e) { - e.printStackTrace(System.out); - } - } - - return ret; - } - - private static RefObject getClassifier() { - return ((ASMMDRModelElement)ASMMDRModel.getMOF().findModelElement("Classifier")).object; - } - -/* - public String toString() { - return super.toString() + "@" + hashCode(); - } -*/ - - public void addAcquaintance(String name, ASMModelElement asso, ASMModelElement ae, boolean isFirst) { - acquaintances.put(name, new Object[] {ae, new Boolean(isFirst)}); - if(!((ASMBoolean)ae.get(null, "isNavigable")).getSymbol()) { // TODO: null -> frame - nonNavigableAcquaintances.put(name, new Object[] {ae, new Boolean(isFirst)}); - } - } - - public boolean isNNAcquaintance(String name) { - Object ret = nonNavigableAcquaintances.get(name); - - if(ret == null) { - for(Iterator i = getSupertypes().iterator() ; i.hasNext() && (ret == null) ; ) { - Object o = i.next(); - if(o instanceof ASMMDRModelElement) { - ASMMDRModelElement ame = (ASMMDRModelElement)o; - ret = ame.nonNavigableAcquaintances.get(name); - } - } - } - - return ret != null; - } - - public boolean isAcquaintance(String name) { - return getAcquaintance(name) != null; - } - - public ASMModelElement getAcquaintance(String name) { - Object[] oa = getAcquaintanceStruct(name); - return (oa != null) ? (ASMModelElement)oa[0] : null; - } - - public Object[] getAcquaintanceStruct(String name) { - Object[] ret = (Object[])acquaintances.get(name); - - if(ret == null) { - for(Iterator i = getSupertypes().iterator() ; i.hasNext() && (ret == null) ; ) { - Object o = i.next(); - if(o instanceof ASMMDRModelElement) { - ASMMDRModelElement ame = (ASMMDRModelElement)o; - ret = ame.getAcquaintanceStruct(name); - } - } - } - - return ret; - } - - public boolean isAcquaintanceFirst(String name) { - return ((Boolean)(getAcquaintanceStruct(name))[1]).booleanValue(); - } - - private Map acquaintances = new HashMap(); - private Map nonNavigableAcquaintances = new HashMap(); - private RefObject object; -} - |