diff --git a/mapstruct-protobuf3/pom.xml b/mapstruct-protobuf3/pom.xml index 7fe7ebb..53eaaae 100644 --- a/mapstruct-protobuf3/pom.xml +++ b/mapstruct-protobuf3/pom.xml @@ -32,7 +32,7 @@ UTF-8 1.4.0.Final 0.5.0 - 3.2.0 + 3.8.0 1.3.1.Final 1.8 1.8 diff --git a/mapstruct-protobuf3/usage/pom.xml b/mapstruct-protobuf3/usage/pom.xml index 2be243d..cdae067 100644 --- a/mapstruct-protobuf3/usage/pom.xml +++ b/mapstruct-protobuf3/usage/pom.xml @@ -72,10 +72,10 @@ compile-custom - com.google.protobuf:protoc:3.2.0:exe:${os.detected.classifier} + com.google.protobuf:protoc:3.11.2:exe:${os.detected.classifier} grpc-java - io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier} + io.grpc:protoc-gen-grpc-java:1.27.0:exe:${os.detected.classifier} diff --git a/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/ProtoMapper.java b/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/ProtoMapper.java new file mode 100644 index 0000000..fa9fa55 --- /dev/null +++ b/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/ProtoMapper.java @@ -0,0 +1,65 @@ +package org.mapstruct.example.mapper; + +import com.google.protobuf.*; +import org.mapstruct.Mapper; + +@Mapper +public interface ProtoMapper +{ + + default BoolValue booleanToBoolValue(final Boolean bool) { + return bool == null ? null : BoolValue.of(bool); + } + + default Boolean boolValueToBoolean(final BoolValue boolValue) { + return boolValue == null ? null : boolValue.getValue(); + } + + default Float floatValueToFloat(final FloatValue floatValue) { + return floatValue == null ? null : floatValue.getValue(); + } + + default FloatValue floatToFloatValue(final Float floatValue) { + return floatValue == null ? null : FloatValue.newBuilder().setValue(floatValue).build(); + } + + default Integer int32ValueToInteger(final Int32Value int32Value) { + return int32Value == null ? null : int32Value.getValue(); + } + + default Int32Value integerToInt32Value(final Integer integer) { + return integer == null ? null : Int32Value.newBuilder().setValue(integer).build(); + } + + default String stringValueToString(final StringValue stringValue) { + return stringValue != null ? stringValue.getValue() : null; + } + + default StringValue stringToStringValue(final String string) { + return string != null ? StringValue.of(string) : null; + } + + default Long int64ValueToLong(final Int64Value value) { + return value != null ? value.getValue() : null; + } + + default Int64Value longToInt64Value(final Long value) { + return value != null ? Int64Value.of(value) : null; + } + + default byte[] bytesValueToBytes(final BytesValue value) { + return value != null ? value.getValue().toByteArray() : null; + } + + default BytesValue bytesToBytesValue(final byte[] value) { + return value != null ? BytesValue.of(ByteString.copyFrom(value)) : null; + } + + default DoubleValue doubleToDoubleValue(final Double value) { + return value != null ? DoubleValue.of(value) : null; + } + + default Double doubleValueToDouble(final DoubleValue value) { + return value != null ? value.getValue() : null; + } +} diff --git a/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/UserMapper.java b/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/UserMapper.java index 68b6a5c..463b558 100644 --- a/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/UserMapper.java +++ b/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/mapper/UserMapper.java @@ -18,10 +18,13 @@ */ package org.mapstruct.example.mapper; +import com.google.protobuf.StringValue; +import org.mapstruct.AfterMapping; import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingConstants; +import org.mapstruct.MappingTarget; import org.mapstruct.NullValueCheckStrategy; import org.mapstruct.ValueMapping; import org.mapstruct.example.protobuf.Department; @@ -36,7 +39,8 @@ * @author Thomas Kratz */ @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, - nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + uses = ProtoMapper.class) public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @@ -50,6 +54,7 @@ public interface UserMapper { @Mapping(source = "permissionsList", target = "permissions") @Mapping(source = "mainDepartmentsList", target = "mainDepartments") @Mapping(source = "departmentsList", target = "departments") + @Mapping(source = "alternateEmailsList", target = "alternateEmails") User map(UserDTO userDTO); @ValueMapping(source = "UNRECOGNIZED", target = MappingConstants.NULL) @@ -60,4 +65,12 @@ public interface UserMapper { Department map(DepartmentDTO departmentDTO); DepartmentDTO map(Department department); + + @AfterMapping + default void after(User user, @MappingTarget final UserDTO.Builder builder) { + int idx = 0; + for (String item : user.getAlternateEmails()) { + builder.addAlternateEmails(idx++, StringValue.of(item)); + } + } } diff --git a/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/protobuf/User.java b/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/protobuf/User.java index 6e779b3..dc7d2c0 100644 --- a/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/protobuf/User.java +++ b/mapstruct-protobuf3/usage/src/main/java/org/mapstruct/example/protobuf/User.java @@ -13,6 +13,7 @@ public class User { private List permissions = new ArrayList<>(); private List mainDepartments = new ArrayList<>(); private List departments = new ArrayList<>(); + private List alternateEmails = new ArrayList<>(); public String getId() { return id; @@ -46,11 +47,19 @@ public void setDepartments(List departments) { this.departments = departments; } - public List getMainDepartments() { - return mainDepartments; - } + public List getMainDepartments() { + return mainDepartments; + } - public void setMainDepartments(List mainDepartments) { - this.mainDepartments = mainDepartments; - } + public void setMainDepartments(List mainDepartments) { + this.mainDepartments = mainDepartments; + } + + public List getAlternateEmails() { + return alternateEmails; + } + + public void setAlternateEmails(List alternateEmails) { + this.alternateEmails = alternateEmails; + } } diff --git a/mapstruct-protobuf3/usage/src/main/proto/User.proto b/mapstruct-protobuf3/usage/src/main/proto/User.proto index 71c50b4..2bec6ac 100644 --- a/mapstruct-protobuf3/usage/src/main/proto/User.proto +++ b/mapstruct-protobuf3/usage/src/main/proto/User.proto @@ -4,12 +4,15 @@ syntax = "proto3"; option java_package = "org.mapstruct.example.protobuf"; option java_outer_classname = "UserProtos"; +import "google/protobuf/wrappers.proto"; + message UserDTO { string id = 1; string email = 2; repeated PermissionDTO permissions = 3; repeated DepartmentDTO main_departments = 4; repeated DepartmentDTO departments = 5; + repeated google.protobuf.StringValue alternateEmails = 6; } enum PermissionDTO { diff --git a/mapstruct-protobuf3/usage/src/test/java/org/mapstruct/example/ProtobufTest.java b/mapstruct-protobuf3/usage/src/test/java/org/mapstruct/example/ProtobufTest.java index 9f564d9..0073b3a 100644 --- a/mapstruct-protobuf3/usage/src/test/java/org/mapstruct/example/ProtobufTest.java +++ b/mapstruct-protobuf3/usage/src/test/java/org/mapstruct/example/ProtobufTest.java @@ -19,6 +19,7 @@ package org.mapstruct.example; import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.StringValue; import org.junit.Assert; import org.junit.Test; import org.mapstruct.example.mapper.UserMapper; @@ -42,6 +43,7 @@ public void test() throws InvalidProtocolBufferException { user.getPermissions().add(Permission.ADMIN); user.getMainDepartments().add(new Department("SALES")); user.getDepartments().add(new Department("AFTER_MARKET")); + user.getAlternateEmails().add("bozo@clown.com"); UserDTO dto = UserMapper.INSTANCE.map(user); UserDTO deserialized = UserDTO.parseFrom(dto.toByteArray()); @@ -56,6 +58,8 @@ public void test() throws InvalidProtocolBufferException { Assert.assertEquals(1,back.getDepartments().size()); Assert.assertEquals("AFTER_MARKET",back.getDepartments().get(0).getName()); + + Assert.assertEquals("bozo@clown.com", back.getAlternateEmails().get(0)); }