diff --git a/core/src/main/java/com/envimate/mapmate/builder/conventional/ConventionalDetector.java b/core/src/main/java/com/envimate/mapmate/builder/conventional/ConventionalDetector.java index 71ec137..d5b6904 100644 --- a/core/src/main/java/com/envimate/mapmate/builder/conventional/ConventionalDetector.java +++ b/core/src/main/java/com/envimate/mapmate/builder/conventional/ConventionalDetector.java @@ -66,30 +66,30 @@ public static ConventionalDetector conventionalDetector() { ); } - public static ConventionalDetector conventionalDetector(final String customPrimitiveSerializationMethodName, - final String customPrimitiveDeserializationMethodName, - final String serializedObjectDeserializationMethodName, + public static ConventionalDetector conventionalDetector(final String customPrimitiveSerializationMethodNamePattern, + final String customPrimitiveDeserializationMethodNamePattern, + final String serializedObjectDeserializationMethodNamePattern, final String... serializedObjectNameDetectionPatterns ) { - validateNotNull(customPrimitiveSerializationMethodName, "customPrimitiveSerializationMethodName"); - validateNotNull(customPrimitiveDeserializationMethodName, "customPrimitiveDeserializationMethodName"); - validateNotNull(serializedObjectDeserializationMethodName, "serializedObjectDeserializationMethodName"); + validateNotNull(customPrimitiveSerializationMethodNamePattern, "customPrimitiveSerializationMethodNamePattern"); + validateNotNull(customPrimitiveDeserializationMethodNamePattern, "customPrimitiveDeserializationMethodNamePattern"); + validateNotNull(serializedObjectDeserializationMethodNamePattern, "serializedObjectDeserializationMethodNamePattern"); validateNotNull(serializedObjectNameDetectionPatterns, "serializedObjectNameDetectionPatterns"); final List customPrimitiveDefinitionFactories = List.of( nameBasedCustomPrimitiveDefinitionFactory( - customPrimitiveSerializationMethodName, - customPrimitiveDeserializationMethodName) + customPrimitiveSerializationMethodNamePattern, + customPrimitiveDeserializationMethodNamePattern) ); final List patterns = Arrays.stream(serializedObjectNameDetectionPatterns) .map(Pattern::compile) .collect(Collectors.toList()); final List serializedObjectDefinitionFactories = List.of( - deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodName), + deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodNamePattern), nameBasedSerializedObjectFactory( patterns, - serializedObjectDeserializationMethodName)); + serializedObjectDeserializationMethodNamePattern)); return conventionalDetector(customPrimitiveDefinitionFactories, serializedObjectDefinitionFactories); } @@ -115,22 +115,22 @@ public static ConventionalDetector conventionalDetectorWithAnnotations() { } public static ConventionalDetector conventionalDetectorWithAnnotations( - final String customPrimitiveSerializationMethodName, - final String customPrimitiveDeserializationMethodName, - final String serializedObjectDeserializationMethodName, + final String customPrimitiveSerializationMethodNamePattern, + final String customPrimitiveDeserializationMethodNamePattern, + final String serializedObjectDeserializationMethodNamePattern, final String... serializedObjectNameDetectionPatterns ) { - validateNotNull(customPrimitiveSerializationMethodName, "customPrimitiveSerializationMethodName"); - validateNotNull(customPrimitiveDeserializationMethodName, "customPrimitiveDeserializationMethodName"); - validateNotNull(serializedObjectDeserializationMethodName, "serializedObjectDeserializationMethodName"); + validateNotNull(customPrimitiveSerializationMethodNamePattern, "customPrimitiveSerializationMethodNamePattern"); + validateNotNull(customPrimitiveDeserializationMethodNamePattern, "customPrimitiveDeserializationMethodNamePattern"); + validateNotNull(serializedObjectDeserializationMethodNamePattern, "serializedObjectDeserializationMethodNamePattern"); validateNotNull(serializedObjectNameDetectionPatterns, "serializedObjectNameDetectionPatterns"); final List customPrimitiveDefinitionFactories = List.of( customPrimitiveClassAnnotationFactory(), customPrimitiveMethodAnnotationFactory(), nameBasedCustomPrimitiveDefinitionFactory( - customPrimitiveSerializationMethodName, - customPrimitiveDeserializationMethodName) + customPrimitiveSerializationMethodNamePattern, + customPrimitiveDeserializationMethodNamePattern) ); final List patterns = Arrays.stream(serializedObjectNameDetectionPatterns) @@ -140,8 +140,8 @@ public static ConventionalDetector conventionalDetectorWithAnnotations( serializedObjectClassAnnotationFactory(), nameBasedSerializedObjectFactory( patterns, - serializedObjectDeserializationMethodName), - deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodName) + serializedObjectDeserializationMethodNamePattern), + deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodNamePattern) ); return conventionalDetector(customPrimitiveDefinitionFactories, serializedObjectDefinitionFactories); } diff --git a/core/src/main/java/com/envimate/mapmate/builder/conventional/serializedobject/namebased/DeserializerMethodNameBasedSerializedObjectFactory.java b/core/src/main/java/com/envimate/mapmate/builder/conventional/serializedobject/namebased/DeserializerMethodNameBasedSerializedObjectFactory.java index dc0210d..0e5e009 100644 --- a/core/src/main/java/com/envimate/mapmate/builder/conventional/serializedobject/namebased/DeserializerMethodNameBasedSerializedObjectFactory.java +++ b/core/src/main/java/com/envimate/mapmate/builder/conventional/serializedobject/namebased/DeserializerMethodNameBasedSerializedObjectFactory.java @@ -33,6 +33,8 @@ import java.lang.reflect.Method; import java.util.List; import java.util.Optional; +import java.util.function.Predicate; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.envimate.mapmate.builder.definitions.SerializedObjectDefinition.serializedObjectDefinition; @@ -43,18 +45,20 @@ @EqualsAndHashCode @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public final class DeserializerMethodNameBasedSerializedObjectFactory implements SerializedObjectDefinitionFactory { - private final String deserializationMethodName; + private final Predicate methodNameMatchPredicate; public static DeserializerMethodNameBasedSerializedObjectFactory deserializerMethodNameBasedSerializedObjectFactory( final String deserializationMethodName) { - return new DeserializerMethodNameBasedSerializedObjectFactory(deserializationMethodName); + final Pattern pattern = Pattern.compile(deserializationMethodName); + final Predicate matchPredicate = pattern.asMatchPredicate(); + return new DeserializerMethodNameBasedSerializedObjectFactory(matchPredicate); } @Override public Optional analyze(final Class type) { final Method[] methods = type.getMethods(); final List deserializerMethods = stream(methods) - .filter(method -> method.getName().equals(this.deserializationMethodName)) + .filter(method -> methodNameMatchPredicate.test(method.getName())) .filter(method -> isStatic(method.getModifiers())) .filter(method -> isPublic(method.getModifiers())) .filter(method -> method.getReturnType().equals(type)) diff --git a/core/src/test/java/com/envimate/mapmate/deserialization/specs/detection/SerializedObjectDetectionSpecs.java b/core/src/test/java/com/envimate/mapmate/deserialization/specs/detection/SerializedObjectDetectionSpecs.java new file mode 100644 index 0000000..efeb783 --- /dev/null +++ b/core/src/test/java/com/envimate/mapmate/deserialization/specs/detection/SerializedObjectDetectionSpecs.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2019 envimate GmbH - https://envimate.com/. + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package com.envimate.mapmate.deserialization.specs.detection; + +import com.envimate.mapmate.builder.Detector; +import com.envimate.mapmate.builder.MapMate; +import com.envimate.mapmate.builder.definitions.CustomPrimitiveDefinition; +import com.envimate.mapmate.builder.definitions.SerializedObjectDefinition; +import com.google.gson.Gson; +import lombok.Data; +import org.junit.Test; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static com.envimate.mapmate.builder.MapMate.aMapMate; +import static com.envimate.mapmate.builder.conventional.serializedobject.namebased.DeserializerMethodNameBasedSerializedObjectFactory.deserializerMethodNameBasedSerializedObjectFactory; +import static com.envimate.mapmate.deserialization.specs.detection.SerializedObjectDetectionSpecs.Val.aVal; +import static com.envimate.mapmate.deserialization.specs.detection.SerializedObjectDetectionSpecs.ValState.aState; +import static org.junit.Assert.assertEquals; + +public class SerializedObjectDetectionSpecs { + @Test + public void detectsSerializedObjectUsingFactoryMethodNamePattern() { + final MapMate mapmate = aMapMate(ValState.class.getPackageName()) + .usingJsonMarshaller(ignored -> null, new Gson()::fromJson) + .withDetector(new Detector() { + @Override + public List customPrimitives(final List> classes) { + return List.of(CustomPrimitiveDefinition.customPrimitiveDefinition( + Val.class, + o -> o.stringValue(), + s -> aVal(s)) + ); + } + + @Override + public List serializedObjects(final List> classes) { + final var analyzer = deserializerMethodNameBasedSerializedObjectFactory("^an?\\p{Upper}.*$"); + return classes.stream() + .map(analyzer::analyze) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } + }) + .build(); + + final ValState expected = aState(aVal("s")); + final ValState actual = mapmate.deserializeJson("{\"val\":\"s\"}", ValState.class); + assertEquals(expected, actual); + } + + @Data + public static class ValState { + private final Val val; + + public static ValState aState(final Val val) { + return new ValState(val); + } + } + + @Data + public static class Val { + private final String value; + + public static Val aVal(final String s) { + return new Val(s); + } + + public String stringValue() { + return value; + } + } +} diff --git a/pom.xml b/pom.xml index 36799d1..4f9b7e2 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.envimate envimate-opensource-parent - 1.0.22 + 1.0.23 pom com.envimate.mapmate