JAL-1503 update version in GPL header
[jalview.git] / src / jalview / ws / dbsources / Uniprot.java
index f29a555..1deb272 100644 (file)
@@ -1,13 +1,26 @@
-/**
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.1)
+ * Copyright (C) 2014 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 <http://www.gnu.org/licenses/>.
+ * 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;
@@ -23,9 +36,6 @@ 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;
@@ -36,11 +46,12 @@ import jalview.ws.seqfetcher.DbSourceProxyImpl;
  */
 public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
 {
-  public Uniprot() {
+  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 +71,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]+)");
   }
 
   /*
@@ -85,24 +96,31 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
 
   private EBIFetchClient ebi = null;
 
+  private static org.exolab.castor.mapping.Mapping map;
+
   public Vector getUniprotEntries(File file)
   {
     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 (file != null)
+      {
+        uni = (UniprotFile) unmar.unmarshal(new FileReader(file));
+      }
+    } catch (Exception e)
     {
       System.out.println("Error getUniprotEntries() " + e);
     }
@@ -120,11 +138,15 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
     startQuery();
     try
     {
-      Alignment al=null;
+      queries = queries.toUpperCase().replaceAll(
+              "(UNIPROT\\|?|UNIPROT_|UNIREF\\d+_|UNIREF\\d+\\|?)", "");
+      Alignment al = null;
       ebi = new EBIFetchClient();
-      StringBuffer result=new StringBuffer();
+      StringBuffer result = new StringBuffer();
       // uniprotxml parameter required since december 2007
-      File file = ebi.fetchDataAsFile("uniprot:" + queries, "uniprotxml", null);
+      // uniprotkb dbname changed introduced december 2008
+      File file = ebi.fetchDataAsFile("uniprotkb:" + queries, "uniprotxml",
+              null);
       Vector entries = getUniprotEntries(file);
 
       if (entries != null)
@@ -149,12 +171,13 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
             name.append(en2.nextElement());
           }
 
-          if (entry.getProtein()!=null && entry.getProtein().getName()!=null)
+          if (entry.getProtein() != null
+                  && entry.getProtein().getName() != null)
           {
-              for (int nm=0,nmSize=entry.getProtein().getName().size(); nm<nmSize;nm++)
-              {
-                name.append(" " + entry.getProtein().getName().elementAt(nm));
-              }
+            for (int nm = 0, nmSize = entry.getProtein().getName().size(); nm < nmSize; nm++)
+            {
+              name.append(" " + entry.getProtein().getName().elementAt(nm));
+            }
           }
 
           result.append(name + "\n"
@@ -164,11 +187,13 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
 
         // Then read in the features and apply them to the dataset
         al = parseResult(result.toString());
-        if (al!=null)
+        if (al != null)
         {
           // Decorate the alignment with database entries.
           addUniprotXrefs(al, entries);
-        } else {
+        }
+        else
+        {
           results = result;
         }
       }
@@ -177,15 +202,15 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
     } catch (Exception e)
     {
       stopQuery();
-      throw(e);
+      throw (e);
     }
   }
 
   /**
    * 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.
    */
@@ -203,17 +228,17 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
         DBRefEntry dbr = new DBRefEntry();
         dbr.setSource(pdb.getType());
         dbr.setAccessionId(pdb.getId());
-        dbr.setVersion(DBRefSource.UNIPROT+":"+getDbVersion());
+        dbr.setVersion(DBRefSource.UNIPROT + ":" + getDbVersion());
         dbxrefs.addElement(dbr);
         if (!pdb.getType().equals("PDB"))
         {
           continue;
         }
-        
+
         onlyPdbEntries.addElement(pdb);
       }
       SequenceI sq = al.getSequenceAt(i);
-      while (sq.getDatasetSequence()!=null)
+      while (sq.getDatasetSequence() != null)
       {
         sq = sq.getDatasetSequence();
       }
@@ -222,16 +247,15 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
       while (en2.hasMoreElements())
       {
         // we always add as uniprot if we retrieved from uniprot or uniprot name
-        sq.addDBRef(
-                new DBRefEntry(DBRefSource.UNIPROT, getDbVersion(), en2.nextElement()
-                        .toString()));
+        sq.addDBRef(new DBRefEntry(DBRefSource.UNIPROT, getDbVersion(), en2
+                .nextElement().toString()));
       }
       en2 = dbxrefs.elements();
       while (en2.hasMoreElements())
       {
-     // we always add as uniprot if we retrieved from uniprot or uniprot name
+        // we always add as uniprot if we retrieved from uniprot or uniprot name
         sq.addDBRef((DBRefEntry) en2.nextElement());
-                    
+
       }
       sq.setPDBId(onlyPdbEntries);
       if (entry.getFeature() != null)
@@ -254,8 +278,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 +290,15 @@ public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy
   {
     return "P00340";
   }
+
   public String getDbName()
   {
     return "Uniprot"; // getDbSource();
   }
+
+  @Override
+  public int getTier()
+  {
+    return 0;
+  }
 }