X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdbsources%2FUniprot.java;h=4c8f3ceb5cde3a0b4b018f1c4a2b67c5a4800149;hb=76776617eb3960193681eb733cb769f90639ce22;hp=f29a555c4c74c9c3f81f01a2a63b9cd55a5fedcf;hpb=25ae256a88bf092f45a78b649a48f41e6fd5d70b;p=jalview.git diff --git a/src/jalview/ws/dbsources/Uniprot.java b/src/jalview/ws/dbsources/Uniprot.java index f29a555..4c8f3ce 100644 --- a/src/jalview/ws/dbsources/Uniprot.java +++ b/src/jalview/ws/dbsources/Uniprot.java @@ -1,20 +1,25 @@ -/** +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. * + * Jalview 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. + * + * Jalview 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 Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.ws.dbsources; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import org.exolab.castor.xml.Unmarshaller; - -import com.stevesoft.pat.Regex; - -import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; @@ -23,24 +28,41 @@ import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.datamodel.UniprotEntry; import jalview.datamodel.UniprotFile; -import jalview.io.FormatAdapter; -import jalview.io.IdentifyFile; -import jalview.ws.DBRefFetcher; import jalview.ws.ebi.EBIFetchClient; import jalview.ws.seqfetcher.DbSourceProxy; import jalview.ws.seqfetcher.DbSourceProxyImpl; +import java.io.File; +import java.io.FileReader; +import java.io.Reader; +import java.util.Vector; + +import org.exolab.castor.xml.Unmarshaller; + +import com.stevesoft.pat.Regex; + /** * @author JimP * */ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy { - public Uniprot() { + + private static final String BAR_DELIMITER = "|"; + + private static final String NEWLINE = "\n"; + + private static org.exolab.castor.mapping.Mapping map; + + /** + * Constructor + */ + public Uniprot() + { super(); addDbSourceProperty(DBRefSource.SEQDB, DBRefSource.SEQDB); addDbSourceProperty(DBRefSource.PROTSEQDB); -// addDbSourceProperty(DBRefSource.MULTIACC, new Integer(50)); + // addDbSourceProperty(DBRefSource.MULTIACC, new Integer(50)); } /* @@ -60,7 +82,7 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy */ public Regex getAccessionValidator() { - return null; + return new Regex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)"); } /* @@ -83,26 +105,37 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy return "0"; // we really don't know what version we're on. } - private EBIFetchClient ebi = null; - - public Vector getUniprotEntries(File file) + /** + * Reads a file containing the reply to the EBI Fetch Uniprot data query, + * unmarshals it to a UniprotFile object, and returns the list of UniprotEntry + * data models (mapped from <entry> elements) + * + * @param fileReader + * @return + */ + public Vector getUniprotEntries(Reader fileReader) { UniprotFile uni = new UniprotFile(); try { - // 1. Load the mapping information from the file - org.exolab.castor.mapping.Mapping map = new org.exolab.castor.mapping.Mapping(uni.getClass().getClassLoader()); - java.net.URL url = getClass().getResource("/uniprot_mapping.xml"); - map.loadMapping(url); + if (map == null) + { + // 1. Load the mapping information from the file + map = new org.exolab.castor.mapping.Mapping(uni.getClass() + .getClassLoader()); + java.net.URL url = getClass().getResource("/uniprot_mapping.xml"); + map.loadMapping(url); + } // 2. Unmarshal the data Unmarshaller unmar = new Unmarshaller(uni); unmar.setIgnoreExtraElements(true); unmar.setMapping(map); - - uni = (UniprotFile) unmar.unmarshal(new FileReader(file)); - } - catch (Exception e) + if (fileReader != null) + { + uni = (UniprotFile) unmar.unmarshal(fileReader); + } + } catch (Exception e) { System.out.println("Error getUniprotEntries() " + e); } @@ -120,55 +153,42 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy startQuery(); try { - Alignment al=null; - ebi = new EBIFetchClient(); - StringBuffer result=new StringBuffer(); + queries = queries.toUpperCase().replaceAll( + "(UNIPROT\\|?|UNIPROT_|UNIREF\\d+_|UNIREF\\d+\\|?)", ""); + AlignmentI al = null; + EBIFetchClient ebi = new EBIFetchClient(); // uniprotxml parameter required since december 2007 - File file = ebi.fetchDataAsFile("uniprot:" + queries, "uniprotxml", null); - Vector entries = getUniprotEntries(file); + // uniprotkb dbname changed introduced december 2008 + File file = ebi.fetchDataAsFile("uniprotkb:" + queries, "uniprotxml", + null); + Vector entries = getUniprotEntries(new FileReader(file)); if (entries != null) { + /* + * If Castor binding included sequence@length, we could guesstimate the + * size of buffer to hold the alignment + */ + StringBuffer result = new StringBuffer(128); // First, make the new sequences - Enumeration en = entries.elements(); - while (en.hasMoreElements()) + for (UniprotEntry entry : entries) { - UniprotEntry entry = (UniprotEntry) en.nextElement(); - - StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot"); - Enumeration en2 = entry.getAccession().elements(); - while (en2.hasMoreElements()) - { - name.append("|"); - name.append(en2.nextElement()); - } - en2 = entry.getName().elements(); - while (en2.hasMoreElements()) - { - name.append("|"); - name.append(en2.nextElement()); - } - - if (entry.getProtein()!=null && entry.getProtein().getName()!=null) - { - for (int nm=0,nmSize=entry.getProtein().getName().size(); nmUniProt/Swiss-Prot"); + for (String accessionId : entry.getAccession()) + { + name.append(BAR_DELIMITER); + name.append(accessionId); + } + for (String n : entry.getName()) + { + name.append(BAR_DELIMITER); + name.append(n); + } + + if (entry.getProtein() != null + && entry.getProtein().getName() != null) + { + for (String nm : entry.getProtein().getName()) + { + name.append(" ").append(nm); + } + } + return name; + } + + /** * add an ordered set of UniprotEntry objects to an ordered set of seuqences. * - * @param al - - * a sequence of n sequences + * @param al + * - a sequence of n sequences * @param entries - * a seuqence of n uniprot entries to be analysed. + * a list of n uniprot entries to be analysed. */ - public void addUniprotXrefs(Alignment al, Vector entries) + public void addUniprotXrefs(AlignmentI al, Vector entries) { + final String dbVersion = getDbVersion(); + for (int i = 0; i < entries.size(); i++) { - UniprotEntry entry = (UniprotEntry) entries.elementAt(i); - Enumeration e = entry.getDbReference().elements(); - Vector onlyPdbEntries = new Vector(); - Vector dbxrefs = new Vector(); - while (e.hasMoreElements()) + UniprotEntry entry = entries.elementAt(i); + Vector onlyPdbEntries = new Vector(); + Vector dbxrefs = new Vector(); + + for (PDBEntry pdb : entry.getDbReference()) { - PDBEntry pdb = (PDBEntry) e.nextElement(); DBRefEntry dbr = new DBRefEntry(); dbr.setSource(pdb.getType()); dbr.setAccessionId(pdb.getId()); - dbr.setVersion(DBRefSource.UNIPROT+":"+getDbVersion()); + dbr.setVersion(DBRefSource.UNIPROT + ":" + dbVersion); dbxrefs.addElement(dbr); - if (!pdb.getType().equals("PDB")) + if ("PDB".equals(pdb.getType())) { - continue; + onlyPdbEntries.addElement(pdb); } - - onlyPdbEntries.addElement(pdb); } + SequenceI sq = al.getSequenceAt(i); - while (sq.getDatasetSequence()!=null) + while (sq.getDatasetSequence() != null) { sq = sq.getDatasetSequence(); } - Enumeration en2 = entry.getAccession().elements(); - while (en2.hasMoreElements()) + for (String accessionId : entry.getAccession()) { - // we always add as uniprot if we retrieved from uniprot or uniprot name - sq.addDBRef( - new DBRefEntry(DBRefSource.UNIPROT, getDbVersion(), en2.nextElement() - .toString())); + /* + * add as uniprot whether retrieved from uniprot or uniprot_name + */ + sq.addDBRef(new DBRefEntry(DBRefSource.UNIPROT, dbVersion, + accessionId)); } - en2 = dbxrefs.elements(); - while (en2.hasMoreElements()) + + for (DBRefEntry dbRef : dbxrefs) { - // we always add as uniprot if we retrieved from uniprot or uniprot name - sq.addDBRef((DBRefEntry) en2.nextElement()); - + sq.addDBRef(dbRef); } sq.setPDBId(onlyPdbEntries); if (entry.getFeature() != null) { - e = entry.getFeature().elements(); - while (e.hasMoreElements()) + for (SequenceFeature sf : entry.getFeature()) { - SequenceFeature sf = (SequenceFeature) e.nextElement(); sf.setFeatureGroup("Uniprot"); sq.addSequenceFeature(sf); } @@ -254,8 +305,11 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy */ public boolean isValidReference(String accession) { - return true; + // TODO: make the following a standard validator + return (accession == null || accession.length() < 2) ? false + : getAccessionValidator().search(accession); } + /** * return LDHA_CHICK uniprot entry */ @@ -263,8 +317,15 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy { return "P00340"; } + public String getDbName() { return "Uniprot"; // getDbSource(); } + + @Override + public int getTier() + { + return 0; + } }