/*
* Copyright 2015-2016 OpenCB
*
* 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 org.opencb.opencga.storage.core.alignment.json;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.opencb.biodata.formats.alignment.io.AlignmentDataReader;
import org.opencb.biodata.models.alignment.Alignment;
import org.opencb.biodata.models.alignment.AlignmentHeader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.GZIPInputStream;
/**
* Date: 18/06/14.
*
* @author Jacobo Coll Moragon <jcoll@ebi.ac.uk>
* <p>
* AlignmentsFileName : <name>.alignments.json.gz
* HeaderFileName : <name>.header.json.gz
*/
public class AlignmentJsonDataReader implements AlignmentDataReader {
private final String alignmentFilename;
private final String headerFilename;
private final boolean gzip;
private final JsonFactory factory;
private final ObjectMapper jsonObjectMapper;
private JsonParser alignmentsParser;
private JsonParser headerParser;
private InputStream alignmentsStream;
private InputStream headerStream;
private AlignmentHeader alignmentHeader;
public AlignmentJsonDataReader(String baseFilename, boolean gzip) {
this(baseFilename + (gzip ? ".alignments.json.gz" : ".alignments.json"), baseFilename
+ (gzip ? ".header.json.gz" : ".header" + ".json"));
}
public AlignmentJsonDataReader(String alignmentFilename, String headerFilename) {
this.alignmentFilename = alignmentFilename;
this.headerFilename = headerFilename;
this.gzip = alignmentFilename.endsWith(".gz");
this.factory = new JsonFactory();
this.jsonObjectMapper = new ObjectMapper(this.factory);
}
@Override
public AlignmentHeader getHeader() {
return alignmentHeader;
}
@Override
public boolean open() {
try {
alignmentsStream = new FileInputStream(alignmentFilename);
headerStream = new FileInputStream(headerFilename);
if (gzip) {
alignmentsStream = new GZIPInputStream(alignmentsStream);
headerStream = new GZIPInputStream(headerStream);
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
return false;
}
return true;
}
@Override
public boolean pre() {
jsonObjectMapper.addMixInAnnotations(Alignment.AlignmentDifference.class, AlignmentDifferenceJsonMixin.class);
//jsonObjectMapper.addMixInAnnotations(Alignment.class, AlignmentJsonMixin.class); //Not needed
try {
alignmentsParser = factory.createParser(alignmentsStream);
headerParser = factory.createParser(headerStream);
alignmentHeader = headerParser.readValueAs(AlignmentHeader.class);
} catch (IOException e) {
e.printStackTrace();
close();
return false;
}
return true;
}
@Override
public List<Alignment> read() {
Alignment elem = readElem();
return elem != null ? Arrays.asList(elem) : null;
}
public Alignment readElem() {
try {
if (alignmentsParser.nextToken() != null) {
Alignment alignment = alignmentsParser.readValueAs(Alignment.class);
return alignment;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public List<Alignment> read(int batchSize) {
//List<Alignment> listRecords = new ArrayList<>(batchSize);
List<Alignment> listRecords = new LinkedList<>();
Alignment elem;
for (int i = 0; i < batchSize; i++) {
elem = readElem();
if (elem == null) {
break;
}
listRecords.add(elem);
}
return listRecords;
}
@Override
public boolean post() {
return true;
}
@Override
public boolean close() {
try {
alignmentsParser.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return true;
}
}