Issue #2250 refactor JUtil to be less dependent on certain elements, make DAF easier to use

Change-Id: Ic89f4669529ac13f3c69ede8553cf57bbfd73760

Former-commit-id: 312ec66384 [formerly dc160577cc] [formerly b3573e90c9] [formerly c2d6c2af41 [formerly b3573e90c9 [formerly 48c392d8000d8cc3a5c8371319fddd776566ef32]]]
Former-commit-id: c2d6c2af41
Former-commit-id: 53e526c2f13fdf394ffb581d1c56b5b036a55a63 [formerly a3ec6e58f5]
Former-commit-id: 8d3cf15469
This commit is contained in:
Matt Nash 2013-11-05 12:27:12 -06:00
parent dd2bb59742
commit d41115860f
6 changed files with 513 additions and 127 deletions

View file

@ -73,7 +73,7 @@ public class DefaultGeometryData implements IGeometryData {
protected String locationName; protected String locationName;
protected Map<String, Object> attributes; protected Map<String, Object> attributes = new HashMap<String, Object>();
@Override @Override
public Object getAttribute(String key) { public Object getAttribute(String key) {
@ -277,6 +277,10 @@ public class DefaultGeometryData implements IGeometryData {
this.dataMap.put(parameter, data); this.dataMap.put(parameter, data);
} }
public void addAttribute(String key, Object value) {
attributes.put(key, value);
}
public void setGeometry(Geometry geom) { public void setGeometry(Geometry geom) {
this.geometry = geom; this.geometry = geom;
} }

View file

@ -43,6 +43,7 @@ import com.vividsolutions.jts.geom.Envelope;
* Jan 28, 2013 bkowal Initial creation * Jan 28, 2013 bkowal Initial creation
* Feb 14, 2013 1614 bsteffen Refactor data access framework to use * Feb 14, 2013 1614 bsteffen Refactor data access framework to use
* single request. * single request.
* Oct 30, 2013 mnash Allow for no parameters to be set.
* *
* </pre> * </pre>
* *
@ -152,8 +153,7 @@ public class MapsQueryAssembler {
* the original request that we are processing * the original request that we are processing
* @return the query * @return the query
*/ */
public static String assembleGetAvailableLocationNames( public static String assembleGetAvailableLocationNames(IDataRequest request) {
IDataRequest request) {
return assembleQuery(request, Boolean.TRUE); return assembleQuery(request, Boolean.TRUE);
} }
@ -190,8 +190,10 @@ IDataRequest request) {
// add any additional database columns the user has specified as // add any additional database columns the user has specified as
// parameters // parameters
// for additional information, refer to: http://tinyurl.com/arnayco // for additional information, refer to: http://tinyurl.com/arnayco
for (String parameter : request.getParameters()) { if (request.getParameters() != null) {
columns.add(parameter); for (String parameter : request.getParameters()) {
columns.add(parameter);
}
} }
} }
List<String> constraints = new ArrayList<String>(); List<String> constraints = new ArrayList<String>();

View file

@ -30,6 +30,7 @@ package com.raytheon.uf.common.python;
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Aug 22, 2013 mnash Initial creation * Aug 22, 2013 mnash Initial creation
* Oct 30, 2013 mnash Add method for searching for subclasses
* *
* </pre> * </pre>
* *
@ -42,4 +43,8 @@ public class PyJavaUtil {
public static boolean isArray(Object obj) { public static boolean isArray(Object obj) {
return obj.getClass().isArray(); return obj.getClass().isArray();
} }
public static boolean isSubclass(Object obj, Class<?> clazz) {
return clazz.isAssignableFrom(obj.getClass());
}
} }

View file

