From e67daa37106fddf64e73b26924af3e7a22038728 Mon Sep 17 00:00:00 2001 From: Kemal Ozcan Date: Sat, 24 Oct 2020 17:57:12 +0300 Subject: [PATCH] mapstruct#597 Built-In conversion between String and StringBuilder --- .../internal/conversion/ConversionUtils.java | 11 ++++++++ .../ap/internal/conversion/Conversions.java | 1 + .../StringBuilderToStringConversion.java | 25 +++++++++++++++++++ .../ap/test/conversion/string/Source.java | 9 +++++++ .../string/StringConversionTest.java | 4 +++ .../ap/test/conversion/string/Target.java | 9 +++++++ .../string/SourceTargetMapperImpl.java | 10 ++++++-- 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 processor/src/main/java/org/mapstruct/ap/internal/conversion/StringBuilderToStringConversion.java diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionUtils.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionUtils.java index 8d2557b33..2afcf3c6a 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionUtils.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/ConversionUtils.java @@ -231,4 +231,15 @@ public final class ConversionUtils { public static String dateTimeFormat(ConversionContext conversionContext) { return typeReferenceName( conversionContext, JodaTimeConstants.DATE_TIME_FORMAT_FQN ); } + + /** + * Name for {@link java.lang.StringBuilder}. + * + * @param conversionContext Conversion context + * + * @return Name or fully-qualified name. + */ + public static String stringBuilder(ConversionContext conversionContext) { + return typeReferenceName( conversionContext, StringBuilder.class ); + } } diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/Conversions.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/Conversions.java index ad5fe85db..02c478bb7 100755 --- a/processor/src/main/java/org/mapstruct/ap/internal/conversion/Conversions.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/Conversions.java @@ -175,6 +175,7 @@ public class Conversions { register( Character.class, String.class, new CharWrapperToStringConversion() ); register( BigInteger.class, String.class, new BigIntegerToStringConversion() ); register( BigDecimal.class, String.class, new BigDecimalToStringConversion() ); + register( StringBuilder.class, String.class, new StringBuilderToStringConversion() ); registerJodaConversions(); diff --git a/processor/src/main/java/org/mapstruct/ap/internal/conversion/StringBuilderToStringConversion.java b/processor/src/main/java/org/mapstruct/ap/internal/conversion/StringBuilderToStringConversion.java new file mode 100644 index 000000000..2f6705fab --- /dev/null +++ b/processor/src/main/java/org/mapstruct/ap/internal/conversion/StringBuilderToStringConversion.java @@ -0,0 +1,25 @@ +/* + * 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.internal.conversion; + +import org.mapstruct.ap.internal.model.common.ConversionContext; + +/** + * Handles conversion between a target type {@link StringBuilder} and {@link String}. + * + */ +public class StringBuilderToStringConversion extends SimpleConversion { + + @Override + protected String getToExpression(ConversionContext conversionContext) { + return ".toString()"; + } + + @Override + protected String getFromExpression(ConversionContext conversionContext) { + return "new " + ConversionUtils.stringBuilder( conversionContext ) + "( )"; + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Source.java b/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Source.java index ae9f22635..7f95abc79 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Source.java +++ b/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Source.java @@ -23,6 +23,7 @@ public class Source { private Boolean boolBool; private char c; private Character cc; + private StringBuilder sb; private Object object; public byte getB() { @@ -160,4 +161,12 @@ public class Source { public void setObject(Object object) { this.object = object; } + + public StringBuilder getSb() { + return sb; + } + + public void setSb(StringBuilder sb) { + this.sb = sb; + } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/conversion/string/StringConversionTest.java b/processor/src/test/java/org/mapstruct/ap/test/conversion/string/StringConversionTest.java index 8b7fe0f05..bc98fff25 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/conversion/string/StringConversionTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/conversion/string/StringConversionTest.java @@ -48,6 +48,7 @@ public class StringConversionTest { source.setBoolBool( Boolean.TRUE ); source.setC( 'G' ); source.setCc( 'H' ); + source.setSb( new StringBuilder( "SB" ) ); Target target = SourceTargetMapper.INSTANCE.sourceToTarget( source ); @@ -68,6 +69,7 @@ public class StringConversionTest { assertThat( target.getBoolBool() ).isEqualTo( "true" ); assertThat( target.getC() ).isEqualTo( "G" ); assertThat( target.getCc() ).isEqualTo( "H" ); + assertThat( target.getSb() ).isEqualTo( "SB" ); } @Test @@ -89,6 +91,7 @@ public class StringConversionTest { target.setBoolBool( "true" ); target.setC( "G" ); target.setCc( "H" ); + target.setSb( "SB" ); Source source = SourceTargetMapper.INSTANCE.targetToSource( target ); @@ -109,6 +112,7 @@ public class StringConversionTest { assertThat( source.getBoolBool() ).isEqualTo( true ); assertThat( source.getC() ).isEqualTo( 'G' ); assertThat( source.getCc() ).isEqualTo( 'H' ); + assertThat( source.getSb().toString() ).isEqualTo( "SB" ); } @Test diff --git a/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Target.java b/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Target.java index db6c3553c..7d58e9c12 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Target.java +++ b/processor/src/test/java/org/mapstruct/ap/test/conversion/string/Target.java @@ -23,6 +23,7 @@ public class Target { private String boolBool; private String c; private String cc; + private String sb; private String object; public String getB() { @@ -160,4 +161,12 @@ public class Target { public void setObject(String object) { this.object = object; } + + public String getSb() { + return sb; + } + + public void setSb(String sb) { + this.sb = sb; + } } diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/conversion/string/SourceTargetMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/conversion/string/SourceTargetMapperImpl.java index 7317a6ba6..ecfa91062 100644 --- a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/conversion/string/SourceTargetMapperImpl.java +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/conversion/string/SourceTargetMapperImpl.java @@ -9,8 +9,8 @@ import javax.annotation.Generated; @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2016-12-30T19:22:52+0100", - comments = "version: , compiler: javac, environment: Java 1.8.0_112 (Oracle Corporation)" + date = "2020-10-24T17:41:29+0300", + comments = "version: , compiler: javac, environment: Java 1.8.0_265 (AdoptOpenJDK)" ) public class SourceTargetMapperImpl implements SourceTargetMapper { @@ -54,6 +54,9 @@ public class SourceTargetMapperImpl implements SourceTargetMapper { if ( source.getCc() != null ) { target.setCc( source.getCc().toString() ); } + if ( source.getSb() != null ) { + target.setSb( source.getSb().toString() ); + } return target; } @@ -115,6 +118,9 @@ public class SourceTargetMapperImpl implements SourceTargetMapper { source.setCc( target.getCc().charAt( 0 ) ); } source.setObject( target.getObject() ); + if ( target.getSb() != null ) { + source.setSb( new StringBuilder( target.getSb() ) ); + } return source; }