/*\r
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5)\r
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)\r
+ * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
* \r
* This file is part of Jalview.\r
* \r
*/\r
package jalview.gui;\r
\r
+import java.text.ParseException;\r
import java.util.*;\r
+import java.util.List;\r
\r
import java.awt.*;\r
import java.awt.event.*;\r
import javax.swing.event.*;\r
import javax.swing.table.*;\r
\r
-import org.biojava.dasobert.dasregistry.*;\r
+import org.biodas.jdas.dassources.Capabilities;\r
+import org.biodas.jdas.dassources.utils.DasCoordinateSystemCollector;\r
+import org.biodas.jdas.dassources.utils.DasTimeFormat;\r
+import org.biodas.jdas.schema.registrycoordinates.DASCOORDINATESYSTEM;\r
+import org.biodas.jdas.schema.sources.CAPABILITY;\r
+import org.biodas.jdas.schema.sources.COORDINATES;\r
+import org.biodas.jdas.schema.sources.MAINTAINER;\r
+import org.biodas.jdas.schema.sources.PROP;\r
+import org.biodas.jdas.schema.sources.SOURCE;\r
+import org.biodas.jdas.schema.sources.SOURCES;\r
+import org.biodas.jdas.schema.sources.VERSION;\r
+\r
import jalview.jbgui.*;\r
import jalview.util.*;\r
\r
public class DasSourceBrowser extends GDasSourceBrowser implements\r
Runnable, ListSelectionListener\r
{\r
- static DasSource[] dasSources = null;\r
+ static org.biodas.jdas.schema.sources.SOURCE[] dasSources = null;\r
\r
- Hashtable localSources = null;\r
+ Hashtable<String, SOURCE> localSources = null;\r
\r
Vector selectedSources;\r
\r
init();\r
}\r
}\r
+\r
FeatureSettings fs = null;\r
+\r
public DasSourceBrowser()\r
{\r
this(null);\r
Object[][] data = new Object[dSize][2];\r
for (int i = 0; i < dSize; i++)\r
{\r
- data[i][0] = dasSources[i].getNickname();\r
+ data[i][0] = dasSources[i].getTitle(); // what's equivalent of nickname\r
data[i][1] = new Boolean(selectedSources.contains(dasSources[i]\r
- .getNickname()));\r
+ .getTitle()));\r
}\r
\r
refreshTableData(data);\r
int dSize = dasSources.length;\r
for (int i = 0; i < dSize; i++)\r
{\r
- if (!dasSources[i].getNickname().equals(nickName))\r
+ if (!dasSources[i].getTitle().equals(nickName))\r
{\r
continue;\r
}\r
\r
- DasSource ds = dasSources[i];\r
-\r
+ SOURCE ds = dasSources[i];\r
+ VERSION latest = getVersionFor(ds);\r
text.append("<font color=\"#0000FF\">Id:</font> "\r
- + dasSources[i].getId() + "<br>");\r
+ + dasSources[i].getUri() + "<br>");\r
text.append("<font color=\"#0000FF\">Nickname:</font> "\r
- + dasSources[i].getNickname() + "<br>");\r
- text.append("<font color=\"#0000FF\">URL:</font> "\r
- + dasSources[i].getUrl() + "<br>");\r
+ + dasSources[i].getTitle() + "<br>");\r
+ text.append("<font color=\"#0000FF\">URL:</font> " + latest.getUri()\r
+ + "<br>");\r
\r
- text\r
- .append("<font color=\"#0000FF\">Admin Email:</font> <a href=\"mailto:"\r
- + dasSources[i].getAdminemail()\r
- + "\">"\r
- + dasSources[i].getAdminemail() + "</a>" + "<br>");\r
+ text.append("<font color=\"#0000FF\">Admin Email:</font> <a href=\"mailto:"\r
+ + ds.getMAINTAINER().getEmail()\r
+ + "\">"\r
+ + ds.getMAINTAINER().getEmail() + "</a>" + "<br>");\r
\r
text.append("<font color=\"#0000FF\">Registered at:</font> "\r
- + dasSources[i].getRegisterDate() + "<br>");\r
+ + latest.getCreated() + "<br>");\r
\r
- text.append("<font color=\"#0000FF\">Last successful test:</font> "\r
- + dasSources[i].getLeaseDate() + "<br>");\r
+ // TODO: Identify last successful test date\r
+ // text.append("<font color=\"#0000FF\">Last successful test:</font> "\r
+ // + latest.dasSources[i].getLeaseDate() + "<br>");\r
\r
text.append("<font color=\"#0000FF\">Labels:</font> ");\r
- for (int s = 0; s < dasSources[i].getLabels().length; s++)\r
+ boolean b = false;\r
+ for (PROP labl : latest.getPROP())\r
{\r
- text.append(dasSources[i].getLabels()[s]);\r
- if (s < dasSources[i].getLabels().length - 1)\r
+ if (labl.getName().equalsIgnoreCase("LABEL"))\r
{\r
- text.append(",");\r
+ if (!b)\r
+ {\r
+ text.append(",");\r
+ }\r
+ text.append(" ");\r
+\r
+ text.append(labl.getValue());\r
+ b = true;\r
}\r
- text.append(" ");\r
+ ;\r
}\r
text.append("<br>");\r
\r
text.append("<font color=\"#0000FF\">Capabilities:</font> ");\r
- String[] scap = dasSources[i].getCapabilities();\r
+ CAPABILITY[] scap = latest.getCAPABILITY().toArray(new CAPABILITY[0]);\r
for (int j = 0; j < scap.length; j++)\r
{\r
text.append(scap[j]);\r
text.append("<br>");\r
\r
text.append("<font color=\"#0000FF\">Coordinates:</font> ");\r
- DasCoordinateSystem[] dcs = ds.getCoordinateSystem();\r
- for (int j = 0; j < dcs.length; j++)\r
+ for (COORDINATES dcs : latest.getCOORDINATES())\r
{\r
- text.append("(" + dcs[j].getUniqueId() + ") "\r
- + dcs[j].getCategory() + ", " + dcs[j].getName());\r
- if (dcs[j].getNCBITaxId() != 0)\r
+ text.append("(" + dcs.getUri() + ") "\r
+\r
+ + dcs.getSource() + ", " + dcs.getAuthority());\r
+ if (dcs.getTaxid() != null && dcs.getTaxid().trim().length() > 0)\r
{\r
- text.append(", " + dcs[j].getNCBITaxId());\r
+ text.append(", " + dcs.getTaxid());\r
}\r
- if (dcs[j].getOrganismName().length() > 0)\r
+ if (dcs.getVersion().trim().length() > 0)\r
{\r
- text.append(", " + dcs[j].getOrganismName());\r
- }\r
+ {\r
+ text.append(", " + dcs.getVersion());\r
+ }\r
\r
- text.append("<br>");\r
- }\r
+ text.append("<br>");\r
+ }\r
\r
- text.append("<font color=\"#0000FF\">Description:</font> "\r
- + dasSources[i].getDescription() + "<br>");\r
+ text.append("<font color=\"#0000FF\">Description:</font> "\r
+ + dasSources[i].getDescription() + "<br>");\r
\r
- if (dasSources[i].getHelperurl() != null\r
- && dasSources[i].getHelperurl().length() > 0)\r
- {\r
- text.append("<font color=\"#0000FF\"><a href=\""\r
- + dasSources[i].getHelperurl()\r
- + "\">Go to site</a></font<br>");\r
- }\r
+ if (dasSources[i].getDocHref() != null\r
+ && dasSources[i].getDocHref().length() > 0)\r
+ {\r
+ text.append("<font color=\"#0000FF\"><a href=\""\r
+ + dasSources[i].getDocHref()\r
+ + "\">Go to site</a></font<br>");\r
+ }\r
\r
- text.append("</font></html>");\r
+ text.append("</font></html>");\r
\r
- break;\r
+ break;\r
+ }\r
}\r
-\r
fullDetails.setText(text.toString());\r
javax.swing.SwingUtilities.invokeLater(new Runnable()\r
{\r
\r
private void setParentGuiEnabled(boolean b)\r
{\r
- if (fs!=null)\r
+ if (fs != null)\r
{\r
fs.fetchDAS.setEnabled(b);\r
fs.saveDAS.setEnabled(b);\r
{\r
for (int i = 0; i < dasSources.length; i++)\r
{\r
- if (dasSources[i].getNickname()\r
- .equals(selectedSources.elementAt(r)))\r
+ if (dasSources[i].getTitle().equals(selectedSources.elementAt(r)))\r
{\r
selected.addElement(dasSources[i]);\r
break;\r
* \r
* @return\r
*/\r
- public DasSource[] getDASSource()\r
+ public SOURCE[] getDASSource()\r
{\r
if (dasSources == null)\r
{\r
worker.start();\r
}\r
\r
- private void setCapabilities(DasSource[] sources)\r
+ private boolean isLaterThan(String ref, String newer)\r
{\r
- Vector authority = new Vector();\r
- Vector type = new Vector();\r
- Vector label = new Vector();\r
+ Date refdate = null, newdate = null;\r
+ try\r
+ {\r
+ refdate = DasTimeFormat.fromDASString(ref);\r
\r
- authority.addElement("Any");\r
- type.addElement("Any");\r
- label.addElement("Any");\r
+ } catch (ParseException x)\r
+ {\r
+ return false;\r
+ }\r
+ try\r
+ {\r
+ newdate = DasTimeFormat.fromDASString(newer);\r
+ } catch (ParseException e)\r
+ {\r
+ // TODO: handle exception\r
+ }\r
+ if (refdate != null)\r
+ {\r
+ if (newdate != null)\r
+ {\r
+ return refdate.before(newdate);\r
+ }\r
+ return false;\r
+ }\r
+ if (newdate != null)\r
+ {\r
+ return true;\r
+ }\r
+ // assume first instance of source is newest in list. - TODO: check if\r
+ // natural ordering of source versions is newest first or oldest first\r
+ return false;\r
+ }\r
\r
- for (int i = 0; i < sources.length; i++)\r
+ private VERSION getVersionFor(SOURCE ds)\r
+ {\r
+ VERSION latest = null;\r
+ for (VERSION v : ds.getVERSION())\r
{\r
- DasSource ds = sources[i];\r
+ if (latest == null\r
+ || isLaterThan(latest.getCreated(), v.getCreated()))\r
+ {\r
+ // TODO: das 1.6 - should just get the first version - ignore other\r
+ // versions since not specified how to construct URL from version's URI\r
+ // + source URI\r
+ latest = v;\r
+ }\r
+ }\r
+ return latest;\r
+ }\r
\r
- DasCoordinateSystem[] dcs = ds.getCoordinateSystem();\r
+ private void setCapabilities(SOURCE[] sources)\r
+ {\r
+ Vector<String> authority = new Vector<String>();\r
+ Vector<String> type = new Vector<String>();\r
+ Vector<String> label = new Vector<String>();\r
+ Vector<String> taxIds = new Vector<String>();\r
+ authority.add("Any");\r
+ type.add("Any");\r
+ label.add("Any");\r
\r
- for (int j = 0; j < dcs.length; j++)\r
+ for (int i = 0; i < sources.length; i++)\r
+ {\r
+ SOURCE ds = sources[i];\r
+ VERSION latest = getVersionFor(ds);\r
+\r
+ for (COORDINATES cs : latest.getCOORDINATES())\r
{\r
- if (!type.contains(dcs[j].getCategory()))\r
+ if (!type.contains(cs.getSource()))\r
{\r
- type.addElement(dcs[j].getCategory());\r
+ type.add(cs.getSource()); // source==category\r
}\r
\r
- if (!authority.contains(dcs[j].getName()))\r
+ if (!authority.contains(cs.getAuthority()))\r
{\r
- authority.addElement(dcs[j].getName());\r
+ authority.add(cs.getAuthority());\r
}\r
}\r
\r
- String[] slabels = ds.getLabels();\r
- for (int s = 0; s < slabels.length; s++)\r
+ for (PROP slabel : latest.getPROP())\r
{\r
- if (!label.contains(slabels[s]))\r
+ if (slabel.getName().equalsIgnoreCase("LABEL")\r
+ && !label.contains(slabel.getValue()))\r
{\r
- label.addElement(slabels[s]);\r
+ label.add(slabel.getValue());\r
}\r
}\r
\r
filter1.setListData(authority);\r
filter2.setListData(type);\r
filter3.setListData(label);\r
+ // filter4 taxIds\r
\r
javax.swing.SwingUtilities.invokeLater(new Runnable()\r
{\r
{\r
int selectedRow = table.getSelectionModel().getMinSelectionIndex();\r
nickname = table.getValueAt(selectedRow, 0).toString();\r
- url = ((DasSource) localSources.get(nickname)).getUrl();\r
- seqsrc = ((DasSource) localSources.get(nickname))\r
- .hasCapability("sequence");\r
+ url = ((SOURCE) localSources.get(nickname)).getUri();\r
+ seqsrc = ((SOURCE) localSources.get(nickname)).getVERSION().get(0)\r
+ .getCAPABILITY().contains(Capabilities.SEQUENCE);\r
}\r
\r
JTextField nametf = new JTextField(nickname, 40);\r
urltf.setText(urltf.getText() + "/");\r
}\r
\r
- Das1Source local = new Das1Source();\r
-\r
- local.setUrl(urltf.getText());\r
- local.setNickname(nametf.getText());\r
- if (seqs.isSelected())\r
- {\r
- local.setCapabilities(new String[]\r
- { "features", "sequence" });\r
- }\r
+ SOURCE local = createLocalSource(urltf.getText(), nametf.getText(), seqs.isSelected(), true);\r
+ \r
if (localSources == null)\r
{\r
localSources = new Hashtable();\r
}\r
\r
- localSources.put(local.getNickname(), local);\r
+ localSources.put(local.getTitle(), local);\r
\r
if (!newSource && !nickname.equals(nametf.getText()))\r
{\r
Object[][] data = new Object[size + adjust][2];\r
for (int i = 0; i < size; i++)\r
{\r
- if (!newSource && dasSources[i].getNickname().equals(nickname))\r
+ if (!newSource && dasSources[i].getTitle().equals(nickname))\r
{\r
- ((DasSource) dasSources[i]).setNickname(local.getNickname());\r
- ((DasSource) dasSources[i]).setUrl(local.getUrl());\r
- data[i][0] = local.getNickname();\r
+ dasSources[i] = local;\r
+ data[i][0] = local.getTitle();\r
data[i][1] = new Boolean(true);\r
}\r
else\r
{\r
- data[i][0] = dasSources[i].getNickname();\r
+ data[i][0] = dasSources[i].getTitle();\r
data[i][1] = new Boolean(selectedSources.contains(dasSources[i]\r
- .getNickname()));\r
+ .getTitle()));\r
}\r
}\r
\r
if (newSource)\r
{\r
- data[size][0] = local.getNickname();\r
+ data[size][0] = local.getTitle();\r
data[size][1] = new Boolean(true);\r
- selectedSources.add(local.getNickname());\r
+ selectedSources.add(local.getTitle());\r
}\r
\r
- DasSource[] tmp = new DasSource[size + adjust];\r
+ SOURCE[] tmp = new SOURCE[size + adjust];\r
\r
System.arraycopy(dasSources, 0, tmp, 0, size);\r
\r
}\r
});\r
\r
- displayFullDetails(local.getNickname());\r
+ displayFullDetails(local.getTitle());\r
+ }\r
+\r
+ private SOURCE createLocalSource(String url, String name,\r
+ boolean sequence, boolean features)\r
+ {\r
+ SOURCE local = new SOURCE();\r
+\r
+ local.setUri(url);\r
+ local.setTitle(name);\r
+ local.setVERSION(new ArrayList<VERSION>());\r
+ VERSION v = new VERSION();\r
+ List<CAPABILITY> cp = new ArrayList<CAPABILITY>();\r
+ if (sequence)\r
+ {\r
+/* Could try and synthesize a coordinate system for the source if needbe\r
+ * COORDINATES coord = new COORDINATES();\r
+ coord.setAuthority("NCBI");\r
+ coord.setSource("Chromosome");\r
+ coord.setTaxid("9606");\r
+ coord.setVersion("35");\r
+ version.getCOORDINATES().add(coord);*/\r
+ CAPABILITY cap=new CAPABILITY();\r
+ cap.setType("das1:"+Capabilities.SEQUENCE.getName());\r
+ cp.add(cap);\r
+ }\r
+ if (features)\r
+ {\r
+ CAPABILITY cap = new CAPABILITY();\r
+ cap.setType("das1:"+Capabilities.FEATURES.getName());\r
+ cp.add(cap);\r
+ }\r
+ \r
+ v.getCAPABILITY().addAll(cp);\r
+ local.getVERSION().add(v);\r
+\r
+ return local;\r
}\r
\r
public void editRemoveLocalSource(MouseEvent evt)\r
localSources.remove(nickname);\r
selectedSources.remove(nickname);\r
Object[][] data = new Object[dasSources.length - 1][2];\r
- DasSource[] tmp = new DasSource[dasSources.length - 1];\r
+ SOURCE[] tmp = new SOURCE[dasSources.length - 1];\r
int index = 0;\r
for (int i = 0; i < dasSources.length; i++)\r
{\r
- if (dasSources[i].getNickname().equals(nickname))\r
+ if (dasSources[i].getTitle().equals(nickname))\r
{\r
continue;\r
}\r
else\r
{\r
tmp[index] = dasSources[i];\r
- data[index][0] = dasSources[i].getNickname();\r
- data[index][1] = new Boolean(selectedSources\r
- .contains(dasSources[i].getNickname()));\r
+ data[index][0] = dasSources[i].getTitle();\r
+ data[index][1] = new Boolean(\r
+ selectedSources.contains(dasSources[i].getTitle()));\r
index++;\r
}\r
}\r
Object[][] data = new Object[size + lsize][2];\r
for (int i = 0; i < size; i++)\r
{\r
- data[i][0] = dasSources[i].getNickname();\r
+ data[i][0] = dasSources[i].getTitle();\r
data[i][1] = new Boolean(selectedSources.contains(dasSources[i]\r
- .getNickname()));\r
+ .getTitle()));\r
}\r
\r
- DasSource[] tmp = new DasSource[size + lsize];\r
+ SOURCE[] tmp = new SOURCE[size + lsize];\r
if (dasSources != null)\r
{\r
System.arraycopy(dasSources, 0, tmp, 0, size);\r
String key = en.nextElement().toString();\r
data[index][0] = key;\r
data[index][1] = new Boolean(false);\r
- tmp[index] = new Das1Source();\r
- tmp[index].setNickname(key);\r
- tmp[index].setUrl(((DasSource) localSources.get(key)).getUrl());\r
+ tmp[index] = createLocalSource(localSources.get(key).getUri(), key, false, true);\r
\r
index++;\r
}\r
\r
ArrayList names = new ArrayList();\r
ArrayList selected = new ArrayList();\r
- DasSource ds;\r
+ SOURCE ds;\r
\r
// The features filter is not visible, but we must still\r
// filter the das source list here.\r
for (int i = 0; i < dSize; i++)\r
{\r
ds = dasSources[i];\r
- DasCoordinateSystem[] dcs = ds.getCoordinateSystem();\r
-\r
- if (dcs.length == 0 && ds.getCapabilities().length == 0\r
+ VERSION v=getVersionFor(ds);\r
+ List<COORDINATES> coords = v.getCOORDINATES();\r
+ if ((coords==null || coords.size()==0)\r
&& filter1.getSelectedIndex() == 0\r
&& filter2.getSelectedIndex() == 0\r
&& filter3.getSelectedIndex() == 0)\r
// THIS IS A FIX FOR LOCAL SOURCES WHICH DO NOT\r
// HAVE COORDINATE SYSTEMS, INFO WHICH AT PRESENT\r
// IS ADDED FROM THE REGISTRY\r
- names.add(ds.getNickname());\r
- selected\r
- .add(new Boolean(selectedSources.contains(ds.getNickname())));\r
+ names.add(ds.getTitle());\r
+ selected.add(new Boolean(selectedSources.contains(ds.getTitle())));\r
continue;\r
}\r
\r
- if (!selectedInList(dummyFeatureList, ds.getCapabilities())\r
- || !selectedInList(filter3.getSelectedValues(), ds\r
- .getLabels()))\r
+ if (!selectedInList(dummyFeatureList, getCapabilityKeys(v))\r
+ || !selectedInList(filter3.getSelectedValues(),\r
+ getLabelsFor(v)))\r
{\r
continue;\r
}\r
\r
- for (int j = 0; j < dcs.length; j++)\r
+ for (int j = 0; j <coords.size(); j++)\r
{\r
if (selectedInList(filter1.getSelectedValues(), new String[]\r
- { dcs[j].getName() })\r
+ { coords.get(j).getAuthority() })\r
&& selectedInList(filter2.getSelectedValues(), new String[]\r
- { dcs[j].getCategory() }))\r
+ { coords.get(j).getSource()}))\r
{\r
- names.add(ds.getNickname());\r
- selected.add(new Boolean(selectedSources.contains(ds\r
- .getNickname())));\r
+ names.add(ds.getTitle());\r
+ selected.add(new Boolean(selectedSources.contains(ds.getTitle())));\r
break;\r
}\r
}\r
refreshTableData(data);\r
}\r
\r
+ private String[] getLabelsFor(VERSION v)\r
+ {\r
+ ArrayList<String> labels=new ArrayList<String>();\r
+ for (PROP p: v.getPROP())\r
+ {\r
+ if (p.getName().equalsIgnoreCase("LABEL"))\r
+ {\r
+ labels.add(p.getValue());\r
+ }\r
+ }\r
+ return labels.toArray(new String[0]);\r
+ }\r
+\r
+ private String[] getCapabilityKeys(VERSION v)\r
+ {\r
+\r
+ ArrayList<String> labels=new ArrayList<String>();\r
+ for (CAPABILITY p: v.getCAPABILITY())\r
+ {\r
+ // TODO: work out what to do with namespace prefix \r
+ // does SEQUENCE == das1:SEQUENCE and das2:SEQUENCE ?\r
+ // for moment, just show all capabilities...\r
+ if (p.getType().startsWith("das1:"))\r
+ {\r
+ labels.add(p.getType());\r
+ }\r
+ }\r
+ return labels.toArray(new String[0]);\r
+ }\r
+\r
boolean selectedInList(Object[] selection, String[] items)\r
{\r
for (int i = 0; i < selection.length; i++)\r
{\r
if (localSources == null)\r
{\r
- localSources = new Hashtable();\r
+ localSources = new Hashtable<String, SOURCE>();\r
}\r
Enumeration sources = _localSources.elements();\r
while (sources.hasMoreElements())\r
{\r
- Das1Source source = (Das1Source) sources.nextElement();\r
- localSources.put(source.getNickname(), source);\r
+ SOURCE source = (SOURCE) sources.nextElement();\r
+ localSources.put(source.getTitle(), source);\r
}\r
}\r
}\r
}\r
}\r
\r
- properties.setProperty(jalview.bin.Cache.DAS_ACTIVE_SOURCE, sb\r
- .toString());\r
+ properties.setProperty(jalview.bin.Cache.DAS_ACTIVE_SOURCE,\r
+ sb.toString());\r
\r
if (localSources != null)\r
{\r
String token = en.nextElement().toString();\r
sb.append(token\r
+ "|"\r
- + (((DasSource) localSources.get(token))\r
- .hasCapability("sequence") ? "sequence:" : "")\r
- + ((DasSource) localSources.get(token)).getUrl() + "\t");\r
+ + (selectedInList(getCapabilityKeys(getVersionFor(localSources.get(token))),\r
+ new String[] { "das1:"+Capabilities.SEQUENCE.getName()}) ? "sequence:" : "")\r
+ + getVersionFor(localSources.get(token)).getUri() + "\t");\r
}\r
\r
- properties.setProperty(jalview.bin.Cache.DAS_LOCAL_SOURCE, sb\r
- .toString());\r
+ properties.setProperty(jalview.bin.Cache.DAS_LOCAL_SOURCE,\r
+ sb.toString());\r
}\r
\r
}\r
{\r
for (int i = 0; i < dasSources.length; i++)\r
{\r
- if (sources.contains(dasSources[i].getNickname()))\r
+ if (sources.contains(dasSources[i].getTitle()))\r
{\r
if (!resolved.contains(dasSources[i]))\r
{\r
\r
/**\r
* disable or enable the buttons on the source browser\r
+ * \r
* @param b\r
*/\r
public void setGuiEnabled(boolean b)\r