package com.ctriposs.baiji; import com.ctriposs.baiji.specific.SpecificJsonReader; import com.ctriposs.baiji.specific.SpecificJsonWriter; import com.ctriposs.baiji.specific.SpecificRecord; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class JsonSerializer implements Serializer { private static final ConcurrentMap<Class<?>, SpecificJsonReader> _readerCache = new ConcurrentHashMap<>(); private static final ConcurrentMap<Class<?>, SpecificJsonWriter> _writerCache = new ConcurrentHashMap<>(); @Override public <T extends SpecificRecord> void serialize(T obj, OutputStream stream) throws IOException { SpecificJsonWriter<T> writer = getWriter(obj); writer.write(obj.getSchema(), obj, stream); } @Override public <T extends SpecificRecord> T deserialize(Class<T> objClass, InputStream stream) throws IOException { SpecificJsonReader<T> reader = (SpecificJsonReader) getReader(objClass); return reader.read(null, stream); } private static <T extends SpecificRecord> SpecificJsonWriter<T> getWriter(T obj) { Class clazz = obj.getClass(); SpecificJsonWriter<T> writer = _writerCache.get(clazz); if (writer == null) { writer = new SpecificJsonWriter<>(); SpecificJsonWriter<T> existedWriter = _writerCache.putIfAbsent(clazz, writer); if (existedWriter != null) { writer = existedWriter; } } return writer; } private static <T extends SpecificRecord> SpecificJsonReader<T> getReader(Class<T> clazz) { SpecificJsonReader<T> datumReader = _readerCache.get(clazz); if (datumReader == null) { SpecificRecord record; try { record = clazz.newInstance(); } catch (Exception e) { throw new RuntimeException(e); } datumReader = new SpecificJsonReader<T>(record.getSchema()); SpecificJsonReader<T> existedReader = _readerCache.putIfAbsent(clazz, datumReader); if (existedReader != null) { datumReader = existedReader; } } return datumReader; } /* public void clearCache() { _readerCache.clear(); _writerCache.clear(); }*/ }