+/**\r
+ * \r
+ */\r
+package jalview.ws.dbsources;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.Enumeration;\r
+import java.util.Hashtable;\r
+import java.util.Vector;\r
+\r
+import com.stevesoft.pat.Regex;\r
+\r
+import jalview.datamodel.Alignment;\r
+import jalview.datamodel.AlignmentI;\r
+import jalview.datamodel.DBRefEntry;\r
+import jalview.datamodel.DBRefSource;\r
+import jalview.datamodel.PDBEntry;\r
+import jalview.datamodel.SequenceFeature;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.datamodel.UniprotEntry;\r
+import jalview.io.FormatAdapter;\r
+import jalview.io.IdentifyFile;\r
+import jalview.ws.DBRefFetcher;\r
+import jalview.ws.DbSourceProxy;\r
+import jalview.ws.DbSourceProxyImpl;\r
+import jalview.ws.EBIFetchClient;\r
+\r
+/**\r
+ * @author JimP\r
+ * \r
+ */\r
+public class Uniprot extends DbSourceProxyImpl implements DbSourceProxy\r
+{\r
+ public Uniprot() {\r
+ super();\r
+ addDbSourceProperty(DBRefSource.SEQDB, DBRefSource.SEQDB);\r
+ addDbSourceProperty(DBRefSource.PROTSEQDB);\r
+ addDbSourceProperty(DBRefSource.MULTIACC);\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see jalview.ws.DbSourceProxy#getAccessionSeparator()\r
+ */\r
+ public String getAccessionSeparator()\r
+ {\r
+ return ";";\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see jalview.ws.DbSourceProxy#getAccessionValidator()\r
+ */\r
+ public Regex getAccessionValidator()\r
+ {\r
+ return null;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see jalview.ws.DbSourceProxy#getDbSource()\r
+ */\r
+ public String getDbSource()\r
+ {\r
+ return DBRefSource.UNIPROT;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see jalview.ws.DbSourceProxy#getDbVersion()\r
+ */\r
+ public String getDbVersion()\r
+ {\r
+ return "0"; // we really don't know what version we're on.\r
+ }\r
+\r
+ private EBIFetchClient ebi = null;\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[])\r
+ */\r
+ public AlignmentI getSequenceRecords(String queries) throws Exception\r
+ {\r
+ startQuery();\r
+ try\r
+ {\r
+ Alignment al=null;\r
+ ebi = new EBIFetchClient();\r
+ StringBuffer result=new StringBuffer();\r
+ File file = ebi.fetchDataAsFile("uniprot:" + queries, "xml", null);\r
+ DBRefFetcher dbref = new DBRefFetcher();\r
+ Vector entries = dbref.getUniprotEntries(file);\r
+\r
+ if (entries != null)\r
+ {\r
+ // First, make the new sequences\r
+ Enumeration en = entries.elements();\r
+ while (en.hasMoreElements())\r
+ {\r
+ UniprotEntry entry = (UniprotEntry) en.nextElement();\r
+\r
+ StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot");\r
+ Enumeration en2 = entry.getAccession().elements();\r
+ while (en2.hasMoreElements())\r
+ {\r
+ name.append("|");\r
+ name.append(en2.nextElement());\r
+ }\r
+ en2 = entry.getName().elements();\r
+ while (en2.hasMoreElements())\r
+ {\r
+ name.append("|");\r
+ name.append(en2.nextElement());\r
+ }\r
+\r
+ if (entry.getProtein() != null)\r
+ {\r
+ name.append(" " + entry.getProtein().getName().elementAt(0));\r
+ }\r
+\r
+ result.append(name + "\n"\r
+ + entry.getUniprotSequence().getContent() + "\n");\r
+\r
+ }\r
+\r
+ // Then read in the features and apply them to the dataset\r
+ al = parseResult(result.toString());\r
+ if (al!=null)\r
+ {\r
+ // Decorate the alignment with database entries.\r
+ addUniprotXrefs(al, entries);\r
+ } else {\r
+ results = result;\r
+ }\r
+ }\r
+ stopQuery();\r
+ return al;\r
+ } catch (Exception e)\r
+ {\r
+ stopQuery();\r
+ throw(e);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * add an ordered set of UniprotEntry objects to an ordered set of seuqences.\r
+ * \r
+ * @param al -\r
+ * a sequence of n sequences\r
+ * @param entries\r
+ * a seuqence of n uniprot entries to be analysed.\r
+ */\r
+ public void addUniprotXrefs(Alignment al, Vector entries)\r
+ {\r
+ for (int i = 0; i < entries.size(); i++)\r
+ {\r
+ UniprotEntry entry = (UniprotEntry) entries.elementAt(i);\r
+ Enumeration e = entry.getDbReference().elements();\r
+ Vector onlyPdbEntries = new Vector();\r
+ while (e.hasMoreElements())\r
+ {\r
+ PDBEntry pdb = (PDBEntry) e.nextElement();\r
+ if (!pdb.getType().equals("PDB"))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ onlyPdbEntries.addElement(pdb);\r
+ }\r
+ SequenceI sq = al.getSequenceAt(i);\r
+ sq = (sq.getDatasetSequence()==null) ? sq : sq.getDatasetSequence();\r
+\r
+ Enumeration en2 = entry.getAccession().elements();\r
+ while (en2.hasMoreElements())\r
+ {\r
+ sq.addDBRef(\r
+ new DBRefEntry(getDbSource(), getDbVersion(), en2.nextElement()\r
+ .toString()));\r
+ }\r
+ sq.setPDBId(onlyPdbEntries);\r
+ if (entry.getFeature() != null)\r
+ {\r
+ e = entry.getFeature().elements();\r
+ while (e.hasMoreElements())\r
+ {\r
+ SequenceFeature sf = (SequenceFeature) e.nextElement();\r
+ sf.setFeatureGroup("Uniprot");\r
+ sq.addSequenceFeature(sf);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String)\r
+ */\r
+ public boolean isValidReference(String accession)\r
+ {\r
+ return true;\r
+ }\r
+ /**\r
+ * return LDHA_CHICK uniprot entry\r
+ */\r
+ public String getTestQuery()\r
+ {\r
+ return "P00340";\r
+ }\r
+}\r