Skip to content

Commit d0da289

Browse files
fix bugs serializedUsingTheSingleStringMethodWithZeroArguments returns null #6 and [BUG] public static fields are not ignored for DTOs #4, update parent and deps
1 parent 93a6d40 commit d0da289

18 files changed

+245
-92
lines changed

core/src/main/java/com/envimate/mapmate/CustomPrimitiveSerializationMethodCallException.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
package com.envimate.mapmate;
2323

2424
import java.lang.invoke.MethodHandle;
25+
import java.lang.reflect.Method;
2526

2627
public final class CustomPrimitiveSerializationMethodCallException extends RuntimeException {
2728
private CustomPrimitiveSerializationMethodCallException(final String msg, final Throwable exception) {
@@ -58,4 +59,21 @@ public static CustomPrimitiveSerializationMethodCallException fromThrowable(
5859
instance);
5960
return customPrimitiveSerializationMethodCallException(msg, exception);
6061
}
62+
63+
public static CustomPrimitiveSerializationMethodCallException fromThrowable(
64+
final String description,
65+
final Throwable exception,
66+
final Class<?> type,
67+
final Method method,
68+
final Object instance) {
69+
final String msg = String.format("%s " +
70+
"type: %s. " +
71+
"method: %s. " +
72+
"instance: %s.",
73+
description,
74+
type,
75+
method,
76+
instance);
77+
return customPrimitiveSerializationMethodCallException(msg, exception);
78+
}
6179
}

