Skip to content

Commit 5fdf93a

Browse files
committed
Added basic processor for collecting Mapper that conform to Spring's Converter interface.
1 parent f30e7f0 commit 5fdf93a

File tree

18 files changed

+201
-74
lines changed

18 files changed

+201
-74
lines changed

additions/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
dependencies {
2+
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
3+
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
4+
implementation 'org.springframework:spring-core:5.0.0.RELEASE'
5+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package uk.co.kleindelao.mapstruct.spring;
2+
3+
import org.springframework.core.convert.converter.Converter;
4+
5+
import javax.annotation.processing.AbstractProcessor;
6+
import javax.annotation.processing.RoundEnvironment;
7+
import javax.annotation.processing.SupportedAnnotationTypes;
8+
import javax.lang.model.element.Element;
9+
import javax.lang.model.element.ExecutableElement;
10+
import javax.lang.model.element.TypeElement;
11+
import javax.lang.model.type.DeclaredType;
12+
import javax.lang.model.type.TypeMirror;
13+
import javax.lang.model.util.Types;
14+
import java.util.Optional;
15+
import java.util.Set;
16+
import java.util.stream.Collectors;
17+
18+
import static javax.lang.model.element.ElementKind.METHOD;
19+
import static javax.lang.model.element.Modifier.PUBLIC;
20+
import static javax.lang.model.type.TypeKind.DECLARED;
21+
import static javax.tools.Diagnostic.Kind.NOTE;
22+
23+
@SupportedAnnotationTypes(ConverterMapperProcessor.ORG_MAPSTRUCT_MAPPER)
24+
public class ConverterMapperProcessor extends AbstractProcessor {
25+
protected static final String ORG_MAPSTRUCT_MAPPER = "org.mapstruct.Mapper";
26+
27+
@Override
28+
public boolean process(
29+
final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
30+
final Types typeUtils = processingEnv.getTypeUtils();
31+
for (final TypeElement annotation : annotations) {
32+
if (ORG_MAPSTRUCT_MAPPER.contentEquals(annotation.getQualifiedName())) {
33+
roundEnv.getElementsAnnotatedWith(annotation).stream()
34+
.filter(mapper -> mapper.asType().getKind() == DECLARED)
35+
.filter(mapper -> getConverterSupertype(mapper).isPresent())
36+
.forEach(
37+
mapper ->
38+
mapper.getEnclosedElements().stream()
39+
.filter(element -> element.getKind() == METHOD)
40+
.filter(method -> method.getModifiers().contains(PUBLIC))
41+
.filter(method -> method.getSimpleName().contentEquals("convert"))
42+
.filter(
43+
convert -> ((ExecutableElement) convert).getParameters().size() == 1)
44+
.filter(
45+
convert ->
46+
typeUtils.isSameType(
47+
getFirstParameterType((ExecutableElement) convert),
48+
getFirstTypeArgument(getConverterSupertype(mapper).get())))
49+
.forEach(
50+
convert ->
51+
processingEnv
52+
.getMessager()
53+
.printMessage(
54+
NOTE,
55+
"Found Mapper '"
56+
+ mapper
57+
+ "' with convert method mapping from '"
58+
+ ((ExecutableElement) convert).getParameters().stream().map(Element::asType).map(TypeMirror::toString).collect(Collectors.joining())
59+
+ "' to '"
60+
+ ((ExecutableElement) convert).getReturnType()
61+
+ "'.")));
62+
}
63+
}
64+
return false;
65+
}
66+
67+
private Optional<? extends TypeMirror> getConverterSupertype(final Element mapper) {
68+
final Types typeUtils = processingEnv.getTypeUtils();
69+
return typeUtils.directSupertypes(mapper.asType()).stream()
70+
.filter(
71+
supertype -> typeUtils.erasure(supertype).toString().equals(Converter.class.getName()))
72+
.findFirst();
73+
}
74+
75+
private static TypeMirror getFirstParameterType(final ExecutableElement convert) {
76+
return convert.getParameters().stream().findFirst().map(Element::asType).orElse(null);
77+
}
78+
79+
private static TypeMirror getFirstTypeArgument(final TypeMirror converterSupertype) {
80+
return ((DeclaredType) converterSupertype).getTypeArguments().stream().findFirst().orElse(null);
81+
}
82+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
uk.co.kleindelao.mapstruct.spring.ConverterMapperProcessor

build.gradle

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,50 @@ plugins {
1010
// Apply the java-library plugin to add support for Java Library
1111
id 'java-library'
1212
id 'jacoco'
13+
id 'maven'
1314
}
1415

15-
repositories {
16-
// Use jcenter for resolving dependencies.
17-
// You can declare any Maven/Ivy/file repository here.
18-
jcenter()
16+
group = 'uk.co.kleindelao.mapstruct.spring'
17+
version = '0.0.1'
18+
19+
allprojects {
20+
repositories {
21+
// Use jcenter for resolving dependencies.
22+
// You can declare any Maven/Ivy/file repository here.
23+
jcenter()
24+
mavenCentral()
25+
}
1926
}
2027

21-
dependencies {
22-
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
23-
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
24-
implementation 'org.springframework:spring-core:5.0.0.RELEASE'
28+
subprojects {
29+
apply plugin: "java-library"
2530

26-
// Use JUnit Jupiter API for testing.
27-
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2'
31+
dependencies {
32+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.1'
33+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.1'
34+
}
2835

29-
// Use JUnit Jupiter Engine for testing.
30-
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
31-
}
36+
compileJava {
37+
sourceCompatibility '1.8'
38+
targetCompatibility '1.8'
39+
}
3240

33-
test {
34-
// Use junit platform for unit tests
35-
useJUnitPlatform()
36-
}
41+
test {
42+
// Use junit platform for unit tests
43+
useJUnitPlatform()
44+
}
3745

38-
jacocoTestReport {
39-
reports {
40-
xml.enabled true
41-
html.enabled false
46+
jacocoTestReport {
47+
reports {
48+
xml.enabled true
49+
html.enabled false
50+
}
4251
}
52+
53+
check.dependsOn jacocoTestReport
54+
}
55+
56+
wrapper {
57+
gradleVersion = '6.3'
4358
}
4459

45-
check.dependsOn jacocoTestReport

gradle/wrapper/gradle-wrapper.jar

3.01 KB
Binary file not shown.

gradle/wrapper/gradle-wrapper.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#Fri Oct 04 14:42:01 BST 2019
2-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
1+
#Sat Mar 28 09:48:39 GMT 2020
2+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
33
distributionBase=GRADLE_USER_HOME
44
distributionPath=wrapper/dists
55
zipStorePath=wrapper/dists

gradlew

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
154154
else
155155
eval `echo args$i`="\"$arg\""
156156
fi
157-
i=$((i+1))
157+
i=`expr $i + 1`
158158
done
159159
case $i in
160-
(0) set -- ;;
161-
(1) set -- "$args0" ;;
162-
(2) set -- "$args0" "$args1" ;;
163-
(3) set -- "$args0" "$args1" "$args2" ;;
164-
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165-
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166-
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167-
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168-
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169-
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
160+
0) set -- ;;
161+
1) set -- "$args0" ;;
162+
2) set -- "$args0" "$args1" ;;
163+
3) set -- "$args0" "$args1" "$args2" ;;
164+
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165+
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166+
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167+
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168+
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169+
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170170
esac
171171
fi
172172

@@ -175,14 +175,9 @@ save () {
175175
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176176
echo " "
177177
}
178-
APP_ARGS=$(save "$@")
178+
APP_ARGS=`save "$@"`
179179

180180
# Collect all arguments for the java command, following the shell quoting and substitution rules
181181
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182182

183-
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
184-
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
185-
cd "$(dirname "$0")"
186-
fi
187-
188183
exec "$JAVACMD" "$@"

gradlew.bat

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
2929
set APP_BASE_NAME=%~n0
3030
set APP_HOME=%DIRNAME%
3131

32+
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
33+
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34+
3235
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
3336
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
3437

settings.gradle

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
/*
2-
* This file was generated by the Gradle 'init' task.
3-
*
4-
* The settings file is used to specify which projects to include in your build.
5-
*
6-
* Detailed information about configuring a multi-project build in Gradle can be found
7-
* in the user manual at https://docs.gradle.org/5.6.2/userguide/multi_project_builds.html
8-
*/
1+
rootProject.name = 'mapstruct-spring-additions-aggregator'
92

10-
rootProject.name = 'mapstruct-spring-additions'
3+
include "additions"
4+
include "tests"

src/main/java/uk/co/kleindelao/mapstruct/spring/Library.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)