Skip to content

Commit f6867bb

Browse files
authored
Cleaner code (#42)
* Fixes #38 * Some refactorings * Documentation link. Fixes #41
1 parent 2c1b186 commit f6867bb

File tree

6 files changed

+275
-178
lines changed

6 files changed

+275
-178
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ Helpful additions to MapStruct when using the Spring Framework.
55
[![Build Status](https://github.com/mapstruct/mapstruct-spring-extensions/workflows/Java%20CI%20with%20Gradle/badge.svg?branch=master)](https://github.com/mapstruct/mapstruct-spring-extensions/actions?query=branch%3Amaster+workflow%3AJava%20CI%20with%20Gradle)
66
[![Code Quality: Java](https://img.shields.io/lgtm/grade/java/g/mapstruct/mapstruct-spring-extensions.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/mapstruct/mapstruct-spring-extensions/context:java)
77
[![Total Alerts](https://img.shields.io/lgtm/alerts/g/mapstruct/mapstruct-spring-extensions.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/mapstruct/mapstruct-spring-extensions/alerts)
8+
9+
This project expects some familiarity with MapStruct Core as well as Spring. Please find the [reference documentation](https://mapstruct.org/documentation/spring-extensions/reference/html/) on the [main MapStruct website](https://mapstruct.org/).

docs/src/docs/asciidoc/chapter-3-mapper-as-converter.asciidoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ MapStruct Mappers nicely match Spring's https://docs.spring.io/spring-framework/
66
[source, java, linenums]
77
[subs="verbatim,attributes"]
88
----
9-
@Mapper
9+
@Mapper(componentModel = "spring")
1010
public interface CarMapper extends Converter<Car, CarDto> {
1111
@Mapping(target = "seats", source = "seatConfiguration")
1212
CarDto convert(Car car);
Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,53 @@
11
package org.mapstruct.extensions.spring.converter;
22

33
import com.squareup.javapoet.ClassName;
4-
import java.util.List;
5-
64
import com.squareup.javapoet.TypeName;
75
import org.apache.commons.lang3.tuple.Pair;
86

7+
import java.util.List;
8+
99
public class ConversionServiceAdapterDescriptor {
10-
private ClassName adapterClassName;
11-
private String conversionServiceBeanName;
12-
private List<Pair<TypeName, TypeName>> fromToMappings;
13-
private boolean lazyAnnotatedConversionServiceBean;
14-
15-
public ClassName getAdapterClassName() {
16-
return adapterClassName;
17-
}
18-
19-
public void setAdapterClassName(final ClassName adapterClassName) {
20-
this.adapterClassName = adapterClassName;
21-
}
22-
23-
public String getConversionServiceBeanName() {
24-
return conversionServiceBeanName;
25-
}
26-
27-
public void setConversionServiceBeanName(String conversionServiceBeanName) {
28-
this.conversionServiceBeanName = conversionServiceBeanName;
29-
}
30-
31-
public List<Pair<TypeName, TypeName>> getFromToMappings() {
32-
return fromToMappings;
33-
}
34-
35-
public void setFromToMappings(final List<Pair<TypeName, TypeName>> fromToMappings) {
36-
this.fromToMappings = fromToMappings;
37-
}
38-
39-
public boolean isLazyAnnotatedConversionServiceBean() {
40-
return lazyAnnotatedConversionServiceBean;
41-
}
42-
43-
public void setLazyAnnotatedConversionServiceBean(boolean lazyAnnotatedConversionServiceBean) {
44-
this.lazyAnnotatedConversionServiceBean = lazyAnnotatedConversionServiceBean;
45-
}
10+
private ClassName adapterClassName;
11+
private String conversionServiceBeanName;
12+
private List<Pair<TypeName, TypeName>> fromToMappings;
13+
private boolean lazyAnnotatedConversionServiceBean;
14+
15+
public ClassName getAdapterClassName() {
16+
return adapterClassName;
17+
}
18+
19+
public ConversionServiceAdapterDescriptor adapterClassName(final ClassName adapterClassName) {
20+
this.adapterClassName = adapterClassName;
21+
return this;
22+
}
23+
24+
public String getConversionServiceBeanName() {
25+
return conversionServiceBeanName;
26+
}
27+
28+
public ConversionServiceAdapterDescriptor conversionServiceBeanName(
29+
final String conversionServiceBeanName) {
30+
this.conversionServiceBeanName = conversionServiceBeanName;
31+
return this;
32+
}
33+
34+
public List<Pair<TypeName, TypeName>> getFromToMappings() {
35+
return fromToMappings;
36+
}
37+
38+
public ConversionServiceAdapterDescriptor fromToMappings(
39+
final List<Pair<TypeName, TypeName>> fromToMappings) {
40+
this.fromToMappings = fromToMappings;
41+
return this;
42+
}
43+
44+
public boolean isLazyAnnotatedConversionServiceBean() {
45+
return lazyAnnotatedConversionServiceBean;
46+
}
47+
48+
public ConversionServiceAdapterDescriptor lazyAnnotatedConversionServiceBean(
49+
final boolean lazyAnnotatedConversionServiceBean) {
50+
this.lazyAnnotatedConversionServiceBean = lazyAnnotatedConversionServiceBean;
51+
return this;
52+
}
4653
}

extensions/src/main/java/org/mapstruct/extensions/spring/converter/ConversionServiceAdapterGenerator.java

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,37 @@
22

33
import com.squareup.javapoet.*;
44
import org.apache.commons.lang3.StringUtils;
5+
import org.apache.commons.lang3.tuple.Pair;
56

67
import java.io.IOException;
78
import java.io.UncheckedIOException;
89
import java.io.Writer;
910
import java.time.Clock;
1011
import java.time.ZonedDateTime;
11-
import java.time.format.DateTimeFormatter;
1212

13+
import static java.time.format.DateTimeFormatter.ISO_INSTANT;
1314
import static java.util.stream.Collectors.toList;
1415
import static javax.lang.model.element.Modifier.*;
1516

1617
public class ConversionServiceAdapterGenerator {
18+
private static final String CONVERSION_SERVICE_PACKAGE_NAME = "org.springframework.core.convert";
19+
private static final String CONVERSION_SERVICE_CLASS_NAME = "ConversionService";
20+
private static final String CONVERSION_SERVICE_FIELD_NAME = "conversionService";
21+
private static final String QUALIFIER_ANNOTATION_PACKAGE_NAME =
22+
"org.springframework.beans.factory.annotation";
23+
private static final String QUALIFIER_ANNOTATION_CLASSS_NAME = "Qualifier";
24+
private static final String LAZY_ANNOTATION_PACKAGE_NAME =
25+
"org.springframework.context.annotation";
26+
private static final String LAZY_ANNOTATION_CLASS_NAME = "Lazy";
27+
1728
private final Clock clock;
1829

1930
public ConversionServiceAdapterGenerator(final Clock clock) {
2031
this.clock = clock;
2132
}
2233

2334
public void writeConversionServiceAdapter(
24-
ConversionServiceAdapterDescriptor descriptor, Writer out) {
35+
final ConversionServiceAdapterDescriptor descriptor, final Writer out) {
2536
try {
2637
JavaFile.builder(
2738
descriptor.getAdapterClassName().packageName(),
@@ -65,24 +76,25 @@ private static ParameterSpec buildConstructorParameterSpec(
6576
ParameterSpec.builder(
6677
conversionServiceFieldSpec.type, conversionServiceFieldSpec.name, FINAL);
6778
if (StringUtils.isNotEmpty(descriptor.getConversionServiceBeanName())) {
68-
parameterBuilder.addAnnotation(buildQualifierANnotation(descriptor));
79+
parameterBuilder.addAnnotation(buildQualifierAnnotation(descriptor));
6980
}
7081
if (Boolean.TRUE.equals(descriptor.isLazyAnnotatedConversionServiceBean())) {
7182
parameterBuilder.addAnnotation(buildLazyAnnotation());
7283
}
7384
return parameterBuilder.build();
7485
}
7586

76-
private static AnnotationSpec buildQualifierANnotation(
87+
private static AnnotationSpec buildQualifierAnnotation(
7788
ConversionServiceAdapterDescriptor descriptor) {
7889
return AnnotationSpec.builder(
79-
ClassName.get("org.springframework.beans.factory.annotation", "Qualifier"))
90+
ClassName.get(QUALIFIER_ANNOTATION_PACKAGE_NAME, QUALIFIER_ANNOTATION_CLASSS_NAME))
8091
.addMember("value", "$S", descriptor.getConversionServiceBeanName())
8192
.build();
8293
}
8394

8495
private static AnnotationSpec buildLazyAnnotation() {
85-
return AnnotationSpec.builder(ClassName.get("org.springframework.context.annotation", "Lazy"))
96+
return AnnotationSpec.builder(
97+
ClassName.get(LAZY_ANNOTATION_PACKAGE_NAME, LAZY_ANNOTATION_CLASS_NAME))
8698
.build();
8799
}
88100

@@ -91,9 +103,8 @@ private static String simpleName(final TypeName typeName) {
91103
if (rawType instanceof ArrayTypeName) {
92104
return arraySimpleName((ArrayTypeName) rawType);
93105
} else if (rawType instanceof ClassName) {
94-
return ((ClassName)rawType).simpleName();
95-
}
96-
else return String.valueOf(typeName);
106+
return ((ClassName) rawType).simpleName();
107+
} else return String.valueOf(typeName);
97108
}
98109

99110
private static String arraySimpleName(ArrayTypeName arrayTypeName) {
@@ -115,35 +126,38 @@ private static Iterable<MethodSpec> buildMappingMethods(
115126
final FieldSpec injectedConversionServiceFieldSpec) {
116127
return descriptor.getFromToMappings().stream()
117128
.map(
118-
sourceTargetPair -> {
119-
final ParameterSpec sourceParameterSpec =
120-
buildSourceParameterSpec(sourceTargetPair.getLeft());
121-
return MethodSpec.methodBuilder(
122-
"map"
123-
+ simpleName(sourceTargetPair.getLeft())
124-
+ "To"
125-
+ simpleName(sourceTargetPair.getRight()))
126-
.addParameter(sourceParameterSpec)
127-
.addModifiers(PUBLIC)
128-
.returns(sourceTargetPair.getRight())
129-
.addStatement(
130-
"return $N.convert($N, $T.class)",
131-
injectedConversionServiceFieldSpec,
132-
sourceParameterSpec,
133-
rawType(sourceTargetPair.getRight()))
134-
.build();
135-
})
129+
sourceTargetPair ->
130+
toMappingMethodSpec(injectedConversionServiceFieldSpec, sourceTargetPair))
136131
.collect(toList());
137132
}
138133

134+
private static MethodSpec toMappingMethodSpec(
135+
final FieldSpec injectedConversionServiceFieldSpec,
136+
final Pair<TypeName, TypeName> sourceTargetPair) {
137+
final ParameterSpec sourceParameterSpec = buildSourceParameterSpec(sourceTargetPair.getLeft());
138+
return MethodSpec.methodBuilder(
139+
String.format(
140+
"map%sTo%s",
141+
simpleName(sourceTargetPair.getLeft()), simpleName(sourceTargetPair.getRight())))
142+
.addParameter(sourceParameterSpec)
143+
.addModifiers(PUBLIC)
144+
.returns(sourceTargetPair.getRight())
145+
.addStatement(
146+
"return $N.convert($N, $T.class)",
147+
injectedConversionServiceFieldSpec,
148+
sourceParameterSpec,
149+
rawType(sourceTargetPair.getRight()))
150+
.build();
151+
}
152+
139153
private static ParameterSpec buildSourceParameterSpec(final TypeName sourceClassName) {
140154
return ParameterSpec.builder(sourceClassName, "source", FINAL).build();
141155
}
142156

143157
private static FieldSpec buildConversionServiceFieldSpec() {
144158
return FieldSpec.builder(
145-
ClassName.get("org.springframework.core.convert", "ConversionService"),
146-
"conversionService",
159+
ClassName.get(CONVERSION_SERVICE_PACKAGE_NAME, CONVERSION_SERVICE_CLASS_NAME),
160+
CONVERSION_SERVICE_FIELD_NAME,
147161
PRIVATE,
148162
FINAL)
149163
.build();
@@ -152,7 +166,7 @@ private static FieldSpec buildConversionServiceFieldSpec() {
152166
private AnnotationSpec buildGeneratedAnnotationSpec() {
153167
return AnnotationSpec.builder(ClassName.get("javax.annotation", "Generated"))
154168
.addMember("value", "$S", ConversionServiceAdapterGenerator.class.getName())
155-
.addMember("date", "$S", DateTimeFormatter.ISO_INSTANT.format(ZonedDateTime.now(clock)))
169+
.addMember("date", "$S", ISO_INSTANT.format(ZonedDateTime.now(clock)))
156170
.build();
157171
}
158172
}

0 commit comments

Comments
 (0)