Skip to content

Commit 252ff32

Browse files
author
sjaakd
committed
replacing GemValue interface with GemValue class
1 parent dfd1694 commit 252ff32

4 files changed

Lines changed: 115 additions & 160 deletions

File tree

Lines changed: 109 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,150 @@
11
package org.mapstruct.tools.gem;
22

3+
import java.util.List;
4+
import java.util.function.Function;
5+
import java.util.stream.Collectors;
6+
import java.util.stream.Stream;
7+
import javax.lang.model.element.AnnotationMirror;
38
import javax.lang.model.element.AnnotationValue;
9+
import javax.lang.model.element.VariableElement;
410

511
/**
612
* Class representing a annotation value
713
*
814
* @param <T> the type represented by this annotation value
915
*/
10-
public interface GemValue<T> {
16+
public class GemValue<T> {
17+
18+
19+
public static <V> GemValue<V> create(AnnotationValue annotationValue,
20+
AnnotationValue annotationDefaultValue, Class<V> valueClass) {
21+
V value = annotationValue == null ? null : valueClass.cast( annotationValue.getValue() );
22+
V defaultValue = annotationDefaultValue == null ? null : valueClass.cast( annotationDefaultValue.getValue() );
23+
return new GemValue<>(value, defaultValue, annotationValue);
24+
}
25+
26+
public static <V> GemValue<List<V>> createArray(AnnotationValue annotationValue,
27+
AnnotationValue annotationDefaultValue, Class<V> valueClass) {
28+
List<V> value = extractListValues( annotationValue, valueClass, Function.identity() );
29+
List<V> defaultValue = extractListValues( annotationDefaultValue, valueClass, Function.identity() );
30+
31+
return new GemValue<>(value, defaultValue, annotationValue);
32+
}
33+
34+
public static GemValue<String> createEnum(AnnotationValue annotationValue,
35+
AnnotationValue annotationDefaultValue) {
36+
String value = annotationValue == null ? null : ( (VariableElement) annotationValue.getValue() ).getSimpleName().toString();
37+
String defaultValue = annotationDefaultValue == null ? null : ( (VariableElement) annotationDefaultValue.getValue() ).getSimpleName().toString();
38+
return new GemValue<>(value, defaultValue, annotationValue);
39+
}
40+
41+
public static GemValue<List<String>> createEnumArray(AnnotationValue annotationValue,
42+
AnnotationValue annotationDefaultValue) {
43+
List<String> value = extractListValues( annotationValue, VariableElement.class, variableElement -> variableElement.getSimpleName().toString() );
44+
List<String> defaultValue = extractListValues( annotationDefaultValue, VariableElement.class, variableElement -> variableElement.getSimpleName().toString() );
45+
46+
return new GemValue<>(value, defaultValue, annotationValue);
47+
}
48+
49+
public static <V> GemValue<V> create(AnnotationValue annotationValue, AnnotationValue annotationDefaultValue,
50+
Function<AnnotationMirror, V> creator) {
51+
V value = annotationValue == null ? null : creator.apply( (AnnotationMirror) annotationValue.getValue() );
52+
V defaultValue = annotationDefaultValue == null ? null : creator.apply( (AnnotationMirror) annotationDefaultValue.getValue() );
53+
return new GemValue<>( value, defaultValue, annotationValue );
54+
}
55+
56+
public static <V> GemValue<List<V>> createArray(AnnotationValue annotationValue, AnnotationValue annotationDefaultValue,
57+
Function<AnnotationMirror, V> creator) {
58+
List<V> value = extractListValues( annotationValue, AnnotationMirror.class, creator );
59+
List<V> defaultValue = extractListValues( annotationDefaultValue, AnnotationMirror.class, creator );
60+
return new GemValue<>( value, defaultValue, annotationValue );
61+
}
62+
63+
private static <V, R> List<R> extractListValues(AnnotationValue annotationValue, Class<V> valueClass,
64+
Function<V, R> mapper) {
65+
List<R> value;
66+
if ( annotationValue != null ) {
67+
Object definedValue = annotationValue.getValue();
68+
if ( definedValue instanceof List ) {
69+
value = toStream( (List) definedValue, valueClass ).map( mapper ).collect( Collectors.toList() );
70+
}
71+
else {
72+
value = null;
73+
}
74+
}
75+
else {
76+
value = null;
77+
}
78+
return value;
79+
}
80+
81+
private static <T> Stream<T> toStream(List<?> annotationValues, Class<T> clz ) {
82+
return annotationValues.stream()
83+
.filter( AnnotationValue.class::isInstance )
84+
.map( AnnotationValue.class::cast )
85+
.map( AnnotationValue::getValue )
86+
.filter( clz::isInstance )
87+
.map( clz::cast );
88+
}
89+
90+
91+
private final T value;
92+
private final T defaultValue;
93+
private final AnnotationValue annotationValue;
94+
95+
private GemValue(T value, T defaultValue, AnnotationValue annotationValue) {
96+
this.value = value;
97+
this.defaultValue = defaultValue;
98+
this.annotationValue = annotationValue;
99+
}
11100

12101
/**
13102
* The implied valued, the value set by the user, default value when not defined
14103
*
15104
* @return the implied value
16105
*/
17-
T get();
106+
public T get() {
107+
return value != null ? value : defaultValue;
108+
}
18109

19110
/**
20111
* The value set by the user
21112
*
22113
* @return the value, null when not set
23114
*/
24-
T getValue();
25-
115+
public T getValue() {
116+
return value;
117+
}
26118
/**
27119
* The default value, as declared in the annotation
28120
*
29121
* @return the default value
30122
*/
31-
T getDefaultValue();
32-
123+
public T getDefaultValue() {
124+
return defaultValue;
125+
}
33126
/**
34127
* The annotation value, e.g. for printing messages {@link javax.annotation.processing.Messager#printMessage}
35128
*
36129
* @return the annotation value (null when not set)
37130
*/
38-
AnnotationValue getAnnotationValue();
39-
131+
public AnnotationValue getAnnotationValue() {
132+
return annotationValue;
133+
}
40134
/**
41-
*
42135
* @return true a value is set by user
43136
*/
44-
boolean hasValue();
137+
public boolean hasValue() {
138+
return value != null;
139+
}
45140

46141
/**
47142
* An annotation set to be valid when set by user or a default value is present.
48143
*
49144
* @return true when valid
50145
*/
51-
boolean isValid();
146+
public boolean isValid() {
147+
return value != null || defaultValue != null;
148+
}
149+
52150
}

processor/src/main/java/org/mapstruct/tools/gem/processor/GemProcessor.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -180,23 +180,6 @@ else if (String.class.getName().equals( fqn ) ) {
180180

181181
private void write( ) {
182182
TypeElement gemElement = processingEnv.getElementUtils().getTypeElement( "org.annotationhelper.GemDefinitions" );
183-
if ( !gemInfos.isEmpty() ) {
184-
GemInfo gemInfo = gemInfos.get( 0 );
185-
try (Writer writer = processingEnv.getFiler().createSourceFile( gemInfo.getGemPackageName() + ".GemValueImpl", gemElement ).openWriter()) {
186-
Configuration cfg = new Configuration( new Version( "2.3.21" ) );
187-
cfg.setClassForTemplateLoading( GemProcessor.class, "/" );
188-
cfg.setDefaultEncoding( "UTF-8" );
189-
190-
Map<String, Object> templateData = new HashMap<>();
191-
192-
templateData.put( "gemInfo", gemInfo );
193-
Template template = cfg.getTemplate( "GemValueImpl.ftl" );
194-
template.process( templateData, writer );
195-
}
196-
catch ( TemplateException | IOException ex ) {
197-
throw new IllegalStateException( ex );
198-
}
199-
}
200183
for ( GemInfo gemInfo : gemInfos ) {
201184
try (Writer writer = processingEnv.getFiler().createSourceFile( gemInfo.getGemPackageName() + "." + gemInfo.getGemName(), gemElement ).openWriter()) {
202185
Configuration cfg = new Configuration( new Version( "2.3.21" ) );

processor/src/main/resources/Gem.ftl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,21 +109,21 @@ public class ${gemInfo.gemName} implements Gem {
109109
<@compress single_line=true>builder.set${gemValueInfo.name?capitalize}(
110110
<#if gemValueInfo.valueType.gem>
111111
<#if gemValueInfo.valueType.array>
112-
GemValueImpl.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn )
112+
GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn )
113113
<#else>
114-
GemValueImpl.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn )
114+
GemValue.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.gemName}::instanceOn )
115115
</#if>
116116
<#elseif gemValueInfo.valueType.enum>
117117
<#if gemValueInfo.valueType.array>
118-
GemValueImpl.createEnumArray( values.get( methodName ), defaultValues.get( methodName ) )
118+
GemValue.createEnumArray( values.get( methodName ), defaultValues.get( methodName ) )
119119
<#else>
120-
GemValueImpl.createEnum( values.get( methodName ), defaultValues.get( methodName ) )
120+
GemValue.createEnum( values.get( methodName ), defaultValues.get( methodName ) )
121121
</#if>
122122
<#else>
123123
<#if gemValueInfo.valueType.array>
124-
GemValueImpl.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class )
124+
GemValue.createArray( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class )
125125
<#else>
126-
GemValueImpl.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class )
126+
GemValue.create( values.get( methodName ), defaultValues.get( methodName ), ${gemValueInfo.valueType.elementName}.class )
127127
</#if>
128128
</#if>
129129
);</@compress>

processor/src/main/resources/GemValueImpl.ftl

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

0 commit comments

Comments
 (0)