Skip to content

Commit

Permalink
JBMAR-137 - Use correct class loader in serializing cloner for readRe…
Browse files Browse the repository at this point in the history
…solve and readObject methods
  • Loading branch information
dmlloyd committed Jun 13, 2012
1 parent fee1b25 commit 2e276bc
Showing 1 changed file with 14 additions and 14 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -190,13 +190,13 @@ private Object clone(final Object orig, final boolean replace) throws IOExceptio
if (UNCLONED.contains(objClass)) { if (UNCLONED.contains(objClass)) {
return orig; return orig;
} }
final boolean sameClass = objClass == clonedClass;
if (objClass.isArray()) { if (objClass.isArray()) {
Object simpleClone = simpleClone(orig, objClass); Object simpleClone = simpleClone(orig, objClass);
if (simpleClone != null) return simpleClone; if (simpleClone != null) return simpleClone;
// must be an object array // must be an object array
final Object[] origArray = (Object[]) orig; final Object[] origArray = (Object[]) orig;
final int len = origArray.length; final int len = origArray.length;
final boolean sameClass = objClass == clonedClass;
if (sameClass && len == 0) { if (sameClass && len == 0) {
clones.put(orig, orig); clones.put(orig, orig);
return orig; return orig;
Expand All @@ -220,6 +220,7 @@ private Object clone(final Object orig, final boolean replace) throws IOExceptio
return clone; return clone;
} }
final SerializableClass info = registry.lookup(objClass); final SerializableClass info = registry.lookup(objClass);
final SerializableClass cloneInfo = sameClass ? info : registry.lookup(clonedClass);
if (replace) { if (replace) {
Object replaced = orig; Object replaced = orig;
if (info.hasWriteReplace()) { if (info.hasWriteReplace()) {
Expand All @@ -236,44 +237,43 @@ private Object clone(final Object orig, final boolean replace) throws IOExceptio
final Object clone; final Object clone;
if (orig instanceof Externalizable) { if (orig instanceof Externalizable) {
final Externalizable externalizable = (Externalizable) orig; final Externalizable externalizable = (Externalizable) orig;
clone = externalizedCreator.create((Class<?>) clone(objClass)); clone = externalizedCreator.create(clonedClass);
clones.put(orig, clone); clones.put(orig, clone);
final Queue<Step> steps = new ArrayDeque<Step>(); final Queue<Step> steps = new ArrayDeque<Step>();
final StepObjectOutput soo = new StepObjectOutput(steps); final StepObjectOutput soo = new StepObjectOutput(steps);
externalizable.writeExternal(soo); externalizable.writeExternal(soo);
soo.doFinish(); soo.doFinish();
((Externalizable) clone).readExternal(new StepObjectInput(steps)); ((Externalizable) clone).readExternal(new StepObjectInput(steps));
} else if (serializabilityChecker.isSerializable(objClass)) { } else if (serializabilityChecker.isSerializable(objClass)) {
clone = serializedCreator.create((Class<?>) clone(objClass)); clone = serializedCreator.create(clonedClass);
final Class<?> cloneClass = clone.getClass(); if (! (serializabilityChecker.isSerializable(clonedClass))) {
if (! (serializabilityChecker.isSerializable(cloneClass))) { throw new NotSerializableException(clonedClass.getName());
throw new NotSerializableException(cloneClass.getName());
} }
clones.put(orig, clone); clones.put(orig, clone);
initSerializableClone(orig, info, clone, cloneClass); initSerializableClone(orig, info, clone, cloneInfo);
} else { } else {
throw new NotSerializableException(objClass.getName()); throw new NotSerializableException(objClass.getName());
} }
Object replaced = clone; Object replaced = clone;
if (info.hasReadResolve()) { if (cloneInfo.hasReadResolve()) {
replaced = info.callReadResolve(replaced); replaced = cloneInfo.callReadResolve(replaced);
} }
replaced = objectResolver.readResolve(replaced); replaced = objectResolver.readResolve(replaced);
if (replaced != clone) clones.put(orig, replaced); if (replaced != clone) clones.put(orig, replaced);
return replaced; return replaced;
} }


private void initSerializableClone(final Object orig, final SerializableClass info, final Object clone, final Class<?> cloneClass) throws IOException, ClassNotFoundException { private void initSerializableClone(final Object orig, final SerializableClass info, final Object clone, final SerializableClass cloneInfo) throws IOException, ClassNotFoundException {


final Class<?> objClass = info.getSubjectClass(); final Class<?> cloneClass = cloneInfo.getSubjectClass();
if (! serializabilityChecker.isSerializable(cloneClass)) { if (! serializabilityChecker.isSerializable(cloneClass)) {
throw new NotSerializableException(cloneClass.getName()); throw new NotSerializableException(cloneClass.getName());
} }
final SerializableClass cloneInfo = registry.lookup(cloneClass);
final Class<?> cloneSuperClass = cloneClass.getSuperclass(); final Class<?> cloneSuperClass = cloneClass.getSuperclass();
final Class<?> objClass = info.getSubjectClass();
if (cloneClass != clone(objClass)) { if (cloneClass != clone(objClass)) {
// try superclass first, then fill in "no data" // try superclass first, then fill in "no data"
initSerializableClone(orig, info, clone, cloneSuperClass); initSerializableClone(orig, info, clone, cloneInfo);
if (cloneInfo.hasReadObjectNoData()) { if (cloneInfo.hasReadObjectNoData()) {
cloneInfo.callReadObjectNoData(clone); cloneInfo.callReadObjectNoData(clone);
} }
Expand All @@ -282,7 +282,7 @@ private void initSerializableClone(final Object orig, final SerializableClass in
// first, init the serializable superclass, if any // first, init the serializable superclass, if any
final Class<?> superClass = objClass.getSuperclass(); final Class<?> superClass = objClass.getSuperclass();
if (serializabilityChecker.isSerializable(superClass) || serializabilityChecker.isSerializable(cloneSuperClass)) { if (serializabilityChecker.isSerializable(superClass) || serializabilityChecker.isSerializable(cloneSuperClass)) {
initSerializableClone(orig, registry.lookup(superClass), clone, cloneSuperClass); initSerializableClone(orig, registry.lookup(superClass), clone, registry.lookup(cloneSuperClass));
} }
if (! serializabilityChecker.isSerializable(objClass)) { if (! serializabilityChecker.isSerializable(objClass)) {
if (cloneInfo.hasReadObjectNoData()) { if (cloneInfo.hasReadObjectNoData()) {
Expand Down

0 comments on commit 2e276bc

Please sign in to comment.