From f922b79d3e1eb54ae3a071d8423d4b0476ab7647 Mon Sep 17 00:00:00 2001 From: Abhinav Sarkar Date: Mon, 2 Nov 2009 23:35:56 +0530 Subject: [PATCH] Added adapters for adapting Java Set, List and Map types to corresponding Python types while converting the args. Added test for it. --- Lib/person.py | 7 +- .../jywrapper/example/Employee.java | 16 ++-- .../jywrapper/example/EmployeeTest.java | 17 ++++ .../abhinavsarkar/jywrapper/JyWrapper.java | 1 - .../net/abhinavsarkar/jywrapper/Util.java | 80 ++++++++++++++++++- 5 files changed, 109 insertions(+), 12 deletions(-) diff --git a/Lib/person.py b/Lib/person.py index 8c65772..e7b1704 100644 --- a/Lib/person.py +++ b/Lib/person.py @@ -24,6 +24,9 @@ class Employee(): if dependent in self._dependents: self._dependents.remove(dependent) dependent.set_employee(None) + + def set_dependents(self, dependents): + self._dependents = dependents def __eq__(self, other): if self == other: @@ -34,7 +37,7 @@ class Employee(): return False def __str__(self): - return "" % (self._first_name, self._last_name) + return "" % (self._first_name, self._last_name, self.__hash__()) def __hash__(self): return 31 + hash(self.__class__) + hash(self._first_name) + hash(self._last_name) @@ -60,7 +63,7 @@ class Dependent(object): return False def __str__(self): - return "" % (self.first_name, self.last_name) + return "" % (self.first_name, self.last_name, self.__hash__()) def __hash__(self): return 31 + hash(self.__class__) + hash(self.first_name) + hash(self.last_name) \ No newline at end of file diff --git a/src/example/java/net/abhinavsarkar/jywrapper/example/Employee.java b/src/example/java/net/abhinavsarkar/jywrapper/example/Employee.java index 7ec7ce7..610af65 100644 --- a/src/example/java/net/abhinavsarkar/jywrapper/example/Employee.java +++ b/src/example/java/net/abhinavsarkar/jywrapper/example/Employee.java @@ -3,17 +3,19 @@ package net.abhinavsarkar.jywrapper.example; import java.util.Set; public interface Employee { - + public Employee initialize(String firstName, String lastName); - + public String getFirstName(); - + public String getLastName(); - + public Set getDependents(); - + + public void setDependents(Set dependents); + public void addDependent(Dependent dependent); - + public void removeDependent(Dependent dependent); - + } diff --git a/src/example/java/net/abhinavsarkar/jywrapper/example/EmployeeTest.java b/src/example/java/net/abhinavsarkar/jywrapper/example/EmployeeTest.java index 089ad08..e8f73be 100644 --- a/src/example/java/net/abhinavsarkar/jywrapper/example/EmployeeTest.java +++ b/src/example/java/net/abhinavsarkar/jywrapper/example/EmployeeTest.java @@ -4,6 +4,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.util.HashSet; +import java.util.Set; + import net.abhinavsarkar.jywrapper.JyWrapper; import org.junit.Test; @@ -49,6 +52,20 @@ public class EmployeeTest { assertTrue(employee.getDependents().contains(dependent)); } + @Test + public void testSetDependent() { + final Dependent dependent = Dependent_.initialize(); + dependent.setFirstName("hawk"); + dependent.setLastName("hawkster"); + final Employee employee = Employee_.initialize("abhinav", "sarkar"); + final Set dependents = new HashSet(); + dependents.add(dependent); + employee.setDependents(dependents); + employee.removeDependent(dependent); + + assertFalse(employee.getDependents().contains(dependent)); + } + @Test public void testRemoveDependent() { final Dependent dependent = Dependent_.initialize(); diff --git a/src/main/java/net/abhinavsarkar/jywrapper/JyWrapper.java b/src/main/java/net/abhinavsarkar/jywrapper/JyWrapper.java index 2151ee0..5fff820 100644 --- a/src/main/java/net/abhinavsarkar/jywrapper/JyWrapper.java +++ b/src/main/java/net/abhinavsarkar/jywrapper/JyWrapper.java @@ -100,7 +100,6 @@ public final class JyWrapper { } } - public static void removeFromPythonPath(final URI path) { final PySystemState pySystemState = Py.getSystemState(); final PyString resolvedPath = Util.resolvePath(path); diff --git a/src/main/java/net/abhinavsarkar/jywrapper/Util.java b/src/main/java/net/abhinavsarkar/jywrapper/Util.java index 6379834..2ead8da 100644 --- a/src/main/java/net/abhinavsarkar/jywrapper/Util.java +++ b/src/main/java/net/abhinavsarkar/jywrapper/Util.java @@ -5,14 +5,22 @@ import static net.abhinavsarkar.jywrapper.Messages._; import java.io.File; import java.io.IOException; import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; import org.python.core.Py; import org.python.core.PyClass; +import org.python.core.PyDictionary; import org.python.core.PyFunction; +import org.python.core.PyList; import org.python.core.PyModule; import org.python.core.PyObject; +import org.python.core.PySet; import org.python.core.PyString; import org.python.core.PyType; +import org.python.core.adapter.PyObjectAdapter; final class Util { @@ -40,16 +48,84 @@ final class Util { return new PyObject[0]; } if (args.length == 1) { - return new PyObject[] { Py.java2py(args[0]) }; + return new PyObject[] { java2py(args[0]) }; } final PyObject[] pyArgs = new PyObject[args.length]; for (int i = args.length; --i >= 0;) { - pyArgs[i] = Py.java2py(args[i]); + pyArgs[i] = java2py(args[i]); } return pyArgs; } + private static abstract class InterfaceAdapter implements PyObjectAdapter { + + private final Class adaptedInterface; + + public InterfaceAdapter(final Class adaptedInterface) { + if (!adaptedInterface.isInterface()) { + throw new IllegalArgumentException( + _("JyWrapper.8", adaptedInterface.getName())); + } + this.adaptedInterface = adaptedInterface; + } + + public boolean canAdapt(final Object object) { + return adaptedInterface.isAssignableFrom(object.getClass()); + } + + } + + private static List interfaceAdapters = new ArrayList(); + + static { + interfaceAdapters.add( + new InterfaceAdapter(Set.class) { + public PyObject adapt(final Object object) { + final Set set = (Set) object; + final PySet pySet = new PySet(); + for (final Object o : set) { + pySet.add(java2py(o)); + } + return pySet; + } + }); + interfaceAdapters.add( + new InterfaceAdapter(List.class) { + public PyObject adapt(final Object object) { + final List list = (List) object; + final PyList pyList = new PyList(); + for (final Object o : list) { + pyList.add(java2py(o)); + } + return pyList; + } + }); + interfaceAdapters.add( + new InterfaceAdapter(Map.class) { + public PyObject adapt(final Object object) { + final Map map = (Map) object; + final PyDictionary pyDictionary = new PyDictionary(); + for (final Map.Entry entry : map.entrySet()) { + pyDictionary.put( + java2py(entry.getKey()), + java2py(entry.getValue())); + } + return pyDictionary; + } + }); + } + + public static PyObject java2py(final Object object) { + for (final InterfaceAdapter interfaceAdapter : interfaceAdapters) { + if (interfaceAdapter.canAdapt(object)) { + return interfaceAdapter.adapt(object); + } + } + + return Py.java2py(object); + } + static String getPyImportName(final PyObject pyObject) { synchronized (pyObject) { if (pyObject instanceof PyType) {