Skip to content

Commit

Permalink
Remove jboss-reflect dependency (#2022)
Browse files Browse the repository at this point in the history
* 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 <sijie@apache.org>
  • Loading branch information
sijie committed Jun 23, 2018
1 parent ed5a8ba commit 6eb238b
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 19 deletions.
7 changes: 0 additions & 7 deletions pom.xml
Expand Up @@ -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>
Expand Down Expand Up @@ -720,12 +719,6 @@ flexible messaging model and an intuitive client API.</description>
<version>${typetools.version}</version>
</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>
Expand Down
5 changes: 0 additions & 5 deletions pulsar-functions/instance/pom.xml
Expand Up @@ -101,11 +101,6 @@
<artifactId>typetools</artifactId>
</dependency>

<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-reflect</artifactId>
</dependency>

</dependencies>

</project>
Expand Up @@ -38,9 +38,9 @@
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;
Expand Down Expand Up @@ -240,7 +240,7 @@ public void close() throws Exception {
@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`
Expand Down
Expand Up @@ -33,10 +33,10 @@
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;
Expand Down Expand Up @@ -157,7 +157,7 @@ public void close() throws Exception {
@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)) {
Expand Down
3 changes: 0 additions & 3 deletions pulsar-functions/runtime-shaded/pom.xml
Expand Up @@ -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>
Expand Down
Expand Up @@ -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;

Expand All @@ -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>.
Expand Down Expand Up @@ -237,4 +252,63 @@ public static boolean classImplementsIface(String fqcn, Class xface) {
}
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();
}
}
}
}
}
Expand Up @@ -164,4 +164,35 @@ public void testClassExists() {
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));
}
}
}

0 comments on commit 6eb238b

Please sign in to comment.