Skip to content
Open
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 @@ -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<CustomPrimitiveDefinitionFactory> customPrimitiveDefinitionFactories = List.of(
nameBasedCustomPrimitiveDefinitionFactory(
customPrimitiveSerializationMethodName,
customPrimitiveDeserializationMethodName)
customPrimitiveSerializationMethodNamePattern,
customPrimitiveDeserializationMethodNamePattern)
);

final List<Pattern> patterns = Arrays.stream(serializedObjectNameDetectionPatterns)
.map(Pattern::compile)
.collect(Collectors.toList());
final List<SerializedObjectDefinitionFactory> serializedObjectDefinitionFactories = List.of(
deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodName),
deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodNamePattern),
nameBasedSerializedObjectFactory(
patterns,
serializedObjectDeserializationMethodName));
serializedObjectDeserializationMethodNamePattern));
return conventionalDetector(customPrimitiveDefinitionFactories, serializedObjectDefinitionFactories);
}

Expand All @@ -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<CustomPrimitiveDefinitionFactory> customPrimitiveDefinitionFactories = List.of(
customPrimitiveClassAnnotationFactory(),
customPrimitiveMethodAnnotationFactory(),
nameBasedCustomPrimitiveDefinitionFactory(
customPrimitiveSerializationMethodName,
customPrimitiveDeserializationMethodName)
customPrimitiveSerializationMethodNamePattern,
customPrimitiveDeserializationMethodNamePattern)
);

final List<Pattern> patterns = Arrays.stream(serializedObjectNameDetectionPatterns)
Expand All @@ -140,8 +140,8 @@ public static ConventionalDetector conventionalDetectorWithAnnotations(
serializedObjectClassAnnotationFactory(),
nameBasedSerializedObjectFactory(
patterns,
serializedObjectDeserializationMethodName),
deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodName)
serializedObjectDeserializationMethodNamePattern),
deserializerMethodNameBasedSerializedObjectFactory(serializedObjectDeserializationMethodNamePattern)
);
return conventionalDetector(customPrimitiveDefinitionFactories, serializedObjectDefinitionFactories);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -43,18 +45,20 @@
@EqualsAndHashCode
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public final class DeserializerMethodNameBasedSerializedObjectFactory implements SerializedObjectDefinitionFactory {
private final String deserializationMethodName;
private final Predicate<String> methodNameMatchPredicate;

public static DeserializerMethodNameBasedSerializedObjectFactory deserializerMethodNameBasedSerializedObjectFactory(
final String deserializationMethodName) {
return new DeserializerMethodNameBasedSerializedObjectFactory(deserializationMethodName);
final Pattern pattern = Pattern.compile(deserializationMethodName);
final Predicate<String> matchPredicate = pattern.asMatchPredicate();
return new DeserializerMethodNameBasedSerializedObjectFactory(matchPredicate);
}

@Override
public Optional<SerializedObjectDefinition> analyze(final Class<?> type) {
final Method[] methods = type.getMethods();
final List<Method> 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))
Expand Down
Original file line number Diff line number Diff line change
@@ -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<CustomPrimitiveDefinition> customPrimitives(final List<Class<?>> classes) {
return List.of(CustomPrimitiveDefinition.customPrimitiveDefinition(
Val.class,
o -> o.stringValue(),
s -> aVal(s))
);
}

@Override
public List<SerializedObjectDefinition> serializedObjects(final List<Class<?>> 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;
}
}
}
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<parent>
<groupId>com.envimate</groupId>
<artifactId>envimate-opensource-parent</artifactId>
<version>1.0.22</version>
<version>1.0.23</version>
</parent>
<packaging>pom</packaging>
<groupId>com.envimate.mapmate</groupId>
Expand Down