Skip to content

Commit d1e1132

Browse files
committed
Add multi packages support in GlobalValueTransformerLoader and update reflections version.
1 parent 4c18cf9 commit d1e1132

File tree

3 files changed

+66
-45
lines changed

3 files changed

+66
-45
lines changed

CHANGELOG.MD

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# Changelog
2+
23
All notable changes to this project will be documented in this file.
34

45
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
@@ -8,6 +9,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
89

910
### Changed
1011

12+
- Add support of multiple packages in `global.value.transformer.search.namespace` configuration property using `;`
13+
separator, e.g. `a.b.c;x.y.z`.
14+
- Update `reflections` library version to `0.9.12`
15+
16+
## [3.0.0] - 2021-01-07
17+
18+
### Changed
19+
1120
- Change base package from `de.zalando` to `org.zalando`
1221
- Update `postgresql` ([CVE-2020-13692](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-13692))
1322
- Update `guava` ([CVE-2020-8908](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-8908))
@@ -16,14 +25,17 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1625
## [2.0.0] - 2017-08-04
1726

1827
### Added
28+
1929
- Changelog
2030
- Contribution guide
2131

2232
### Changed
33+
2334
- Updated to Java 8
2435
- Updated Spring version to `4.3.8.RELEASE`
2536
- Postgresql JDBC driver updated to version `42.1.1`
2637
- Project license changed to [MIT](LICENSE).
2738

2839
### Removed
40+
2941
- Java 7 support

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
<dependency>
111111
<groupId>org.reflections</groupId>
112112
<artifactId>reflections</artifactId>
113-
<version>0.9.11</version>
113+
<version>0.9.12</version>
114114
</dependency>
115115
<dependency>
116116
<groupId>com.google.guava</groupId>

src/main/java/org/zalando/sprocwrapper/globalvaluetransformer/GlobalValueTransformerLoader.java

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,38 @@
11
package org.zalando.sprocwrapper.globalvaluetransformer;
22

3-
import java.lang.reflect.InvocationTargetException;
4-
import java.util.Set;
5-
3+
import com.google.common.base.Strings;
64
import org.reflections.Reflections;
7-
85
import org.reflections.scanners.SubTypesScanner;
96
import org.reflections.scanners.TypeAnnotationsScanner;
10-
117
import org.reflections.util.ClasspathHelper;
128
import org.reflections.util.ConfigurationBuilder;
139
import org.reflections.util.FilterBuilder;
14-
1510
import org.slf4j.Logger;
1611
import org.slf4j.LoggerFactory;
17-
18-
import com.google.common.base.Predicate;
19-
import com.google.common.base.Strings;
20-
2112
import org.zalando.sprocwrapper.globalvaluetransformer.annotation.GlobalValueTransformer;
22-
2313
import org.zalando.typemapper.core.ValueTransformer;
2414
import org.zalando.typemapper.core.fieldMapper.GlobalValueTransformerRegistry;
2515

