Author: awhite
Date: Tue Jan 23 13:10:21 2007
New Revision: 499137
URL: http://svn.apache.org/viewvc?view=rev&rev=499137
Log:
Use additional contextual classloaders when deserializing lob data.
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/Serialization.java
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?view=diff&rev=499137&r1=499136&r2=499137
==============================================================================
---
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
(original)
+++
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
Tue Jan 23 13:10:21 2007
@@ -658,8 +658,7 @@
boolean loaded) {
int idx = _meta.getExtraFieldDataIndex(field);
if (idx == -1)
- throw new InternalException(String.valueOf(_meta.getField
- (field)));
+ throw new InternalException(String.valueOf(_meta.getField(field)));
Object old = (_fieldImpl == null) ? null : _fieldImpl[idx];
if (data != null) {
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/Serialization.java
URL:
http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/Serialization.java?view=diff&rev=499137&r1=499136&r2=499137
==============================================================================
---
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/Serialization.java
(original)
+++
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/Serialization.java
Tue Jan 23 13:10:21 2007
@@ -21,6 +21,7 @@
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.io.ObjectStreamClass;
import java.io.OutputStream;
import java.io.Serializable;
@@ -28,6 +29,7 @@
import org.apache.openjpa.kernel.StoreContext;
import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.lib.util.MultiClassLoader;
/**
* Helper class to serialize and deserialize persistent objects,
@@ -74,7 +76,7 @@
public static Object deserialize(InputStream in, StoreContext ctx) {
try {
if (ctx == null)
- return new ObjectInputStream(in).readObject();
+ return new ClassResolvingObjectInputStream(in).readObject();
return new PersistentObjectInputStream(in, ctx).readObject();
} catch (Exception e) {
throw new StoreException(e);
@@ -106,11 +108,34 @@
}
}
+ private static class ClassResolvingObjectInputStream
+ extends ObjectInputStream {
+
+ public ClassResolvingObjectInputStream(InputStream delegate)
+ throws IOException {
+ super(delegate);
+ }
+
+ protected Class resolveClass(ObjectStreamClass desc)
+ throws IOException, ClassNotFoundException {
+ MultiClassLoader loader = new MultiClassLoader();
+ addContextClassLoaders(loader);
+ loader.addClassLoader(getClass().getClassLoader());
+ loader.addClassLoader(MultiClassLoader.SYSTEM_LOADER);
+ return Class.forName(desc.getName(), true, loader);
+ }
+
+ protected void addContextClassLoaders(MultiClassLoader loader) {
+ loader.addClassLoader(Thread.currentThread().
+ getContextClassLoader());
+ }
+ }
+
/**
* Object input stream that replaces oids with their objects.
*/
private static class PersistentObjectInputStream
- extends ObjectInputStream {
+ extends ClassResolvingObjectInputStream {
private final StoreContext _ctx;
@@ -124,6 +149,11 @@
super(delegate);
_ctx = ctx;
enableResolveObject(true);
+ }
+
+ protected void addContextClassLoaders(MultiClassLoader loader) {
+ super.addContextClassLoaders(loader);
+ loader.addClassLoader(_ctx.getClassLoader());
}
protected Object resolveObject(Object obj) {