core/src/main/java/com/envimate/mapmate/builder/MapMateBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ public MapMateBuilder usingMarshaller(final MarshallingType marshallingType,
126126

127127
public MapMateBuilder usingMarshaller(final Map<MarshallingType, Marshaller> marshallerMap,
128128
final Map<MarshallingType, Unmarshaller> unmarshallerMap) {
129-
this.marshallerMap = marshallerMap;
130-
this.unmarshallerMap = unmarshallerMap;
129+
this.marshallerMap = new HashMap<>(marshallerMap);
130+
this.unmarshallerMap = new HashMap<>(unmarshallerMap);
131131
return this;
132132
}
133133

core/src/main/java/com/envimate/mapmate/builder/anticorruption/DefinitionsFactory.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@
2525
import com.envimate.mapmate.builder.definitions.CustomPrimitiveDeserializer;
2626
import com.envimate.mapmate.builder.definitions.CustomPrimitiveSerializer;
2727
import com.envimate.mapmate.builder.definitions.SerializedObjectDefinition;
28-
import com.envimate.mapmate.deserialization.*;
28+
import com.envimate.mapmate.deserialization.DeserializableCustomPrimitive;
29+
import com.envimate.mapmate.deserialization.DeserializableDataTransferObject;
30+
import com.envimate.mapmate.deserialization.DeserializableDefinitions;
2931
import com.envimate.mapmate.deserialization.methods.DeserializationDTOMethod;
30-
import com.envimate.mapmate.serialization.*;
31-
import com.envimate.mapmate.serialization.methods.SerializationCPMethod;
32+
import com.envimate.mapmate.serialization.SerializableCustomPrimitive;
33+
import com.envimate.mapmate.serialization.SerializableDataTransferObject;
34+
import com.envimate.mapmate.serialization.SerializableDefinitions;
35+
import com.envimate.mapmate.serialization.methods.SerializationCPMethodDefinition;
3236
import com.envimate.mapmate.serialization.methods.SerializationDTOMethod;
3337
import lombok.AccessLevel;
3438
import lombok.EqualsAndHashCode;
@@ -65,7 +69,7 @@ public SerializableDefinitions toSerializableDefinitions() {
6569
for (final CustomPrimitiveDefinition customPrimitiveDefinition : this.customPrimitiveDefinitions) {
6670
final Class<?> type = customPrimitiveDefinition.type;
6771
final CustomPrimitiveSerializer<?> serializer = customPrimitiveDefinition.serializer;
68-
final SerializationCPMethod serializationCPMethod = serializationCPMethodAdapter(serializer);
72+
final SerializationCPMethodDefinition serializationCPMethod = serializationCPMethodAdapter(serializer);
6973
final SerializableCustomPrimitive serializableCP = serializableCustomPrimitive(type, serializationCPMethod);
7074
serializableCPs.add(serializableCP);
7175
}

core/src/main/java/com/envimate/mapmate/builder/anticorruption/SerializationCPMethodAdapter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import com.envimate.mapmate.builder.definitions.CustomPrimitiveSerializer;
2525
import com.envimate.mapmate.serialization.methods.SerializationCPMethod;
26+
import com.envimate.mapmate.serialization.methods.SerializationCPMethodDefinition;
2627
import lombok.AccessLevel;
2728
import lombok.EqualsAndHashCode;
2829
import lombok.RequiredArgsConstructor;
@@ -32,7 +33,7 @@
3233
@ToString
3334
@EqualsAndHashCode
3435
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
35-
public final class SerializationCPMethodAdapter implements SerializationCPMethod {
36+
public final class SerializationCPMethodAdapter implements SerializationCPMethod, SerializationCPMethodDefinition {
3637
private final CustomPrimitiveSerializer serializer;
3738

3839
public static SerializationCPMethodAdapter serializationCPMethodAdapter(
@@ -41,8 +42,9 @@ public static SerializationCPMethodAdapter serializationCPMethodAdapter(
4142
}
4243

4344
@Override
44-
public void verifyCompatibility(final Class<?> targetType) {
45+
public SerializationCPMethod verifyCompatibility(final Class<?> targetType) {
4546
//nothing to do here, everything is pre-validated using the new builder
47+
return this;
4648
}
4749

4850
@Override

core/src/main/java/com/envimate/mapmate/deserialization/builder/scanner/CustomPrimitivePackageScanner.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ private CustomPrimitivePackageScanner(final List<ClassFilter> classFilters,
4646
this.deserializationCPMethod = deserializationCPMethod;
4747
}
4848

49-
public static PackageScanner theCustomPrimitivePackageScanner(final List<ClassFilter> classFilters,
50-
final DeserializationCPMethod deserializationCPMethod) {
49+
public static PackageScanner theCustomPrimitivePackageScanner(
50+
final List<ClassFilter> classFilters,
51+
final DeserializationCPMethod deserializationCPMethod
52+
) {
5153
return new CustomPrimitivePackageScanner(classFilters, deserializationCPMethod);
5254
}
5355

core/src/main/java/com/envimate/mapmate/serialization/CircularReferenceDetector.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@
2222
package com.envimate.mapmate.serialization;
2323

2424
import java.lang.reflect.Field;
25-
import java.util.ArrayList;
26-
import java.util.HashSet;
27-
import java.util.Objects;
28-
import java.util.Set;
25+
import java.lang.reflect.Modifier;
26+
import java.util.*;
27+
import java.util.stream.Collectors;
2928

3029
/**
3130
* CircularReferenceDetector provides ways to scan and detect circular references in a given object.
@@ -70,8 +69,11 @@ void detect(final Object subject) {
7069

7170
private void detect(final Object subject, final ArrayList<Object> references) {
7271
final Class<?> type = subject.getClass();
73-
final Field[] fields = type.getFields();
72+
final List<Field> fields = Arrays.stream(type.getFields())
73+
.filter(field -> !Modifier.isStatic(field.getModifiers()))
74+
.collect(Collectors.toList());
7475
for (final Field field : fields) {
76+
7577
final Object value = this.readFieldValue(subject, field);
7678
if (value != null) {
7779
if (!isWrapperType(value.getClass())) {

core/src/main/java/com/envimate/mapmate/serialization/SerializableCustomPrimitive.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import com.envimate.mapmate.Definition;
2525
import com.envimate.mapmate.serialization.methods.SerializationCPMethod;
26+
import com.envimate.mapmate.serialization.methods.SerializationCPMethodDefinition;
2627

2728
public final class SerializableCustomPrimitive implements Definition {
2829

@@ -34,9 +35,11 @@ private SerializableCustomPrimitive(final Class<?> type, final SerializationCPMe
3435
this.serializationCPMethod = serializationCPMethod;
3536
}
3637

37-
public static SerializableCustomPrimitive serializableCustomPrimitive(final Class<?> type,
38-
final SerializationCPMethod serializationCPMethod) {
39-
serializationCPMethod.verifyCompatibility(type);
38+
public static SerializableCustomPrimitive serializableCustomPrimitive(
39+
final Class<?> type,
40+
final SerializationCPMethodDefinition definition
41+
) {
42+
final SerializationCPMethod serializationCPMethod = definition.verifyCompatibility(type);
4043
return new SerializableCustomPrimitive(type, serializationCPMethod);
4144
}
4245

core/src/main/java/com/envimate/mapmate/serialization/builder/CustomPrimitiveSerializationMethodBuilder.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,29 @@
2222
package com.envimate.mapmate.serialization.builder;
2323

2424
import com.envimate.mapmate.reflections.MethodName;
25-
import com.envimate.mapmate.serialization.methods.SerializationCPMethod;
25+
import com.envimate.mapmate.serialization.methods.SerializationCPMethodDefinition;
2626

2727
import java.util.function.Function;
2828

2929
import static com.envimate.mapmate.reflections.MethodName.fromString;
3030
import static com.envimate.mapmate.serialization.methods.NamedMethodSerializationCPMethod.theNamedMethodSerializationCPMethod;
3131
import static com.envimate.mapmate.serialization.methods.ProvidedMethodSerializationCPMethod.providedMethodSerializationCPMethod;
32+
import static com.envimate.mapmate.serialization.methods.UniqueNoArgumentsMethodReturningStringCPMethod.theUniqueNoArgumentsMethodReturningStringCPMethod;
3233
import static com.envimate.mapmate.validators.NotNullValidator.validateNotNull;
3334

3435
@SuppressWarnings("unused")
3536
public final class CustomPrimitiveSerializationMethodBuilder<T> {
3637
private final Class<T> type;
37-
private final Function<SerializationCPMethod, SerializerBuilder> resultConsumer;
38+
private final Function<SerializationCPMethodDefinition, SerializerBuilder> resultConsumer;
3839

3940
private CustomPrimitiveSerializationMethodBuilder(
40-
final Class<T> type, final Function<SerializationCPMethod, SerializerBuilder> resultConsumer) {
41+
final Class<T> type, final Function<SerializationCPMethodDefinition, SerializerBuilder> resultConsumer) {
4142
this.type = type;
4243
this.resultConsumer = resultConsumer;
4344
}
4445

4546
static <T> CustomPrimitiveSerializationMethodBuilder<T> aCustomPrimitiveSerializationMethodBuilder(
46-
final Class<T> type, final Function<SerializationCPMethod, SerializerBuilder> resultConsumer) {
47+
final Class<T> type, final Function<SerializationCPMethodDefinition, SerializerBuilder> resultConsumer) {
4748
return new CustomPrimitiveSerializationMethodBuilder<>(type, resultConsumer);
4849
}
4950

@@ -56,12 +57,12 @@ public SerializerBuilder serializedUsingTheMethod(final Function<T, String> meth
5657
return serializedUsing(providedMethodSerializationCPMethod(this.type, method));
5758
}
5859

59-
public SerializerBuilder serializedUsing(final SerializationCPMethod method) {
60-
validateNotNull(method, "method");
61-
return this.resultConsumer.apply(method);
60+
public SerializerBuilder serializedUsingTheSingleStringMethodWithZeroArguments() {
61+
return serializedUsing(theUniqueNoArgumentsMethodReturningStringCPMethod());
6262
}
6363

64-
public SerializerBuilder serializedUsingTheSingleStringMethodWithZeroArguments() {
65-
return null;
64+
public SerializerBuilder serializedUsing(final SerializationCPMethodDefinition methodDefinition) {
65+
validateNotNull(methodDefinition, "methodDefinition");
66+
return this.resultConsumer.apply(methodDefinition);
6667
}
6768
}

core/src/main/java/com/envimate/mapmate/serialization/builder/scanner/CustomPrimitivePackageScanner.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.envimate.mapmate.reflections.PackageName;
2727
import com.envimate.mapmate.serialization.SerializableCustomPrimitive;
2828
import com.envimate.mapmate.serialization.SerializableDefinitions;
29-
import com.envimate.mapmate.serialization.methods.SerializationCPMethod;
29+
import com.envimate.mapmate.serialization.methods.SerializationCPMethodDefinition;
3030

3131
import java.util.List;
3232

@@ -38,25 +38,27 @@
3838
public final class CustomPrimitivePackageScanner implements PackageScanner {
3939

4040
private final List<ClassFilter> classFilters;
41-
private final SerializationCPMethod serializationCPMethod;
41+
private final SerializationCPMethodDefinition serializationCPMethodDefinition;
4242

4343
private CustomPrimitivePackageScanner(final List<ClassFilter> classFilters,
44-
final SerializationCPMethod serializationCPMethod) {
44+
final SerializationCPMethodDefinition serializationCPMethodDefinition) {
4545
this.classFilters = classFilters;
46-
this.serializationCPMethod = serializationCPMethod;
46+
this.serializationCPMethodDefinition = serializationCPMethodDefinition;
4747
}
4848

49-
public static PackageScanner theCustomPrimitivePackageScanner(final List<ClassFilter> classFilters,
50-
final SerializationCPMethod serializationCPMethod) {
51-
return new CustomPrimitivePackageScanner(classFilters, serializationCPMethod);
49+
public static PackageScanner theCustomPrimitivePackageScanner(
50+
final List<ClassFilter> classFilters,
51+
final SerializationCPMethodDefinition serializationCPMethodDefinition
52+
) {
53+
return new CustomPrimitivePackageScanner(classFilters, serializationCPMethodDefinition);
5254
}
5355

5456
@Override
5557
public SerializableDefinitions scan(final PackageName packageName) {
5658
final ScanablePackage scanablePackage = scannablePackage(packageName, this.classFilters);
5759
final List<Class<?>> types = scanablePackage.getTypes();
5860
final List<SerializableCustomPrimitive> customPrimitives = types.stream()
59-
.map(type -> serializableCustomPrimitive(type, this.serializationCPMethod))
61+
.map(type -> serializableCustomPrimitive(type, this.serializationCPMethodDefinition))
6062
.collect(toList());
6163
return withTheCustomPrimitives(customPrimitives);
6264
}

core/src/main/java/com/envimate/mapmate/serialization/methods/NamedMethodSerializationCPMethod.java

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,27 @@
2121

2222
package com.envimate.mapmate.serialization.methods;
2323

24-
import com.envimate.mapmate.CustomPrimitiveSerializationMethodCallException;
2524
import com.envimate.mapmate.reflections.MethodName;
2625

27-
import java.lang.invoke.MethodHandle;
28-
import java.lang.invoke.WrongMethodTypeException;
2926
import java.lang.reflect.Method;
3027

31-
import static com.envimate.mapmate.reflections.Reflections.findPublicStringMethodByName;
3228
import static com.envimate.mapmate.serialization.methods.SerializationMethodNotCompatibleException.serializationMethodNotCompatibleException;
3329
import static java.lang.reflect.Modifier.isPublic;
3430
import static java.lang.reflect.Modifier.isStatic;
3531

36-
public final class NamedMethodSerializationCPMethod implements SerializationCPMethod {
37-
32+
public final class NamedMethodSerializationCPMethod implements SerializationCPMethodDefinition {
3833
private final MethodName methodName;
3934

4035
private NamedMethodSerializationCPMethod(final MethodName methodName) {
4136
this.methodName = methodName;
4237
}
4338

44-
public static SerializationCPMethod theNamedMethodSerializationCPMethod(final MethodName methodName) {
39+
public static NamedMethodSerializationCPMethod theNamedMethodSerializationCPMethod(final MethodName methodName) {
4540
return new NamedMethodSerializationCPMethod(methodName);
4641
}
4742

4843
@Override
49-
public void verifyCompatibility(final Class<?> targetType) {
44+
public SerializationCPMethod verifyCompatibility(final Class<?> targetType) {
5045
try {
5146
final Method method = targetType.getMethod(this.methodName.internalValueForMapping());
5247
if (method.getParameterCount() != 0) {
@@ -69,33 +64,11 @@ public void verifyCompatibility(final Class<?> targetType) {
6964
" does not have a zero argument String method" +
7065
" named '" + this.methodName.internalValueForMapping() + "'");
7166
}
67+
return ReflectionMethodSerializationCPMethod.reflectionMethodSerializationCPMethod(method);
7268
} catch (final NoSuchMethodException e) {
7369
throw serializationMethodNotCompatibleException("class '" + targetType.getName() + "'" +
7470
" does not have a zero argument String method" +
7571
" named '" + this.methodName.internalValueForMapping() + "'", e);
7672
}
7773
}
78-
79-
@Override
80-
public String serialize(final Object object) {
81-
final Class<?> type = object.getClass();
82-
final MethodHandle methodHandle = findPublicStringMethodByName(type, this.methodName.internalValueForMapping());
83-
try {
84-
return (String) methodHandle.invoke(object);
85-
} catch (final WrongMethodTypeException | ClassCastException e) {
86-
throw CustomPrimitiveSerializationMethodCallException.fromThrowable(
87-
"this should never happen, contact the developers.",
88-
e,
89-
type,
90-
methodHandle,
91-
object);
92-
} catch (final Throwable throwable) {
93-
throw CustomPrimitiveSerializationMethodCallException.fromThrowable(
94-
"exception invoking serialization method",
95-
throwable,
96-
type,
97-
methodHandle,
98-
object);
99-
}
100-
}
10174
}

0 commit comments

Comments
 (0)