#235 java expressions and unit test, simplify getconstantmapping, reorg unit test

This commit is contained in:
sjaakd 2014-06-24 21:35:09 +02:00 committed by Gunnar Morling
parent 87f7f55539
commit b41aa588a1
18 changed files with 491 additions and 55 deletions

View File

@ -42,8 +42,9 @@ public @interface Mapping {
* <li>The source name of the configured property as defined by the JavaBeans specification.</li> * <li>The source name of the configured property as defined by the JavaBeans specification.</li>
* <li>When used to map an enum constant, the name of the constant member is to be given<./li>. * <li>When used to map an enum constant, the name of the constant member is to be given<./li>.
* </ol> * </ol>
* Either this attribute or {@link #constant()} may be specified for a given mapping, but not both at the same * Either this attribute or {@link #constant()} or {@link #expression()} may be specified for a given mapping,
* time. * but not two at the same time. If this attribute is given, the target property must be specified via
* {@link #target()}.
* *
* @return The source name of the configured property or enum constant. * @return The source name of the configured property or enum constant.
*/ */
@ -70,11 +71,26 @@ public @interface Mapping {
* target property is not of type {@code String}, the value will be converted by applying a matching conversion * target property is not of type {@code String}, the value will be converted by applying a matching conversion
* method or built-in conversion. * method or built-in conversion.
* <p> * <p>
* Either this attribute or {@link #source()} may be specified for a given mapping, but not both at the same time. * Either this attribute or {@link #source()} or {@link #expression()} may be specified for a given mapping,
* If this attribute is given, the target property must be specified via {@link #target()}. * but not two at the same time. If this attribute is given, the target property must be specified via
* {@link #target()}.
* *
* @return A constant {@code String} constant specifying the value for the designated target property * @return A constant {@code String} constant specifying the value for the designated target property
*/ */
String constant() default ""; String constant() default "";
/**
* An expression {@link String} based on which the specified target property is to be set.
*
* The format is determined by a type of expression. For instance:
* {@code expression = "java(new org.example.TimeAndFormat( s.getTime(), s.getFormat() ))")} will insert the java
* expression in the designated {@link #target()} property.
* <p>
* Either this attribute or {@link #source()} or {@link #constant()} may be specified for a given mapping,
* but not two at the same time. If this attribute is given, the target property must be specified via
* {@link #target()}.
*
* @return A constant {@code String} constant specifying the value for the designated target property
*/
String expression() default "";
} }

View File

@ -40,8 +40,9 @@ public @interface Mapping {
* <li>The source name of the configured property as defined by the JavaBeans specification.</li> * <li>The source name of the configured property as defined by the JavaBeans specification.</li>
* <li>When used to map an enum constant, the name of the constant member is to be given<./li>. * <li>When used to map an enum constant, the name of the constant member is to be given<./li>.
* </ol> * </ol>
* Either this attribute or {@link #constant()} may be specified for a given mapping, but not both at the same * Either this attribute or {@link #constant()} or {@link #expression()} may be specified for a given mapping,
* time. * but not two at the same time. If this attribute is given, the target property must be specified via
* {@link #target()}.
* *
* @return The source name of the configured property or enum constant. * @return The source name of the configured property or enum constant.
*/ */
@ -68,11 +69,27 @@ public @interface Mapping {
* target property is not of type {@code String}, the value will be converted by applying a matching conversion * target property is not of type {@code String}, the value will be converted by applying a matching conversion
* method or built-in conversion. * method or built-in conversion.
* <p> * <p>
* Either this attribute or {@link #source()} may be specified for a given mapping, but not both at the same time. * Either this attribute or {@link #source()} or {@link #expression()} may be specified for a given mapping,
* If this attribute is given, the target property must be specified via {@link #target()}. * but not two at the same time. If this attribute is given, the target property must be specified via
* {@link #target()}.
* *
* @return A constant {@code String} constant specifying the value for the designated target property * @return A constant {@code String} constant specifying the value for the designated target property
*/ */
String constant() default ""; String constant() default "";
/**
* An expression {@link String} based on which the specified target property is to be set.
*
* The format is determined by a type of expression. For instance:
* {@code expression = "java(new org.example.TimeAndFormat( s.getTime(), s.getFormat() ))")} will insert the java
* expression in the designated {@link #target()} property.
* <p>
* Either this attribute or {@link #source()} or {@link #constant()} may be specified for a given mapping,
* but not two at the same time. If this attribute is given, the target property must be specified via
* {@link #target()}.
*
* @return A constant {@code String} constant specifying the value for the designated target property
*/
String expression() default "";
} }

View File

@ -22,6 +22,8 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.processing.Messager; import javax.annotation.processing.Messager;
import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue; import javax.lang.model.element.AnnotationValue;
@ -39,10 +41,14 @@ import org.mapstruct.ap.util.AnnotationProcessingException;
*/ */
public class Mapping { public class Mapping {
private static final Pattern JAVA_EXPRESSION = Pattern.compile( "^java\\((.*)\\)$" );
private final String sourceName; private final String sourceName;
private final String sourceParameterName; private final String sourceParameterName;
private final String sourcePropertyName; private final String sourcePropertyName;
private final String constant; private final String constant;
private final String expression;
private final String javaExpression;
private final String targetName; private final String targetName;
private final String dateFormat; private final String dateFormat;
private final AnnotationMirror mirror; private final AnnotationMirror mirror;
@ -74,10 +80,12 @@ public class Mapping {
mappingPrism.values.source() mappingPrism.values.source()
); );
if ( mappingPrism.source().isEmpty() && mappingPrism.constant().isEmpty() ) { if ( mappingPrism.source().isEmpty() &&
mappingPrism.constant().isEmpty() &&
mappingPrism.expression().isEmpty() ) {
messager.printMessage( messager.printMessage(
Diagnostic.Kind.ERROR, Diagnostic.Kind.ERROR,
"Either define a source or a constant in a Mapping", "Either define a source, a constant or an epression in a Mapping",
element element
); );
return null; return null;
@ -85,17 +93,33 @@ public class Mapping {
else if ( !mappingPrism.source().isEmpty() && !mappingPrism.constant().isEmpty() ) { else if ( !mappingPrism.source().isEmpty() && !mappingPrism.constant().isEmpty() ) {
messager.printMessage( messager.printMessage(
Diagnostic.Kind.ERROR, Diagnostic.Kind.ERROR,
"Source and constant are both defined in Mapping, either define a source or an expression", "Source and constant are both defined in Mapping, either define a source or a constant",
element
);
return null;
}
else if ( !mappingPrism.source().isEmpty() && !mappingPrism.expression().isEmpty() ) {
messager.printMessage(
Diagnostic.Kind.ERROR,
"Source and expression are both defined in Mapping, either define a source or an expression",
element
);
return null;
}
else if ( !mappingPrism.expression().isEmpty() && !mappingPrism.constant().isEmpty() ) {
messager.printMessage(
Diagnostic.Kind.ERROR,
"Expression and constant are both defined in Mapping, either define an expression or a constant",
element element
); );
return null; return null;
} }
return new Mapping( return new Mapping(
mappingPrism.source(), mappingPrism.source(),
sourceNameParts != null ? sourceNameParts[0] : null, sourceNameParts != null ? sourceNameParts[0] : null,
sourceNameParts != null ? sourceNameParts[1] : mappingPrism.source(), sourceNameParts != null ? sourceNameParts[1] : mappingPrism.source(),
mappingPrism.constant(), mappingPrism.constant(),
mappingPrism.expression(),
mappingPrism.target(), mappingPrism.target(),
mappingPrism.dateFormat(), mappingPrism.dateFormat(),
mappingPrism.mirror, mappingPrism.mirror,
@ -124,12 +148,15 @@ public class Mapping {
} }
private Mapping(String sourceName, String sourceParameterName, String sourcePropertyName, String constant, private Mapping(String sourceName, String sourceParameterName, String sourcePropertyName, String constant,
String targetName, String dateFormat, AnnotationMirror mirror, String expression, String targetName, String dateFormat, AnnotationMirror mirror,
AnnotationValue sourceAnnotationValue, AnnotationValue targetAnnotationValue) { AnnotationValue sourceAnnotationValue, AnnotationValue targetAnnotationValue) {
this.sourceName = sourceName; this.sourceName = sourceName;
this.sourceParameterName = sourceParameterName; this.sourceParameterName = sourceParameterName;
this.sourcePropertyName = sourcePropertyName; this.sourcePropertyName = sourcePropertyName;
this.constant = constant; this.constant = constant;
this.expression = expression;
Matcher javaExpressionMatcher = JAVA_EXPRESSION.matcher( expression );
this.javaExpression = javaExpressionMatcher.matches() ? javaExpressionMatcher.group( 1 ) : "";
this.targetName = targetName.equals( "" ) ? sourceName : targetName; this.targetName = targetName.equals( "" ) ? sourceName : targetName;
this.dateFormat = dateFormat; this.dateFormat = dateFormat;
this.mirror = mirror; this.mirror = mirror;
@ -169,6 +196,9 @@ public class Mapping {
return constant; return constant;
} }
public String getJavaExpression() {
return javaExpression;
}
public String getTargetName() { public String getTargetName() {
return targetName; return targetName;
@ -200,6 +230,7 @@ public class Mapping {
null, null,
targetName, targetName,
constant, constant,
expression,
sourceName, sourceName,
dateFormat, dateFormat,
mirror, mirror,

View File

@ -406,13 +406,30 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
// check if there's a mapping defined // check if there's a mapping defined
Mapping mapping = method.getMappingByTargetPropertyName( targetPropertyName ); Mapping mapping = method.getMappingByTargetPropertyName( targetPropertyName );
String dateFormat = null; String dateFormat = null;
boolean isSourceConstant = false;
String sourceConstant = null;
String sourcePropertyName; String sourcePropertyName;
if ( mapping != null ) { if ( mapping != null ) {
dateFormat = mapping.getDateFormat(); dateFormat = mapping.getDateFormat();
isSourceConstant = !mapping.getConstant().isEmpty();
sourceConstant = "\"" + mapping.getConstant() + "\""; if ( Executables.isSetterMethod( targetAccessor ) ) {
// check constants first
if ( !mapping.getConstant().isEmpty() ) {
return getConstantMapping(
mapperReferences,
methods,
method,
"\"" + mapping.getConstant() + "\"",
targetAccessor,
dateFormat
);
}
if ( !mapping.getJavaExpression().isEmpty() ) {
return getJavaExpressionMapping( method, mapping.getJavaExpression(), targetAccessor );
}
}
sourcePropertyName = mapping.getSourcePropertyName(); sourcePropertyName = mapping.getSourcePropertyName();
} }
else { else {
@ -421,18 +438,6 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
List<ExecutableElement> sourceGetters = parameter.getType().getGetters(); List<ExecutableElement> sourceGetters = parameter.getType().getGetters();
// check constants first
if ( isSourceConstant ) {
return getConstantMapping(
mapperReferences,
methods,
method,
sourceConstant,
targetAccessor,
dateFormat
);
}
// then iterate over source accessors (assuming the source is a bean) // then iterate over source accessors (assuming the source is a bean)
for ( ExecutableElement sourceAccessor : sourceGetters ) { for ( ExecutableElement sourceAccessor : sourceGetters ) {
@ -676,6 +681,7 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
} }
else if ( mappedProperty.getConstant().isEmpty() && else if ( mappedProperty.getConstant().isEmpty() &&
mappedProperty.getJavaExpression().isEmpty() &&
!hasSourceProperty( method, mappedProperty.getSourcePropertyName() ) ) { !hasSourceProperty( method, mappedProperty.getSourcePropertyName() ) ) {
messager.printMessage( messager.printMessage(
Kind.ERROR, Kind.ERROR,
@ -843,7 +849,7 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
List<SourceMethod> methods, List<SourceMethod> methods,
SourceMethod method, SourceMethod method,
String constantExpression, String constantExpression,
ExecutableElement targetAcessor, ExecutableElement targetAccessor,
String dateFormat) { String dateFormat) {
// source // source
@ -851,14 +857,8 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
Type sourceType = typeFactory.getType( String.class ); Type sourceType = typeFactory.getType( String.class );
// target // target
Type targetType = null; Type targetType = typeFactory.getSingleParameter( targetAccessor ).getType();
if ( Executables.isSetterMethod( targetAcessor ) ) { String targetPropertyName = Executables.getPropertyName( targetAccessor );
targetType = typeFactory.getSingleParameter( targetAcessor ).getType();
}
else if ( Executables.isGetterMethod( targetAcessor ) ) {
targetType = typeFactory.getReturnType( targetAcessor );
}
String targetPropertyName = Executables.getPropertyName( targetAcessor );
Assignment assignment = mappingResolver.getTargetAssignment( Assignment assignment = mappingResolver.getTargetAssignment(
method, method,
@ -874,13 +874,6 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
if ( assignment != null ) { if ( assignment != null ) {
// create a new Map or Collection implementation if no method or type conversion
if ( targetType != null && ( targetType.isCollectionType() || targetType.isMapType() ) ) {
if ( assignment.getType() == DIRECT ) {
assignment = new NewCollectionOrMapWrapper( assignment, targetType.getImportTypes() );
}
}
// target accessor is setter, so decorate assignment as setter // target accessor is setter, so decorate assignment as setter
assignment = new SetterWrapper( assignment, method.getThrownTypes() ); assignment = new SetterWrapper( assignment, method.getThrownTypes() );
} }
@ -898,6 +891,20 @@ public class MapperCreationProcessor implements ModelElementProcessor<List<Sourc
); );
} }
return new PropertyMapping( targetAccessor.getSimpleName().toString(), targetType, assignment );
}
/**
* Creates a {@link PropertyMapping} representing the mapping of the given java expression into the target
* property.
*/
private PropertyMapping getJavaExpressionMapping(SourceMethod method,
String javaExpression,
ExecutableElement targetAcessor) {
Type targetType = typeFactory.getSingleParameter( targetAcessor ).getType();
Assignment assignment = AssignmentFactory.createSimple( javaExpression );
assignment = new SetterWrapper( assignment, method.getThrownTypes() );
return new PropertyMapping( targetAcessor.getSimpleName().toString(), targetType, assignment ); return new PropertyMapping( targetAcessor.getSimpleName().toString(), targetType, assignment );
} }

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;

View File

@ -0,0 +1,43 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.constants;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
*
* @author Sjaak Derksen
*/
@Mapper(uses = StringListMapper.class)
public interface ErroneousMapper3 {
ErroneousMapper3 INSTANCE = Mappers.getMapper( ErroneousMapper3.class );
@Mappings( {
@Mapping( target = "stringConstant", constant = "stringConstant"),
@Mapping( target = "integerConstant", expression = "java('test')", constant = "14"),
@Mapping( target = "longWrapperConstant", constant = "3001"),
@Mapping( target = "dateConstant", dateFormat = "dd-MM-yyyy", constant = "09-01-2014"),
@Mapping( target = "nameConstants", constant = "jack-jill-tom" )
} )
Target sourceToTarget(Source s);
}

View File

@ -0,0 +1,43 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.constants;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
*
* @author Sjaak Derksen
*/
@Mapper(uses = StringListMapper.class)
public interface ErroneousMapper4 {
ErroneousMapper4 INSTANCE = Mappers.getMapper( ErroneousMapper4.class );
@Mappings( {
@Mapping( target = "stringConstant", constant = "stringConstant"),
@Mapping( source = "test" , target = "integerConstant", expression = "java('test')"),
@Mapping( target = "longWrapperConstant", constant = "3001"),
@Mapping( target = "dateConstant", dateFormat = "dd-MM-yyyy", constant = "09-01-2014"),
@Mapping( target = "nameConstants", constant = "jack-jill-tom" )
} )
Target sourceToTarget(Source s);
}

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
/** /**
* *

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -96,14 +96,64 @@ public class SourceConstantsTest {
@Diagnostic(type = ErroneousMapper1.class, @Diagnostic(type = ErroneousMapper1.class,
kind = Kind.ERROR, kind = Kind.ERROR,
line = 42, line = 42,
messageRegExp = "Source and constant are both defined in Mapping, either define a source or an " messageRegExp = "Source and constant are both defined in Mapping, either define a source or a "
+ "expression"), + "constant"),
@Diagnostic(type = ErroneousMapper1.class, @Diagnostic(type = ErroneousMapper1.class,
kind = Kind.WARNING, kind = Kind.WARNING,
line = 42, line = 42,
messageRegExp = "Unmapped target property: \"integerConstant\"") messageRegExp = "Unmapped target property: \"integerConstant\"")
} }
) )
public void errorOnSourceAndConstant() throws ParseException {
}
@Test
@IssueKey( "187" )
@WithClasses( {
Source.class,
Target.class,
ErroneousMapper3.class,
StringListMapper.class
} )
@ExpectedCompilationOutcome(
value = CompilationResult.FAILED,
diagnostics = {
@Diagnostic(type = ErroneousMapper3.class,
kind = Kind.ERROR,
line = 42,
messageRegExp = "Expression and constant are both defined in Mapping, either define an expression or a "
+ "constant"),
@Diagnostic(type = ErroneousMapper3.class,
kind = Kind.WARNING,
line = 42,
messageRegExp = "Unmapped target property: \"integerConstant\"")
}
)
public void errorOnConstantAndExpression() throws ParseException {
}
@Test
@IssueKey( "187" )
@WithClasses( {
Source.class,
Target.class,
ErroneousMapper4.class,
StringListMapper.class
} )
@ExpectedCompilationOutcome(
value = CompilationResult.FAILED,
diagnostics = {
@Diagnostic(type = ErroneousMapper4.class,
kind = Kind.ERROR,
line = 42,
messageRegExp = "Source and expression are both defined in Mapping, either define a source or an "
+ "expression"),
@Diagnostic(type = ErroneousMapper4.class,
kind = Kind.WARNING,
line = 42,
messageRegExp = "Unmapped target property: \"integerConstant\"")
}
)
public void errorOnSourceAndExpression() throws ParseException { public void errorOnSourceAndExpression() throws ParseException {
} }
@ -121,7 +171,7 @@ public class SourceConstantsTest {
@Diagnostic(type = ErroneousMapper2.class, @Diagnostic(type = ErroneousMapper2.class,
kind = Kind.ERROR, kind = Kind.ERROR,
line = 42, line = 42,
messageRegExp = "Either define a source or a constant in a Mapping"), messageRegExp = "Either define a source, a constant or an epression in a Mapping"),
@Diagnostic(type = ErroneousMapper2.class, @Diagnostic(type = ErroneousMapper2.class,
kind = Kind.WARNING, kind = Kind.WARNING,
line = 42, line = 42,

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;

View File

@ -16,7 +16,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.mapstruct.ap.test.sourceconstants; package org.mapstruct.ap.test.source.constants;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;

View File

@ -0,0 +1,59 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.expressions.java;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mapstruct.ap.testutil.WithClasses;
import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner;
import static org.fest.assertions.Assertions.assertThat;
/**
*
* @author Sjaak Derksen
*/
@WithClasses( {Source.class, Target.class, SourceTargetMapper.class, TimeAndFormat.class } )
@RunWith(AnnotationProcessorTestRunner.class)
public class JavaExpressionTest {
@Test
public void testJavaExpressionInsertion() throws ParseException {
Source source = new Source();
String format = "dd-MM-yyyy,hh:mm:ss";
Date time = getTime( format, "09-01-2014,01:35:03");
source.setFormat( format );
source.setTime( time );
Target target = SourceTargetMapper.INSTANCE.sourceToTarget( source );
assertThat( target ).isNotNull();
assertThat( target.getTimeAndFormat().getTime() ).isEqualTo( time );
assertThat( target.getTimeAndFormat().getFormat() ).isEqualTo( format );
}
private Date getTime(String format, String date) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat( format );
Date result = dateFormat.parse( date );
return result;
}
}

View File

@ -0,0 +1,47 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.expressions.java;
import java.util.Date;
/**
* @author Sjaak Derksen
*/
public class Source {
private String format;
private Date time;
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
}

View File

@ -0,0 +1,37 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.expressions.java;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
/**
* @author Sjaak Derksen
*/
@Mapper
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers.getMapper( SourceTargetMapper.class );
@Mapping(target = "timeAndFormat", expression = "java( new org.mapstruct.ap.test.source.expressions.java."
+ "TimeAndFormat( s.getTime(), s.getFormat() ))")
Target sourceToTarget(Source s);
}

View File

@ -0,0 +1,36 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.expressions.java;
/**
* @author Sjaak Derksen
*/
public class Target {
private TimeAndFormat timeAndFormat;
public TimeAndFormat getTimeAndFormat() {
return timeAndFormat;
}
public void setTimeAndFormat(TimeAndFormat timeAndFormat) {
this.timeAndFormat = timeAndFormat;
}
}

View File

@ -0,0 +1,50 @@
/**
* Copyright 2012-2014 Gunnar Morling (http://www.gunnarmorling.de/)
* and/or other contributors as indicated by the @authors tag. See the
* copyright.txt file in the distribution for a full listing of all
* contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.mapstruct.ap.test.source.expressions.java;
import java.util.Date;
/**
* @author Sjaak Derksen
*/
public class TimeAndFormat {
private Date time;
private String format;
public TimeAndFormat( Date time, String format ) {
this.time = time;
this.format = format;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getFormat() {
return format;
}
public void setFormat(String tfFormat) {
this.format = tfFormat;
}
}