@ -0,0 +1,56 @@
# #
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
# #
from com.vividsolutions.jts.io import WKTReader
from com.vividsolutions.jts.geom import Geometry
from shapely.geometry.base import BaseGeometry
from shapely import wkt
from com.raytheon.uf.common.python import PyJavaUtil
#
# Handler for geometries from Python to Java and back.
#
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 10/14/13 2250 mnash Initial creation of JUtil handler
#
#
def shapelyToJTS(val):
valtype = type(val)
if issubclass(valtype, BaseGeometry):
reader = WKTReader()
retObj = reader.read(val.to_wkt())
return True, retObj
return False, val
def jtsToShapely(obj, customConverter=None):
if PyJavaUtil.isSubclass(obj, Geometry):
return True, _toShapely(obj)
return False, obj
def _toShapely(obj):
return wkt.loads(obj.toText())

View file

@ -18,25 +18,29 @@
# further licensing information. # further licensing information.
# # # #
from java.lang import Integer, Float, Long, Boolean, String, Object, Double
from java.util import HashMap, LinkedHashMap, ArrayList
from java.util import Collections
from java.util import Date
from java.lang.reflect import Array
from collections import OrderedDict from collections import OrderedDict
from java.util import HashMap, LinkedHashMap, ArrayList
from shapely.geometry.base import BaseGeometry from java.lang import String
from shapely import wkt
import jep
import datetime
from com.raytheon.uf.common.python import PyJavaUtil
# #
# Provides convenience methods for Java-Python bridging # Provides convenience methods for Java-Python bridging
# #
# For utilization of the basics, doing the following will work just fine :
# #
# import JUtil
# JUtil.pyValToJavaObj(val)
#
# However, to do more advanced conversion, you can register a handler and it will then be
# available to do the necessary conversion.
#
# For example, Geometry objects are not currently handled. The GeometryHandler module will
# handle them however. Code would be written as follows :
#
# import JUtil
# from GeometryHandler import jtsToShapely, shapelyToJTS
# JUtil.registerJavaToPython(jtsToShapely)
# JUtil.registerPythonToJava(shapelyToJTS)
# JUtil.pyValToJavaObj(val)
# #
# SOFTWARE HISTORY # SOFTWARE HISTORY
# #
@ -46,12 +50,58 @@ from com.raytheon.uf.common.python import PyJavaUtil
# 03/12/13 1759 dgilling Extend Java List types handled # 03/12/13 1759 dgilling Extend Java List types handled
# by javaObjToPyVal(). # by javaObjToPyVal().
# 08/20/13 2250 mnash Handle Dates, doubles, and arrays # 08/20/13 2250 mnash Handle Dates, doubles, and arrays
# 10/15/13 mnash Refactor to reduce dependencies and clean up
# #
# #
JEP_ARRAY_TYPE = type(jep.jarray(0,Object))
def registerPythonToJava(method):
'''
We want to register new handlers per PythonInterpreter.
This allows us to utilize different conversions that may not
be needed for some PythonInterpreters, but to use them in others
where they are required.
'''
pythonHandlers.append(method)
def registerJavaToPython(method):
javaHandlers.append(method)
def pyValToJavaObj(val):
'''
The main method for Python to Java conversion in JUtil. If no conversion
method can be found, a string representation of the python value will be
returned as we do not want to crash the JVM.
'''
retVal = val
if retVal is not None :
for handleMethod in pythonHandlers:
success, obj = handleMethod(val)
if success:
retVal = obj
break
return retVal
def javaObjToPyVal(obj, customConverter=None):
'''
The main method for Java to Python conversion in JUtil. If no conversion
method can be found, the PyJObject will be returned and may still be able
to be used that way from within Python.
'''
retVal = obj
if retVal is not None :
for handleMethod in javaHandlers:
success, val = handleMethod(obj, customConverter)
if success:
retVal = val
break
return retVal
def javaStringListToPylist(jlist): def javaStringListToPylist(jlist):
'''
Going forward should use javaObjToPyVal instead.
'''
pylist = [] pylist = []
size = jlist.size() size = jlist.size()
for i in range(size): for i in range(size):
@ -59,30 +109,19 @@ def javaStringListToPylist(jlist):
return pylist return pylist
def pylistToJavaStringList(pylist): def pylistToJavaStringList(pylist):
'''
Going forward should use pyValToJavaObj instead.
'''
jlist = ArrayList(); jlist = ArrayList();
for i in pylist: for i in pylist:
jlist.add(String(i)) jlist.add(String(i))
return jlist return jlist
def javaStringMapToPyDict(javaMap):
keys = javaMap.keySet()
itr = keys.iterator()
pyDict = {}
while itr.hasNext():
key = itr.next()
val = javaMap.get(key)
fval = str(val)
if fval.find('[') > -1:
exec "fval = " + fval
else:
try:
fval = float(fval)
except:
pass
pyDict[str(key)] = fval
return pyDict
def javaMapToPyDict(javaMap, customConverter=None): def javaMapToPyDict(javaMap, customConverter=None):
'''
Going forward should use javaObjToPyVal instead.
'''
keys = javaMap.keySet() keys = javaMap.keySet()
itr = keys.iterator() itr = keys.iterator()
if javaMap.jclassname == "java.util.LinkedHashMap": if javaMap.jclassname == "java.util.LinkedHashMap":
@ -96,6 +135,9 @@ def javaMapToPyDict(javaMap, customConverter=None):
return pyDict return pyDict
def pyDictToJavaMap(pyDict): def pyDictToJavaMap(pyDict):
'''
Going forward should use pyValToJavaObj instead.
'''
if pyDict is None : if pyDict is None :
return None return None
@ -108,98 +150,13 @@ def pyDictToJavaMap(pyDict):
jmap.put(pyValToJavaObj(key), pyValToJavaObj(pyDict[key])) jmap.put(pyValToJavaObj(key), pyValToJavaObj(pyDict[key]))
return jmap return jmap
def pyValToJavaObj(val):
retObj = val
valtype = type(val)
# since Python on 64 bit has larger ints, we need to do a check
# for compatibility with Java Integers
if valtype is int and val <= Integer.MAX_VALUE and val >= Integer.MIN_VALUE :
retObj = Integer(val)
elif valtype is float:
retObj = Float(val)
elif valtype is long or valtype is int:
retObj = Long(val)
elif valtype is bool:
retObj = Boolean(val)
elif valtype is list:
retObj = ArrayList()
for i in val:
retObj.add(pyValToJavaObj(i))
elif valtype is tuple:
tempList = ArrayList()
for i in val:
tempList.add(pyValToJavaObj(i))
retObj = Collections.unmodifiableList(tempList)
elif valtype is datetime.datetime:
epoch = datetime.datetime.utcfromtimestamp(0)
delta = val - epoch
retObj = Date(long(delta.total_seconds()) * 1000)
elif issubclass(valtype, dict):
retObj = pyDictToJavaMap(val)
elif issubclass(valtype, JavaWrapperClass):
retObj = val.toJavaObj()
elif issubclass(valtype, BaseGeometry):
from com.vividsolutions.jts.io import WKTReader
reader = WKTReader()
retObj = reader.read(val.to_wkt())
return retObj
def javaObjToPyVal(obj, customConverter=None):
retVal = None
if obj is None:
return retVal
# handle pyjobjects
if hasattr(obj, 'jclassname'):
objtype = obj.jclassname
if objtype == "java.lang.Integer":
retVal = obj.intValue()
elif objtype == "java.lang.Float":
retVal = obj.floatValue()
elif objtype == "java.lang.Long":
retVal = obj.longValue()
elif objtype == "java.lang.Boolean":
retVal = bool(obj.booleanValue())
elif objtype == "java.lang.Double":
retVal = obj.doubleValue()
elif objtype == "java.util.Date":
retVal = datetime.datetime.fromtimestamp(obj.getTime() / 1000)
elif objtype in ["com.vividsolutions.jts.geom.Geometry", "com.vividsolutions.jts.geom.GeometryCollection",
"com.vividsolutions.jts.geom.Polygon", "com.vividsolutions.jts.geom.MultiPolygon",
"com.vividsolutions.jts.geom.LineString", "com.vividsolutions.jts.geom.MultiLineString",
"com.vividsolutions.jts.geom.Point", "com.vividsolutions.jts.geom.MultiPoint",
"com.vividsolutions.jts.geom.LinearRing"] :
retVal = wkt.loads(obj.toText())
elif objtype in ["java.util.ArrayList", "java.util.Arrays$ArrayList"]:
retVal = []
size = obj.size()
for i in range(size):
retVal.append(javaObjToPyVal(obj.get(i), customConverter))
elif objtype == "java.util.Collections$UnmodifiableRandomAccessList":
tempList = []
size = obj.size()
for i in range(size):
tempList.append(javaObjToPyVal(obj.get(i), customConverter))
retVal = tuple(tempList)
elif objtype == "java.util.HashMap":
retVal = javaMapToPyDict(obj, customConverter)
elif PyJavaUtil.isArray(obj):
retVal = []
size = Array.getLength(obj)
for i in range(size):
retVal.append(javaObjToPyVal(Array.get(obj, i), customConverter))
elif customConverter is not None:
retVal = customConverter(obj)
if retVal is None:
retVal = str(obj)
# test for jep array type
elif isinstance(obj, JEP_ARRAY_TYPE):
retVal = []
size = len(obj)
for i in range(size):
retVal.append(javaObjToPyVal(obj[i], customConverter))
return retVal
class JavaWrapperClass(object): class JavaWrapperClass(object):
def toJavaObj(self): def toJavaObj(self):
raise NotImplementedError, "Subclasses must override this method." raise NotImplementedError, "Subclasses must override this method."
# this initializes the basic handlers for Java->Python conversion and Python->Java conversion
from JUtilHandler import javaBasicsToPyBasics, pyBasicsToJavaBasics, javaCollectionToPyCollection, pyCollectionToJavaCollection, javaClassToPyClass, pyClassToJavaClass
pythonHandlers = [pyBasicsToJavaBasics, pyCollectionToJavaCollection, pyClassToJavaClass]
javaHandlers = [javaBasicsToPyBasics, javaCollectionToPyCollection, javaClassToPyClass]

