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)); + } + } }