package org.eurocarbdb.util.glycomedb; import java.util.HashMap; import java.util.List; import java.util.Set; import org.eurocarbdb.dataaccess.HibernateEntityManager; import org.eurocarbdb.dataaccess.core.Contributor; import org.eurocarbdb.dataaccess.core.GlycanSequence; import org.eurocarbdb.dataaccess.core.GlycanSequenceReference; import org.eurocarbdb.dataaccess.core.Reference; import org.eurocarbdb.util.glycomedb.data.DataExport; import org.eurocarbdb.util.glycomedb.data.StructureListType.Structure; import org.eurocarbdb.util.glycomedb.data.StructureListType.Structure.Resource; import org.hibernate.Query; public class UpdatingEuroCarbDataBase { private Contributor m_user = null; private HibernateEntityManager m_manager = new HibernateEntityManager(); private HashMap<String, CrossReference> m_hashDatabaseNames = new HashMap<String, CrossReference>(); private HashMap<String, Integer> m_glycanSequences = new HashMap<String, Integer>(); Configuration m_config; public void startLoading(DataExport de, Configuration a_config){ //start hibernate manager m_manager.beginUnitOfWork(); this.m_config = a_config; /*checking if user exists or not *if not exist, then add up current user to the database */ if(userexist(a_config) != null){ m_user = userexist(a_config); } else{ this.m_user = new Contributor(); m_user.setContributorName(a_config.getUsername()); m_user.setEmail(a_config.getUserEmailAddress()); m_user.setFullName(a_config.getUserFullName()); m_user.setIsBlocked(true); m_user.setIsActivated(true); m_user.setPassword("asgkjq34kjhfdslkj"); this.m_manager.store(this.m_user); } //hash build reference buildHashMapWithReference(gettingReferencebyuser()); buildHashMapWithSequences(gettingSequences()); //end of hibernate manager m_manager.endUnitOfWork(); if(de.ifError()){ System.err.println("ifError"); return; } else{ if(!de.ifStructureList()){ System.err.println("ifStructureListError"); return; } else{ for(Structure structure1 : de.getStructureList().getStructures()){ if(structure1.getSequenceFormat().equals("glycoct_condensed")){ m_manager.beginUnitOfWork(); Integer t_hibernateSequence=this.getSequenceCT(structure1.getSequenceString()); if(t_hibernateSequence == null){ System.out.print("\nsequence format in xml does not match to anyone in the database\n"); } else{ System.out.print("\nsequence format in xml matches to one in the database\nUpdating....\n"); //start updating database this.updatedatabase(t_hibernateSequence,structure1,a_config); } m_manager.endUnitOfWork(); } } m_manager.beginUnitOfWork(); //look up hashMap if false found, then delete entries from database. this.deleteUnusedEntries(); m_manager.endUnitOfWork(); } } } /* * lookup m_hashDatabaseNames * if false found, then delete data from database */ private void deleteUnusedEntries() { for(String t_key : m_hashDatabaseNames.keySet() ) { CrossReference t_ref = m_hashDatabaseNames.get(t_key); if(t_ref.isUsed()){ HashMap<Integer,CrossReferenceToStructure> hashGetSequence = t_ref.getSeqeunces(); for(Integer t_IntKey : hashGetSequence.keySet()){ CrossReferenceToStructure t_refStruc = hashGetSequence.get(t_IntKey); if(!t_refStruc.isUsed()){ this.m_manager.remove( this.m_manager.lookup(GlycanSequenceReference.class, t_refStruc.getId())); } } } else{ this.m_manager.remove( this.m_manager.lookup(Reference.class, t_ref.getID())); } } } private void buildHashMapWithSequences(List<Object[]> gettingSequences) { for(Object[] t_gly : gettingSequences){ m_glycanSequences.put((String)t_gly[1], (Integer)t_gly[0]); } } private List<Object[]> gettingSequences() { Query t_query = m_manager.getQuery("org.eurocarbdb.dataaccess.core.GlycanSequence.GET_ALL_ID_SEQUENCE"); @SuppressWarnings("unchecked") List <Object[]> t = (List<Object[]>) t_query.list(); return t; } public void buildHashMapWithReference(List<Object[]> ref) { for(Object[] t_ref : ref) { String t_key = ((String)t_ref[1]) + "+" + ((String)t_ref[2]); CrossReference cre = this.m_hashDatabaseNames.get(t_key); if ( cre == null ) { cre = new CrossReference(); cre.setID((Integer)t_ref[0]); this.m_hashDatabaseNames.put(t_key, cre); } // add structure to crossreference HashMap<Integer,CrossReferenceToStructure> t_seq = cre.getSeqeunces(); CrossReferenceToStructure t_instance = new CrossReferenceToStructure(); t_instance.setId((Integer)t_ref[3]); t_seq.put((Integer)t_ref[4],t_instance); } } private CrossReference addReferenceToHash(Reference a_ref) { String tmp = a_ref.getExternalReferenceName() + "+" + a_ref.getExternalReferenceId(); CrossReference cre = new CrossReference(); cre.setID(a_ref.getId()); HashMap<Integer,CrossReferenceToStructure> t_seq = cre.getSeqeunces(); Set<GlycanSequenceReference> t_seqRef= a_ref.getGlycanSequenceReferences(); for(GlycanSequenceReference gly : t_seqRef){ CrossReferenceToStructure t_instance = new CrossReferenceToStructure(); t_instance.setId(gly.getGlycanSequenceReferenceId()); t_seq.put(gly.getGlycanSequence().getGlycanSequenceId(),t_instance); } m_hashDatabaseNames.put(tmp, cre); return cre; } public void updatedatabase(Integer a_hibernateSequence, Structure a_jibxStructure, Configuration m_config){ for(Resource res: a_jibxStructure.getResources()) { if ( ! m_config.isIgnoreDatabase( res.getDb() ) ) { this.addReferenceToDb(res.getDb(), res.getId(),a_hibernateSequence); } } this.addReferenceToDb(a_jibxStructure.getDatabase(), a_jibxStructure.getId(),a_hibernateSequence); } public void addReferenceToDb(String a_resourceName, String a_resourceId,Integer a_hibernateSequence) { CrossReference t_crossReference = this.lookupReferenceByHashMap(a_resourceName,a_resourceId); if (t_crossReference == null ) { Reference t_reference = new Reference(); t_reference.setReferenceType("database"); t_reference.setExternalReferenceId(a_resourceId); String t_name = m_config.getDatabaseName(a_resourceName); if ( t_name == null ) { t_reference.setExternalReferenceName(a_resourceName); } else { t_reference.setExternalReferenceName(t_name); if(m_config.getDatabaseUrl(a_resourceName)!= null){ t_reference.setUrl(m_config.getDatabaseUrl(a_resourceName)+t_reference.getExternalReferenceId()); } else{ t_reference.setUrl(null); } } t_reference.setContributor(this.m_user); m_manager.store(t_reference); t_crossReference = this.addReferenceToHash(t_reference); } t_crossReference.setUsed(true); if ( !this.existsGlycanSequenceToReference(a_hibernateSequence,t_crossReference) ) { this.createGlycanSequenceToReference(a_hibernateSequence,t_crossReference); } else { t_crossReference.getSeqeunces().get(a_hibernateSequence).setUsed(true); } } private boolean existsGlycanSequenceToReference(Integer a_hibernateSequence, CrossReference t_reference) { CrossReferenceToStructure t = t_reference.getSeqeunces().get(a_hibernateSequence); if(t!= null){ return true; } return false; } private void createGlycanSequenceToReference( Integer a_hibernateSequence, CrossReference a_reference) { GlycanSequenceReference glycanSequenceReference = new GlycanSequenceReference(); glycanSequenceReference.setContributor(this.m_user); glycanSequenceReference.setGlycanSequence(this.m_manager.lookup(GlycanSequence.class, a_hibernateSequence)); glycanSequenceReference.setReference(this.m_manager.lookup(Reference.class, a_reference.getID())); m_manager.store(glycanSequenceReference); CrossReferenceToStructure t_refStruc = new CrossReferenceToStructure(); t_refStruc.setId(glycanSequenceReference.getId()); t_refStruc.setUsed(true); a_reference.getSeqeunces().put(a_hibernateSequence,t_refStruc); } public List<Object[]> gettingReferencebyuser(){ Query t_query = m_manager.getQuery("org.eurocarbdb.dataaccess.core.Reference.GET_CROSSREFERENCE_BY_USER"); t_query = t_query.setParameter("cont", m_user); @SuppressWarnings("unchecked") List<Object[]> t = (List<Object[]>) t_query.list(); return t; } public CrossReference lookupReferenceByHashMap(String a_name, String a_id){ String a_namePlusId = this.m_config.getDatabaseName(a_name) + "+" + a_id; CrossReference t_ref = m_hashDatabaseNames.get(a_namePlusId); if( t_ref != null){ return t_ref; } return null; } public Reference lookupReference(String a_name, String a_id) { Query t_query = m_manager.getQuery("org.eurocarbdb.dataaccess.core.Reference.IDLOOKUP"); t_query = t_query.setParameter("ext_name", m_config.getDatabaseName(a_name)); t_query = t_query.setParameter("ext_id", a_id); t_query = t_query.setParameter("cont", m_user); Reference t = (Reference) t_query.uniqueResult(); return t; } private Contributor userexist(Configuration m_config) { Query t_query = m_manager.getQuery("org.eurocarbdb.dataaccess.core.Contributor.BY_EXACT_NAME"); t_query = t_query.setParameter("name", m_config.getUsername()); Contributor t = (Contributor) t_query.uniqueResult(); return t; } public Integer getSequenceCT(String sequence) { return m_glycanSequences.get(sequence); } }