package org.opencb.opencga.storage.core.io.json; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import org.opencb.commons.io.DataReader; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.util.ArrayList; import java.util.List; /** * Created on 02/12/16. * * Generic Json writer from an input stream. * * TODO: Move to Java Common Libs * @author Jacobo Coll <jacobo167@gmail.com> */ public class JsonDataReader<T> implements DataReader<T> { private final JsonFactory jsonFactory; private final ObjectMapper objectMapper; private final Class<T> clazz; private final InputStream inputStream; private JsonParser parser; private long numReads; public JsonDataReader(Class<T> clazz, InputStream inputStream) { this.clazz = clazz; this.inputStream = inputStream; jsonFactory = new JsonFactory(); objectMapper = new ObjectMapper(jsonFactory); } @Override public boolean open() { numReads = 0; try { parser = jsonFactory.createParser(inputStream); } catch (IOException e) { throw new UncheckedIOException(e); } return true; } @Override public List<T> read(int batchSize) { List<T> batch = new ArrayList<>(batchSize); try { while (parser.nextToken() != null && batch.size() < batchSize) { numReads++; batch.add(parser.readValueAs(clazz)); } } catch (IOException e) { throw new UncheckedIOException(e); } return batch; } @Override public boolean close() { try { parser.close(); } catch (IOException e) { throw new UncheckedIOException(e); } return true; } public void addMixIn(Class<?> target, Class<?> mixinSource) { objectMapper.addMixIn(target, mixinSource); } public ObjectMapper getObjectMapper() { return objectMapper; } public long getNumReads() { return numReads; } }