rmannibucau commented on code in PR #210:
URL: https://github.com/apache/openjpa/pull/210#discussion_r4230069596
##########
openjpa-kernel/src/main/java/org/apache/openjpa/util/Serialization.java:
##########
@@ -111,23 +104,55 @@ protected Object replaceObject(Object obj) {
}
}
- public static class ClassResolvingObjectInputStream
- extends ObjectInputStream {
+ public static class ClassResolvingObjectInputStream extends
ObjectInputStream {
+ /**
+ * Candidate loaders, in the same order the original MultiClassLoader
+ * used them; resolved lazily once per stream.
+ */
+ private ClassLoader[] _loaders;
- public ClassResolvingObjectInputStream(InputStream delegate)
- throws IOException {
+ public ClassResolvingObjectInputStream(InputStream delegate) throws
IOException {
super(delegate);
}
@Override
- protected Class resolveClass(ObjectStreamClass desc)
- throws IOException, ClassNotFoundException {
+ protected Class resolveClass(ObjectStreamClass desc) throws
IOException, ClassNotFoundException {
String name = BlacklistClassResolver.DEFAULT.check(desc.getName());
- MultiClassLoader loader = new MultiClassLoader();
- addContextClassLoaders(loader);
- loader.addClassLoader(getClass().getClassLoader());
- loader.addClassLoader(MultiClassLoader.SYSTEM_LOADER);
- return Class.forName(name, true, loader);
+ ClassNotFoundException notFound = null;
+ for (ClassLoader loader : getCandidateLoaders()) {
+ try {
+ return Class.forName(name, true, loader);
+ } catch (ClassNotFoundException e) {
+ if (notFound == null) {
+ notFound = e;
+ }
+ }
+ }
+
+ // primitive types and anything the candidates could not see
+ try {
+ return super.resolveClass(desc);
+ } catch (ClassNotFoundException e) {
+ throw notFound == null ? e : notFound;
+ }
+ }
+
+ private ClassLoader[] getCandidateLoaders() {
+ if (_loaders == null) {
+ // MultiClassLoader is used here only as an ordered,
de-duplicating
+ // container so that subclasses overriding
addContextClassLoaders keep
+ // working; it is never handed to the JVM, hence no
ClassLoaderData
+ // is created for it.
+ MultiClassLoader holder = new MultiClassLoader();
Review Comment:
`new ClassLoader[] {}` or Stream.of(....).filter().toArray() works
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]