
com.github.jasonruckman.sidney.ext.guava.MultimapSerializer Maven / Gradle / Ivy
/**
* Copyright 2014 Jason Ruckman
*
* Licensed 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.github.jasonruckman.sidney.ext.guava;
import com.github.jasonruckman.sidney.core.BaseSid;
import com.github.jasonruckman.sidney.core.TypeRef;
import com.github.jasonruckman.sidney.core.serde.InstanceFactory;
import com.github.jasonruckman.sidney.core.serde.InstanceFactoryCache;
import com.github.jasonruckman.sidney.core.serde.ReadContext;
import com.github.jasonruckman.sidney.core.serde.WriteContext;
import com.github.jasonruckman.sidney.core.serde.serializer.Serializer;
import com.github.jasonruckman.sidney.core.serde.serializer.SerializerContext;
import com.google.common.collect.*;
import java.util.Collection;
import java.util.Map;
public class MultimapSerializer extends Serializer> {
private Serializer keySerializer;
private Serializer valueSerializer;
private InstanceFactoryCache cache;
public static void registerMaps(BaseSid sid) {
sid.addSerializer(Multimap.class, MultimapSerializer.class);
sid.addInstanceFactory(ArrayListMultimap.class, new InstanceFactory() {
@Override
public ArrayListMultimap newInstance() {
return ArrayListMultimap.create();
}
});
sid.addInstanceFactory(LinkedListMultimap.class, new InstanceFactory() {
@Override
public LinkedListMultimap newInstance() {
return LinkedListMultimap.create();
}
});
sid.addInstanceFactory(LinkedHashMultimap.class, new InstanceFactory() {
@Override
public LinkedHashMultimap newInstance() {
return LinkedHashMultimap.create();
}
});
sid.addInstanceFactory(TreeMultimap.class, new InstanceFactory() {
@Override
public TreeMultimap newInstance() {
return TreeMultimap.create();
}
});
sid.addInstanceFactory(HashMultimap.class, new InstanceFactory() {
@Override
public HashMultimap newInstance() {
return HashMultimap.create();
}
});
}
@Override
public void consume(TypeRef typeRef, SerializerContext context) {
keySerializer = context.serializer(typeRef.param(0));
valueSerializer = context.serializer(typeRef.param(1));
cache = new InstanceFactoryCache(getFactories());
}
@Override
public void writeValue(Multimap value, WriteContext context) {
Map> map = value.asMap();
context.getMeta().writeConcreteType(value.getClass());
context.getMeta().writeRepetitionCount(map.size());
for (Map.Entry> entry : map.entrySet()) {
keySerializer.writeValue(entry.getKey(), context);
//can't use the defaults here, because its an inner class
context.getMeta().writeRepetitionCount(entry.getValue().size());
for (V v : entry.getValue()) {
valueSerializer.writeValue(v, context);
}
}
}
@Override
public Multimap readValue(ReadContext context) {
Multimap multimap = (Multimap) cache.newInstance(context.getMeta().readConcreteType());
int num = context.getMeta().readRepetitionCount();
for (int i = 0; i < num; i++) {
K key = keySerializer.readValue(context);
int size = context.getMeta().readRepetitionCount();
for (int j = 0; j < size; j++) {
multimap.put(key, valueSerializer.readValue(context));
}
}
return multimap;
}
@Override
public boolean requiresTypeColumn() {
return true;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy