Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,14 @@ public interface CarMapper {

* Between `java.time.LocalDateTime` from Java 8 Date-Time package and `java.time.LocalDate` from the same package.

* Between `java.time.ZonedDateTime` from Java 8 Date-Time package and `java.time.LocalDateTime` from the same package.

* Between `java.time.OffsetDateTime` from Java 8 Date-Time package and `java.time.LocalDateTime` from the same package.

* Between `java.time.ZonedDateTime` from Java 8 Date-Time package and `java.time.Instant` from the same package.

* Between `java.time.OffsetDateTime` from Java 8 Date-Time package and `java.time.Instant` from the same package.

* Between `java.time.ZonedDateTime` from Java 8 Date-Time package and `java.util.Calendar`.

* Between `java.sql.Date` and `java.util.Date`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.Period;
import java.time.ZonedDateTime;
import java.util.Calendar;
Expand Down Expand Up @@ -244,7 +245,11 @@ private void registerJava8TimeConversions() {

// Java 8 time
register( LocalDateTime.class, LocalDate.class, new JavaLocalDateTimeToLocalDateConversion() );
register( ZonedDateTime.class, LocalDateTime.class, new JavaZonedDateTimeToLocalDateTimeConversion() );
register( OffsetDateTime.class, LocalDateTime.class, new JavaOffsetDateTimeToLocalDateTimeConversion() );

register( ZonedDateTime.class, Instant.class, new JavaZonedDateTimeToInstantConversion() );
register( OffsetDateTime.class, Instant.class, new JavaOffsetDateTimeToInstantConversion() );
}

private void registerJavaTimeSqlConversions() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* 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 java.time.ZoneOffset;
import java.util.Set;

import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.util.Collections;

import static org.mapstruct.ap.internal.conversion.ConversionUtils.zoneOffset;

public class JavaOffsetDateTimeToInstantConversion extends SimpleConversion {
@Override
protected String getToExpression(ConversionContext conversionContext) {
return "<SOURCE>.toInstant()";
}

@Override
protected String getFromExpression(ConversionContext conversionContext) {
return "<SOURCE>.atOffset( " + zoneOffset( conversionContext ) + ".UTC )";
}

@Override
protected Set<Type> getFromConversionImportTypes(ConversionContext conversionContext) {
return Collections.asSet(
conversionContext.getTypeFactory().getType( ZoneOffset.class )
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* 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 java.time.ZoneOffset;
import java.util.Set;

import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.util.Collections;

import static org.mapstruct.ap.internal.conversion.ConversionUtils.zoneOffset;

public class JavaOffsetDateTimeToLocalDateTimeConversion extends SimpleConversion {

@Override
protected String getToExpression(ConversionContext conversionContext) {
return "<SOURCE>.toLocalDateTime()";
}

@Override
protected String getFromExpression(ConversionContext conversionContext) {
return "<SOURCE>.atOffset( " + zoneOffset( conversionContext ) + ".UTC )";
}

@Override
protected Set<Type> getFromConversionImportTypes(ConversionContext conversionContext) {
return Collections.asSet(
conversionContext.getTypeFactory().getType( ZoneOffset.class )
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* 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 java.time.ZoneOffset;
import java.util.Set;

import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.util.Collections;

import static org.mapstruct.ap.internal.conversion.ConversionUtils.zoneOffset;

public class JavaZonedDateTimeToInstantConversion extends SimpleConversion {
@Override
protected String getToExpression(ConversionContext conversionContext) {
return "<SOURCE>.toInstant()";
}

@Override
protected String getFromExpression(ConversionContext conversionContext) {
return "<SOURCE>.atZone( " + zoneOffset( conversionContext ) + ".UTC )";
}

@Override
protected Set<Type> getFromConversionImportTypes(ConversionContext conversionContext) {
return Collections.asSet(
conversionContext.getTypeFactory().getType( ZoneOffset.class )
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* 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 java.time.ZoneOffset;
import java.util.Set;

import org.mapstruct.ap.internal.model.common.ConversionContext;
import org.mapstruct.ap.internal.model.common.Type;
import org.mapstruct.ap.internal.util.Collections;

import static org.mapstruct.ap.internal.conversion.ConversionUtils.zoneOffset;

public class JavaZonedDateTimeToLocalDateTimeConversion extends SimpleConversion {

@Override
protected String getToExpression(ConversionContext conversionContext) {
return "<SOURCE>.toLocalDateTime()";

}

@Override
protected String getFromExpression(ConversionContext conversionContext) {
return "<SOURCE>.atZone( " + zoneOffset( conversionContext ) + ".UTC )";
}

@Override
protected Set<Type> getFromConversionImportTypes(ConversionContext conversionContext) {
return Collections.asSet(
conversionContext.getTypeFactory().getType( ZoneOffset.class )
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*
* 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.java8time;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

import org.junit.jupiter.api.extension.RegisterExtension;
import org.mapstruct.ap.test.conversion.java8time.zonedoffsetdatetimetolocaldatetimeconversion.Source;
import org.mapstruct.ap.test.conversion.java8time.zonedoffsetdatetimetolocaldatetimeconversion.SourceTargetMapper;
import org.mapstruct.ap.test.conversion.java8time.zonedoffsetdatetimetolocaldatetimeconversion.Target;
import org.mapstruct.ap.testutil.IssueKey;
import org.mapstruct.ap.testutil.ProcessorTest;
import org.mapstruct.ap.testutil.WithClasses;
import org.mapstruct.ap.testutil.runner.GeneratedSource;

import static org.assertj.core.api.Assertions.assertThat;

@WithClasses({ Source.class, Target.class, SourceTargetMapper.class })
@IssueKey("4027")
public class ZonedOffsetDateTimeToLocalDateTimeConversionTest {

@RegisterExtension
GeneratedSource generatedSource = new GeneratedSource()
.addComparisonToFixtureFor( SourceTargetMapper.class );

@ProcessorTest
public void testZonedDateTimeToLocalDateTimeMapping() {
ZonedDateTime zonedDateTime = ZonedDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneId.of( "UTC" ) );
Source source = new Source();
source.setZonedDateTime( zonedDateTime );
Target target = SourceTargetMapper.INSTANCE.toTarget( source );
assertThat( target.getZonedDateTime() )
.isEqualTo( LocalDateTime.of( 2024, 1, 1, 12, 30, 0 ) );
}

@ProcessorTest
public void testOffsetDateTimeToLocalDateTimeMapping() {
OffsetDateTime offsetDateTime = OffsetDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC );
Source source = new Source();
source.setOffsetDateTime( offsetDateTime );
Target target = SourceTargetMapper.INSTANCE.toTarget( source );
assertThat( target.getOffsetDateTime() )
.isEqualTo( LocalDateTime.of( 2024, 1, 1, 12, 30, 0 ) );
}

@ProcessorTest
public void testLocalDateTimeToZonedDateTimeMapping() {
LocalDateTime localDateTime = LocalDateTime.of( 2024, 1, 1, 12, 30, 0 );
Target target = new Target();
target.setZonedDateTime( localDateTime );
Source source = SourceTargetMapper.INSTANCE.toSource( target );
assertThat( source.getZonedDateTime() )
.isEqualTo( ZonedDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC ) );
}

@ProcessorTest
public void testLocalDateTimeToOffsetDateTimeMapping() {
LocalDateTime localDateTime = LocalDateTime.of( 2024, 1, 1, 12, 30, 0 );
Target target = new Target();
target.setOffsetDateTime( localDateTime );
Source source = SourceTargetMapper.INSTANCE.toSource( target );
assertThat( source.getOffsetDateTime() )
.isEqualTo( OffsetDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC ) );
}

@ProcessorTest
public void testZonedDateTimeToInstantMapping() {
ZonedDateTime zonedDateTime = ZonedDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC );
Source source = new Source();
source.setZonedDateTimeAsInstant( zonedDateTime );
Target target = SourceTargetMapper.INSTANCE.toTarget( source );
assertThat( target.getZonedDateTimeAsInstant() )
.isEqualTo( Instant.parse( "2024-01-01T12:30:00Z" ) );
}

@ProcessorTest
public void testOffsetDateTimeToInstantMapping() {
OffsetDateTime offsetDateTime = OffsetDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC );
Source source = new Source();
source.setOffsetDateTimeAsInstant( offsetDateTime );
Target target = SourceTargetMapper.INSTANCE.toTarget( source );
assertThat( target.getOffsetDateTimeAsInstant() )
.isEqualTo( Instant.parse( "2024-01-01T12:30:00Z" ) );
}

@ProcessorTest
public void testInstantToZonedDateTimeMapping() {
Instant instant = Instant.parse( "2024-01-01T12:30:00Z" );
Target target = new Target();
target.setZonedDateTimeAsInstant( instant );
Source source = SourceTargetMapper.INSTANCE.toSource( target );
assertThat( source.getZonedDateTimeAsInstant() )
.isEqualTo( ZonedDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC ) );
}

@ProcessorTest
public void testInstantToOffsetDateTimeMapping() {
Instant instant = Instant.parse( "2024-01-01T12:30:00Z" );
Target target = new Target();
target.setOffsetDateTimeAsInstant( instant );
Source source = SourceTargetMapper.INSTANCE.toSource( target );
assertThat( source.getOffsetDateTimeAsInstant() )
.isEqualTo( OffsetDateTime.of( 2024, 1, 1, 12, 30, 0, 0, ZoneOffset.UTC ) );
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* 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.java8time.zonedoffsetdatetimetolocaldatetimeconversion;

import java.time.OffsetDateTime;
import java.time.ZonedDateTime;

public class Source {
private ZonedDateTime zonedDateTime;
private OffsetDateTime offsetDateTime;
private ZonedDateTime zonedDateTimeAsInstant;
private OffsetDateTime offsetDateTimeAsInstant;

public ZonedDateTime getZonedDateTime() {
return zonedDateTime;
}

public void setZonedDateTime(ZonedDateTime zonedDateTime) {
this.zonedDateTime = zonedDateTime;
}

public OffsetDateTime getOffsetDateTime() {
return offsetDateTime;
}

public void setOffsetDateTime(OffsetDateTime offsetDateTime) {
this.offsetDateTime = offsetDateTime;
}

public ZonedDateTime getZonedDateTimeAsInstant() {
return zonedDateTimeAsInstant;
}

public void setZonedDateTimeAsInstant(ZonedDateTime zonedDateTimeAsInstant) {
this.zonedDateTimeAsInstant = zonedDateTimeAsInstant;
}

public OffsetDateTime getOffsetDateTimeAsInstant() {
return offsetDateTimeAsInstant;
}

public void setOffsetDateTimeAsInstant(OffsetDateTime offsetDateTimeAsInstant) {
this.offsetDateTimeAsInstant = offsetDateTimeAsInstant;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* 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.java8time.zonedoffsetdatetimetolocaldatetimeconversion;

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface SourceTargetMapper {
SourceTargetMapper INSTANCE = Mappers.getMapper( SourceTargetMapper.class );

Target toTarget(Source source);

Source toSource(Target target);
}
Loading
Loading