This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git

commit 10397f71de1c6f43b639907106863ecdf416ab7d
Author: Sijie Guo <guosi...@gmail.com>
AuthorDate: Sat Jun 23 04:36:24 2018 -0700

    Remove jboss-reflect dependency (#2022)
    
    * Remove jboss-reflect dependency
    
    *Motivation*
    
    `jboss-reflect` is a LGPL dependency, which is in Category-X and can't be 
used for apache project.
    
    *Solution*
    
    Removed `jboss-reflect` dependency and replace it with a simple util 
function to load classes.
    
    Signed-off-by: Sijie Guo <si...@apache.org>
---
 pom.xml                                            |  7 --
 pulsar-functions/instance/pom.xml                  |  5 --
 .../apache/pulsar/functions/sink/PulsarSink.java   |  4 +-
 .../pulsar/functions/source/PulsarSource.java      |  4 +-
 pulsar-functions/runtime-shaded/pom.xml            |  3 -
 .../apache/pulsar/functions/utils/Reflections.java | 74 ++++++++++++++++++++++
 .../pulsar/functions/utils/ReflectionsTest.java    | 31 +++++++++
 7 files changed, 109 insertions(+), 19 deletions(-)

diff --git a/pom.xml b/pom.xml
index 3330bfe..1f01dcf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -138,7 +138,6 @@ flexible messaging model and an intuitive client 
API.</description>
     <puppycrawl.checkstyle.version>6.19</puppycrawl.checkstyle.version>
     <dockerfile-maven.version>1.3.7</dockerfile-maven.version>
     <typetools.version>0.5.0</typetools.version>
-    <jboss-reflect.version>2.2.1.SP1</jboss-reflect.version>
     <protobuf2.version>2.4.1</protobuf2.version>
     <protobuf3.version>3.5.1</protobuf3.version>
     <protoc3.version>3.5.1-1</protoc3.version>
@@ -721,12 +720,6 @@ flexible messaging model and an intuitive client 
API.</description>
       </dependency>
 
       <dependency>
-        <groupId>org.jboss</groupId>
-        <artifactId>jboss-reflect</artifactId>
-        <version>${jboss-reflect.version}</version>
-      </dependency>
-
-      <dependency>
         <groupId>io.grpc</groupId>
         <artifactId>grpc-all</artifactId>
         <version>${grpc.version}</version>
diff --git a/pulsar-functions/instance/pom.xml 
b/pulsar-functions/instance/pom.xml
index 68fd859..74c94e1 100644
--- a/pulsar-functions/instance/pom.xml
+++ b/pulsar-functions/instance/pom.xml
@@ -101,11 +101,6 @@
       <artifactId>typetools</artifactId>
     </dependency>
 
-    <dependency>
-      <groupId>org.jboss</groupId>
-      <artifactId>jboss-reflect</artifactId>
-    </dependency>
-
   </dependencies>
 
 </project>
diff --git 
a/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/sink/PulsarSink.java
 
b/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/sink/PulsarSink.java
index 0356ab1..590a586 100644
--- 
a/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/sink/PulsarSink.java
+++ 
b/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/sink/PulsarSink.java
@@ -38,9 +38,9 @@ import 
org.apache.pulsar.functions.instance.producers.MultiConsumersOneOuputTopi
 import org.apache.pulsar.functions.instance.producers.Producers;
 import org.apache.pulsar.functions.source.PulsarRecord;
 import org.apache.pulsar.functions.utils.FunctionConfig;
+import org.apache.pulsar.functions.utils.Reflections;
 import org.apache.pulsar.io.core.RecordContext;
 import org.apache.pulsar.io.core.Sink;
-import org.jboss.util.Classes;
 
 import java.util.Base64;
 import java.util.Map;
@@ -240,7 +240,7 @@ public class PulsarSink<T> implements Sink<T> {
     @VisibleForTesting
     void setupSerDe() throws ClassNotFoundException {
 
-        Class<?> typeArg = 
Classes.loadClass(this.pulsarSinkConfig.getTypeClassName(),
+        Class<?> typeArg = 
Reflections.loadClass(this.pulsarSinkConfig.getTypeClassName(),
                 Thread.currentThread().getContextClassLoader());
 
         if (!Void.class.equals(typeArg)) { // return type is not `Void.class`
diff --git 
a/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/source/PulsarSource.java
 
b/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/source/PulsarSource.java
index 74f2366..ae5d0d6 100644
--- 
a/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/source/PulsarSource.java
+++ 
b/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/source/PulsarSource.java
@@ -33,10 +33,10 @@ import org.apache.pulsar.functions.api.SerDe;
 import org.apache.pulsar.functions.api.utils.DefaultSerDe;
 import org.apache.pulsar.functions.instance.InstanceUtils;
 import org.apache.pulsar.functions.utils.FunctionConfig;
+import org.apache.pulsar.functions.utils.Reflections;
 import org.apache.pulsar.functions.utils.Utils;
 import org.apache.pulsar.io.core.Record;
 import org.apache.pulsar.io.core.Source;
-import org.jboss.util.Classes;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -157,7 +157,7 @@ public class PulsarSource<T> implements Source<T> {
     @VisibleForTesting
     void setupSerDe() throws ClassNotFoundException {
 
-        Class<?> typeArg = 
Classes.loadClass(this.pulsarSourceConfig.getTypeClassName(),
+        Class<?> typeArg = 
Reflections.loadClass(this.pulsarSourceConfig.getTypeClassName(),
                 Thread.currentThread().getContextClassLoader());
 
         if (Void.class.equals(typeArg)) {
diff --git a/pulsar-functions/runtime-shaded/pom.xml 
b/pulsar-functions/runtime-shaded/pom.xml
index 2c613b2..12eacd9 100644
--- a/pulsar-functions/runtime-shaded/pom.xml
+++ b/pulsar-functions/runtime-shaded/pom.xml
@@ -127,9 +127,6 @@
                   
<include>com.google.googlejavaformat:google-java-format</include>
                   <include>com.google.errorprone:javac</include>
                   <include>net.jodah:typetools</include>
-                  <include>org.jboss:jboss-reflect</include>
-                  <include>org.jboss.logging:jboss-logging-spi</include>
-                  <include>org.jboss:jboss-common-core</include>
                   <include>com.beust:jcommander</include>
                   
<include>com.fasterxml.jackson.dataformat:jackson-dataformat-yaml</include>
                   <include>org.yaml:snakeyaml</include>
diff --git 
a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/Reflections.java
 
b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/Reflections.java
index 64418bb..6116889 100644
--- 
a/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/Reflections.java
+++ 
b/pulsar-functions/utils/src/main/java/org/apache/pulsar/functions/utils/Reflections.java
@@ -19,11 +19,13 @@
 package org.apache.pulsar.functions.utils;
 
 import java.io.IOException;
+import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -35,6 +37,19 @@ public class Reflections {
     private static final Map<Class<?>, Constructor<?>> constructorCache =
         new ConcurrentHashMap<>();
 
+    private static final Map PRIMITIVE_NAME_TYPE_MAP = new HashMap();
+
+    static {
+        PRIMITIVE_NAME_TYPE_MAP.put("boolean", Boolean.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("byte", Byte.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("char", Character.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("short", Short.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("int", Integer.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("long", Long.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("float", Float.TYPE);
+        PRIMITIVE_NAME_TYPE_MAP.put("double", Double.TYPE);
+    }
+
     /**
      * Create an instance of <code>userClassName</code> using provided 
<code>classLoader</code>.
      * This instance should implement the provided interface 
<code>xface</code>.
@@ -237,4 +252,63 @@ public class Reflections {
         }
         return ret;
     }
+
+    private static boolean isPrimitive(String type) {
+        return PRIMITIVE_NAME_TYPE_MAP.containsKey(type);
+    }
+
+    /**
+     * Load class to resolve array types.
+     *
+     * @param className class name
+     * @param classLoader class loader
+     * @return loaded class
+     * @throws ClassNotFoundException
+     */
+    public static Class loadClass(String className, ClassLoader classLoader) 
throws ClassNotFoundException {
+        if (className.length() == 1) {
+            char type = className.charAt(0);
+            if (type == 'B') {
+                return Byte.TYPE;
+            } else if (type == 'C') {
+                return Character.TYPE;
+            } else if (type == 'D') {
+                return Double.TYPE;
+            } else if (type == 'F') {
+                return Float.TYPE;
+            } else if (type == 'I') {
+                return Integer.TYPE;
+            } else if (type == 'J') {
+                return Long.TYPE;
+            } else if (type == 'S') {
+                return Short.TYPE;
+            } else if (type == 'Z') {
+                return Boolean.TYPE;
+            } else if (type == 'V') {
+                return Void.TYPE;
+            } else {
+                throw new ClassNotFoundException(className);
+            }
+        } else if (isPrimitive(className)) {
+            return (Class)PRIMITIVE_NAME_TYPE_MAP.get(className);
+        } else if (className.charAt(0) == 'L' && 
className.charAt(className.length() - 1) == ';') {
+            return classLoader.loadClass(className.substring(1, 
className.length() - 1));
+        } else {
+            try {
+                return classLoader.loadClass(className);
+            } catch (ClassNotFoundException var4) {
+                if (className.charAt(0) != '[') {
+                    throw var4;
+                } else {
+                    int arrayDimension;
+                    for(arrayDimension = 0; className.charAt(arrayDimension) 
== '['; ++arrayDimension) {
+                        ;
+                    }
+
+                    Class componentType = 
loadClass(className.substring(arrayDimension), classLoader);
+                    return Array.newInstance(componentType, new 
int[arrayDimension]).getClass();
+                }
+            }
+        }
+    }
 }
diff --git 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/ReflectionsTest.java
 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/ReflectionsTest.java
index a8ef953..41f943e 100644
--- 
a/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/ReflectionsTest.java
+++ 
b/pulsar-functions/utils/src/test/java/org/apache/pulsar/functions/utils/ReflectionsTest.java
@@ -164,4 +164,35 @@ public class ReflectionsTest {
         assertTrue(Reflections.classExists(String.class.getName()));
         assertTrue(!Reflections.classExists("com.fake.class"));
     }
+
+    @Test
+    public void testLoadClass() throws Exception {
+        ClassLoader clsLoader = ClassLoader.getSystemClassLoader();
+        Class[] classes = new Class[] {
+            Integer.class,
+            int.class,
+            Byte.class,
+            byte.class,
+            Double.class,
+            double.class,
+            Float.class,
+            float.class,
+            Character.class,
+            char.class,
+            Long.class,
+            long.class,
+            Short.class,
+            short.class,
+            Boolean.class,
+            boolean.class,
+            Void.class,
+            Reflections.class,
+            Integer[].class,
+            int[].class
+        };
+
+        for (Class cls : classes) {
+            assertEquals(cls, Reflections.loadClass(cls.getName(), clsLoader));
+        }
+    }
 }

Reply via email to