package de.galan.verjson.core; import java.util.Collection; import java.util.Map; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonSerializer; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.HashMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; import com.google.common.collect.SetMultimap; import de.galan.commons.util.Pair; import de.galan.verjson.step.Step; /** * Acts as a container for all Steps (transformations and schema validations), does define the optional namespace. * Additional type de/serializers can be registered here. * * @author daniel */ public class Versions { private ListMultimap<Long, Step> steps; private String namespace; private Map<Class<?>, JsonSerializer<?>> serializers; private Map<Class<?>, JsonDeserializer<?>> deserializers; private SetMultimap<Class<?>, Pair<Class<?>, String>> polys; private boolean includeTimestamp; public Versions() { this(null); } public Versions(String namespace) { setNamespace(namespace); steps = ArrayListMultimap.create(); serializers = Maps.newHashMap(); deserializers = Maps.newHashMap(); polys = HashMultimap.create(); includeTimestamp = true; } public void setNamespace(String namespace) { this.namespace = namespace; } public String getNamespace() { return namespace; } public void configure() { // can be overriden } public ListMultimap<Long, Step> getSteps() { return steps; } public Versions add(Long sourceVersion, Step step) { if (step != null) { getSteps().put(sourceVersion, step); } return this; } public <T> void registerSubclass(Class<T> parentClass, Class<? extends T> childClass, String typeName) { getRegisteredSubclasses().put(parentClass, new Pair<Class<?>, String>(childClass, typeName)); } public SetMultimap<Class<?>, Pair<Class<?>, String>> getRegisteredSubclasses() { return polys; } public <T> Versions registerSerializer(JsonSerializer<T> serializer) { if (serializer != null) { serializers.put(serializer.getClass(), serializer); } return this; } public <T> Versions registerDeserializer(JsonDeserializer<T> deserializer) { if (deserializer != null) { deserializers.put(deserializer.getClass(), deserializer); } return this; } public Collection<JsonSerializer<?>> getSerializer() { return serializers.values(); } public Collection<JsonDeserializer<?>> getDeserializer() { return deserializers.values(); } public boolean isIncludeTimestamp() { return includeTimestamp; } /** A timestamp is added to the meta-data, this can be avoided by setting this property to false */ public void setIncludeTimestamp(boolean includeTimestamp) { this.includeTimestamp = includeTimestamp; } }