#2552 Add built in conversion between URL and String

This commit is contained in:
Adam Szatyin 2021-08-17 19:21:07 +02:00 committed by GitHub
parent eb12c485ee
commit c52ff812aa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 236 additions and 0 deletions

View File

@ -122,6 +122,9 @@ public interface CarMapper {
* Between `String` and `StringBuilder`
* Between `java.net.URL` and `String`.
** When converting from a `String`, the value needs to be a valid https://en.wikipedia.org/wiki/URL[URL] otherwise a `MalformedURLException` is thrown.
[[mapping-object-references]]
=== Mapping object references

View File

@ -7,6 +7,7 @@ package org.mapstruct.ap.internal.conversion;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DecimalFormat;
@ -254,4 +255,15 @@ public final class ConversionUtils {
public static String uuid(ConversionContext conversionContext) {
return typeReferenceName( conversionContext, UUID.class );
}
/**
* Name for {@link java.net.URL}.
*
* @param conversionContext Conversion context
*
* @return Name or fully-qualified name.
*/
public static String url(ConversionContext conversionContext) {
return typeReferenceName( conversionContext, URL.class );
}
}

View File

@ -7,6 +7,7 @@ package org.mapstruct.ap.internal.conversion;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.Duration;
@ -193,6 +194,8 @@ public class Conversions {
register( Currency.class, String.class, new CurrencyToStringConversion() );
register( UUID.class, String.class, new UUIDToStringConversion() );
registerURLConversion();
}
private void registerJodaConversions() {
@ -294,6 +297,16 @@ public class Conversions {
}
}
private void registerURLConversion() {
if ( isJavaURLAvailable() ) {
register( URL.class, String.class, new URLToStringConversion() );
}
}
private boolean isJavaURLAvailable() {
return typeFactory.isTypeAvailable( "java.net.URL" );
}
private void register(Class<?> sourceClass, Class<?> targetClass, ConversionProvider conversion) {
Type sourceType = typeFactory.getType( sourceClass );
Type targetType = typeFactory.getType( targetClass );

View File

@ -0,0 +1,46 @@
/*
* 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;
import org.mapstruct.ap.internal.model.common.Type;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Set;
import static org.mapstruct.ap.internal.conversion.ConversionUtils.url;
import static org.mapstruct.ap.internal.util.Collections.asSet;
/**
* Conversion between {@link java.net.URL} and {@link String}.
*
* @author Adam Szatyin
*/
public class URLToStringConversion extends SimpleConversion {
@Override
protected String getToExpression(ConversionContext conversionContext) {
return "<SOURCE>.toString()";
}
@Override
protected String getFromExpression(ConversionContext conversionContext) {
return "new " + url( conversionContext ) + "( <SOURCE> )";
}
@Override
protected Set<Type> getFromConversionImportTypes(final ConversionContext conversionContext) {
return asSet( conversionContext.getTypeFactory().getType( URL.class ) );
}
@Override
protected List<Type> getFromConversionExceptionTypes(ConversionContext conversionContext) {
return java.util.Collections.singletonList(
conversionContext.getTypeFactory().getType( MalformedURLException.class )
);
}
}

View File

@ -0,0 +1,33 @@
/*
* 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.conversion.url;
import java.net.URL;
/**
* @author Adam Szatyin
*/
public class Source {
private URL url;
private URL invalidURL;
public URL getURL() {
return url;
}
public void setURL(URL url) {
this.url = url;
}
public URL getInvalidURL() {
return invalidURL;
}
public void setInvalidURL(URL invalidURL) {
this.invalidURL = invalidURL;
}
}

View File

@ -0,0 +1,30 @@
/*
* 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.conversion.url;
/**
* @author Adam Szatyin
*/
public class Target {
private String url;
private String invalidURL;
public String getURL() {
return this.url;
}
public void setURL(final String url) {
this.url = url;
}
public String getInvalidURL() {
return this.invalidURL;
}
public void setInvalidURL(final String invalidURL) {
this.invalidURL = invalidURL;
}
}

View File

@ -0,0 +1,76 @@
/*
* 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.conversion.url;
import org.mapstruct.ap.testutil.ProcessorTest;
import org.mapstruct.ap.testutil.WithClasses;
import java.net.MalformedURLException;
import java.net.URL;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Tests conversions between {@link java.net.URL} and String.
*
* @author Adam Szatyin
*/
@WithClasses({ Source.class, Target.class, URLMapper.class })
public class URLConversionTest {
@ProcessorTest
public void shouldApplyURLConversion() throws MalformedURLException {
Source source = new Source();
source.setURL( new URL("https://mapstruct.org/") );
Target target = URLMapper.INSTANCE.sourceToTarget( source );
assertThat( target ).isNotNull();
assertThat( target.getURL() ).isEqualTo( source.getURL().toString() );
}
@ProcessorTest
public void shouldApplyReverseURLConversion() throws MalformedURLException {
Target target = new Target();
target.setURL( "https://mapstruct.org/" );
Source source = URLMapper.INSTANCE.targetToSource( target );
assertThat( source ).isNotNull();
assertThat( source.getURL() ).isEqualTo( new URL( target.getURL() ) );
}
@ProcessorTest
public void shouldHandleInvalidURLString() {
Target target = new Target();
target.setInvalidURL( "XXXXXXXXX" );
assertThatThrownBy( () -> URLMapper.INSTANCE.targetToSource( target ) )
.isInstanceOf( RuntimeException.class )
.getRootCause().isInstanceOf( MalformedURLException.class );
}
@ProcessorTest
public void shouldHandleInvalidURLStringWithMalformedURLException() {
Target target = new Target();
target.setInvalidURL( "XXXXXXXXX" );
assertThatThrownBy( () -> URLMapper.INSTANCE.targetToSourceWithMalformedURLException( target ) )
.isInstanceOf( MalformedURLException.class );
}
@ProcessorTest
public void shouldHandleNullURLString() {
Source source = new Source();
Target target = URLMapper.INSTANCE.sourceToTarget( source );
assertThat( target ).isNotNull();
assertThat( target.getURL() ).isNull();
assertThat( target.getInvalidURL() ).isNull();
}
}

View File

@ -0,0 +1,23 @@
/*
* 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.conversion.url;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.net.MalformedURLException;
@Mapper
public interface URLMapper {
URLMapper INSTANCE = Mappers.getMapper( URLMapper.class );
Target sourceToTarget(Source source);
Source targetToSource(Target target);
Source targetToSourceWithMalformedURLException(Target target) throws MalformedURLException;
}