package openmods.serializable.cls;
import com.google.common.collect.Lists;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import openmods.serializable.IObjectSerializer;
import openmods.utils.CachedFactory;
import openmods.utils.FieldsSelector;
public class ClassSerializersProvider {
public static final ClassSerializersProvider instance = new ClassSerializersProvider();
private final CachedFactory<Class<?>, IObjectSerializer<?>> cache = new CachedFactory<Class<?>, IObjectSerializer<?>>() {
@Override
protected IObjectSerializer<?> create(Class<?> key) {
ClassSerializerBuilder<Object> builder = new ClassSerializerBuilder<Object>(key);
for (Field f : SELECTOR.getFields(key))
builder.appendField(f);
return builder.create();
}
};
private final FieldsSelector SELECTOR = new FieldsSelector() {
@Override
protected List<FieldEntry> listFields(Class<?> cls) {
List<FieldEntry> result = Lists.newArrayList();
for (Field f : cls.getFields()) {
Serialize ann = f.getAnnotation(Serialize.class);
if (ann != null) result.add(new FieldEntry(f, ann.rank()));
}
return result;
}
};
@SuppressWarnings("unchecked")
public <T> IObjectSerializer<T> getSerializer(Class<? extends T> cls) {
return (IObjectSerializer<T>)cache.getOrCreate(cls);
}
@SuppressWarnings("unchecked")
public <T> IObjectSerializer<T> getSerializer(T object) {
return getSerializer((Class<? extends T>)object.getClass());
}
public void readFromStream(Object object, DataInput input) throws IOException {
getSerializer(object).readFromStream(object, input);
}
public void writeToStream(Object object, DataOutput output) throws IOException {
getSerializer(object).writeToStream(object, output);
}
}