//package org.genedb.web.mvc.model;
//
//import org.genedb.web.gui.ImageMapSummary;
//import org.genedb.web.mvc.model.types.DBXRefType;
//import org.genedb.web.mvc.model.types.DtoObjectArrayField;
//import org.genedb.web.mvc.model.types.DtoStringArrayField;
//import org.genedb.web.mvc.model.types.FeatureCVTPropType;
//import org.genedb.web.mvc.model.types.PeptidePropertiesType;
//
//import org.gmod.schema.utils.PeptideProperties;
//
//import org.apache.commons.io.IOUtils;
//import org.apache.log4j.Logger;
//import org.springframework.dao.EmptyResultDataAccessException;
//import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
//import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
//import java.io.ObjectInputStream;
//import java.io.ObjectOutputStream;
//import java.lang.reflect.Constructor;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.Collection;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//
//
//import com.google.common.collect.Maps;
//
//@Transactional
//public class DtoDb {
//
// Logger logger = Logger.getLogger(DtoDb.class);
//
// private SimpleJdbcTemplate template;
//
//
//
// public int persistDTO(TranscriptDTO dto) throws Exception{
// logger.debug("persistDTO...");
// //Integer index = findDTO(dto.getFeatureId());
// Integer index = findDTO(dto.getTranscriptId());
// if (index != null) {
// return 0;
// }
//
// Map<String, Object> args = Maps.newHashMap();
// args.put("transcript_id", dto.getTranscriptId());
// args.put("alternative_transcript", dto.isAnAlternateTranscript());
// args.put("gene_name", dto.getGeneName());
// if (dto.getLastModified()>0){
// args.put("last_modified_date", new Date(dto.getLastModified()));
// }else{
// args.put("last_modified_date", null);
// }
// args.put("max", dto.getMax());
// args.put("min", dto.getMin());
// args.put("organism_common_name", dto.getOrganismCommonName());
// args.put("organism_html_short_name", dto.getOrganismHtmlShortName());
// args.put("proper_name", dto.getProperName());
// args.put("protein_coding", dto.isProteinCoding());
// args.put("pseudo", dto.isPseudo());
// args.put("strand", dto.getStrand());
// args.put("top_level_feature_displayname", dto.getTopLevelFeatureDisplayName());
// args.put("top_level_feature_length", dto.getTopLevelFeatureLength());
// args.put("top_level_feature_type", dto.getTopLevelFeatureType());
// args.put("top_level_feature_uniquename", dto.getTopLevelFeatureUniqueName());
// args.put("type_description", dto.getTypeDescription());
// args.put("uniquename", dto.getUniqueName());
//
// args.put("cluster_ids", new DtoStringArrayField(dto.getClusterIds()));
// args.put("comments", new DtoStringArrayField(dto.getComments()));
// args.put("notes", new DtoStringArrayField(dto.getNotes()));
// args.put("obsolete_names", new DtoStringArrayField(dto.getObsoleteNames()));
// args.put("orthologue_names", new DtoStringArrayField(dto.getOrthologueNames()));
// args.put("publications", new DtoStringArrayField(dto.getPublications()));
// //args.put("synonyms", new DtoStringArrayField(dto.getTranscriptSynonyms()));
//
// args.put("dbx_ref_dtos", createArrayField(dto.getDbXRefDTOs(), DBXRefType.class, "dbxreftype"));
// args.put("algorithm_data", getBytes(dto.getAlgorithmData()));
//
// if (dto.getPolypeptideProperties()!= null){
// args.put("polypeptide_properties", new PeptidePropertiesType(dto.getPolypeptideProperties()));
// }else{
// args.put("polypeptide_properties", null);
// }
//// args.put("domain_information", createArrayField(dto.getDomainInformation(), PepRegionGroupType.class));
//// args.put("synonyms_by_types", getBytes(dto.getSynonymsByTypes()));
//
// template.update("insert into transcript_cache " +
//
// " values(nextval('transcript_cache_seq')," +
// ":transcript_id," +
// ":alternative_transcript," +
// ":gene_name," +
// ":last_modified_date," +
// ":max," +
// ":min," +
// ":organism_common_name," +
// ":organism_html_short_name," +
// ":proper_name," +
// ":protein_coding," +
// ":pseudo," +
// ":strand," +
// ":top_level_feature_displayname," +
// ":top_level_feature_length," +
// ":top_level_feature_type," +
// ":top_level_feature_uniquename," +
// ":type_description," +
// ":uniquename," +
//
// ":cluster_ids," +
// ":comments," +
// ":notes," +
// ":obsolete_names," +
// ":orthologue_names," +
// ":publications," +
// ":synonyms," +
//
// ":polypeptide_properties," +
// ":dbx_ref_dtos," +
// ":algorithm_data" +
//// ":domain_information," +
//// ":synonyms_by_types" +
// ") ",
// args);
//
// int transcriptId = dto.getTranscriptId();
// updateFeatureCvtermDTO(transcriptId, dto.getControlledCurations());
// updateFeatureCvtermDTO(transcriptId, dto.getGoBiologicalProcesses());
// updateFeatureCvtermDTO(transcriptId, dto.getGoCellularComponents());
// updateFeatureCvtermDTO(transcriptId, dto.getGoMolecularFunctions());
// updateFeatureCvtermDTO(transcriptId, dto.getProducts());
//
//
// return 1;
// }
//
// private void updateFeatureCvtermDTO(int transcriptId, List<FeatureCvTermDTO> fdtos)throws Exception{
// Map<String, Object> args = Maps.newHashMap();
// for(FeatureCvTermDTO fdto : fdtos){
// args.put("temp_type_name", fdto.getTypeName());
// args.put("type_name", fdto.getTypeName());
// args.put("type_accession", fdto.getTypeAccession());
// args.put("with_from", fdto.getWithFrom());
// args.put("count", fdto.getCount());
// args.put("pubs", new DtoStringArrayField(fdto.getPubs()));
// args.put("dbxref", createArrayField(fdto.getDbXRefDtoList(), DBXRefType.class, "dbxreftype"));
// args.put("props", createPropsArrayField(fdto.getProps(), "featurecvtproptype"));
// args.put("transcript_id", transcriptId);
//
// template.update("insert into transcript_featurecvterm " +
// " values(nextval('transcript_featurecvterm_seq')," +
// ":temp_type_name," +
// ":type_name," +
// ":type_accession," +
// ":with_from," +
// ":count," +
// ":pubs," +
// ":dbxref," +
// ":props," +
// ":transcript_id" +
// ") ",
// args);
// }
// }
//
// private DtoObjectArrayField createPropsArrayField(Map<String, Collection<String>> props, String typeName){
// List<FeatureCVTPropType> featureCVTPropTypes = new ArrayList<FeatureCVTPropType>();
// for(String key: props.keySet()){
// Collection<String> values = props.get(key);
// int size = values.size();
// //featureCVTPropTypes.add(new FeatureCVTPropType(key, values.toArray(new String[size])));
// }
// return new DtoObjectArrayField(typeName, featureCVTPropTypes);
// }
//
// private <T, K> DtoObjectArrayField createArrayField(List<T> dtos, Class<K> clazz, String typeName)throws Exception{
// int i=0;
// List<K> types = new ArrayList<K>();
// for(T ele: dtos){
// Constructor<K> constructor = clazz.getConstructor(ele.getClass());
// K retObj = constructor.newInstance(dtos.get(i++));
// types.add(retObj);
// }
// return new DtoObjectArrayField(typeName, types);
// }
//
// private <T> byte[] getBytes(T value)throws Exception{
// ByteArrayOutputStream bos = new ByteArrayOutputStream();
// ObjectOutputStream oos = new ObjectOutputStream(bos);
// oos.writeObject(value);
// oos.flush();
// oos.close();
// bos.close();
// return bos.toByteArray();
// }
//
// public FeatureDTO retrieveDTO(int featureId) {
// Integer index = findDTO(featureId);
//
// if (index == null) {
// return null;
// }
//
// TranscriptDTOMapper transcriptDTOMapper = new TranscriptDTOMapper();
//
// FeatureDTO ret = template.queryForObject(
// "select * from transcript_cache where transcript_cache_id=?",
// transcriptDTOMapper,
// index);
//
// return ret;
// }
//
//
// private Integer findDTO(int featureId) {
// logger.debug("findDTO, featureId: " + featureId);
// try{
// return template.queryForInt("select transcript_cache_id from transcript_cache where transcript_id=?", featureId);
// }catch(EmptyResultDataAccessException e){
// logger.warn(String.format("No feature id %d found...", featureId));
// return null;
// }
// }
//
//
//
// class TranscriptDTOMapper implements ParameterizedRowMapper<TranscriptDTO> {
//
// @SuppressWarnings("unchecked")
// @Override
// public TranscriptDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
// TranscriptDTO ret = new TranscriptDTO();
//
// // Simple types
// ret.setAnAlternateTranscript(rs.getBoolean("alternative_transcript"));
// ret.setGeneName(rs.getString("gene_name"));
//
// Date lastModifiedDate = rs.getDate("last_modified_date");
// if(lastModifiedDate!=null){
// ret.setLastModified(lastModifiedDate.getTime());
// }
//
// ret.setMax(rs.getInt("max"));
// ret.setMin(rs.getInt("min"));
// ret.setOrganismCommonName(rs.getString("organism_common_name"));
// ret.setOrganismHtmlShortName(rs.getString("organism_html_short_name"));
// ret.setProperName(rs.getString("proper_name"));
// ret.setProteinCoding(rs.getBoolean("protein_coding"));
// ret.setPseudo(rs.getBoolean("pseudo"));
// ret.setStrand(rs.getShort("strand"));
// ret.setTopLevelFeatureDisplayName(rs.getString("top_level_feature_displayname"));
// ret.setTopLevelFeatureLength(rs.getInt("top_level_feature_length"));
// ret.setTopLevelFeatureType(rs.getString("top_level_feature_type"));
// ret.setTopLevelFeatureUniqueName(rs.getString("top_level_feature_uniquename"));
// ret.setTypeDescription(rs.getString("type_description"));
// ret.setUniqueName(rs.getString("uniquename"));
//
// // Array types
// ret.setClusterIds(sqlArrayAsListString(rs, "cluster_ids"));
// ret.setComments(sqlArrayAsListString(rs, "comments"));
// ret.setNotes(sqlArrayAsListString(rs, "notes"));
// ret.setObsoleteNames(sqlArrayAsListString(rs, "obsolete_names"));
// ret.setOrthologueNames(sqlArrayAsListString(rs, "orthologue_names"));
// ret.setPublications(sqlArrayAsListString(rs, "publications"));
// // ret.setTranscriptSynonyms(sqlArrayAsListString(rs, "synonyms"));
//
//
//
// ret.setAlgorithmData(objectFromSerializedStream(rs, "algorithm_data", Map.class));
// ret.setControlledCurations(objectFromSerializedStream(rs, "controlled_curation", List.class));
// ret.setDbXRefDTOs(objectFromSerializedStream(rs, "dbX_ref_dtos", List.class));
// ret.setDomainInformation(objectFromSerializedStream(rs, "domain_information", List.class));
// ret.setGoBiologicalProcesses(objectFromSerializedStream(rs, "go_biological_processes", List.class));
// ret.setGoCellularComponents(objectFromSerializedStream(rs, "go_cellular_components", List.class));
// ret.setGoMolecularFunctions(objectFromSerializedStream(rs, "go_molecular_functions", List.class));
// ret.setIms(objectFromSerializedStream(rs, "image_map_summary", ImageMapSummary.class));
// ret.setPolypeptideProperties(objectFromSerializedStream(rs, "polypeptide_properties", PeptideProperties.class));
// ret.setProducts(objectFromSerializedStream(rs, "products", List.class));
//// ret.setTranscriptSynonymsByTypes(objectFromSerializedStream(rs, "synonyms_by_types", Map.class));
//
// return ret;
// }
//
// private <T> T objectFromSerializedStream(ResultSet rs, String columnName, Class<T> expectedType) {
//
// ObjectInputStream ois = null;
// try {
// byte[] colValue = rs.getBytes(columnName);
// ois = new ObjectInputStream(new ByteArrayInputStream(colValue));
// @SuppressWarnings("unchecked") T ret = (T)ois.readObject();
// ois.close();
// ois = null;
// return ret;
// } catch (SQLException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (ClassNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } finally {
// IOUtils.closeQuietly(ois);
// }
// throw new RuntimeException(
// String.format("Unable to deserialize '%s' as '%s' from dto cache", columnName, expectedType.getCanonicalName()));
// }
//
// private List<String> sqlArrayAsListString(ResultSet rs, String columnName) throws SQLException {
// return Arrays.asList((String[])rs.getArray(columnName).getArray());
// }
// }
//
// class TranscriptDTOReverseMapper {
//
// public Map<String, Object> mapRow(FeatureDTO td) throws SQLException {
// Map<String, Object> ret = Maps.newHashMap();
//
// // Simple types
// ret.put("anAlternateTranscript", td.isAnAlternateTranscript());
// ret.put("geneName", td.getGeneName());
// ret.put("lastModified", td.getLastModified());
// ret.put("max", td.getMax());
// ret.put("min", td.getMin());
// ret.put("organismCommonName", td.getOrganismCommonName());
// ret.put("organismHtmlShortName", td.getOrganismHtmlShortName());
// ret.put("properName", td.getProperName());
// ret.put("proteinCoding", td.isProteinCoding());
// ret.put("pseudo", td.isPseudo());
// ret.put("strand", td.getStrand());
// ret.put("topLevelFeatureDisplayName", td.getTopLevelFeatureDisplayName());
// ret.put("topLevelFeatureLength", td.getTopLevelFeatureLength());
// ret.put("topLevelFeatureType", td.getTopLevelFeatureType());
// ret.put("topLevelFeatureUniqueName", td.getTopLevelFeatureUniqueName());
// ret.put("typeDescription", td.getTypeDescription());
// ret.put("uniqueName", td.getUniqueName());
//
// // Array types
// ret.put("clusterIds", td.getClusterIds());
// ret.put("comments", td.getComments());
// ret.put("notes", td.getNotes());
// ret.put("obsoleteNames", td.getObsoleteNames());
// ret.put("orthologueNames", td.getOrthologueNames());
// ret.put("publications", td.getPublications());
//// ret.put("synonyms", td.getTranscriptSynonyms());
//
// // Special types
// ret.put("algoritmData", td.getAlgorithmData());
// ret.put("controlledCurations", td.getControlledCurations());
// ret.put("dbXRefDTOs", td.getDbXRefDTOs());
// ret.put("domainInformation", td.getDomainInformation());
// ret.put("goBiologicalProcesses", td.getGoBiologicalProcesses());
// ret.put("goCellularComponents", td.getGoCellularComponents());
// ret.put("goMolecularFunctions", td.getGoMolecularFunctions());
// ret.put("ims", td.getIms());
// ret.put("polypeptideProperties", td.getPolypeptideProperties());
// ret.put("products", td.getProducts());
// ret.put("synonymsByTypes", td.getSynonymsByTypes());
//
// return ret;
// }
//
//
// }
//
// public SimpleJdbcTemplate getTemplate() {
// return template;
// }
//
//
// public void setTemplate(SimpleJdbcTemplate template) {
// this.template = template;
// }
//
//}