Skip to content

Commit

Permalink
removed Spring dependencies from para-core, added ClassGraph lib for …
Browse files Browse the repository at this point in the history
…classpath scanning
  • Loading branch information
albogdano committed Aug 21, 2021
1 parent f49211e commit c588367
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 73 deletions.
25 changes: 4 additions & 21 deletions para-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

<properties>
<jacksonVer>2.12.3</jacksonVer>
<springVer>5.3.9</springVer>
<flexmarkVer>0.62.2</flexmarkVer>
</properties>

Expand All @@ -25,27 +24,11 @@
<version>${awsJdkVer}</version>
</dependency>

<!-- SPRING -->
<!-- CLASSGRAPH -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springVer}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springVer}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springVer}</version>
<groupId>io.github.classgraph</groupId>
<artifactId>classgraph</artifactId>
<version>4.8.114</version>
</dependency>

<!-- INJECT & JAX-RS -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,11 @@
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import io.github.classgraph.ClassGraph;
import io.github.classgraph.ClassInfoList;
import io.github.classgraph.ScanResult;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
Expand All @@ -48,10 +50,6 @@
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;
import org.springframework.util.ClassUtils;

/**
* Contains methods for object/grid mapping, JSON serialization, class scanning and resolution.
Expand All @@ -67,7 +65,6 @@ public final class ParaObjectUtils {
// maps lowercase simple names to class objects
private static final Map<String, Class<? extends ParaObject>> CORE_CLASSES = new DualHashBidiMap();
private static final Map<String, Class<? extends ParaObject>> CORE_PARA_CLASSES = new DualHashBidiMap();
private static final CoreClassScanner SCANNER = new CoreClassScanner();
private static final ObjectMapper JSON_MAPPER = new ObjectMapper();

static {
Expand Down Expand Up @@ -501,13 +498,33 @@ public static Class<? extends ParaObject> toClass(String type, Class<? extends P
*
* @return a map of simple class names (lowercase) to class objects
*/
@SuppressWarnings("unchecked")
public static Map<String, Class<? extends ParaObject>> getCoreClassesMap() {
if (CORE_CLASSES.isEmpty()) {
try {
CORE_PARA_CLASSES.putAll(SCANNER.getComponentClasses(ParaObject.class.getPackage().getName()));
String corePackage = ParaObject.class.getPackage().getName();
ClassGraph cg1 = new ClassGraph().enableClassInfo().acceptPackages(corePackage);
try (ScanResult scanResult = cg1.scan()) {
ClassInfoList classes = scanResult.getClassesImplementing(ParaObject.class.getName()).
filter(ci -> !ci.isInterface() && !ci.isAbstract());
for (io.github.classgraph.ClassInfo clazz : classes) {
CORE_PARA_CLASSES.put(clazz.getSimpleName().toLowerCase(),
(Class<? extends ParaObject>) clazz.loadClass(true));
}
}

CORE_CLASSES.putAll(CORE_PARA_CLASSES);

if (!Config.CORE_PACKAGE_NAME.isEmpty()) {
CORE_CLASSES.putAll(SCANNER.getComponentClasses(Config.CORE_PACKAGE_NAME));
ClassGraph cg2 = new ClassGraph().enableClassInfo().acceptPackages(Config.CORE_PACKAGE_NAME);
try (ScanResult scanResult = cg2.scan()) {
ClassInfoList classes = scanResult.getClassesImplementing(ParaObject.class.getName()).
filter(ci -> !ci.isInterface() && !ci.isAbstract());
for (io.github.classgraph.ClassInfo clazz : classes) {
CORE_CLASSES.putIfAbsent(clazz.getSimpleName().toLowerCase(),
(Class<? extends ParaObject>) clazz.loadClass(true));
}
}
}
logger.debug("Found {} ParaObject classes: {}", CORE_CLASSES.size(), CORE_CLASSES);
} catch (Exception ex) {
Expand All @@ -517,40 +534,6 @@ public static Map<String, Class<? extends ParaObject>> getCoreClassesMap() {
return Collections.unmodifiableMap(CORE_CLASSES);
}

/**
* Helper class that lists all classes contained in a given package.
*/
private static class CoreClassScanner extends ClassPathScanningCandidateComponentProvider {

private static final Logger LOG = LoggerFactory.getLogger(CoreClassScanner.class);

CoreClassScanner() {
super(false);
addIncludeFilter(new AssignableTypeFilter(ParaObject.class));
}

final Map<String, Class<? extends ParaObject>> getComponentClasses(String basePackage) {
basePackage = (basePackage == null) ? "" : basePackage;
Map<String, Class<? extends ParaObject>> classes = new LinkedHashMap<>();
for (BeanDefinition candidate : findCandidateComponents(basePackage)) {
try {
Class<? extends ParaObject> clazz = (Class<? extends ParaObject>)
ClassUtils.resolveClassName(candidate.getBeanClassName(),
Thread.currentThread().getContextClassLoader());
boolean isAbstract = Modifier.isAbstract(clazz.getModifiers());
boolean isInterface = Modifier.isInterface(clazz.getModifiers());
boolean isCoreObject = ParaObject.class.isAssignableFrom(clazz);
if (isCoreObject && !isAbstract && !isInterface) {
classes.put(clazz.getSimpleName().toLowerCase(), clazz);
}
} catch (Exception ex) {
LOG.error(null, ex);
}
}
return classes;
}
}

/**
* Converts a JSON string to a domain object. If we can't match the JSON to a core object, we fall back to
* {@link com.erudika.para.core.Sysprop}.
Expand Down
25 changes: 15 additions & 10 deletions para-core/src/main/java/com/erudika/para/rest/Signer.java
Original file line number Diff line number Diff line change
Expand Up @@ -235,16 +235,8 @@ public Response invokeSignedRequest(Client apiClient, String accessKey, String s

// strip URI template param brackets - https://stackoverflow.com/questions/57011188
reqPath = reqPath.replaceAll("[{}]", "");
if (params != null) {
for (Map.Entry<String, List<String>> param : params.entrySet()) {
String key = param.getKey();
List<String> value = param.getValue();
if (value != null && !value.isEmpty()) {
params.put(key, value.stream().filter(v -> !StringUtils.isBlank(v)).
map(v -> v.replaceAll("[{}]", "")).collect(Collectors.toList()));
}
}
}
cleanUpParams(params);

WebTarget target = apiClient.target(endpointURL).path(reqPath);
Map<String, String> signedHeaders = new HashMap<>();
if (!isJWT) {
Expand Down Expand Up @@ -351,4 +343,17 @@ public Map<String, String> signRequest(String accessKey, String secretKey,

return sign(httpMethod, endpointURL, reqPath, headers, sigParams, in, accessKey, secretKey);
}

private void cleanUpParams(MultivaluedMap<String, String> params) {
if (params != null) {
for (Map.Entry<String, List<String>> param : params.entrySet()) {
String key = param.getKey();
List<String> value = param.getValue();
if (value != null && !value.isEmpty()) {
params.put(key, value.stream().filter(v -> !StringUtils.isBlank(v)).
map(v -> v.replaceAll("[{}]", "")).collect(Collectors.toList()));
}
}
}
}
}

0 comments on commit c588367

Please sign in to comment.