Skip to content

Commit d961f42

Browse files
author
vbuell
committed
initial implementation for object transformer
1 parent 993ef37 commit d961f42

File tree

2 files changed

+60
-4
lines changed

2 files changed

+60
-4
lines changed

javaobj.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

7274
class 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+
8796
class 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

tests.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,13 @@ def test_collections(self):
165165
print pobj
166166

167167
classdesc = pobj.get_class()
168-
print classdesc
169-
print classdesc.fields_names
170-
print classdesc.fields_types
168+
# print classdesc
169+
# print classdesc.fields_names
170+
# print classdesc.fields_types
171171

172+
print "arrayList:", pobj.arrayList
173+
print "linkedList:", pobj.linkedList
174+
print "hashMap:", pobj.hashMap
172175

173176
if __name__ == '__main__':
174177
unittest.main()

0 commit comments

Comments
 (0)