From f17ddcfb1874bb271b4b7b921a4e416467e977e5 Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Sat, 13 Oct 2018 08:54:09 +0200 Subject: [PATCH] #1608 Make sure that property names for fluent setters starting with is are handled properly (#1620) --- .../ap/spi/DefaultAccessorNamingStrategy.java | 4 +- .../mapstruct/ap/test/bugs/_1608/Book.java | 32 ++++++++++ .../mapstruct/ap/test/bugs/_1608/BookDto.java | 61 +++++++++++++++++++ .../ap/test/bugs/_1608/Issue1608Mapper.java | 20 ++++++ .../ap/test/bugs/_1608/Issue1608Test.java | 39 ++++++++++++ 5 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Book.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/BookDto.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Mapper.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Test.java diff --git a/processor/src/main/java/org/mapstruct/ap/spi/DefaultAccessorNamingStrategy.java b/processor/src/main/java/org/mapstruct/ap/spi/DefaultAccessorNamingStrategy.java index 908963f5d..ab0d604a6 100644 --- a/processor/src/main/java/org/mapstruct/ap/spi/DefaultAccessorNamingStrategy.java +++ b/processor/src/main/java/org/mapstruct/ap/spi/DefaultAccessorNamingStrategy.java @@ -156,8 +156,8 @@ public class DefaultAccessorNamingStrategy implements AccessorNamingStrategy { @Override public String getPropertyName(ExecutableElement getterOrSetterMethod) { String methodName = getterOrSetterMethod.getSimpleName().toString(); - if ( methodName.startsWith( "is" ) || methodName.startsWith( "get" ) || methodName.startsWith( "set" ) ) { - return IntrospectorUtils.decapitalize( methodName.substring( methodName.startsWith( "is" ) ? 2 : 3 ) ); + if ( methodName.startsWith( "get" ) || methodName.startsWith( "set" ) ) { + return IntrospectorUtils.decapitalize( methodName.substring( 3 ) ); } else if ( isFluentSetter( getterOrSetterMethod ) ) { return methodName; diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Book.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Book.java new file mode 100644 index 000000000..0bfeb08e1 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Book.java @@ -0,0 +1,32 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1608; + +/** + * @author Filip Hrisafov + */ +public class Book { + + private String isbn; + + private int issueYear; + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public int getIssueYear() { + return issueYear; + } + + public void setIssueYear(int issueYear) { + this.issueYear = issueYear; + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/BookDto.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/BookDto.java new file mode 100644 index 000000000..7244cc1c6 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/BookDto.java @@ -0,0 +1,61 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1608; + +/** + * @author Filip Hrisafov + */ +public class BookDto { + + private final String isbn; + private final int issueYear; + + public BookDto(String isbn, int issueYear) { + this.isbn = isbn; + this.issueYear = issueYear; + } + + public String getIsbn() { + return isbn; + } + + public int getIssueYear() { + return issueYear; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private String isbn; + + private int issueYear; + + public String getIsbn() { + return isbn; + } + + public Builder isbn(String isbn) { + this.isbn = isbn; + return this; + } + + public int getIssueYear() { + return issueYear; + } + + public Builder setIssueYear(int issueYear) { + this.issueYear = issueYear; + return this; + } + + public BookDto build() { + return new BookDto( isbn, issueYear ); + } + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Mapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Mapper.java new file mode 100644 index 000000000..f36f9739f --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Mapper.java @@ -0,0 +1,20 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1608; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author Filip Hrisafov + */ +@Mapper +public interface Issue1608Mapper { + + Issue1608Mapper INSTANCE = Mappers.getMapper( Issue1608Mapper.class ); + + BookDto map(Book source); +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Test.java new file mode 100644 index 000000000..44abfd69f --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1608/Issue1608Test.java @@ -0,0 +1,39 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1608; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mapstruct.ap.testutil.IssueKey; +import org.mapstruct.ap.testutil.WithClasses; +import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Filip Hrisafov + */ +@RunWith(AnnotationProcessorTestRunner.class) +@IssueKey("1608") +@WithClasses({ + Issue1608Mapper.class, + Book.class, + BookDto.class +}) +public class Issue1608Test { + + @Test + public void shouldCorrectlyUseFluentSettersStartingWithIs() { + + Book book = new Book(); + book.setIsbn( "978-3-16-148410-0" ); + book.setIssueYear( 2018 ); + BookDto bookDto = Issue1608Mapper.INSTANCE.map( book ); + + assertThat( bookDto.getIsbn() ).isEqualTo( "978-3-16-148410-0" ); + assertThat( bookDto.getIssueYear() ).isEqualTo( 2018 ); + } +}