Repository: metamodel Updated Branches: refs/heads/feature/5.x/swagger-docs 3ac879eac -> 35c9861eb
METAMODEL-241: Fixed This fix is implemented by further diving deep into the depths of OpenJDK. I'm not really fond of going down that route, but it seems to be the way to go if we really want to keep deserialization support. Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/cfe3e120 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/cfe3e120 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/cfe3e120 Branch: refs/heads/feature/5.x/swagger-docs Commit: cfe3e1207ea3a753bde45c1b8108bb05cee8703b Parents: 2e39b50 Author: kaspersorensen <[email protected]> Authored: Sun May 15 21:47:27 2016 -0700 Committer: kaspersorensen <[email protected]> Committed: Sun May 15 21:47:27 2016 -0700 ---------------------------------------------------------------------- CHANGES.md | 1 + .../LegacyDeserializationObjectInputStream.java | 26 ++++++++++++++++++++ 2 files changed, 27 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/cfe3e120/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index 66d1917..d4d0110 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ * [METAMODEL-159] - DataContextFactory misses methods to create HBase and POJO data contexts. * [METAMODEL-252] - Fixed a bug that caused JDBC updates to unnecessarily refresh schema objects. * [METAMODEL-1082] - Improved performance of batch ElasticSearch operations by using bulk API. + * [METAMODEL-241] - Fixed deserialization of legacy enum types on OpenJDK after rev. 7c1d34773aa6. ### Apache MetaModel 4.5.2 http://git-wip-us.apache.org/repos/asf/metamodel/blob/cfe3e120/core/src/main/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStream.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStream.java b/core/src/main/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStream.java index c4d4570..95fad92 100644 --- a/core/src/main/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStream.java +++ b/core/src/main/java/org/apache/metamodel/util/LegacyDeserializationObjectInputStream.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Comparator; @@ -252,6 +253,31 @@ public class LegacyDeserializationObjectInputStream extends ObjectInputStream { */ private boolean isEnumExpected(ObjectStreamClass objectStreamClass) { try { + final Field initializedField = ObjectStreamClass.class.getDeclaredField("initialized"); + initializedField.setAccessible(true); + final Boolean initialized = (Boolean) initializedField.get(objectStreamClass); + if (!initialized) { + /* + * Snippet from the JDK source: + * + * void initNonProxy(ObjectStreamClass model, + * Class<?> cl, + * ClassNotFoundException resolveEx, + * ObjectStreamClass superDesc) + **/ + final Method initMethod = ObjectStreamClass.class.getDeclaredMethod("initNonProxy", ObjectStreamClass.class, + Class.class, ClassNotFoundException.class, ObjectStreamClass.class); + initMethod.setAccessible(true); + initMethod.invoke(objectStreamClass, objectStreamClass, null, null, null); + } + } catch (NoSuchFieldError e) { + logger.debug("Failed to access boolean field 'initialized' in {}", objectStreamClass.getName(), e); + } catch (Exception e) { + logger.debug("Failed to access invoke ObjectStreamClass.initialize() to prepare {}", objectStreamClass + .getName(), e); + } + + try { final Method isEnumMethod = ObjectStreamClass.class.getDeclaredMethod("isEnum"); isEnumMethod.setAccessible(true); final Boolean result = (Boolean) isEnumMethod.invoke(objectStreamClass);