16+
import java.lang.reflect.InvocationTargetException;
17+
import java.util.Arrays;
18+
import java.util.HashSet;
19+
import java.util.Set;
20+
import java.util.function.Predicate;
21+
import java.util.stream.Collectors;
22+
2623
public class GlobalValueTransformerLoader {
2724

25+
private static final Logger LOG = LoggerFactory.getLogger(GlobalValueTransformerLoader.class);
2826
private static final String GLOBAL_VALUE_TRANSFORMER_SEARCH_NAMESPACE = "global.value.transformer.search.namespace";
29-
30-
// you need to set the namespace to a valid value like: org.doodlejump
27+
private static final String NAMESPACE_SEPARATOR = ";";
3128
private static String namespaceToScan = "org.zalando";
32-
33-
private static final Logger LOG = LoggerFactory.getLogger(GlobalValueTransformerLoader.class);
3429
private static boolean scannedClasspath = false;
3530

3631
public static synchronized ValueTransformer<?, ?> getValueTransformerForClass(final Class<?> genericType)
37-
throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
32+
throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
3833

3934
// did we already scanned the classpath for global value transformers?
40-
if (scannedClasspath == false) {
41-
final Predicate<String> filter = new Predicate<String>() {
42-
@Override
43-
public boolean apply(final String input) {
44-
return GlobalValueTransformer.class.getCanonicalName().equals(input);
45-
}
46-
};
35+
if (!scannedClasspath) {
4736

4837
// last to get the namespace from the system environment
4938
String myNameSpaceToScan = null;
@@ -59,29 +48,33 @@ public boolean apply(final String input) {
5948
myNameSpaceToScan = namespaceToScan;
6049
}
6150

62-
if (!Strings.isNullOrEmpty(myNameSpaceToScan)) {
63-
final Reflections reflections = new Reflections(new ConfigurationBuilder().filterInputsBy(
64-
new FilterBuilder.Include(FilterBuilder.prefix(myNameSpaceToScan))).setUrls(
65-
ClasspathHelper.forPackage(myNameSpaceToScan)).setScanners(new TypeAnnotationsScanner()
66-
.filterResultsBy(filter), new SubTypesScanner()));
67-
final Set<Class<?>> typesAnnotatedWith = reflections.getTypesAnnotatedWith(
68-
GlobalValueTransformer.class);
69-
for (final Class<?> foundGlobalValueTransformer : typesAnnotatedWith) {
70-
final Class<?> valueTransformerReturnType;
71-
try {
72-
valueTransformerReturnType = ValueTransformerUtils.getUnmarshalFromDbClass(
73-
foundGlobalValueTransformer);
74-
GlobalValueTransformerRegistry.register(valueTransformerReturnType,
75-
(ValueTransformer<?, ?>) foundGlobalValueTransformer.getDeclaredConstructor().newInstance());
76-
} catch (final RuntimeException e) {
77-
LOG.error("Failed to add global transformer [{}] to global registry.",
51+
final Set<String> namespaces =
52+
Arrays.stream(myNameSpaceToScan.split(NAMESPACE_SEPARATOR))
53+
.map(String::trim)
54+
.filter(Strings::isNullOrEmpty)
55+
.collect(Collectors.toSet());
56+
57+
namespaces.add(namespaceToScan);
58+
LOG.debug("Scan the following packages for {}: {}", GlobalValueTransformer.class.getSimpleName(),
59+
namespaces);
60+
final Set<Class<?>> typesAnnotatedWith = loadAnnotatedTypes(namespaces);
61+
62+
for (final Class<?> foundGlobalValueTransformer : typesAnnotatedWith) {
63+
final Class<?> valueTransformerReturnType;
64+
try {
65+
valueTransformerReturnType = ValueTransformerUtils.getUnmarshalFromDbClass(
66+
foundGlobalValueTransformer);
67+
GlobalValueTransformerRegistry.register(valueTransformerReturnType,
68+
(ValueTransformer<?, ?>) foundGlobalValueTransformer.getDeclaredConstructor()
69+
.newInstance());
70+
} catch (final RuntimeException e) {
71+
LOG.error("Failed to add global transformer [{}] to global registry.",
7872
foundGlobalValueTransformer, e);
79-
continue;
80-
}
73+
continue;
74+
}
8175

82-
LOG.debug("Global Value Transformer [{}] for type [{}] registered. ",
76+
LOG.debug("Global Value Transformer [{}] for type [{}] registered.",
8377
foundGlobalValueTransformer.getSimpleName(), valueTransformerReturnType.getSimpleName());
84-
}
8578
}
8679

8780
scannedClasspath = true;
@@ -90,10 +83,26 @@ public boolean apply(final String input) {
9083
return GlobalValueTransformerRegistry.getValueTransformerForClass(genericType);
9184
}
9285

86+
private static Set<Class<?>> loadAnnotatedTypes(Set<String> namespacesToScan) {
87+
final Predicate<String> filter = input -> GlobalValueTransformer.class.getCanonicalName().equals(input);
88+
final Set<Class<?>> result = new HashSet<>();
89+
for (String namespace : namespacesToScan) {
90+
final Reflections reflections = new Reflections(
91+
new ConfigurationBuilder()
92+
.filterInputsBy(new FilterBuilder.Include(FilterBuilder.prefix(namespace)))
93+
.setUrls(ClasspathHelper.forPackage(namespace))
94+
.setScanners(new TypeAnnotationsScanner().filterResultsBy(filter),
95+
new SubTypesScanner())
96+
);
97+
result.addAll(reflections.getTypesAnnotatedWith(GlobalValueTransformer.class));
98+
}
99+
return result;
100+
}
101+
93102
/**
94103
* Use this static function to set the namespace to scan.
95104
*
96-
* @param newNamespace the new namespace to be searched for {@link GlobalValueTransformer}
105+
* @param newNamespace the new namespace to be searched for {@link org.zalando.sprocwrapper.globalvaluetransformer.annotation.GlobalValueTransformer}
97106
*/
98107
public static void changeNamespaceToScan(final String newNamespace) {
99108
namespaceToScan = newNamespace;

0 commit comments

Comments
 (0)