This is an automated email from the ASF dual-hosted git repository.
sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git
The following commit(s) were added to refs/heads/master by this push:
new 6eb238b Remove jboss-reflect dependency (#2022)
6eb238b is described below
commit 6eb238b442e145857977d3980d3b6a23dfda671d
Author: Sijie Guo <[email protected]>
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 <[email protected]>
---
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 62be820..41b45c6 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 8b0f763..2908984 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 f7130ac..7b165b6 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));
+ }
+ }
}