[FLINK-1817] Fix ClassLoaderObjectInputStream to support primitive type classes

This closes #565


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/d33b4454
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/d33b4454
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/d33b4454

Branch: refs/heads/master
Commit: d33b44549d416c30f01ead9aacf5cf7ed30674ca
Parents: 23fe006
Author: Fabian Hueske <fhue...@apache.org>
Authored: Thu Apr 2 01:28:08 2015 +0200
Committer: Fabian Hueske <fhue...@apache.org>
Committed: Tue Apr 7 14:46:24 2015 +0200

----------------------------------------------------------------------
 .../apache/flink/util/InstantiationUtil.java    | 30 +++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/d33b4454/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java
----------------------------------------------------------------------
diff --git 
a/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java 
b/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java
index c7088f5..241e56a 100644
--- a/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java
+++ b/flink-core/src/main/java/org/apache/flink/util/InstantiationUtil.java
@@ -34,6 +34,7 @@ import java.io.ObjectOutputStream;
 import java.io.ObjectStreamClass;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
+import java.util.HashMap;
 
 /**
  * Utility class to create instances from class objects and checking failure 
reasons.
@@ -48,10 +49,37 @@ public class InstantiationUtil {
        private static class ClassLoaderObjectInputStream extends 
ObjectInputStream {
                private ClassLoader classLoader;
 
+               private static final HashMap<String, Class<?>> primitiveClasses
+                               = new HashMap<String, Class<?>>(8, 1.0F);
+               static {
+                       primitiveClasses.put("boolean", boolean.class);
+                       primitiveClasses.put("byte", byte.class);
+                       primitiveClasses.put("char", char.class);
+                       primitiveClasses.put("short", short.class);
+                       primitiveClasses.put("int", int.class);
+                       primitiveClasses.put("long", long.class);
+                       primitiveClasses.put("float", float.class);
+                       primitiveClasses.put("double", double.class);
+                       primitiveClasses.put("void", void.class);
+               }
+
                @Override
                public Class<?> resolveClass(ObjectStreamClass desc) throws 
IOException, ClassNotFoundException {
                        if (classLoader != null) {
-                               return Class.forName(desc.getName(), false, 
classLoader);
+                               String name = desc.getName();
+                               try {
+                                       return Class.forName(name, false, 
classLoader);
+                               } catch (ClassNotFoundException ex) {
+                                       // check if class is a primitive class
+                                       Class<?> cl = 
primitiveClasses.get(name);
+                                       if (cl != null) {
+                                               // return primitive class
+                                               return cl;
+                                       } else {
+                                               // throw ClassNotFoundException
+                                               throw ex;
+                                       }
+                               }
                        }
 
                        return super.resolveClass(desc);

Reply via email to