From 22c337a947437a685facab11c400b45bfc12416b Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Sat, 10 Feb 2018 17:39:48 +0100 Subject: [PATCH] #782 Add custom SPI implementations for Immutables in the integration tests --- .../immutablesBuilderTest/extras/pom.xml | 24 +++++ .../ImmutablesAccessorNamingStrategy.java | 34 +++++++ .../extras/ImmutablesBuilderProvider.java | 97 +++++++++++++++++++ .../immutablesBuilderTest/mapper/pom.xml | 28 ++++++ .../mapstruct/itest/immutables/Address.java | 0 .../itest/immutables/AddressDto.java | 0 .../mapstruct/itest/immutables/Person.java | 0 .../mapstruct/itest/immutables/PersonDto.java | 0 .../itest/immutables/PersonMapper.java | 0 ...rg.mapstruct.ap.spi.AccessorNamingStrategy | 18 ++++ .../org.mapstruct.ap.spi.BuilderProvider | 18 ++++ .../immutables/ImmutablesMapperTest.java | 0 .../resources/immutablesBuilderTest/pom.xml | 15 ++- 13 files changed, 225 insertions(+), 9 deletions(-) create mode 100644 integrationtest/src/test/resources/immutablesBuilderTest/extras/pom.xml create mode 100644 integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesAccessorNamingStrategy.java create mode 100644 integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesBuilderProvider.java create mode 100644 integrationtest/src/test/resources/immutablesBuilderTest/mapper/pom.xml rename integrationtest/src/test/resources/immutablesBuilderTest/{ => mapper}/src/main/java/org/mapstruct/itest/immutables/Address.java (100%) rename integrationtest/src/test/resources/immutablesBuilderTest/{ => mapper}/src/main/java/org/mapstruct/itest/immutables/AddressDto.java (100%) rename integrationtest/src/test/resources/immutablesBuilderTest/{ => mapper}/src/main/java/org/mapstruct/itest/immutables/Person.java (100%) rename integrationtest/src/test/resources/immutablesBuilderTest/{ => mapper}/src/main/java/org/mapstruct/itest/immutables/PersonDto.java (100%) rename integrationtest/src/test/resources/immutablesBuilderTest/{ => mapper}/src/main/java/org/mapstruct/itest/immutables/PersonMapper.java (100%) create mode 100644 integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.AccessorNamingStrategy create mode 100644 integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.BuilderProvider rename integrationtest/src/test/resources/immutablesBuilderTest/{ => mapper}/src/test/java/org/mapstruct/itest/immutables/ImmutablesMapperTest.java (100%) diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/extras/pom.xml b/integrationtest/src/test/resources/immutablesBuilderTest/extras/pom.xml new file mode 100644 index 0000000000..c7f6a13f92 --- /dev/null +++ b/integrationtest/src/test/resources/immutablesBuilderTest/extras/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + + immutablesIntegrationTest + org.mapstruct + 1.0.0 + + + itest-immutables-mapping-extras + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + provided + + + + \ No newline at end of file diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesAccessorNamingStrategy.java b/integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesAccessorNamingStrategy.java new file mode 100644 index 0000000000..56fef54689 --- /dev/null +++ b/integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesAccessorNamingStrategy.java @@ -0,0 +1,34 @@ +/** + * Copyright 2012-2017 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.itest.immutables.extras; + +import javax.lang.model.element.ExecutableElement; + +import org.mapstruct.ap.spi.DefaultAccessorNamingStrategy; + +/** + * @author Filip Hrisafov + */ +public class ImmutablesAccessorNamingStrategy extends DefaultAccessorNamingStrategy { + + @Override + protected boolean isBuilderSetter(ExecutableElement method) { + return super.isBuilderSetter( method ) && !method.getSimpleName().toString().equals( "from" ); + } +} diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesBuilderProvider.java b/integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesBuilderProvider.java new file mode 100644 index 0000000000..63c6ae26a6 --- /dev/null +++ b/integrationtest/src/test/resources/immutablesBuilderTest/extras/src/main/java/org/mapstruct/itest/immutables/extras/ImmutablesBuilderProvider.java @@ -0,0 +1,97 @@ +/** + * Copyright 2012-2017 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.itest.immutables.extras; + +import java.util.regex.Pattern; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.Name; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import org.mapstruct.ap.spi.BuilderInfo; +import org.mapstruct.ap.spi.DefaultBuilderProvider; +import org.mapstruct.ap.spi.TypeHierarchyErroneousException; + +/** + * @author Filip Hrisafov + */ +public class ImmutablesBuilderProvider extends DefaultBuilderProvider { + + private static final Pattern JAVA_JAVAX_PACKAGE = Pattern.compile( "^javax?\\..*" ); + + @Override + protected BuilderInfo findBuilderInfo(TypeElement typeElement, Elements elements, Types types) { + Name name = typeElement.getQualifiedName(); + if ( name.length() == 0 || JAVA_JAVAX_PACKAGE.matcher( name ).matches() ) { + return null; + } + TypeElement immutableAnnotation = elements.getTypeElement( "org.immutables.value.Value.Immutable" ); + if ( immutableAnnotation != null ) { + BuilderInfo info = findBuilderInfoForImmutables( + typeElement, + immutableAnnotation, + elements, + types + ); + if ( info != null ) { + return info; + } + } + + return super.findBuilderInfo( typeElement, elements, types ); + } + + protected BuilderInfo findBuilderInfoForImmutables(TypeElement typeElement, + TypeElement immutableAnnotation, Elements elements, Types types) { + for ( AnnotationMirror annotationMirror : elements.getAllAnnotationMirrors( typeElement ) ) { + if ( types.isSameType( annotationMirror.getAnnotationType(), immutableAnnotation.asType() ) ) { + TypeElement immutableElement = asImmutableElement( typeElement, elements ); + if ( immutableElement != null ) { + return super.findBuilderInfo( immutableElement, elements, types ); + } + else { + throw new TypeHierarchyErroneousException( typeElement ); + } + } + } + return null; + } + + private TypeElement asImmutableElement(TypeElement typeElement, Elements elements) { + Element enclosingElement = typeElement.getEnclosingElement(); + StringBuilder builderQualifiedName = new StringBuilder( typeElement.getQualifiedName().length() + 17 ); + if ( enclosingElement.getKind() == ElementKind.PACKAGE ) { + builderQualifiedName.append( ( (PackageElement) enclosingElement ).getQualifiedName().toString() ); + } + else { + builderQualifiedName.append( ( (TypeElement) enclosingElement ).getQualifiedName().toString() ); + } + + if ( builderQualifiedName.length() > 0 ) { + builderQualifiedName.append( "." ); + } + + builderQualifiedName.append( "Immutable" ).append( typeElement.getSimpleName() ); + return elements.getTypeElement( builderQualifiedName ); + } +} diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/mapper/pom.xml b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/pom.xml new file mode 100644 index 0000000000..cbe79c972e --- /dev/null +++ b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + + immutablesIntegrationTest + org.mapstruct + 1.0.0 + + + itest-immutables-mapper + + + + + org.immutables + value + provided + + + org.mapstruct + itest-immutables-mapping-extras + 1.0.0 + + + \ No newline at end of file diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/Address.java b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/Address.java similarity index 100% rename from integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/Address.java rename to integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/Address.java diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/AddressDto.java b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/AddressDto.java similarity index 100% rename from integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/AddressDto.java rename to integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/AddressDto.java diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/Person.java b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/Person.java similarity index 100% rename from integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/Person.java rename to integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/Person.java diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/PersonDto.java b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/PersonDto.java similarity index 100% rename from integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/PersonDto.java rename to integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/PersonDto.java diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/PersonMapper.java b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/PersonMapper.java similarity index 100% rename from integrationtest/src/test/resources/immutablesBuilderTest/src/main/java/org/mapstruct/itest/immutables/PersonMapper.java rename to integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/PersonMapper.java diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.AccessorNamingStrategy b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.AccessorNamingStrategy new file mode 100644 index 0000000000..a908131ba1 --- /dev/null +++ b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.AccessorNamingStrategy @@ -0,0 +1,18 @@ +# Copyright 2012-2017 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. + +org.mapstruct.itest.immutables.extras.ImmutablesAccessorNamingStrategy diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.BuilderProvider b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.BuilderProvider new file mode 100644 index 0000000000..2ab5dab768 --- /dev/null +++ b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/resources/META-INF/services/org.mapstruct.ap.spi.BuilderProvider @@ -0,0 +1,18 @@ +# Copyright 2012-2017 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. + +org.mapstruct.itest.immutables.extras.ImmutablesBuilderProvider diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/src/test/java/org/mapstruct/itest/immutables/ImmutablesMapperTest.java b/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/test/java/org/mapstruct/itest/immutables/ImmutablesMapperTest.java similarity index 100% rename from integrationtest/src/test/resources/immutablesBuilderTest/src/test/java/org/mapstruct/itest/immutables/ImmutablesMapperTest.java rename to integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/test/java/org/mapstruct/itest/immutables/ImmutablesMapperTest.java diff --git a/integrationtest/src/test/resources/immutablesBuilderTest/pom.xml b/integrationtest/src/test/resources/immutablesBuilderTest/pom.xml index 4906dc997d..19a738894d 100644 --- a/integrationtest/src/test/resources/immutablesBuilderTest/pom.xml +++ b/integrationtest/src/test/resources/immutablesBuilderTest/pom.xml @@ -30,13 +30,10 @@ immutablesIntegrationTest - jar - - - - org.immutables - value - provided - - + pom + + + extras + mapper +