blob: facc74d06f97dfc341aa0c59a8150f033977fcf3 [file] [log] [blame]
import sys
import traceback
import py4j
from py4j.java_collections import ListConverter
def isJython():
return hasattr(sys, 'subversion') and (sys.subversion[0]== 'Jython')
class ReflectiveModule(object):
def __init__(self, realModule):
self.realModule = realModule;
def __getattr__( self, name ):
def wrappedMethod(*args):
unwrappedArgs = [ unwrap(e) for e in args ]
result = getattr(self.realModule, name)(*unwrappedArgs)
return wrap(result);
return wrappedMethod;
class PythonListWrapper:
def __init__(self, list):
self.list = list;
self.i = 0;
self.n = list.size();
def __getitem__(self, key):
obj = self.list[key];
return wrap(self.list[key]);
def __setitem__(self, key, val):
self.list[key] = val;
def __iter__(self):
return self;
def __len__(self):
return self.n;
def __next__(self):
if self.i < self.n:
i = self.i
self.i += 1
return wrap(self.list[i]);
else:
raise StopIteration()
def unwrap(self):
return self.list;
next = __next__ # Alias for Python 2
def getListClass():
if isJython() :
#return org.eclipse.papyrus.moka.parametric.semantics.proxy.ValueListProxy
return org.eclipse.papyrus.moka.engine.suml.accessor.structures.ListAccess
else:
return py4j.java_collections.JavaList
def getMapClass():
if isJython() :
#return org.eclipse.papyrus.moka.parametric.semantics.proxy.MapProxy
return org.eclipse.papyrus.moka.engine.suml.accessor.structures.MapAccess
else:
return py4j.java_collections.JavaMap
def isOperation(value):
if not (isinstance(value, py4j.java_gateway.JavaObject)) :
return False;
return value.getClass().getName() == "org.eclipse.papyrus.moka.engine.suml.accessor.structures.OperationAccess";
class PythonOperationWrapper:
def __init__(self, opAccess) :
self.opAccess = opAccess;
def __call__(self, *arg ):
return self.opAccess.call(arg);
class PythonWrapper:
def __init__(self, obj):
self.__dict__["obj"] = obj;
def __getattr__(self, name):
if name in self.__dict__ :
return self.__dict__[name];
if name.startswith('_') :
if name[1:] in self.__dict__ :
return self.__dict__[name[1:]];
return wrap(self.__dict__["obj"][name[1:]])
if name in self.__dict__["obj"] :
return wrap(self.__dict__["obj"][name]);
raise ValueError( "'" + name + "' not found in " + str(self) );
def __setattr__(self, name, value):
if name in self.__dict__ :
self.__dict__[name] = value;
return;
if name.startswith('_') :
self.__dict__["obj"][name[1:]] = unwrap(value);
return;
if name in self.__dict__["obj"]:
self.__dict__["obj"][name] = unwrap(value);
return;
self.__dict__[name] = value;
def __getitem__(self, key):
return wrap(self.__dict__["obj"].valueAt(key));
def __str__(self):
return self.__dict__["obj"].toString()
def unwrap(self):
return self.__dict__["obj"]
def unwrap(obj):
if isinstance(obj, PythonWrapper):
return obj.unwrap();
if isinstance(obj, PythonListWrapper):
return obj.unwrap();
if isinstance(obj, list ) :
return ListConverter().convert( [ unwrap(e) for e in obj ], gateway._gateway_client)
return obj;
def wrap(value):
if ( value == None ) :
return value;
#Already wrapped
if isinstance(value, PythonWrapper):
return value;
if isinstance(value, getListClass()):
return PythonListWrapper(value);
if isinstance(value, getMapClass()):
return PythonWrapper(value);
if isOperation(value):
return PythonOperationWrapper(value);
return value;
#print("Python Bootstrap executed.")