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));
}