diff --git a/processor/src/main/java/org/mapstruct/ap/model/Mapper.java b/processor/src/main/java/org/mapstruct/ap/model/Mapper.java index a6d8cc482..cc1d7c366 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/Mapper.java +++ b/processor/src/main/java/org/mapstruct/ap/model/Mapper.java @@ -18,7 +18,11 @@ */ package org.mapstruct.ap.model; +import java.util.Collection; import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.annotation.Generated; public class Mapper { @@ -28,6 +32,7 @@ public class Mapper { private final List beanMappings; private final List usedMapperTypes; private final Options options; + private final SortedSet importedTypes; public Mapper(String packageName, String interfaceName, String implementationName, List beanMappings, List usedMapperTypes, Options options) { @@ -37,6 +42,40 @@ public class Mapper { this.beanMappings = beanMappings; this.usedMapperTypes = usedMapperTypes; this.options = options; + this.importedTypes = determineImportedTypes(); + } + + private SortedSet determineImportedTypes() { + SortedSet importedTypes = new TreeSet(); + importedTypes.add( Type.forClass( Generated.class ) ); + + for ( BeanMapping beanMapping : beanMappings ) { + addWithDependents( importedTypes, beanMapping.getSourceType() ); + addWithDependents( importedTypes, beanMapping.getTargetType() ); + + for ( PropertyMapping propertyMapping : beanMapping.getPropertyMappings() ) { + addWithDependents( importedTypes, propertyMapping.getSourceType() ); + addWithDependents( importedTypes, propertyMapping.getTargetType() ); + } + } + + return importedTypes; + } + + private void addWithDependents(Collection collection, Type typeToAdd) { + if ( typeToAdd == null ) { + return; + } + + if ( typeToAdd.getPackageName() != null && + !typeToAdd.getPackageName().equals( packageName ) && + !typeToAdd.getPackageName().startsWith( "java.lang" ) ) { + collection.add( typeToAdd ); + } + + addWithDependents( collection, typeToAdd.getCollectionImplementationType() ); + addWithDependents( collection, typeToAdd.getIterableImplementationType() ); + addWithDependents( collection, typeToAdd.getElementType() ); } @Override @@ -81,4 +120,8 @@ public class Mapper { public Options getOptions() { return options; } + + public SortedSet getImportedTypes() { + return importedTypes; + } } diff --git a/processor/src/main/java/org/mapstruct/ap/model/Type.java b/processor/src/main/java/org/mapstruct/ap/model/Type.java index 411738428..13b054858 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/Type.java +++ b/processor/src/main/java/org/mapstruct/ap/model/Type.java @@ -32,7 +32,7 @@ import java.util.concurrent.ConcurrentMap; * * @author Gunnar Morling */ -public class Type { +public class Type implements Comparable { private final static Set primitiveTypeNames = new HashSet( Arrays.asList( "boolean", "char", "byte", "short", "int", "long", "float", "double" ) @@ -140,6 +140,10 @@ public class Type { return isIterableType; } + public String getFullyQualifiedName() { + return packageName == null ? name : packageName + "." + name; + } + @Override public String toString() { if ( packageName == null ) { @@ -203,4 +207,9 @@ public class Type { } return true; } + + @Override + public int compareTo(Type o) { + return getFullyQualifiedName().compareTo( o.getFullyQualifiedName() ); + } } diff --git a/processor/src/main/resources/mapper-implementation.ftl b/processor/src/main/resources/mapper-implementation.ftl index f8f36aefd..f1a42f236 100644 --- a/processor/src/main/resources/mapper-implementation.ftl +++ b/processor/src/main/resources/mapper-implementation.ftl @@ -20,13 +20,9 @@ --> package ${packageName}; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import javax.annotation.Generated; -import java.util.Date; +<#list importedTypes as importedType> +import ${importedType.fullyQualifiedName}; + @Generated( value = "org.mapstruct.ap.MappingProcessor"<#if options.suppressGeneratorTimestamp == false>, diff --git a/processor/src/test/java/org/mapstruct/ap/test/collection/defaultimplementation/DefaultCollectionImplementationTest.java b/processor/src/test/java/org/mapstruct/ap/test/collection/defaultimplementation/DefaultCollectionImplementationTest.java index a9c6d2634..45b20f1e8 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/collection/defaultimplementation/DefaultCollectionImplementationTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/collection/defaultimplementation/DefaultCollectionImplementationTest.java @@ -37,7 +37,6 @@ import static org.fest.assertions.Assertions.assertThat; }) public class DefaultCollectionImplementationTest extends MapperTestBase { - @Test @IssueKey("6") public void shouldUseDefaultImplementationForList() { diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapper.java b/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapper.java index 1701d3806..394124289 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapper.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapper.java @@ -24,6 +24,10 @@ import org.mapstruct.Mapper; import org.mapstruct.Mappers; import org.mapstruct.Mapping; import org.mapstruct.Mappings; +import org.mapstruct.ap.test.complex.source.Car; +import org.mapstruct.ap.test.complex.source.Person; +import org.mapstruct.ap.test.complex.target.CarDto; +import org.mapstruct.ap.test.complex.target.PersonDto; @Mapper(uses = DateMapper.class) public interface CarMapper { diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapperTest.java b/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapperTest.java index 9654689ae..56df15c3d 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapperTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/CarMapperTest.java @@ -23,6 +23,11 @@ import java.util.Arrays; import java.util.GregorianCalendar; import java.util.List; +import org.mapstruct.ap.test.complex.source.Car; +import org.mapstruct.ap.test.complex.source.Category; +import org.mapstruct.ap.test.complex.source.Person; +import org.mapstruct.ap.test.complex.target.CarDto; +import org.mapstruct.ap.test.complex.target.PersonDto; import org.mapstruct.ap.testutil.MapperTestBase; import org.mapstruct.ap.testutil.WithClasses; import org.testng.annotations.Test; diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/Car.java b/processor/src/test/java/org/mapstruct/ap/test/complex/source/Car.java similarity index 98% rename from processor/src/test/java/org/mapstruct/ap/test/complex/Car.java rename to processor/src/test/java/org/mapstruct/ap/test/complex/source/Car.java index 4857de531..be7b0ef7a 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/Car.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/source/Car.java @@ -16,11 +16,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.mapstruct.ap.test.complex; +package org.mapstruct.ap.test.complex.source; import java.util.Date; import java.util.List; + public class Car { private String make; diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/Category.java b/processor/src/test/java/org/mapstruct/ap/test/complex/source/Category.java similarity index 94% rename from processor/src/test/java/org/mapstruct/ap/test/complex/Category.java rename to processor/src/test/java/org/mapstruct/ap/test/complex/source/Category.java index e4ca9a11e..0dd6d0677 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/Category.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/source/Category.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.mapstruct.ap.test.complex; +package org.mapstruct.ap.test.complex.source; public enum Category { SEDAN, CONVERTIBLE, TRUCK; diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/Person.java b/processor/src/test/java/org/mapstruct/ap/test/complex/source/Person.java similarity index 95% rename from processor/src/test/java/org/mapstruct/ap/test/complex/Person.java rename to processor/src/test/java/org/mapstruct/ap/test/complex/source/Person.java index 85e4270ab..d7dc205f7 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/Person.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/source/Person.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.mapstruct.ap.test.complex; +package org.mapstruct.ap.test.complex.source; public class Person { diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/CarDto.java b/processor/src/test/java/org/mapstruct/ap/test/complex/target/CarDto.java similarity index 98% rename from processor/src/test/java/org/mapstruct/ap/test/complex/CarDto.java rename to processor/src/test/java/org/mapstruct/ap/test/complex/target/CarDto.java index 760fcdca5..98e78d1c1 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/CarDto.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/target/CarDto.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.mapstruct.ap.test.complex; +package org.mapstruct.ap.test.complex.target; import java.util.List; diff --git a/processor/src/test/java/org/mapstruct/ap/test/complex/PersonDto.java b/processor/src/test/java/org/mapstruct/ap/test/complex/target/PersonDto.java similarity index 95% rename from processor/src/test/java/org/mapstruct/ap/test/complex/PersonDto.java rename to processor/src/test/java/org/mapstruct/ap/test/complex/target/PersonDto.java index 9acc6490d..9e654bef4 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/complex/PersonDto.java +++ b/processor/src/test/java/org/mapstruct/ap/test/complex/target/PersonDto.java @@ -16,7 +16,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.mapstruct.ap.test.complex; +package org.mapstruct.ap.test.complex.target; public class PersonDto {