#454 Do not check the existence of types in the classloader of the processor, but on the classpath of the sources

This commit is contained in:
Andreas Gudian 2015-02-11 09:55:51 +01:00
parent 892cdb2921
commit 0c226f8388
4 changed files with 52 additions and 119 deletions

View File

@ -18,7 +18,6 @@
*/ */
package org.mapstruct.ap.conversion; package org.mapstruct.ap.conversion;
import javax.lang.model.util.Elements;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Calendar; import java.util.Calendar;
@ -26,11 +25,12 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.lang.model.util.Elements;
import org.mapstruct.ap.model.common.Type; import org.mapstruct.ap.model.common.Type;
import org.mapstruct.ap.model.common.TypeFactory; import org.mapstruct.ap.model.common.TypeFactory;
import org.mapstruct.ap.util.JavaTimeConstants; import org.mapstruct.ap.util.JavaTimeConstants;
import org.mapstruct.ap.util.JodaTimeConstants; import org.mapstruct.ap.util.JodaTimeConstants;
import org.mapstruct.ap.util.NativeTypes;
import static org.mapstruct.ap.conversion.ReverseConversion.reverse; import static org.mapstruct.ap.conversion.ReverseConversion.reverse;
@ -197,50 +197,18 @@ public class Conversions {
} }
// Joda to String // Joda to String
register( register( JodaTimeConstants.DATE_TIME_FQN, String.class, new JodaDateTimeToStringConversion() );
getClass( JodaTimeConstants.DATE_TIME_FQN ), register( JodaTimeConstants.LOCAL_DATE_FQN, String.class, new JodaLocalDateToStringConversion() );
String.class, register( JodaTimeConstants.LOCAL_DATE_TIME_FQN, String.class, new JodaLocalDateTimeToStringConversion() );
new JodaDateTimeToStringConversion() register( JodaTimeConstants.LOCAL_TIME_FQN, String.class, new JodaLocalTimeToStringConversion() );
);
register(
getClass( JodaTimeConstants.LOCAL_DATE_FQN ),
String.class,
new JodaLocalDateToStringConversion()
);
register(
getClass( JodaTimeConstants.LOCAL_DATE_TIME_FQN ),
String.class,
new JodaLocalDateTimeToStringConversion()
);
register(
getClass( JodaTimeConstants.LOCAL_TIME_FQN ),
String.class,
new JodaLocalTimeToStringConversion()
);
// Joda to Date // Joda to Date
register( register( JodaTimeConstants.DATE_TIME_FQN, Date.class, new JodaTimeToDateConversion() );
getClass( JodaTimeConstants.DATE_TIME_FQN ), register( JodaTimeConstants.LOCAL_DATE_FQN, Date.class, new JodaTimeToDateConversion() );
Date.class, register( JodaTimeConstants.LOCAL_DATE_TIME_FQN, Date.class, new JodaTimeToDateConversion() );
new JodaTimeToDateConversion()
);
register(
getClass( JodaTimeConstants.LOCAL_DATE_FQN ),
Date.class,
new JodaTimeToDateConversion()
);
register(
getClass( JodaTimeConstants.LOCAL_DATE_TIME_FQN ),
Date.class,
new JodaTimeToDateConversion()
);
// Joda to Calendar // Joda to Calendar
register( register( JodaTimeConstants.DATE_TIME_FQN, Calendar.class, new JodaDateTimeToCalendarConversion() );
getClass( JodaTimeConstants.DATE_TIME_FQN ),
Calendar.class,
new JodaDateTimeToCalendarConversion()
);
} }
private void registerJava8TimeConversions() { private void registerJava8TimeConversions() {
@ -249,48 +217,25 @@ public class Conversions {
} }
// Java 8 time to String // Java 8 time to String
register( register( JavaTimeConstants.ZONED_DATE_TIME_FQN, String.class, new JavaZonedDateTimeToStringConversion() );
getClass( JavaTimeConstants.ZONED_DATE_TIME_FQN ), register( JavaTimeConstants.LOCAL_DATE_FQN, String.class, new JavaLocalDateToStringConversion() );
String.class, register( JavaTimeConstants.LOCAL_DATE_TIME_FQN, String.class, new JavaLocalDateTimeToStringConversion() );
new JavaZonedDateTimeToStringConversion() register( JavaTimeConstants.LOCAL_TIME_FQN, String.class, new JavaLocalTimeToStringConversion() );
);
register(
getClass( JavaTimeConstants.LOCAL_DATE_FQN ),
String.class,
new JavaLocalDateToStringConversion()
);
register(
getClass( JavaTimeConstants.LOCAL_DATE_TIME_FQN ),
String.class,
new JavaLocalDateTimeToStringConversion()
);
register(
getClass( JavaTimeConstants.LOCAL_TIME_FQN ),
String.class,
new JavaLocalTimeToStringConversion()
);
// Java 8 to Date // Java 8 to Date
register( register( JavaTimeConstants.ZONED_DATE_TIME_FQN, Date.class, new JavaZonedDateTimeToDateConversion() );
getClass( JavaTimeConstants.ZONED_DATE_TIME_FQN ), register( JavaTimeConstants.LOCAL_DATE_TIME_FQN, Date.class, new JavaLocalDateTimeToDateConversion() );
Date.class,
new JavaZonedDateTimeToDateConversion()
);
register(
getClass( JavaTimeConstants.LOCAL_DATE_TIME_FQN ),
Date.class,
new JavaLocalDateTimeToDateConversion()
);
} }
private static boolean isJodaTimeAvailable() { private boolean isJodaTimeAvailable() {
return NativeTypes.isTypeAvailable( JodaTimeConstants.DATE_TIME_FQN ); return typeFactory.isTypeAvailable( JodaTimeConstants.DATE_TIME_FQN );
} }
private static boolean isJava8TimeAvailable() {
return NativeTypes.isTypeAvailable( JavaTimeConstants.ZONED_DATE_TIME_FQN ); private boolean isJava8TimeAvailable() {
return typeFactory.isTypeAvailable( JavaTimeConstants.ZONED_DATE_TIME_FQN );
} }
private void registerNativeTypeConversion(Class<?> sourceType, Class<?> targetType) { private void registerNativeTypeConversion(Class<?> sourceType, Class<?> targetType) {
if ( sourceType.isPrimitive() && targetType.isPrimitive() ) { if ( sourceType.isPrimitive() && targetType.isPrimitive() ) {
register( sourceType, targetType, new PrimitiveToPrimitiveConversion( sourceType ) ); register( sourceType, targetType, new PrimitiveToPrimitiveConversion( sourceType ) );
@ -333,9 +278,20 @@ public class Conversions {
} }
} }
private void register(Class<?> sourceType, Class<?> targetType, ConversionProvider conversion) { private void register(Class<?> sourceClass, Class<?> targetClass, ConversionProvider conversion) {
conversions.put( forClasses( sourceType, targetType ), conversion ); Type sourceType = typeFactory.getType( sourceClass );
conversions.put( forClasses( targetType, sourceType ), reverse( conversion ) ); Type targetType = typeFactory.getType( targetClass );
conversions.put( new Key( sourceType, targetType ), conversion );
conversions.put( new Key( targetType, sourceType ), reverse( conversion ) );
}
private void register(String sourceTypeName, Class<?> targetClass, ConversionProvider conversion) {
Type sourceType = typeFactory.getType( sourceTypeName );
Type targetType = typeFactory.getType( targetClass );
conversions.put( new Key( sourceType, targetType ), conversion );
conversions.put( new Key( targetType, sourceType ), reverse( conversion ) );
} }
public ConversionProvider getConversion(Type sourceType, Type targetType) { public ConversionProvider getConversion(Type sourceType, Type targetType) {
@ -349,22 +305,6 @@ public class Conversions {
return conversions.get( new Key( sourceType, targetType ) ); return conversions.get( new Key( sourceType, targetType ) );
} }
private Key forClasses(Class<?> sourceClass, Class<?> targetClass) {
Type sourceType = typeFactory.getType( sourceClass );
Type targetType = typeFactory.getType( targetClass );
return new Key( sourceType, targetType );
}
private Class<?> getClass(String fullyQualifiedName) {
try {
return Conversions.class.getClassLoader().loadClass( fullyQualifiedName );
}
catch ( ClassNotFoundException e ) {
throw new RuntimeException( "Couldn't load class: " + fullyQualifiedName, e );
}
}
private static class Key { private static class Key {
private final Type sourceType; private final Type sourceType;
private final Type targetType; private final Type targetType;

View File

@ -18,8 +18,6 @@
*/ */
package org.mapstruct.ap.model.common; package org.mapstruct.ap.model.common;
import static org.mapstruct.ap.util.SpecificCompilerWorkarounds.erasure;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@ -59,6 +57,8 @@ import org.mapstruct.ap.prism.TargetTypePrism;
import org.mapstruct.ap.util.AnnotationProcessingException; import org.mapstruct.ap.util.AnnotationProcessingException;
import org.mapstruct.ap.util.SpecificCompilerWorkarounds; import org.mapstruct.ap.util.SpecificCompilerWorkarounds;
import static org.mapstruct.ap.util.SpecificCompilerWorkarounds.erasure;
/** /**
* Factory creating {@link Type} instances. * Factory creating {@link Type} instances.
* *
@ -116,6 +116,16 @@ public class TypeFactory {
return getType( typeElement ); return getType( typeElement );
} }
/**
* Determines if the type with the given full qualified name is part of the classpath
*
* @param canonicalName Name of the type to be checked for availability
* @return true if the type with the given full qualified name is part of the classpath.
*/
public boolean isTypeAvailable(String canonicalName) {
return null != elementUtils.getTypeElement( canonicalName );
}
public Type getType(TypeElement typeElement) { public Type getType(TypeElement typeElement) {
return getType( typeElement.asType() ); return getType( typeElement.asType() );
} }

View File

@ -23,7 +23,6 @@ import java.util.List;
import org.mapstruct.ap.model.common.TypeFactory; import org.mapstruct.ap.model.common.TypeFactory;
import org.mapstruct.ap.util.Collections; import org.mapstruct.ap.util.Collections;
import org.mapstruct.ap.util.JavaTimeConstants; import org.mapstruct.ap.util.JavaTimeConstants;
import org.mapstruct.ap.util.NativeTypes;
/** /**
* Registry for all built-in methods. * Registry for all built-in methods.
@ -46,14 +45,14 @@ public class BuiltInMappingMethods {
); );
if ( isJava8TimeAvailable() ) { if ( isJava8TimeAvailable( typeFactory ) ) {
builtInMethods.add( new ZonedDateTimeToCalendar( typeFactory ) ); builtInMethods.add( new ZonedDateTimeToCalendar( typeFactory ) );
builtInMethods.add( new CalendarToZonedDateTime( typeFactory ) ); builtInMethods.add( new CalendarToZonedDateTime( typeFactory ) );
} }
} }
private static boolean isJava8TimeAvailable() { private static boolean isJava8TimeAvailable(TypeFactory typeFactory) {
return NativeTypes.isTypeAvailable( JavaTimeConstants.ZONED_DATE_TIME_FQN ); return typeFactory.isTypeAvailable( JavaTimeConstants.ZONED_DATE_TIME_FQN );
} }
public List<BuiltInMethod> getBuiltInMethods() { public List<BuiltInMethod> getBuiltInMethods() {

View File

@ -77,20 +77,4 @@ public class NativeTypes {
return WRAPPER_TO_PRIMITIVE_TYPES.get( clazz ); return WRAPPER_TO_PRIMITIVE_TYPES.get( clazz );
} }
/**
* Determines if the type with the given full qualified name is part of the classpath
*
* @param fullQualifiedClassName Name of the type to be checked for availability
* @return true if the type with the given full qualified name is part of the classpath.
*/
public static boolean isTypeAvailable(String fullQualifiedClassName) {
try {
Class.forName( fullQualifiedClassName, false, NativeTypes.class.getClassLoader() );
}
catch ( ClassNotFoundException e ) {
return false;
}
return true;
}
} }