Skip to content

Commit 133eaae

Browse files
committed
Reorganised examples as preparation for enabling the dynamic specification of the bridge class' package and name.
1 parent cb31b57 commit 133eaae

File tree

27 files changed

+241
-148
lines changed

27 files changed

+241
-148
lines changed

additions/build.gradle

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
plugins {
2-
id "io.freefair.lombok" version "5.0.0-rc6"
3-
}
4-
51
dependencies {
62
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
73
implementation 'org.springframework:spring-core:5.0.0.RELEASE'

additions/lombok.config

Lines changed: 0 additions & 2 deletions
This file was deleted.
Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
package uk.co.kleindelao.mapstruct.spring.converter;
22

33
import com.squareup.javapoet.ClassName;
4-
import lombok.Builder;
5-
import lombok.Singular;
6-
import lombok.Value;
7-
import org.apache.commons.lang3.tuple.Pair;
8-
94
import java.util.List;
5+
import org.apache.commons.lang3.tuple.Pair;
106

11-
@Value
12-
@Builder
137
public class ConversionServiceBridgeDescriptor {
14-
ClassName bridgeClassName;
15-
@Singular
16-
List<Pair<ClassName, ClassName>> fromToMappings;
8+
private ClassName bridgeClassName;
9+
private List<Pair<ClassName, ClassName>> fromToMappings;
10+
11+
public ClassName getBridgeClassName() {
12+
return bridgeClassName;
13+
}
14+
15+
public void setBridgeClassName(final ClassName bridgeClassName) {
16+
this.bridgeClassName = bridgeClassName;
17+
}
18+
19+
public List<Pair<ClassName, ClassName>> getFromToMappings() {
20+
return fromToMappings;
21+
}
22+
23+
public void setFromToMappings(final List<Pair<ClassName, ClassName>> fromToMappings) {
24+
this.fromToMappings = fromToMappings;
25+
}
1726
}

additions/src/main/java/uk/co/kleindelao/mapstruct/spring/converter/ConversionServiceBridgeGenerator.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package uk.co.kleindelao.mapstruct.spring.converter;
22

3-
import com.squareup.javapoet.*;
4-
import lombok.Value;
5-
import org.springframework.core.convert.ConversionService;
3+
import static java.util.stream.Collectors.toList;
4+
import static javax.lang.model.element.Modifier.*;
65

6+
import com.squareup.javapoet.*;
77
import java.io.IOException;
88
import java.io.UncheckedIOException;
99
import java.io.Writer;
1010
import java.time.Clock;
1111
import java.time.ZonedDateTime;
1212
import java.time.format.DateTimeFormatter;
13+
import org.springframework.core.convert.ConversionService;
1314

14-
import static java.util.stream.Collectors.toList;
15-
import static javax.lang.model.element.Modifier.*;
16-
17-
@Value
1815
public class ConversionServiceBridgeGenerator {
19-
Clock clock;
16+
private final Clock clock;
17+
18+
public ConversionServiceBridgeGenerator(final Clock clock) {
19+
this.clock = clock;
20+
}
2021

2122
public void writeConversionServiceBridge(
2223
ConversionServiceBridgeDescriptor descriptor, Writer out) {

additions/src/main/java/uk/co/kleindelao/mapstruct/spring/converter/ConverterMapperProcessor.java

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
package uk.co.kleindelao.mapstruct.spring.converter;
22

3-
import com.squareup.javapoet.ClassName;
4-
import org.apache.commons.lang3.tuple.Pair;
5-
import org.springframework.core.convert.converter.Converter;
6-
import uk.co.kleindelao.mapstruct.spring.converter.ConversionServiceBridgeDescriptor.ConversionServiceBridgeDescriptorBuilder;
3+
import static javax.lang.model.element.ElementKind.METHOD;
4+
import static javax.lang.model.element.Modifier.PUBLIC;
5+
import static javax.lang.model.type.TypeKind.DECLARED;
6+
import static javax.tools.Diagnostic.Kind.ERROR;
77

8+
import com.squareup.javapoet.ClassName;
9+
import java.io.IOException;
10+
import java.io.Writer;
11+
import java.time.Clock;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
import java.util.Optional;
15+
import java.util.Set;
816
import javax.annotation.processing.AbstractProcessor;
917
import javax.annotation.processing.RoundEnvironment;
1018
import javax.annotation.processing.SupportedAnnotationTypes;
@@ -14,16 +22,8 @@
1422
import javax.lang.model.type.DeclaredType;
1523
import javax.lang.model.type.TypeMirror;
1624
import javax.lang.model.util.Types;
17-
import java.io.IOException;
18-
import java.io.Writer;
19-
import java.time.Clock;
20-
import java.util.Optional;
21-
import java.util.Set;
22-
23-
import static javax.lang.model.element.ElementKind.METHOD;
24-
import static javax.lang.model.element.Modifier.PUBLIC;
25-
import static javax.lang.model.type.TypeKind.DECLARED;
26-
import static javax.tools.Diagnostic.Kind.ERROR;
25+
import org.apache.commons.lang3.tuple.Pair;
26+
import org.springframework.core.convert.converter.Converter;
2727

2828
@SupportedAnnotationTypes(ConverterMapperProcessor.ORG_MAPSTRUCT_MAPPER)
2929
public class ConverterMapperProcessor extends AbstractProcessor {
@@ -36,14 +36,13 @@ public class ConverterMapperProcessor extends AbstractProcessor {
3636
public boolean process(
3737
final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
3838
final Types typeUtils = processingEnv.getTypeUtils();
39-
final ConversionServiceBridgeDescriptorBuilder descriptorBuilder =
40-
ConversionServiceBridgeDescriptor.builder()
41-
.bridgeClassName(
42-
ClassName.get(
43-
ConverterMapperProcessor.class.getPackage().getName(),
44-
"ConversionServiceBridge"));
39+
final ConversionServiceBridgeDescriptor descriptor = new ConversionServiceBridgeDescriptor();
40+
descriptor.setBridgeClassName(
41+
ClassName.get(
42+
ConverterMapperProcessor.class.getPackage().getName(), "ConversionServiceBridge"));
4543
for (final TypeElement annotation : annotations) {
4644
if (ORG_MAPSTRUCT_MAPPER.contentEquals(annotation.getQualifiedName())) {
45+
final List<Pair<ClassName, ClassName>> fromToMappings = new ArrayList<>();
4746
roundEnv.getElementsAnnotatedWith(annotation).stream()
4847
.filter(mapper -> mapper.asType().getKind() == DECLARED)
4948
.filter(mapper -> getConverterSupertype(mapper).isPresent())
@@ -60,32 +59,35 @@ public boolean process(
6059
typeUtils.isSameType(
6160
getFirstParameterType((ExecutableElement) convert),
6261
getFirstTypeArgument(getConverterSupertype(mapper).get())))
63-
.forEach(
62+
.map(
6463
convert ->
65-
descriptorBuilder.fromToMapping(
66-
Pair.of(
67-
(ClassName)
68-
((ExecutableElement) convert)
69-
.getParameters().stream()
70-
.map(Element::asType)
71-
.map(ClassName::get)
72-
.findFirst()
73-
.get(),
74-
(ClassName)
75-
ClassName.get(
76-
((ExecutableElement) convert).getReturnType())))));
64+
Pair.of(
65+
(ClassName)
66+
((ExecutableElement) convert)
67+
.getParameters().stream()
68+
.map(Element::asType)
69+
.map(ClassName::get)
70+
.findFirst()
71+
.get(),
72+
(ClassName)
73+
ClassName.get(
74+
((ExecutableElement) convert).getReturnType())))
75+
.forEach(fromToMappings::add));
76+
descriptor.setFromToMappings(fromToMappings);
7777
try (final Writer outputWriter =
78-
processingEnv
79-
.getFiler()
80-
.createSourceFile(
81-
ConverterMapperProcessor.class.getPackage().getName() + ".ConversionServiceBridge")
82-
.openWriter()) {
83-
bridgeGenerator.writeConversionServiceBridge(descriptorBuilder.build(), outputWriter);
78+
processingEnv
79+
.getFiler()
80+
.createSourceFile(
81+
ConverterMapperProcessor.class.getPackage().getName()
82+
+ ".ConversionServiceBridge")
83+
.openWriter()) {
84+
bridgeGenerator.writeConversionServiceBridge(descriptor, outputWriter);
8485
} catch (IOException e) {
8586
processingEnv
86-
.getMessager()
87-
.printMessage(
88-
ERROR, "Error while opening ConversionServiceBridge output file: " + e.getMessage());
87+
.getMessager()
88+
.printMessage(
89+
ERROR,
90+
"Error while opening ConversionServiceBridge output file: " + e.getMessage());
8991
}
9092
}
9193
}

additions/src/test/java/uk/co/kleindelao/mapstruct/spring/converter/ConversionServiceBridgeGeneratorTest.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
package uk.co.kleindelao.mapstruct.spring.converter;
22

3-
import com.squareup.javapoet.ClassName;
4-
import org.apache.commons.lang3.tuple.Pair;
5-
import org.junit.jupiter.api.Test;
3+
import static java.nio.charset.StandardCharsets.UTF_8;
4+
import static java.util.Collections.singletonList;
5+
import static org.apache.commons.io.IOUtils.resourceToString;
6+
import static org.assertj.core.api.BDDAssertions.then;
67

8+
import com.squareup.javapoet.ClassName;
79
import java.io.IOException;
810
import java.io.StringWriter;
911
import java.time.Clock;
1012
import java.time.ZoneId;
1113
import java.time.ZonedDateTime;
12-
13-
import static java.nio.charset.StandardCharsets.UTF_8;
14-
import static org.apache.commons.io.IOUtils.resourceToString;
15-
import static org.assertj.core.api.BDDAssertions.then;
14+
import org.apache.commons.lang3.tuple.Pair;
15+
import org.junit.jupiter.api.Test;
1616

1717
class ConversionServiceBridgeGeneratorTest {
1818
private static final Clock FIXED_CLOCK =
1919
Clock.fixed(
20-
ZonedDateTime.of(2020, 3, 29, 15, 21, 34, (int) (236 * Math.pow(10, 6)), ZoneId.of("Z")).toInstant(),
20+
ZonedDateTime.of(2020, 3, 29, 15, 21, 34, (int) (236 * Math.pow(10, 6)), ZoneId.of("Z"))
21+
.toInstant(),
2122
ZoneId.of("Z"));
2223
private final ConversionServiceBridgeGenerator generator =
2324
new ConversionServiceBridgeGenerator(FIXED_CLOCK);
2425

2526
@Test
2627
void shouldGenerateMatchingOutput() throws IOException {
2728
// Given
28-
final ConversionServiceBridgeDescriptor descriptor =
29-
ConversionServiceBridgeDescriptor.builder()
30-
.bridgeClassName(
31-
ClassName.get(
32-
ConversionServiceBridgeGeneratorTest.class.getPackage().getName(),
33-
"ConversionServiceBridge"))
34-
.fromToMapping(Pair.of(ClassName.get("test", "Car"), ClassName.get("test", "CarDto")))
35-
.build();
29+
final ConversionServiceBridgeDescriptor descriptor = new ConversionServiceBridgeDescriptor();
30+
descriptor.setBridgeClassName(
31+
ClassName.get(
32+
ConversionServiceBridgeGeneratorTest.class.getPackage().getName(),
33+
"ConversionServiceBridge"));
34+
descriptor.setFromToMappings(
35+
singletonList(Pair.of(ClassName.get("test", "Car"), ClassName.get("test", "CarDto"))));
3636
final StringWriter outputWriter = new StringWriter();
3737

3838
// When

annotations/build.gradle

Whitespace-only changes.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package uk.co.kleindelao.mapstruct.spring;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
/**
9+
* Marks a class or interface as configuration source for the Spring additions. There can be only <em>one</em>
10+
* annotated type in each compiled module.
11+
*
12+
* @author Raimund Klein
13+
*/
14+
@Target(ElementType.TYPE)
15+
@Retention(RetentionPolicy.SOURCE)
16+
public @interface SpringMapperConfig {
17+
/**
18+
* The package name for the generated &quot;Bridge&quot; between the MapStruct mappers and Spring's
19+
* {@link org.springframework.core.convert.ConversionService}. If omitted, the package name will be the same as
20+
* the one for the annotated type.
21+
*
22+
* @return The package name for the generated &quot;Bridge&quot;.
23+
*/
24+
String conversionServiceBridgePackage() default "";
25+
26+
/**
27+
* The class name for the generated &quot;Bridge&quot; between the MapStruct mappers and Spring's
28+
* {@link org.springframework.core.convert.ConversionService}.
29+
*
30+
* @return The class name for the generated &quot;Bridge&quot;.
31+
*/
32+
String conversionServiceBridgeClassName() default "ConversionServiceBridge";
33+
}

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ plugins {
1010
// Apply the java-library plugin to add support for Java Library
1111
id 'java-library'
1212
id 'jacoco'
13-
id 'maven'
1413
}
1514

1615
group = 'uk.co.kleindelao.mapstruct.spring'

examples/model/build.gradle

Whitespace-only changes.

0 commit comments

Comments
 (0)