/*
* #%L
* gitools-core
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.matrix.format;
import com.google.common.base.Strings;
import org.gitools.api.PersistenceException;
import org.gitools.api.analysis.IProgressMonitor;
import org.gitools.api.resource.IResourceLocator;
import org.gitools.matrix.model.matrix.AnnotationMatrix;
import org.gitools.resource.AbstractResourceFormat;
import org.gitools.utils.readers.text.CSVParser;
import org.gitools.utils.readers.text.CSVReader;
import org.gitools.utils.readers.text.RawFlatTextWriter;
import javax.enterprise.context.ApplicationScoped;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
@ApplicationScoped
public class AnnotationMatrixFormat extends AbstractResourceFormat<AnnotationMatrix> {
private static AnnotationMatrixFormat INSTANCE = new AnnotationMatrixFormat();
public static AnnotationMatrixFormat get() {
return INSTANCE;
}
public static final String EXTENSION = "tsv";
public AnnotationMatrixFormat() {
super(EXTENSION, AnnotationMatrix.class);
}
@Override
public boolean isDefaultExtension() {
return true;
}
@Override
protected AnnotationMatrix readResource(IResourceLocator resourceLocator, IProgressMonitor progressMonitor) throws PersistenceException {
AnnotationMatrix matrix = new AnnotationMatrix();
try {
InputStream in = resourceLocator.openInputStream(progressMonitor);
// A reader that don't skip the comments.
CSVReader parser = new CSVReader(
new InputStreamReader(in),
CSVParser.DEFAULT_SEPARATOR,
CSVParser.DEFAULT_QUOTE_CHARACTER,
CSVParser.DEFAULT_ESCAPE_CHARACTER,
'\n',
0,
CSVParser.DEFAULT_STRICT_QUOTES,
CSVParser.DEFAULT_IGNORE_LEADING_WHITESPACE
);
// Header
String[] headers = parser.readNext();
while (headers[0].length() > 0 && headers[0].charAt(0) == '#') {
headers = parser.readNext();
}
// Annotations
String[] fields;
while ((fields = parser.readNext()) != null) {
if (Strings.isNullOrEmpty(fields[0])) {
continue;
}
// Annotation metadata
if (fields[0].charAt(0) == '#') {
for (int i = 1; (i < headers.length) && (i < fields.length); i++) {
String key = fields[0].substring(1).trim();
matrix.setAnnotationMetadata(key, headers[i], fields[i]);
}
} else {
for (int i = 1; (i < headers.length) && (i < fields.length); i++) {
matrix.setAnnotation(fields[0], headers[i], fields[i]);
}
}
}
in.close();
} catch (Exception e) {
throw new PersistenceException(e);
}
matrix.init();
return matrix;
}
@Override
protected void writeResource(IResourceLocator resourceLocator, AnnotationMatrix resource, IProgressMonitor progressMonitor) throws PersistenceException {
try {
OutputStream out = resourceLocator.openOutputStream(progressMonitor);
RawFlatTextWriter writer = new RawFlatTextWriter(new OutputStreamWriter(out), '\t', '"');
// Header
List<String> labels = new ArrayList<>();
for (String label : resource.getLabels()) {
labels.add(label);
}
writer.writePropertyList("identifier", labels);
// Annotation metadata
String[] annotations = new String[labels.size()];
for (String key : resource.getMetadataKeys()) {
for (int i = 0; i < labels.size(); i++) {
annotations[i] = resource.getAnnotationMetadata(key, labels.get(i));
}
writer.writePropertyList('#' + key, annotations);
}
// Annotations
for (String identifier : resource.getIdentifiers()) {
for (int i = 0; i < labels.size(); i++) {
annotations[i] = resource.getAnnotation(identifier, labels.get(i));
}
writer.writePropertyList(identifier, annotations);
}
writer.close();
} catch (Exception e) {
throw new PersistenceException(e);
}
}
}