/**
* Copyright (c) 2016, All Contributors (see CONTRIBUTORS file)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.eventsourcing.layout;
import java.util.HashMap;
public abstract class Serialization {
protected HashMap<TypeHandler, Serializer<?, ? extends TypeHandler>> serializers = new HashMap<>();
protected HashMap<TypeHandler, Deserializer<?, ? extends TypeHandler>> deserializers = new HashMap<>();
@SuppressWarnings("unchecked")
public <T, H extends TypeHandler> Serializer<T, H> getSerializer(H typeHandler) {
Serializer<T, H> s = (Serializer<T, H>) serializers.get(typeHandler);
if (s == null) {
throw new RuntimeException("No " + getClass().getName() + " serializer for " + typeHandler.getClass() + " has " +
"been found");
}
return s;
}
@SuppressWarnings("unchecked")
public <T, H extends TypeHandler> Deserializer<T, H> getDeserializer(H typeHandler) {
Deserializer<T, H> ds = (Deserializer<T, H>) deserializers.get(typeHandler);
if (ds == null) {
throw new RuntimeException("No " + getClass().getName() + " deserializer for " + typeHandler.getClass() + " has " +
"been found");
}
return ds;
}
public <H extends TypeHandler> void addSerializer(H typeHandler, Serializer<?, H> serializer) {
serializers.put(typeHandler, serializer);
if (!serializers.containsKey(typeHandler)) {
throw new RuntimeException("Can't store type handler " + typeHandler);
}
}
public <H extends TypeHandler> void addDeserializer(H typeHandler, Deserializer<?, H> deserializer) {
deserializers.put(typeHandler, deserializer);
if(!deserializers.containsKey(typeHandler)) {
throw new RuntimeException("Can't store type handler " + typeHandler);
}
}
public abstract <T> ObjectSerializer<T> getSerializer(Class<?> klass);
public <T> ObjectDeserializer<T> getDeserializer(Class<?> klass) {
return getDeserializer(klass, false);
}
public abstract <T> ObjectDeserializer<T> getDeserializer(Class<?> klass, boolean allowReadonly);
}