Hi Andy-

Sorry for the delay in response.  Thanks for testing the revised implementation.  I am looking into these issues and I will be in touch.


Josh Juneau
Twitter ID:  javajuneau

On Sat, Mar 13, 2010 at 3:06 AM, Andy Rose <barbalute@gmail.com> wrote:
Sorry for the late reply! It's been a busy week.

I'm still getting an error. I have a (serializable) Java class and a Python class that extends it, and I've loaded the Python class (successfully) into Java. After instantiating the Python class in Java, I'd like to make a copy of it from Java.

So I've tried - with the new files you've sent me - creating a new function in the superclass (that returned null) but I overrode it in the Python class, having it return a copy.deepcopy(pythonClassName). That didn't work, so what I then tried was using the copy method from DeepJavaCopier, and it's giving me a ClassNotFound error when it tries to read the object back in (obj = in.readObject();)

This is the first line of the error I'm getting:
java.lang.ClassNotFoundException: org.python.proxies.MyTestClass$MyTestClass$0

So I'm not sure if I'm using it properly - my class is only serializable (not cloneable), because I only want to make a deep copy of it.

Thanks again for all your help,

On Tue, Mar 9, 2010 at 2:54 AM, Josh Juneau <juneau001@gmail.com> wrote:

You are correct in that there were still issues with the version of copy.py which I previously sent to you.  I think that the issues you were seeing are twofold.  There are a couple of rules one must follow in order to create copies of Java objects.  First, in order to be deep copyable, a Java object must implement java.io.Serializable.  Ensure that your testClass is serializable.  Second, if you are trying to create a shallow copy of the object then it must implement the java.lang.Cloneable interface and override the clone() method.  I've attached one such Java object (Person.java) that should be both shallow and deep copyable via the new copy.py (which is also included).

I found that in the previous version I sent to you , Java classes were not being deep copied correctly as the Python code was unable to actually create the copy.  In order to make it work, I've re-written the deep copy implementation in Java code and now the copy.py uses the new Java implementation each time a deep copy is necessary.  This seems to do the trick as I believe the Python deep copy implementation was encountering issues in translation and creating a proxy object rather than a straight copy.

To use this new version, please place DeepJavaCopier.class, and copy.py in your Lib directory.  Then, ensure that your Java object adheres to the rules mentioned above.  The solution definitely could use some further testing, so any help would be appreciated! 


On Mon, Mar 8, 2010 at 4:28 PM, Andy Rose <barbalute@gmail.com> wrote:
Thanks very much to both of you for the help, but with the new copy.py I'm getting an error:

raise Error('un-deep-copyable object of type %s' % type(x))
copy.Error: un-deep-copyable object of type <class 'testClass.testClass'>

testClass in this case is a very simple class containing only a single integer. Any ideas why this might be happening? I can give my code if it will help.

Thanks again,

On Mon, Mar 8, 2010 at 4:08 PM, Josh Juneau <juneau001@gmail.com> wrote:
Yes, there is an issue with the current version of copy.py that is being distributed with 2.5.1.  You can read more about the issue on the bug tracker at http://bugs.jython.org/issue1551...but it specifically addresses issues while making copies of Java objects using copy() and deepcopy().  I am going to be checking in the attached version of copy.py which has been corrected to address the issues related to the bug report.  There is also an effort taking place to convert the current version of copy.py into a Java implementation to help boost performance a bit.  Please stay tuned for that version sometime in the future.

If you have a moment, please drop the attached version of copy.py into your jython Lib directory and give it a try.  Hopefully it will resolve your issues.  If it does not, please submit another bug or add onto issue 1551.


Josh Juneau
Twitter ID:  javajuneau

On Mon, Mar 8, 2010 at 1:49 PM, Barbalute <Barbalute@gmail.com> wrote:

As the name suggests, it seems that copy and deepcopy aren't copying the
variables in my Java class.

I currently have a Python class extending an existing Java abstract class.
For various reasons, I've overwritten clone() in the Python class so that
when the Java class calls it, it returns a deepcopy() of itself.

This seems to properly copy the methods from the class, but the variables
from the abstract Java class are lost in the copy, and I have no idea why.

In the overwritten Python clone() method, I'm able to manually copy over the
variables, doing for example:

x = copy.deepcopy(self)
x.name = self.name
return x

But this shouldn't be necessary and becomes increasingly unwieldy for
classes with lots of variables. If I don't do it, though, name is not set in
x and will return null in Java. Am I doing something wrong, or is something
broken with copy() and deepcopy()?

Thanks for your time.
View this message in context: http://old.nabble.com/copy-and-deepcopy-not-copying-Java-class-variables--tp27826254p27826254.html
Sent from the jython-users mailing list archive at Nabble.com.

Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
Jython-users mailing list