@@ -32,6 +32,7 @@ def load(file_object):
3232 from a file-like object.
3333 """
3434 marshaller = JavaObjectUnmarshaller (file_object )
35+ marshaller .add_transformer (DefaultObjectTransformer ())
3536 return marshaller .readObject ()
3637
3738
@@ -42,6 +43,7 @@ def loads(string):
4243 """
4344 f = StringIO .StringIO (string )
4445 marshaller = JavaObjectUnmarshaller (f )
46+ marshaller .add_transformer (DefaultObjectTransformer ())
4547 return marshaller .readObject ()
4648
4749
@@ -71,6 +73,7 @@ def __repr__(self):
7173
7274class JavaObject (object ):
7375 classdesc = None
76+ annotations = []
7477
7578 def get_class (self ):
7679 return self .classdesc
@@ -84,6 +87,12 @@ def __repr__(self):
8487 name = self .classdesc .name
8588 return "<javaobj:%s>" % name
8689
90+ def copy (self , new_object ):
91+ new_object .classdesc = self .classdesc
92+
93+ for name in self .classdesc .fields_names :
94+ new_object .__setattr__ (name , getattr (self , name ))
95+
8796class JavaObjectConstants :
8897
8998 STREAM_MAGIC = 0xaced
@@ -163,6 +172,7 @@ def __init__(self, stream=None):
163172 self .references = []
164173 self .object_stream = stream
165174 self ._readStreamHeader ()
175+ self .object_transformers = []
166176
167177 def readObject (self ):
168178 try :
@@ -182,6 +192,9 @@ def readObject(self):
182192 self ._oops_dump_state ()
183193 raise
184194
195+ def add_transformer (self , transformer ):
196+ self .object_transformers .append (transformer )
197+
185198 def _readStreamHeader (self ):
186199 (magic , version ) = self ._readStruct (">HH" )
187200 if magic != self .STREAM_MAGIC or version != self .STREAM_VERSION :
@@ -200,6 +213,8 @@ def _read_and_exec_opcode(self, ident=0, expect=None):
200213 def _readStruct (self , unpack ):
201214 length = struct .calcsize (unpack )
202215 ba = self .object_stream .read (length )
216+ if len (ba ) != length :
217+ raise RuntimeError ("Stream has been ended unexpectedly while unmarshaling." )
203218 return struct .unpack (unpack , ba )
204219
205220 def _readString (self ):
@@ -344,7 +359,16 @@ def do_object(self, parent=None, ident=0):
344359 # objectAnnotation
345360 while opcode != self .TC_ENDBLOCKDATA :
346361 opcode , obj = self ._read_and_exec_opcode (ident = ident + 1 ) # , expect=[self.TC_ENDBLOCKDATA, self.TC_BLOCKDATA, self.TC_OBJECT, self.TC_NULL, self.TC_REFERENCE])
347- log_debug ("objectAnnotation value: " + str (obj ))
362+ if opcode != self .TC_ENDBLOCKDATA :
363+ java_object .annotations .append (obj )
364+ log_debug ("objectAnnotation value: " + str (obj ), ident )
365+
366+ # Transform object
367+ for transformer in self .object_transformers :
368+ tmp_object = transformer .transform (java_object )
369+ if tmp_object != java_object :
370+ java_object = tmp_object
371+ break
348372
349373 return java_object
350374
@@ -466,6 +490,7 @@ def __init__(self, stream=None):
466490 self .object_stream = stream
467491
468492 def dump (self , obj ):
493+
469494 self .object_obj = obj
470495 self .object_stream = StringIO .StringIO ()
471496 self ._writeStreamHeader ()
@@ -503,3 +528,31 @@ def write_blockdata(self, obj, parent=None):
503528 def write_object (self , obj , parent = None ):
504529 self ._writeStruct (">B" , 1 , (self .TC_OBJECT , ))
505530 self ._writeStruct (">B" , 1 , (self .TC_CLASSDESC , ))
531+
532+ class DefaultObjectTransformer (object ):
533+
534+ class JavaList (list , JavaObject ):
535+ pass
536+
537+ def transform (self , object ):
538+ # if object.get_class().name == "java.util.ArrayList":
539+ # print "---"
540+ # print "java.util.ArrayList"
541+ # print object.annotations
542+ # print "---"
543+ # new_object = self.JavaList()
544+ # object.copy(new_object)
545+ # new_object.extend(object.annotations)
546+ # return new_object
547+ if object .get_class ().name == "java.util.LinkedList" :
548+ print "---"
549+ print
550+ print "java.util.LinkedList"
551+ print object .annotations
552+ print "---"
553+ new_object = self .JavaList ()
554+ object .copy (new_object )
555+ new_object .extend (object .annotations )
556+ return new_object
557+
558+ return object
0 commit comments