/*
* 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.hadoop.variant.converters.annotation;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hbase.client.Result;
import org.opencb.biodata.models.variant.avro.VariantAnnotation;
import org.opencb.biodata.tools.variant.converters.Converter;
import org.opencb.opencga.storage.core.variant.adaptors.VariantField;
import org.opencb.opencga.storage.core.variant.io.json.mixin.VariantAnnotationMixin;
import org.opencb.opencga.storage.hadoop.variant.GenomeHelper;
import org.opencb.opencga.storage.hadoop.variant.index.phoenix.VariantPhoenixHelper;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* Created on 03/12/15.
*
* @author Jacobo Coll <jacobo167@gmail.com>
*/
public class HBaseToVariantAnnotationConverter implements Converter<Result, VariantAnnotation> {
private final ObjectMapper objectMapper;
private final byte[] columnFamily;
public HBaseToVariantAnnotationConverter(GenomeHelper genomeHelper) {
columnFamily = genomeHelper.getColumnFamily();
objectMapper = new ObjectMapper();
objectMapper.addMixIn(VariantAnnotation.class, VariantAnnotationMixin.class);
}
public HBaseToVariantAnnotationConverter setReturnedFields(Set<VariantField> allReturnedFields) {
List<String> list = new ArrayList<>();
if (allReturnedFields != null) {
for (VariantField annotationField : VariantField.values()) {
if (annotationField.getParent() == VariantField.ANNOTATION && !allReturnedFields.contains(annotationField)) {
list.add(annotationField.fieldName().replace(VariantField.ANNOTATION.fieldName() + '.', ""));
}
}
}
String[] returnedAnnotationFields = list.toArray(new String[list.size()]);
objectMapper.setAnnotationIntrospector(
new JacksonAnnotationIntrospector() {
@Override
public String[] findPropertiesToIgnore(Annotated ac, boolean forSerialization) {
String[] propertiesToIgnore = super.findPropertiesToIgnore(ac, forSerialization);
if (ArrayUtils.isNotEmpty(propertiesToIgnore)) {
List<String> list = new ArrayList<>();
Collections.addAll(list, returnedAnnotationFields);
Collections.addAll(list, propertiesToIgnore);
return list.toArray(new String[list.size()]);
} else {
return returnedAnnotationFields;
}
}
});
return this;
}
@Override
public VariantAnnotation convert(Result result) {
byte[] value = result.getValue(columnFamily, VariantPhoenixHelper.VariantColumn.FULL_ANNOTATION.bytes());
if (ArrayUtils.isNotEmpty(value)) {
try {
return objectMapper.readValue(value, VariantAnnotation.class);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
return null;
}
public VariantAnnotation convert(ResultSet resultSet) {
int column;
try {
column = resultSet.findColumn(VariantPhoenixHelper.VariantColumn.FULL_ANNOTATION.column());
} catch (SQLException e) {
//Column not found
return null;
}
try {
String value = resultSet.getString(column);
if (StringUtils.isNotEmpty(value)) {
try {
return objectMapper.readValue(value, VariantAnnotation.class);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
} catch (SQLException e) {
// This should never happen!
throw new IllegalStateException(e);
}
return null;
}
}