View file

@ -0,0 +1,362 @@
# #
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
# #
import JUtil
#
# Basic handler for Python to Java and back (this handles all the main things
# that JUtil needs to do, but none of the special ones that should and can be
# added if the code wants to be more powerful.
#
# Note : All methods that convert from Java to Python should take a custom converter, even if it is not used.
#
#
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 10/14/13 2250 mnash Initial creation of JUtil handler
#
#
from java.lang import Integer, Float, Long, Boolean, String, Double, Number
from java.util import Date
from com.raytheon.uf.common.python import PyJavaUtil
import datetime
# Java -> Python conversion
def javaBasicsToPyBasics(obj, customConverter=None):
'''
Determines the correct method to call out of the dict to convert Java basic
objects to Python
'''
if hasattr(obj, 'jclassname'):
classname = obj.jclassname
if classname in javaBasics :
return True, javaBasics[classname](obj)
else :
for javaClass in fallbackBasics :
if PyJavaUtil.isSubclass(obj, javaClass) :
return True, fallbackBasics[javaClass](obj, customConverter)
return False, obj
def _toPythonInt(obj, customConverter=None):
'''
Turns a Java Integer to a Python int
'''
return obj.intValue()
def _toPythonLong(obj, customConverter=None):
'''
Turns a Java Long to a Python long, or int,
depending on the architecture
'''
return obj.longValue()
def _toPythonFloat(obj, customConverter=None):
'''
Turns a Java Float to a Python float
'''
return obj.floatValue()
def _toPythonDouble(obj, customConverter=None):
'''
Turns a Java Double to a Python float
'''
return obj.doubleValue()
def _toPythonBool(obj, customConverter=None):
'''
Turns a Java Boolean to a Python bool
'''
return bool(obj.booleanValue())
def _toPythonString(obj, customConverter=None):
'''
Turns a Java String to a Python str
'''
return obj.toString()
def _toPythonDatetime(obj, customConverter=None):
'''
Turns a Java Date to a Python datetime
'''
return datetime.datetime.fromtimestamp(obj.getTime() / 1000)
# Python -> Java conversion
def pyBasicsToJavaBasics(val):
'''
Method registered with JUtil to figure out any conversion of Python to Java.
Returns a default of String of that value if nothing else can be found.
'''
valtype = type(val)
if valtype in pythonBasics :
return True, pythonBasics[valtype](val)
return False, str(val)
def _toJavaInt(val):
'''
Turns a Python int to a Java Integer, or a Long, depending the range
of the value.
'''
# since Python on 64 bit has larger ints, we need to do a check
# for compatibility with Java Integers
if val <= Integer.MAX_VALUE and val >= Integer.MIN_VALUE :
return Integer(val)
# outside the Java bounds for Integer, so make it a Java Long
return Long(val)
def _toJavaFloat(val):
'''
Turns a Python float to a Java Float
'''
return Float(val)
def _toJavaLong(val):
'''
Turns a Python long to a Java Long
'''
return Long(val)
def _toJavaBoolean(val):
'''
Turns a Python bool to a Java Boolean
'''
return Boolean(val)
def _toJavaString(val):
'''
Turns a Python str to a Java String
'''
return String(str(val))
def _toJavaDate(val):
'''
Turns a Python datetime to a Java Date
'''
epoch = datetime.datetime.utcfromtimestamp(0)
delta = val - epoch
return Date(long(delta.total_seconds()) * 1000)
# the dict that registers the Python data type to the method for conversion
pythonBasics = {int:_toJavaInt, float:_toJavaFloat, long:_toJavaLong, bool:_toJavaBoolean, str:_toJavaString, unicode:_toJavaString, datetime.datetime:_toJavaDate}
# the dict that registers the Java String of type to the method for conversion
javaBasics = {'java.lang.Integer':_toPythonInt, 'java.lang.Float':_toPythonFloat, 'java.lang.Double':_toPythonDouble, 'java.lang.Long':_toPythonLong, 'java.lang.Boolean':_toPythonBool, 'java.lang.String':_toPythonString, 'java.util.Date':_toPythonDatetime}
fallbackBasics = {Number:_toPythonFloat}
'''
The following methods will handle Python and Java collection conversion.
'''
from java.lang import Object
from java.util import Collections, HashMap, LinkedHashMap, ArrayList
from java.util import Date
from java.lang.reflect import Array
from java.util import List, Set, Map
from collections import OrderedDict
import jep
# make a jarray to find out if we have that
JEP_ARRAY_TYPE = type(jep.jarray(0, Object))
# Java -> Python conversion
def javaCollectionToPyCollection(obj, customConverter=None):
'''
Main method to register with JUtil for conversion of Java
collections to Python collections.
'''
if hasattr(obj, 'jclassname'):
classname = obj.jclassname
if classname in javaCollections :
return True, javaCollections[classname](obj, customConverter)
elif PyJavaUtil.isArray(obj):
return True, _fromJavaArray(obj, customConverter)
else :
# we have some fallback capability, if we don't specifically handle a class, we
# want to try some of the more common types and see if those are available for
# conversion
for javaClass in fallbackCollections :
if PyJavaUtil.isSubclass(obj, javaClass):
return True, fallbackCollections[javaClass](obj, customConverter)
elif isinstance(obj, JEP_ARRAY_TYPE):
return True, _fromJepArray(obj, customConverter)
return False, obj
def _toPythonList(obj, customConverter=None):
'''
Converts to a Python list.
'''
retVal = []
size = obj.size()
for i in range(size):
retVal.append(JUtil.javaObjToPyVal(obj.get(i), customConverter))
return retVal
def _toPythonTuple(obj, customConverter=None):
'''
Converts to a Python tuple.
'''
return tuple(_toPythonList(obj, customConverter))
def _toPythonDict(obj, customConverter=None):
'''
Converts to a Python dict.
'''
return __toPythonDict(obj, {}, customConverter)
def _toPythonSet(obj, customConverter=None):
'''
Converts to a Python set.
'''
retVal = set()
size = obj.size()
for i in range(size):
retVal.add(JUtil.javaObjToPyVal(obj.get(i), customConverter))
return retVal
def _toPythonOrderedDict(obj, customConverter=None):
'''
Converts to a Python OrderedDict.
'''
return __toPythonDict(obj, OrderedDict(), customConverter)
def _fromJavaArray(obj, customConverter=None):
'''
Converts from a Java array to a Python list.
'''
retVal = []
for i in range(size):
retVal.append(JUtil.javaObjToPyVal(Array.get(obj, i), customConverter))
return retVal
def _fromJepArray(obj, customConverter=None):
'''
Converts from a Jep array to a Python list.
'''
retVal = []
size = len(obj)
for i in range(size):
retVal.append(JUtil.javaObjToPyVal(obj[i], customConverter))
return retVal
def __toPythonDict(javaMap, pyDict, customConverter=None):
'''
Converts to a Python dict. Passed in the dict type, and then handles the key conversion.
'''
keys = javaMap.keySet()
itr = keys.iterator()
while itr.hasNext() :
key = itr.next()
obj = javaMap.get(key)
pyDict[JUtil.javaObjToPyVal(key)] = JUtil.javaObjToPyVal(obj, customConverter)
return pyDict
# Python -> Java conversion
def pyCollectionToJavaCollection(val):
'''
Main method registered with JUtil for conversion of collections in Python
to Java collections.
'''
valtype = type(val)
if valtype in pythonCollections :
return True, pythonCollections[valtype](val)
# not directly in the dict, so lets check whether they are subclasses
for pytype in pythonCollections :
if issubclass(pytype, valtype):
return True, pythonCollections[valtype](val)
return False, str(val)
def _toJavaList(val):
'''
Turns a Python list to a Java List
'''
retObj = ArrayList()
for i in val :
retObj.add(JUtil.pyValToJavaObj(i))
return retObj
def _toJavaUnmodifiableList(val):
'''
Turns a Python tuple to a Java UnmodifiableList
'''
return Collections.unmodifiableList(_toJavaList(val))
def _toJavaLinkedMap(val):
'''
Turns a Python OrderedDict to a Java LinkedHashMap
'''
return __toJavaMap(val, LinkedHashMap())
def _toJavaMap(val):
'''
Turns a Python dict to a Java HashMap
'''
return __toJavaMap(val, HashMap())
def __toJavaMap(pyDict, jmap):
'''
Does the actual conversion of the elements inside of the dict to Map
'''
for key in pyDict:
jmap.put(JUtil.pyValToJavaObj(key), JUtil.pyValToJavaObj(pyDict[key]))
return jmap
javaCollections = {'java.util.ArrayList':_toPythonList, 'java.util.Arrays$ArrayList':_toPythonList, 'java.util.Collections$UnmodifiableRandomAccessList':_toPythonTuple, 'java.util.HashMap':_toPythonDict, 'java.util.LinkedHashMap':_toPythonOrderedDict}
pythonCollections = { list:_toJavaList, tuple:_toJavaUnmodifiableList, OrderedDict:_toJavaLinkedMap, dict:_toJavaMap }
fallbackCollections = { List:_toPythonList, Map:_toPythonDict, Set:_toPythonSet }
'''
Handles other types of Java to Python conversion and back.
'''
def javaClassToPyClass(obj, customConverter=None):
'''
Main method to convert Java classes to Python classes that aren't already defined above.
Registers with JUtil
'''
if customConverter is not None :
return True, customConverter(obj)
return False, obj
def pyClassToJavaClass(val):
'''
Main method that registers with JUtil to convert Python classes to Java classes.
'''
valtype = type(val)
for pyType in pythonClasses :
if issubclass(valtype, pyType):
return True, pythonClasses[pyType](val)
return False, str(val)
def _toJavaClass(val):
'''
Utilizes the JUtil.JavaWrapperClass object and its corresponding
toJavaObj() method that returns a Java object.
'''
return val.toJavaObj()
# registers the data type for conversion to a Java class.
pythonClasses = {JUtil.JavaWrapperClass:_toJavaClass}