From b483c2012e40cab4b38f650dc049c94efe7e27c2 Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Tue, 26 Jun 2018 16:16:15 +0100 Subject: [PATCH] JAL-3035 - jalview-das is no more ! - jsdas lib removed - DAS settings panel deleted (Feature settings pane has no tabs now) - all code for wrapping DAS sources and retrieving sequences and features from them is gone - test methods/main methods have been de-dasified or removed if their only purpose was to test DAS source discovery - fancy sorting code to account for DAS sequence source names has been removed --- .classpath | 1 - lib/jdas-1.0.4.jar | Bin 249906 -> 0 bytes src/jalview/bin/Cache.java | 18 - src/jalview/bin/Jalview.java | 1 - src/jalview/gui/DasSourceBrowser.java | 864 ------------------ src/jalview/gui/FeatureSettings.java | 210 ----- src/jalview/gui/JDatabaseTree.java | 50 -- src/jalview/gui/Preferences.java | 5 - src/jalview/gui/SequenceFetcher.java | 26 +- src/jalview/jbgui/GPreferences.java | 10 - src/jalview/ws/DBRefFetcher.java | 65 +- src/jalview/ws/DasSequenceFeatureFetcher.java | 925 -------------------- src/jalview/ws/SequenceFetcher.java | 86 +- .../ws/dbsources/das/api/DasSourceRegistryI.java | 57 -- .../ws/dbsources/das/api/jalviewSourceI.java | 87 -- .../dbsources/das/datamodel/DasSequenceSource.java | 354 -------- .../dbsources/das/datamodel/DasSourceRegistry.java | 484 ---------- .../ws/dbsources/das/datamodel/JalviewSource.java | 384 -------- test/jalview/analysis/CrossRefTest.java | 6 +- test/jalview/ws/PDBSequenceFetcherTest.java | 2 +- test/jalview/ws/SequenceFetcherTest.java | 18 +- test/jalview/ws/dbsources/RemoteFormatTest.java | 4 +- test/jalview/ws/seqfetcher/DasSequenceFetcher.java | 49 -- 23 files changed, 36 insertions(+), 3670 deletions(-) delete mode 100644 lib/jdas-1.0.4.jar delete mode 100644 src/jalview/gui/DasSourceBrowser.java delete mode 100644 src/jalview/ws/DasSequenceFeatureFetcher.java delete mode 100644 src/jalview/ws/dbsources/das/api/DasSourceRegistryI.java delete mode 100644 src/jalview/ws/dbsources/das/api/jalviewSourceI.java delete mode 100644 src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java delete mode 100644 src/jalview/ws/dbsources/das/datamodel/DasSourceRegistry.java delete mode 100644 src/jalview/ws/dbsources/das/datamodel/JalviewSource.java delete mode 100644 test/jalview/ws/seqfetcher/DasSequenceFetcher.java diff --git a/.classpath b/.classpath index 0cdc4b9..d32799b 100644 --- a/.classpath +++ b/.classpath @@ -36,7 +36,6 @@ - diff --git a/lib/jdas-1.0.4.jar b/lib/jdas-1.0.4.jar deleted file mode 100644 index fb5d128497bf0dd35c1a984bb542a5543e5204fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249906 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

>1jtY@wsOski2 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 z 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

$ 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 diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index dcd6546..83bc810 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -28,8 +28,6 @@ import jalview.schemes.UserColourScheme; import jalview.structure.StructureImportSettings; import jalview.urls.IdOrgSettings; import jalview.util.ColorUtils; -import jalview.ws.dbsources.das.api.DasSourceRegistryI; -import jalview.ws.dbsources.das.datamodel.DasSourceRegistry; import jalview.ws.sifts.SiftsSettings; import java.awt.Color; @@ -982,22 +980,6 @@ public class Cache return null; } - private static DasSourceRegistryI sourceRegistry = null; - - /** - * initialise and .. - * - * @return instance of the das source registry - */ - public static DasSourceRegistryI getDasSourceRegistry() - { - if (sourceRegistry == null) - { - sourceRegistry = new DasSourceRegistry(); - } - return sourceRegistry; - } - /** * Set the specified value, or remove it if null or empty. Does not save the * properties file. diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 30620a1..ea2f1d6 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -149,7 +149,6 @@ public class Jalview af.setProgressBar(MessageManager .getString("status.das_features_being_retrived"), id); af.featureSettings_actionPerformed(null); - af.featureSettings.fetchDasFeatures(dasSources, true); af.setProgressBar(null, id); synchronized (us) { diff --git a/src/jalview/gui/DasSourceBrowser.java b/src/jalview/gui/DasSourceBrowser.java deleted file mode 100644 index 8570ac3..0000000 --- a/src/jalview/gui/DasSourceBrowser.java +++ /dev/null @@ -1,864 +0,0 @@ -/* - * 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.gui; - -import jalview.jbgui.GDasSourceBrowser; -import jalview.util.MessageManager; -import jalview.util.TableSorter; -import jalview.ws.dbsources.das.api.DasSourceRegistryI; -import jalview.ws.dbsources.das.api.jalviewSourceI; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.Vector; - -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; -import javax.swing.SwingUtilities; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.AbstractTableModel; - -import org.biodas.jdas.schema.sources.CAPABILITY; -import org.biodas.jdas.schema.sources.COORDINATES; -import org.biodas.jdas.schema.sources.PROP; -import org.biodas.jdas.schema.sources.VERSION; - -public class DasSourceBrowser extends GDasSourceBrowser - implements Runnable, ListSelectionListener -{ - DasSourceRegistryI sourceRegistry = null; - - Vector selectedSources; - - public DasSourceBrowser(FeatureSettings featureSettings) - { - fs = featureSettings; - // TODO DasSourceRegistryProvider API - sourceRegistry = jalview.bin.Cache.getDasSourceRegistry(); - String registry = sourceRegistry.getDasRegistryURL(); - - registryURL.setText(registry); - - setSelectedFromProperties(); - - displayFullDetails(null); - table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - filter1.addListSelectionListener(this); - filter2.addListSelectionListener(this); - filter3.addListSelectionListener(this); - - // Ask to be notified of selection changes. - ListSelectionModel rowSM = table.getSelectionModel(); - rowSM.addListSelectionListener(new ListSelectionListener() - { - @Override - public void valueChanged(ListSelectionEvent e) - { - ListSelectionModel lsm = (ListSelectionModel) e.getSource(); - if (!lsm.isSelectionEmpty()) - { - int selectedRow = lsm.getMinSelectionIndex(); - displayFullDetails(table.getValueAt(selectedRow, 0).toString()); - } - } - }); - - table.addMouseListener(new MouseAdapter() - { - @Override - public void mouseClicked(MouseEvent evt) - { - if (evt.getClickCount() == 2 || evt.isPopupTrigger()) - { - editRemoveLocalSource(evt); - } - } - }); - - if (sourceRegistry.getSources() != null) - { - init(); - } - } - - FeatureSettings fs = null; - - private boolean loadingDasSources; - - public DasSourceBrowser() - { - this(null); - } - - @Override - public void paintComponent(java.awt.Graphics g) - { - if (sourceRegistry == null) - { - Thread worker = new Thread(this); - worker.start(); - } - } - - void init() - { - List sources = sourceRegistry.getSources(); - int dSize = sources.size(); - Object[][] data = new Object[dSize][2]; - for (int i = 0; i < dSize; i++) - { - data[i][0] = sources.get(i).getTitle(); // what's equivalent of nickname - data[i][1] = new Boolean( - selectedSources.contains(sources.get(i).getTitle())); - } - - refreshTableData(data); - setCapabilities(sourceRegistry); - - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - TableSorter sorter = (TableSorter) table.getModel(); - sorter.setSortingStatus(1, TableSorter.DESCENDING); - sorter.setSortingStatus(1, TableSorter.NOT_SORTED); - } - }); - - progressBar.setIndeterminate(false); - progressBar.setVisible(false); - addLocal.setVisible(true); - refresh.setVisible(true); - } - - public void refreshTableData(Object[][] data) - { - TableSorter sorter = new TableSorter(new DASTableModel(data)); - sorter.setTableHeader(table.getTableHeader()); - table.setModel(sorter); - } - - void displayFullDetails(String nickName) - { - - StringBuffer text = new StringBuffer( - ""); - - if (nickName == null) - { - fullDetails.setText(text + MessageManager - .getString("label.select_das_service_from_table")); - return; - } - - int dSize = sourceRegistry.getSources().size(); - for (jalviewSourceI ds : sourceRegistry.getSources()) - { - if (!ds.getTitle().equals(nickName)) - { - continue; - } - - VERSION latest = ds.getVersion(); - text.append( - "Id: " + ds.getUri() + "
"); - text.append("Nickname: " - + ds.getTitle() + "
"); - - text.append("URL:
" + ds.getSourceURL() + "" - + "
"); - if (!ds.isLocal()) - { - if (ds.getDocHref() != null && ds.getDocHref().length() > 0) - { - text.append("Site: " + ds.getDocHref() + "" - + "
"); - } - - text.append("Description: " - + ds.getDescription() + "
"); - - text.append( - "Admin Email: " + ds.getEmail() + "" - + "
"); - - text.append("Registered at: " - + latest.getCreated() + "
"); - - // TODO: Identify last successful test date - // text.append("Last successful test: " - // + latest.dasSources[i].getLeaseDate() + "
"); - } - else - { - text.append("Source was added manually.
"); - } - text.append("Labels: "); - boolean b = false; - for (PROP labl : latest.getPROP()) - { - if (labl.getName().equalsIgnoreCase("LABEL")) - { - if (b) - { - text.append(","); - } - text.append(" "); - - text.append(labl.getValue()); - b = true; - } - ; - } - text.append("
"); - - text.append("Capabilities: "); - CAPABILITY[] scap = latest.getCAPABILITY().toArray(new CAPABILITY[0]); - for (int j = 0; j < scap.length; j++) - { - text.append(scap[j].getType()); - if (j < scap.length - 1) - { - text.append(", "); - } - } - text.append("
"); - - text.append("Coordinates:"); - int i = 1; - for (COORDINATES dcs : latest.getCOORDINATES()) - { - text.append("
" + i++ + ". "); - text.append(dcs.getAuthority() + " : " + dcs.getSource()); - if (dcs.getTaxid() != null && dcs.getTaxid().trim().length() > 0) - { - text.append(" [TaxId:" + dcs.getTaxid() + "]"); - } - if (dcs.getVersion() != null - && dcs.getVersion().trim().length() > 0) - { - { - text.append(" {v. " + dcs.getVersion() + "}"); - } - } - text.append(" (" + dcs.getUri() - + ")"); - } - text.append("
"); - - break; - } - - fullDetails.setText(text.toString()); - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - fullDetailsScrollpane.getVerticalScrollBar().setValue(0); - } - }); - } - - @Override - public void run() - { - loadingDasSources = true; - - addLocal.setVisible(false); - refresh.setVisible(false); - progressBar.setVisible(true); - progressBar.setIndeterminate(true); - setParentGuiEnabled(false); - // Refresh the source list. - sourceRegistry.refreshSources(); - - init(); - - setParentGuiEnabled(true); - loadingDasSources = false; - - } - - private void setParentGuiEnabled(boolean b) - { - if (fs != null) - { - fs.fetchDAS.setEnabled(b); - fs.saveDAS.setEnabled(b); - } - } - - public Vector getSelectedSources() - { - // wait around if we're still loading. - while (sourceRegistry == null) - { - if (!loadingDasSources) - { - new Thread(this).start(); - try - { - Thread.sleep(5); - } catch (Exception e) - { - } - ; - while (loadingDasSources) - { - try - { - Thread.sleep(5); - } catch (Exception e) - { - } - ; - } - ; - } - } - - Vector selected = new Vector(); - for (String source : selectedSources) - { - jalviewSourceI srce = sourceRegistry.getSource(source); - if (srce != null) - { - selected.addElement(srce); - } - } - return selected; - } - - @Override - public void refresh_actionPerformed(ActionEvent e) - { - saveProperties(jalview.bin.Cache.applicationProperties); - - Thread worker = new Thread(this); - worker.start(); - } - - private void setCapabilities(DasSourceRegistryI sourceRegistry2) - { - Vector authority = new Vector(); - Vector type = new Vector(); - Vector label = new Vector(); - Vector taxIds = new Vector(); - authority.add("Any"); - type.add("Any"); - label.add("Any"); - - for (jalviewSourceI ds : sourceRegistry2.getSources()) - { - VERSION latest = ds.getVersion(); - - for (COORDINATES cs : latest.getCOORDINATES()) - { - if (!type.contains(cs.getSource())) - { - type.add(cs.getSource()); // source==category - } - - if (!authority.contains(cs.getAuthority())) - { - authority.add(cs.getAuthority()); - } - } - - for (PROP slabel : latest.getPROP()) - { - if (slabel.getName().equalsIgnoreCase("LABEL") - && !label.contains(slabel.getValue())) - { - label.add(slabel.getValue()); - } - } - - } - - filter1.setListData(authority); - filter2.setListData(type); - filter3.setListData(label); - // filter4 taxIds - - javax.swing.SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - filter1.setSelectedIndex(0); - filter2.setSelectedIndex(0); - filter3.setSelectedIndex(0); - } - }); - } - - @Override - public void amendLocal(boolean newSource) - { - String url = "http://localhost:8080/", nickname = ""; - boolean seqsrc = false; - if (!newSource) - { - int selectedRow = table.getSelectionModel().getMinSelectionIndex(); - nickname = table.getValueAt(selectedRow, 0).toString(); - jalviewSourceI source = sourceRegistry.getSource(nickname); - url = source.getUri(); - seqsrc = source.isSequenceSource(); - } - - JTextField nametf = new JTextField(nickname, 40); - JTextField urltf = new JTextField(url, 40); - JCheckBox seqs = new JCheckBox( - MessageManager.getString("label.sequence_source")); - seqs.setSelected(seqsrc); - JPanel panel = new JPanel(new BorderLayout()); - JPanel pane12 = new JPanel(new BorderLayout()); - pane12.add(new JLabel(MessageManager.getString("label.name:")), - BorderLayout.CENTER); - pane12.add(nametf, BorderLayout.EAST); - panel.add(pane12, BorderLayout.NORTH); - pane12 = new JPanel(new BorderLayout()); - pane12.add(new JLabel(MessageManager.getString("label.url:")), - BorderLayout.NORTH); - pane12.add(seqs, BorderLayout.SOUTH); - pane12.add(urltf, BorderLayout.EAST); - panel.add(pane12, BorderLayout.SOUTH); - - int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop, - panel, MessageManager.getString("label.enter_local_das_source"), - JvOptionPane.OK_CANCEL_OPTION); - - if (reply != JvOptionPane.OK_OPTION) - { - return; - } - - if (!urltf.getText().endsWith("/")) - { - urltf.setText(urltf.getText() + "/"); - } - - jalviewSourceI local = sourceRegistry.createLocalSource(urltf.getText(), - nametf.getText(), seqs.isSelected(), true); - List sources = sourceRegistry.getSources(); - int osize = sources.size(); - int size = osize + (newSource ? 1 : 0); - - Object[][] data = new Object[size][2]; - DASTableModel dtm = (table != null) - ? (DASTableModel) ((TableSorter) table.getModel()) - .getTableModel() - : null; - for (int i = 0; i < osize; i++) - { - String osrc = (dtm == null || i >= osize) ? null - : (String) dtm.getValueAt(i, 0); - if (!newSource && osrc != null - && dtm.getValueAt(i, 0).equals(nickname)) - { - data[i][0] = local.getTitle(); - data[i][1] = new Boolean(true); - } - else - { - data[i][0] = osrc; - data[i][1] = new Boolean(selectedSources.contains(osrc)); - } - } - // Always add a new source at the end - if (newSource) - { - data[osize][0] = local.getTitle(); - data[osize][1] = new Boolean(true); - selectedSources.add(local.getTitle()); - } - - refreshTableData(data); - - SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - scrollPane.getVerticalScrollBar() - .setValue(scrollPane.getVerticalScrollBar().getMaximum()); - } - }); - - displayFullDetails(local.getTitle()); - } - - public void editRemoveLocalSource(MouseEvent evt) - { - int selectedRow = table.getSelectionModel().getMinSelectionIndex(); - if (selectedRow == -1) - { - return; - } - - String nickname = table.getValueAt(selectedRow, 0).toString(); - - if (!sourceRegistry.getSource(nickname).isLocal()) - { - JvOptionPane.showInternalMessageDialog(Desktop.desktop, - MessageManager.getString( - "label.you_can_only_edit_or_remove_local_das_sources"), - MessageManager.getString("label.public_das_source"), - JvOptionPane.WARNING_MESSAGE); - return; - } - - Object[] options = { "Edit", "Remove", "Cancel" }; - int choice = JvOptionPane.showInternalOptionDialog(Desktop.desktop, - "Do you want to edit or remove " + nickname + "?", - "Edit / Remove Local DAS Source", - JvOptionPane.YES_NO_CANCEL_OPTION, - JvOptionPane.QUESTION_MESSAGE, null, options, options[2]); - - switch (choice) - { - case 0: - amendLocal(false); - break; - case 1: - sourceRegistry.removeLocalSource(sourceRegistry.getSource(nickname)); - selectedSources.remove(nickname); - Object[][] data = new Object[sourceRegistry.getSources().size()][2]; - int index = 0, l = table.getRowCount(); - - for (int i = 0; i < l; i++) - { - String nm; - if ((nm = (String) table.getValueAt(i, 0)).equals(nickname)) - { - continue; - } - else - { - data[index][0] = nm; - data[index][1] = new Boolean(selectedSources.contains(nm)); - index++; - } - } - refreshTableData(data); - SwingUtilities.invokeLater(new Runnable() - { - @Override - public void run() - { - scrollPane.getVerticalScrollBar() - .setValue(scrollPane.getVerticalScrollBar().getMaximum()); - } - }); - - break; - } - } - - @Override - public void valueChanged(ListSelectionEvent evt) - { - // Called when the MainTable selection changes - if (evt.getValueIsAdjusting()) - { - return; - } - - displayFullDetails(null); - - // Filter the displayed data sources - - ArrayList names = new ArrayList(); - ArrayList selected = new ArrayList(); - - // The features filter is not visible, but we must still - // filter the das source list here. - // July 2006 - only 6 sources fo not serve features - Object[] dummyFeatureList = new Object[] { "features" }; - List srcs = sourceRegistry.getSources(); - for (jalviewSourceI ds : srcs) - { - - VERSION v = ds.getVersion(); - List coords = v.getCOORDINATES(); - if (ds.isLocal() || ((coords == null || coords.size() == 0) - && filter1.getSelectedIndex() == 0 - && filter2.getSelectedIndex() == 0 - && filter3.getSelectedIndex() == 0)) - { - // THIS IS A FIX FOR LOCAL SOURCES WHICH DO NOT - // HAVE COORDINATE SYSTEMS, INFO WHICH AT PRESENT - // IS ADDED FROM THE REGISTRY - names.add(ds.getTitle()); - selected.add(new Boolean(selectedSources.contains(ds.getTitle()))); - continue; - } - - if (!selectedInList(dummyFeatureList, ds.getCapabilityList(v)) - || !selectedInList(filter3.getSelectedValues(), - ds.getLabelsFor(v))) - { - continue; - } - - for (int j = 0; j < coords.size(); j++) - { - if (selectedInList(filter1.getSelectedValues(), - new String[] - { coords.get(j).getAuthority() }) - && selectedInList(filter2.getSelectedValues(), new String[] - { coords.get(j).getSource() })) - { - names.add(ds.getTitle()); - selected.add( - new Boolean(selectedSources.contains(ds.getTitle()))); - break; - } - } - } - - int dSize = names.size(); - Object[][] data = new Object[dSize][2]; - for (int d = 0; d < dSize; d++) - { - data[d][0] = names.get(d); - data[d][1] = selected.get(d); - } - - refreshTableData(data); - } - - private boolean selectedInList(Object[] selection, String[] items) - { - for (int i = 0; i < selection.length; i++) - { - if (selection[i].equals("Any")) - { - return true; - } - if (items == null || items.length == 0) - { - return false; - } - String sel = (items[0].startsWith("das1:") ? "das1:" : "") - + selection[i]; - for (int j = 0; j < items.length; j++) - { - if (sel.equals(items[j])) - { - return true; - } - } - } - - return false; - } - - void setSelectedFromProperties() - { - String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", - "uniprot"); - StringTokenizer st = new StringTokenizer(active, "\t"); - selectedSources = new Vector(); - while (st.hasMoreTokens()) - { - selectedSources.addElement(st.nextToken()); - } - } - - @Override - public void reset_actionPerformed(ActionEvent e) - { - registryURL.setText(sourceRegistry.getDasRegistryURL()); - } - - /** - * set the DAS source settings in the given jalview properties. - * - * @param properties - */ - public void saveProperties(Properties properties) - { - if (registryURL.getText() == null || registryURL.getText().length() < 1) - { - properties.remove(jalview.bin.Cache.DAS_REGISTRY_URL); - } - else - { - properties.setProperty(jalview.bin.Cache.DAS_REGISTRY_URL, - registryURL.getText()); - } - - StringBuffer sb = new StringBuffer(); - for (int r = 0; r < table.getModel().getRowCount(); r++) - { - if (((Boolean) table.getValueAt(r, 1)).booleanValue()) - { - sb.append(table.getValueAt(r, 0) + "\t"); - } - } - - properties.setProperty(jalview.bin.Cache.DAS_ACTIVE_SOURCE, - sb.toString()); - - String sourceprop = sourceRegistry.getLocalSourceString(); - properties.setProperty(jalview.bin.Cache.DAS_LOCAL_SOURCE, sourceprop); - } - - class DASTableModel extends AbstractTableModel - { - - public DASTableModel(Object[][] data) - { - this.data = data; - } - - private String[] columnNames = new String[] { - MessageManager.getString("label.nickname"), - MessageManager.getString("label.use_source") }; - - private Object[][] data; - - @Override - public int getColumnCount() - { - return columnNames.length; - } - - @Override - public int getRowCount() - { - return data.length; - } - - @Override - public String getColumnName(int col) - { - return columnNames[col]; - } - - @Override - public Object getValueAt(int row, int col) - { - return data[row][col]; - } - - /* - * JTable uses this method to determine the default renderer/ editor for - * each cell. If we didn't implement this method, then the last column would - * contain text ("true"/"false"), rather than a check box. - */ - @Override - public Class getColumnClass(int c) - { - return getValueAt(0, c).getClass(); - } - - /* - * Don't need to implement this method unless your table's editable. - */ - @Override - public boolean isCellEditable(int row, int col) - { - // Note that the data/cell address is constant, - // no matter where the cell appears onscreen. - return col == 1; - - } - - /* - * Don't need to implement this method unless your table's data can change. - */ - @Override - public void setValueAt(Object value, int row, int col) - { - data[row][col] = value; - fireTableCellUpdated(row, col); - - String name = getValueAt(row, 0).toString(); - boolean selected = ((Boolean) value).booleanValue(); - - if (selectedSources.contains(name) && !selected) - { - selectedSources.remove(name); - } - - if (!selectedSources.contains(name) && selected) - { - selectedSources.add(name); - } - } - } - - public void initDasSources() - { - - Thread thr = new Thread(new Runnable() - { - @Override - public void run() - { - // this actually initialises the das source list - paintComponent(null); // yuk - } - }); - thr.start(); - while (loadingDasSources || sourceRegistry == null) - { - try - { - Thread.sleep(10); - } catch (Exception e) - { - } - ; - } - } - - /** - * disable or enable the buttons on the source browser - * - * @param b - */ - public void setGuiEnabled(boolean b) - { - refresh.setEnabled(b); - addLocal.setEnabled(b); - } -} diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index 821454f..78c1cac 100644 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -36,10 +36,7 @@ import jalview.schemabinding.version2.MatcherSet; import jalview.schemes.FeatureColour; import jalview.util.MessageManager; import jalview.util.Platform; -import jalview.viewmodel.AlignmentViewport; import jalview.viewmodel.seqfeatures.FeatureRendererModel.FeatureSettingsBean; -import jalview.ws.DasSequenceFeatureFetcher; -import jalview.ws.dbsources.das.api.jalviewSourceI; import java.awt.BorderLayout; import java.awt.Color; @@ -74,7 +71,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.Vector; import javax.help.HelpSetException; import javax.swing.AbstractCellEditor; @@ -96,7 +92,6 @@ import javax.swing.JSlider; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; @@ -127,12 +122,6 @@ public class FeatureSettings extends JPanel private static final int MIN_HEIGHT = 400; - DasSourceBrowser dassourceBrowser; - - DasSequenceFeatureFetcher dasFeatureFetcher; - - JPanel dasSettingsPane = new JPanel(); - final FeatureRenderer fr; public final AlignFrame af; @@ -325,9 +314,6 @@ public class FeatureSettings extends JPanel // MessageManager.getString("label.feature_settings_click_drag"))); scrollPane.setViewportView(table); - dassourceBrowser = new DasSourceBrowser(this); - dasSettingsPane.add(dassourceBrowser, BorderLayout.CENTER); - if (af.getViewport().isShowSequenceFeatures() || !fr.hasRenderOrder()) { fr.findAllFeatures(true); // display everything! @@ -376,7 +362,6 @@ public class FeatureSettings extends JPanel javax.swing.event.InternalFrameEvent evt) { fr.removePropertyChangeListener(change); - dassourceBrowser.fs = null; }; }); frame.setLayer(JLayeredPane.PALETTE_LAYER); @@ -1158,8 +1143,6 @@ public class FeatureSettings extends JPanel JPanel settingsPane = new JPanel(); settingsPane.setLayout(new BorderLayout()); - dasSettingsPane.setLayout(new BorderLayout()); - JPanel bigPanel = new JPanel(); bigPanel.setLayout(new BorderLayout()); @@ -1314,38 +1297,6 @@ public class FeatureSettings extends JPanel transparency.setMaximum(70); transparency.setToolTipText( MessageManager.getString("label.transparency_tip")); - fetchDAS.setText(MessageManager.getString("label.fetch_das_features")); - fetchDAS.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - fetchDAS_actionPerformed(e); - } - }); - saveDAS.setText(MessageManager.getString("action.save_as_default")); - saveDAS.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - saveDAS_actionPerformed(e); - } - }); - - JPanel dasButtonPanel = new JPanel(); - dasButtonPanel.setBorder(BorderFactory.createEtchedBorder()); - dasSettingsPane.setBorder(null); - cancelDAS.setEnabled(false); - cancelDAS.setText(MessageManager.getString("action.cancel_fetch")); - cancelDAS.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - cancelDAS_actionPerformed(e); - } - }); JPanel transPanel = new JPanel(new GridLayout(1, 2)); bigPanel.add(transPanel, BorderLayout.SOUTH); @@ -1365,172 +1316,11 @@ public class FeatureSettings extends JPanel buttonPanel.add(loadColours); buttonPanel.add(saveColours); bigPanel.add(scrollPane, BorderLayout.CENTER); - dasSettingsPane.add(dasButtonPanel, BorderLayout.SOUTH); - dasButtonPanel.add(fetchDAS); - dasButtonPanel.add(cancelDAS); - dasButtonPanel.add(saveDAS); settingsPane.add(bigPanel, BorderLayout.CENTER); settingsPane.add(buttonPanel, BorderLayout.SOUTH); this.add(settingsPane); } - public void fetchDAS_actionPerformed(ActionEvent e) - { - fetchDAS.setEnabled(false); - cancelDAS.setEnabled(true); - dassourceBrowser.setGuiEnabled(false); - Vector selectedSources = dassourceBrowser - .getSelectedSources(); - doDasFeatureFetch(selectedSources, true, true); - } - - /** - * get the features from selectedSources for all or the current selection - * - * @param selectedSources - * @param checkDbRefs - * @param promptFetchDbRefs - */ - private void doDasFeatureFetch(List selectedSources, - boolean checkDbRefs, boolean promptFetchDbRefs) - { - SequenceI[] dataset, seqs; - int iSize; - AlignmentViewport vp = af.getViewport(); - if (vp.getSelectionGroup() != null - && vp.getSelectionGroup().getSize() > 0) - { - iSize = vp.getSelectionGroup().getSize(); - dataset = new SequenceI[iSize]; - seqs = vp.getSelectionGroup().getSequencesInOrder(vp.getAlignment()); - } - else - { - iSize = vp.getAlignment().getHeight(); - seqs = vp.getAlignment().getSequencesArray(); - } - - dataset = new SequenceI[iSize]; - for (int i = 0; i < iSize; i++) - { - dataset[i] = seqs[i].getDatasetSequence(); - } - - cancelDAS.setEnabled(true); - dasFeatureFetcher = new jalview.ws.DasSequenceFeatureFetcher(dataset, - this, selectedSources, checkDbRefs, promptFetchDbRefs); - af.getViewport().setShowSequenceFeatures(true); - af.showSeqFeatures.setSelected(true); - } - - /** - * blocking call to initialise the das source browser - */ - public void initDasSources() - { - dassourceBrowser.initDasSources(); - } - - /** - * examine the current list of das sources and return any matching the given - * nicknames in sources - * - * @param sources - * Vector of Strings to resolve to DAS source nicknames. - * @return sources that are present in source list. - */ - public List resolveSourceNicknames(Vector sources) - { - return dassourceBrowser.sourceRegistry.resolveSourceNicknames(sources); - } - - /** - * get currently selected das sources. ensure you have called initDasSources - * before calling this. - * - * @return vector of selected das source nicknames - */ - public Vector getSelectedSources() - { - return dassourceBrowser.getSelectedSources(); - } - - /** - * properly initialise DAS fetcher and then initiate a new thread to fetch - * features from the named sources (rather than any turned on by default) - * - * @param sources - * @param block - * if true then runs in same thread, otherwise passes to the Swing - * executor - */ - public void fetchDasFeatures(Vector sources, boolean block) - { - initDasSources(); - List resolved = dassourceBrowser.sourceRegistry - .resolveSourceNicknames(sources); - if (resolved.size() == 0) - { - resolved = dassourceBrowser.getSelectedSources(); - } - if (resolved.size() > 0) - { - final List dassources = resolved; - fetchDAS.setEnabled(false); - // cancelDAS.setEnabled(true); doDasFetch does this. - Runnable fetcher = new Runnable() - { - - @Override - public void run() - { - doDasFeatureFetch(dassources, true, false); - - } - }; - if (block) - { - fetcher.run(); - } - else - { - SwingUtilities.invokeLater(fetcher); - } - } - } - - public void saveDAS_actionPerformed(ActionEvent e) - { - dassourceBrowser - .saveProperties(jalview.bin.Cache.applicationProperties); - } - - public void complete() - { - fetchDAS.setEnabled(true); - cancelDAS.setEnabled(false); - dassourceBrowser.setGuiEnabled(true); - - } - - public void cancelDAS_actionPerformed(ActionEvent e) - { - if (dasFeatureFetcher != null) - { - dasFeatureFetcher.cancel(); - } - complete(); - } - - public void noDasSourceActive() - { - complete(); - JvOptionPane.showInternalConfirmDialog(Desktop.desktop, - MessageManager.getString("label.no_das_sources_selected_warn"), - MessageManager.getString("label.no_das_sources_selected_title"), - JvOptionPane.DEFAULT_OPTION, JvOptionPane.INFORMATION_MESSAGE); - } - // /////////////////////////////////////////////////////////////////////// // http://java.sun.com/docs/books/tutorial/uiswing/components/table.html // /////////////////////////////////////////////////////////////////////// diff --git a/src/jalview/gui/JDatabaseTree.java b/src/jalview/gui/JDatabaseTree.java index 1018d6e..8d62433 100644 --- a/src/jalview/gui/JDatabaseTree.java +++ b/src/jalview/gui/JDatabaseTree.java @@ -20,7 +20,6 @@ */ package jalview.gui; -import jalview.bin.Cache; import jalview.util.MessageManager; import jalview.ws.seqfetcher.DbSourceProxy; @@ -42,7 +41,6 @@ import java.util.List; import java.util.Vector; import javax.swing.JButton; -import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -518,54 +516,6 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener lstners.remove(actionListener); } - public static void main(String args[]) - { - Cache.getDasSourceRegistry(); - JDatabaseTree jdt = new JDatabaseTree(new jalview.ws.SequenceFetcher()); - JFrame foo = new JFrame(); - foo.setLayout(new BorderLayout()); - foo.add(jdt.getDatabaseSelectorButton(), BorderLayout.CENTER); - foo.pack(); - foo.setVisible(true); - int nultimes = 5; - final Thread us = Thread.currentThread(); - jdt.addActionListener(new ActionListener() - { - - @Override - public void actionPerformed(ActionEvent e) - { - us.interrupt(); - } - }); - do - { - try - { - Thread.sleep(50); - } catch (InterruptedException x) - { - nultimes--; - if (!jdt.hasSelection()) - { - System.out.println("No Selection"); - } - else - { - System.out.println("Selection: " + jdt.getSelectedItem()); - int s = 1; - for (DbSourceProxy pr : jdt.getSelectedSources()) - { - System.out.println("Source " + s++ + ": " + pr.getDbName() - + " (" + pr.getDbSource() + ") Version " - + pr.getDbVersion() + ". Test:\t" + pr.getTestQuery()); - } - System.out.println("Test queries: " + jdt.getExampleQueries()); - } - } - } while (nultimes > 0 && foo.isVisible()); - foo.setVisible(false); - } @Override public void keyPressed(KeyEvent arg0) diff --git a/src/jalview/gui/Preferences.java b/src/jalview/gui/Preferences.java index 5aab26d..7d02fac 100755 --- a/src/jalview/gui/Preferences.java +++ b/src/jalview/gui/Preferences.java @@ -168,8 +168,6 @@ public class Preferences extends GPreferences JInternalFrame frame; - DasSourceBrowser dasSource; - private WsPreferences wsPrefs; private OptionsParam promptEachTimeOpt = new OptionsParam( @@ -190,8 +188,6 @@ public class Preferences extends GPreferences super(); frame = new JInternalFrame(); frame.setContentPane(this); - dasSource = new DasSourceBrowser(); - dasTab.add(dasSource, BorderLayout.CENTER); wsPrefs = new WsPreferences(); wsTab.add(wsPrefs, BorderLayout.CENTER); int width = 500, height = 450; @@ -797,7 +793,6 @@ public class Preferences extends GPreferences Cache.applicationProperties.setProperty("PAD_GAPS", Boolean.toString(padGaps.isSelected())); - dasSource.saveProperties(Cache.applicationProperties); wsPrefs.updateAndRefreshWsMenuConfig(false); Cache.saveProperties(); Desktop.instance.doConfigureStructurePrefs(); diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index f545e70..8754fbb 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -34,7 +34,6 @@ import jalview.io.gff.SequenceOntologyI; import jalview.util.DBRefUtils; import jalview.util.MessageManager; import jalview.util.Platform; -import jalview.ws.dbsources.das.api.DasSourceRegistryI; import jalview.ws.seqfetcher.DbSourceProxy; import java.awt.BorderLayout; @@ -111,10 +110,6 @@ public class SequenceFetcher extends JPanel implements Runnable private static jalview.ws.SequenceFetcher sfetch = null; - private static long lastDasSourceRegistry = -3; - - private static DasSourceRegistryI dasRegistry = null; - private static boolean _initingFetcher = false; private static Thread initingThread = null; @@ -165,11 +160,7 @@ public class SequenceFetcher extends JPanel implements Runnable Thread.currentThread().hashCode()); } } - if (sfetch == null || dasRegistry != Cache.getDasSourceRegistry() - || lastDasSourceRegistry != (Cache.getDasSourceRegistry() - .getDasRegistryURL() - + Cache.getDasSourceRegistry().getLocalSourceString()) - .hashCode()) + if (sfetch == null) { _initingFetcher = true; initingThread = Thread.currentThread(); @@ -183,16 +174,12 @@ public class SequenceFetcher extends JPanel implements Runnable "status.init_sequence_database_fetchers"), Thread.currentThread().hashCode()); } - dasRegistry = Cache.getDasSourceRegistry(); - dasRegistry.refreshSources(); jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher(); if (guiWindow != null) { guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); } - lastDasSourceRegistry = (dasRegistry.getDasRegistryURL() - + dasRegistry.getLocalSourceString()).hashCode(); sfetch = sf; _initingFetcher = false; initingThread = null; @@ -564,15 +551,10 @@ public class SequenceFetcher extends JPanel implements Runnable dbeg.setText(MessageManager.formatMessage("label.example_query_param", new String[] { eq })); + // TODO this should be a property of the SequenceFetcher whether commas are and + // colons are allowed in the IDs... + boolean enablePunct = !(eq != null && eq.indexOf(",") > -1); - for (DbSourceProxy dbs : database.getSelectedSources()) - { - if (dbs instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) - { - enablePunct = false; - break; - } - } replacePunctuation.setEnabled(enablePunct); } catch (Exception ex) diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index 26e0919..6807382 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -264,10 +264,6 @@ public class GPreferences extends JPanel protected JCheckBox sortByTree = new JCheckBox(); - /* - * DAS Settings tab - */ - protected JPanel dasTab = new JPanel(); /* * Web Services tab @@ -326,12 +322,6 @@ public class GPreferences extends JPanel MessageManager.getString("label.editing")); /* - * See DasSourceBrowser for the real work of configuring this tab. - */ - dasTab.setLayout(new BorderLayout()); - tabbedPane.add(dasTab, MessageManager.getString("label.das_settings")); - - /* * See WsPreferences for the real work of configuring this tab. */ wsTab.setLayout(new BorderLayout()); diff --git a/src/jalview/ws/DBRefFetcher.java b/src/jalview/ws/DBRefFetcher.java index 1677eca..061e70c 100644 --- a/src/jalview/ws/DBRefFetcher.java +++ b/src/jalview/ws/DBRefFetcher.java @@ -28,15 +28,12 @@ import jalview.datamodel.DBRefSource; import jalview.datamodel.Mapping; import jalview.datamodel.SequenceI; import jalview.gui.CutAndPasteTransfer; -import jalview.gui.DasSourceBrowser; import jalview.gui.Desktop; import jalview.gui.FeatureSettings; import jalview.gui.IProgressIndicator; import jalview.gui.OOMWarning; import jalview.util.DBRefUtils; import jalview.util.MessageManager; -import jalview.ws.dbsources.das.api.jalviewSourceI; -import jalview.ws.dbsources.das.datamodel.DasSequenceSource; import jalview.ws.seqfetcher.DbSourceProxy; import java.util.ArrayList; @@ -119,7 +116,7 @@ public class DBRefFetcher implements Runnable DbSourceProxy[] sources, FeatureSettings featureSettings, boolean isNucleotide) { - listeners = new ArrayList(); + listeners = new ArrayList<>(); this.progressWindow = progressIndicatorFrame; alseqs = new SequenceI[seqs.length]; SequenceI[] ds = new SequenceI[seqs.length]; @@ -165,23 +162,7 @@ public class DBRefFetcher implements Runnable { // af.featureSettings_actionPerformed(null); String[] defdb = null; - List selsources = new ArrayList(); - Vector dasselsrc = (featureSettings != null) - ? featureSettings.getSelectedSources() - : new DasSourceBrowser().getSelectedSources(); - - for (jalviewSourceI src : dasselsrc) - { - List sp = src.getSequenceSourceProxies(); - if (sp != null) - { - selsources.addAll(sp); - if (sp.size() > 1) - { - Cache.log.debug("Added many Db Sources for :" + src.getTitle()); - } - } - } + List selsources = new ArrayList<>(); // select appropriate databases based on alignFrame context. if (forNucleotide) { @@ -191,7 +172,7 @@ public class DBRefFetcher implements Runnable { defdb = DBRefSource.PROTEINDBS; } - List srces = new ArrayList(); + List srces = new ArrayList<>(); for (String ddb : defdb) { List srcesfordb = sfetcher.getSourceProxy(ddb); @@ -235,30 +216,6 @@ public class DBRefFetcher implements Runnable } /** - * retrieve all the das sequence sources and add them to the list of db - * sources to retrieve from - */ - public void appendAllDasSources() - { - if (dbSources == null) - { - dbSources = new DbSourceProxy[0]; - } - // append additional sources - DbSourceProxy[] otherdb = sfetcher - .getDbSourceProxyInstances(DasSequenceSource.class); - if (otherdb != null && otherdb.length > 0) - { - DbSourceProxy[] newsrc = new DbSourceProxy[dbSources.length - + otherdb.length]; - System.arraycopy(dbSources, 0, newsrc, 0, dbSources.length); - System.arraycopy(otherdb, 0, newsrc, dbSources.length, - otherdb.length); - dbSources = newsrc; - } - } - - /** * start the fetcher thread * * @param waitTillFinished @@ -311,14 +268,14 @@ public class DBRefFetcher implements Runnable } else if (seqs == null) { - seqs = new Vector(); + seqs = new Vector<>(); seqs.addElement(seq); } } else { - seqs = new Vector(); + seqs = new Vector<>(); seqs.addElement(seq); } @@ -357,9 +314,9 @@ public class DBRefFetcher implements Runnable e.printStackTrace(); } - Vector sdataset = new Vector( + Vector sdataset = new Vector<>( Arrays.asList(dataset)); - List warningMessages = new ArrayList(); + List warningMessages = new ArrayList<>(); int db = 0; while (sdataset.size() > 0 && db < dbSources.length) @@ -371,8 +328,8 @@ public class DBRefFetcher implements Runnable SequenceI[] currSeqs = new SequenceI[sdataset.size()]; sdataset.copyInto(currSeqs);// seqs that are to be validated against // dbSources[db] - Vector queries = new Vector(); // generated queries curSeq - seqRefs = new Hashtable>(); + Vector queries = new Vector<>(); // generated queries curSeq + seqRefs = new Hashtable<>(); int seqIndex = 0; @@ -574,7 +531,7 @@ public class DBRefFetcher implements Runnable { // Work out which sequences this sequence matches, // taking into account all accessionIds and names in the file - Vector sequenceMatches = new Vector(); + Vector sequenceMatches = new Vector<>(); // look for corresponding accession ids DBRefEntry[] entryRefs = DBRefUtils .selectRefs(retrievedSeq.getDBRefs(), new String[] @@ -826,7 +783,7 @@ public class DBRefFetcher implements Runnable */ private SequenceI[] recoverDbSequences(SequenceI[] sequencesArray) { - Vector nseq = new Vector(); + Vector nseq = new Vector<>(); for (int i = 0; sequencesArray != null && i < sequencesArray.length; i++) { diff --git a/src/jalview/ws/DasSequenceFeatureFetcher.java b/src/jalview/ws/DasSequenceFeatureFetcher.java deleted file mode 100644 index c661e2c..0000000 --- a/src/jalview/ws/DasSequenceFeatureFetcher.java +++ /dev/null @@ -1,925 +0,0 @@ -/* - * 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; - -import jalview.bin.Cache; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.DBRefSource; -import jalview.datamodel.SequenceFeature; -import jalview.datamodel.SequenceI; -import jalview.gui.AlignFrame; -import jalview.gui.Desktop; -import jalview.gui.FeatureSettings; -import jalview.gui.JvOptionPane; -import jalview.util.DBRefUtils; -import jalview.util.MessageManager; -import jalview.util.UrlLink; -import jalview.ws.dbsources.das.api.DasSourceRegistryI; -import jalview.ws.dbsources.das.api.jalviewSourceI; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.biodas.jdas.client.FeaturesClient; -import org.biodas.jdas.client.adapters.features.DasGFFAdapter; -import org.biodas.jdas.client.adapters.features.DasGFFAdapter.GFFAdapter; -import org.biodas.jdas.client.threads.FeaturesClientMultipleSources; -import org.biodas.jdas.schema.features.ERRORSEGMENT; -import org.biodas.jdas.schema.features.FEATURE; -import org.biodas.jdas.schema.features.LINK; -import org.biodas.jdas.schema.features.SEGMENT; -import org.biodas.jdas.schema.features.TYPE; -import org.biodas.jdas.schema.features.UNKNOWNFEATURE; -import org.biodas.jdas.schema.features.UNKNOWNSEGMENT; -import org.biodas.jdas.schema.sources.COORDINATES; - -/** - * DOCUMENT ME! - * - * @author $author$ - * @version $Revision$ - */ -public class DasSequenceFeatureFetcher -{ - SequenceI[] sequences; - - AlignFrame af; - - FeatureSettings fsettings; - - StringBuffer sbuffer = new StringBuffer(); - - List selectedSources; - - boolean cancelled = false; - - private void debug(String mesg) - { - debug(mesg, null); - } - - private void debug(String mesg, Exception e) - { - if (Cache.log != null) - { - Cache.log.debug(mesg, e); - } - else - { - System.err.println(mesg); - if (e != null) - { - e.printStackTrace(); - } - } - } - - long startTime; - - private DasSourceRegistryI sourceRegistry; - - private boolean useJDASMultiThread = true; - - /** - * Creates a new SequenceFeatureFetcher object. Uses default - * - * @param align - * DOCUMENT ME! - * @param ap - * DOCUMENT ME! - */ - public DasSequenceFeatureFetcher(SequenceI[] sequences, - FeatureSettings fsettings, Vector selectedSources) - { - this(sequences, fsettings, selectedSources, true, true, true); - } - - public DasSequenceFeatureFetcher(SequenceI[] oursequences, - FeatureSettings fsettings, List selectedSources2, - boolean checkDbrefs, boolean promptFetchDbrefs) - { - this(oursequences, fsettings, selectedSources2, checkDbrefs, - promptFetchDbrefs, true); - } - - public DasSequenceFeatureFetcher(SequenceI[] oursequences, - FeatureSettings fsettings, List selectedSources2, - boolean checkDbrefs, boolean promptFetchDbrefs, - boolean useJDasMultiThread) - { - this.useJDASMultiThread = useJDasMultiThread; - this.selectedSources = new ArrayList<>(); - // filter both sequences and sources to eliminate duplicates - for (jalviewSourceI src : selectedSources2) - { - if (!selectedSources.contains(src)) - { - selectedSources.add(src); - } - ; - } - Vector sqs = new Vector(); - for (int i = 0; i < oursequences.length; i++) - { - if (!sqs.contains(oursequences[i])) - { - sqs.addElement(oursequences[i]); - } - } - sequences = new SequenceI[sqs.size()]; - for (int i = 0; i < sequences.length; i++) - { - sequences[i] = (SequenceI) sqs.elementAt(i); - } - if (fsettings != null) - { - this.fsettings = fsettings; - this.af = fsettings.af; - af.setShowSeqFeatures(true); - } - int uniprotCount = 0; - for (jalviewSourceI source : selectedSources) - { - for (COORDINATES coords : source.getVersion().getCOORDINATES()) - { - // TODO: match UniProt coord system canonically (?) - does - // UniProt==uniprot==UNIPROT ? - if (coords.getAuthority().toLowerCase().equals("uniprot")) - { - uniprotCount++; - break; - } - } - } - - int refCount = 0; - for (int i = 0; i < sequences.length; i++) - { - DBRefEntry[] dbref = sequences[i].getDBRefs(); - if (dbref != null) - { - for (int j = 0; j < dbref.length; j++) - { - if (dbref[j].getSource().equals(DBRefSource.UNIPROT)) - { - refCount++; - break; - } - } - } - } - - if (checkDbrefs && refCount < sequences.length && uniprotCount > 0) - { - - int reply = JvOptionPane.YES_OPTION; - if (promptFetchDbrefs) - { - reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop, - MessageManager.getString( - "info.you_want_jalview_to_find_uniprot_accessions"), - MessageManager - .getString("label.find_uniprot_accession_ids"), - JvOptionPane.YES_NO_OPTION, JvOptionPane.QUESTION_MESSAGE); - } - - if (reply == JvOptionPane.YES_OPTION) - { - Thread thread = new Thread(new FetchDBRefs()); - thread.start(); - } - else - { - _startFetching(); - } - } - else - { - _startFetching(); - } - - } - - private void _startFetching() - { - running = true; - new Thread(new FetchSeqFeatures()).start(); - } - - class FetchSeqFeatures implements Runnable - { - @Override - public void run() - { - startFetching(); - setGuiFetchComplete(); - } - } - - class FetchDBRefs implements Runnable - { - @Override - public void run() - { - running = true; - boolean isNucleotide = af.getViewport().getAlignment().isNucleotide(); - new DBRefFetcher(sequences, af, null, af.featureSettings, - isNucleotide).fetchDBRefs(true); - - startFetching(); - setGuiFetchComplete(); - } - } - - /** - * Spawns Fetcher threads to add features to sequences in the dataset - */ - void startFetching() - { - running = true; - cancelled = false; - startTime = System.currentTimeMillis(); - if (af != null) - { - af.setProgressBar(MessageManager.getString( - "status.fetching_das_sequence_features"), startTime); - } - if (sourceRegistry == null) - { - sourceRegistry = Cache.getDasSourceRegistry(); - } - if (selectedSources == null || selectedSources.size() == 0) - { - try - { - jalviewSourceI[] sources = sourceRegistry.getSources() - .toArray(new jalviewSourceI[0]); - String active = Cache.getDefault("DAS_ACTIVE_SOURCE", "uniprot"); - StringTokenizer st = new StringTokenizer(active, "\t"); - selectedSources = new Vector(); - String token; - while (st.hasMoreTokens()) - { - token = st.nextToken(); - for (int i = 0; i < sources.length; i++) - { - if (sources[i].getTitle().equals(token)) - { - selectedSources.add(sources[i]); - break; - } - } - } - } catch (Exception ex) - { - debug("Exception whilst setting default feature sources from registry and local preferences.", - ex); - } - } - - if (selectedSources == null || selectedSources.size() == 0) - { - System.out.println("No DAS Sources active"); - cancelled = true; - setGuiNoDassourceActive(); - return; - } - - sourcesRemaining = selectedSources.size(); - FeaturesClientMultipleSources fc = new FeaturesClientMultipleSources(); - fc.setConnProps(sourceRegistry.getSessionHandler()); - // Now sending requests one at a time to each server - ArrayList srcobj = new ArrayList<>(); - ArrayList src = new ArrayList<>(); - List> ids = new ArrayList<>(); - List> idobj = new ArrayList<>(); - List> sqset = new ArrayList<>(); - for (jalviewSourceI _sr : selectedSources) - { - - Map slist = new HashMap<>(); - List idob = new ArrayList<>(); - List qset = new ArrayList<>(); - - for (SequenceI seq : sequences) - { - Object[] idset = nextSequence(_sr, seq); - if (idset != null) - { - List _idob = (List) idset[0]; - List _qset = (List) idset[1]; - if (_idob.size() > 0) - { - // add sequence's ref for each id derived from it - // (space inefficient, but most unambiguous) - // could replace with hash with _qset values as keys. - Iterator dbobj = _idob.iterator(); - for (String q : _qset) - { - SequenceI osq = slist.get(q); - DBRefEntry dr = dbobj.next(); - if (osq != null && osq != seq) - { - // skip - non-canonical query - } - else - { - idob.add(dr); - qset.add(q); - slist.put(q, seq); - } - } - } - } - } - if (idob.size() > 0) - { - srcobj.add(_sr); - src.add(_sr.getSourceURL()); - ids.add(qset); - idobj.add(idob); - sqset.add(slist); - } - } - Map, Exception>> errors = new HashMap<>(); - Map, DasGFFAdapter>> results = new HashMap<>(); - if (!useJDASMultiThread) - { - Iterator sources = src.iterator(); - // iterate over each query for each source and do each one individually - for (List idl : ids) - { - String source = sources.next(); - FeaturesClient featuresc = new FeaturesClient( - sourceRegistry.getSessionHandler() - .getConnectionPropertyProviderFor(source)); - for (String id : idl) - { - List qid = Arrays.asList(new String[] { id }); - try - { - DasGFFAdapter dga = featuresc.fetchData(source, qid); - Map, DasGFFAdapter> ers = results.get(source); - if (ers == null) - { - results.put(source, - ers = new HashMap<>()); - } - ers.put(qid, dga); - } catch (Exception ex) - { - Map, Exception> ers = errors.get(source); - if (ers == null) - { - errors.put(source, - ers = new HashMap<>()); - } - ers.put(qid, ex); - } - } - } - } - else - { - // pass them all at once - fc.fetchData(src, ids, false, results, errors); - fc.shutDown(); - while (!fc.isTerminated()) - { - try - { - Thread.sleep(200); - } catch (InterruptedException x) - { - - } - } - } - Iterator> idset = ids.iterator(); - Iterator> idobjset = idobj.iterator(); - Iterator> seqset = sqset.iterator(); - for (jalviewSourceI source : srcobj) - { - processResponse(seqset.next(), source, idset.next(), idobjset.next(), - results.get(source.getSourceURL()), - errors.get(source.getSourceURL())); - } - } - - private void processResponse(Map sequencemap, - jalviewSourceI jvsource, List ids, List idobj, - Map, DasGFFAdapter> results, - Map, Exception> errors) - { - Set sequences = new HashSet<>(); - String source = jvsource.getSourceURL(); - // process features - DasGFFAdapter result = (results == null) ? null : results.get(ids); - Exception error = (errors == null) ? null : errors.get(ids); - if (result == null) - { - debug("das source " + source + " could not be contacted. " - + (error == null ? "" : error.toString())); - } - else - { - - GFFAdapter gff = result.getGFF(); - List segments = gff.getSegments(); - List errorsegs = gff.getErrorSegments(); - List unkfeats = gff.getUnknownFeatures(); - List unksegs = gff.getUnknownSegments(); - debug("das source " + source + " returned " + gff.getTotal() - + " responses. " + (errorsegs != null ? errorsegs.size() : 0) - + " were incorrect segment queries, " - + (unkfeats != null ? unkfeats.size() : 0) - + " were unknown features " - + (unksegs != null ? unksegs.size() : 0) - + " were unknown segments and " - + (segments != null ? segments.size() : 0) - + " were segment responses."); - Iterator dbr = idobj.iterator(); - if (segments != null) - { - for (SEGMENT seg : segments) - { - String id = seg.getId(); - if (ids.indexOf(id) == -1) - { - id = id.toUpperCase(); - } - DBRefEntry dbref = idobj.get(ids.indexOf(id)); - SequenceI sequence = sequencemap.get(id); - boolean added = false; - sequences.add(sequence); - - for (FEATURE feat : seg.getFEATURE()) - { - // standard DAS feature-> jalview sequence feature transformation - SequenceFeature f = newSequenceFeature(feat, - jvsource.getTitle()); - if (!parseSeqFeature(sequence, f, feat, jvsource)) - { - if (dbref.getMap() != null && f.getBegin() > 0 - && f.getEnd() > 0) - { - debug("mapping from " + f.getBegin() + " - " + f.getEnd()); - SequenceFeature vf[] = null; - - try - { - vf = dbref.getMap().locateFeature(f); - } catch (Exception ex) - { - Cache.log.warn( - "Error in 'experimental' mapping of features. Please try to reproduce and then report info to jalview-discuss@jalview.org."); - Cache.log.warn("Mapping feature from " + f.getBegin() - + " to " + f.getEnd() + " in dbref " - + dbref.getAccessionId() + " in " - + dbref.getSource()); - Cache.log.warn("using das Source " + source); - Cache.log.warn("Exception", ex); - } - - if (vf != null) - { - for (int v = 0; v < vf.length; v++) - { - debug("mapping to " + v + ": " + vf[v].getBegin() - + " - " + vf[v].getEnd()); - sequence.addSequenceFeature(vf[v]); - } - } - } - else - { - sequence.addSequenceFeature(f); - } - } - } - } - featuresAdded(sequences); - } - else - { - // System.out.println("No features found for " + seq.getName() - // + " from: " + e.getDasSource().getNickname()); - } - } - } - - private void setGuiNoDassourceActive() - { - - if (af != null) - { - af.setProgressBar( - MessageManager.getString("status.no_das_sources_active"), - startTime); - } - if (getFeatSettings() != null) - { - fsettings.noDasSourceActive(); - } - } - - /** - * Update our fsettings dialog reference if we didn't have one when we were - * first initialised. - * - * @return fsettings - */ - private FeatureSettings getFeatSettings() - { - if (fsettings == null) - { - if (af != null) - { - fsettings = af.featureSettings; - } - } - return fsettings; - } - - public void cancel() - { - if (af != null) - { - af.setProgressBar(MessageManager.getString( - "status.das_feature_fetching_cancelled"), startTime); - } - cancelled = true; - } - - int sourcesRemaining = 0; - - private boolean running = false; - - private void setGuiFetchComplete() - { - running = false; - if (!cancelled && af != null) - { - // only update the progress bar if we've completed the fetch normally - af.setProgressBar(MessageManager.getString( - "status.das_feature_fetching_complete"), startTime); - } - - if (af != null && af.featureSettings != null) - { - af.featureSettings.discoverAllFeatureData(); - } - - if (getFeatSettings() != null) - { - fsettings.complete(); - } - } - - void featuresAdded(Set seqs) - { - if (af == null) - { - // no gui to update with features. - return; - } - af.getFeatureRenderer().featuresAdded(); - - int start = af.getViewport().getRanges().getStartSeq(); - int end = af.getViewport().getRanges().getEndSeq(); - int index; - for (index = start; index < end; index++) - { - for (SequenceI seq : seqs) - { - if (seq == af.getViewport().getAlignment().getSequenceAt(index) - .getDatasetSequence()) - { - af.alignPanel.paintAlignment(true, true); - index = end; - break; - } - } - } - } - - Object[] nextSequence(jalviewSourceI dasSource, SequenceI seq) - { - if (cancelled) - { - return null; - } - DBRefEntry[] uprefs = DBRefUtils.selectRefs(seq.getDBRefs(), - new String[] - { - // jalview.datamodel.DBRefSource.PDB, - DBRefSource.UNIPROT, - // jalview.datamodel.DBRefSource.EMBL - not tested on any EMBL coord - // sys sources - }); - // TODO: minimal list of DAS queries to make by querying with untyped ID if - // distinct from any typed IDs - - List ids = new ArrayList<>(); - List qstring = new ArrayList<>(); - boolean dasCoordSysFound = false; - - if (uprefs != null) - { - // do any of these ids match the source's coordinate system ? - for (int j = 0; !dasCoordSysFound && j < uprefs.length; j++) - { - - for (COORDINATES csys : dasSource.getVersion().getCOORDINATES()) - { - if (DBRefUtils.isDasCoordinateSystem(csys.getAuthority(), - uprefs[j])) - { - debug("Launched fetcher for coordinate system " - + csys.getAuthority()); - // Will have to pass any mapping information to the fetcher - // - the start/end for the DBRefEntry may not be the same as the - // sequence's start/end - - System.out.println( - seq.getName() + " " + (seq.getDatasetSequence() == null) - + " " + csys.getUri()); - - dasCoordSysFound = true; // break's out of the loop - ids.add(uprefs[j]); - qstring.add(uprefs[j].getAccessionId()); - } - else - { - System.out.println("IGNORE " + csys.getAuthority()); - } - } - } - } - - if (!dasCoordSysFound) - { - String id = null; - // try and use the name as the sequence id - if (seq.getName().indexOf("|") > -1) - { - id = seq.getName().substring(seq.getName().lastIndexOf("|") + 1); - if (id.trim().length() < 4) - { - // hack - we regard a significant ID as being at least 4 - // non-whitespace characters - id = seq.getName().substring(0, seq.getName().lastIndexOf("|")); - if (id.indexOf("|") > -1) - { - id = id.substring(id.lastIndexOf("|") + 1); - } - } - } - else - { - id = seq.getName(); - } - if (id != null) - { - DBRefEntry dbre = new DBRefEntry(); - dbre.setAccessionId(id); - // Should try to call a general feature fetcher that - // queries many sources with name to discover applicable ID references - ids.add(dbre); - qstring.add(dbre.getAccessionId()); - } - } - - return new Object[] { ids, qstring }; - } - - /** - * examine the given sequence feature to determine if it should actually be - * turned into sequence annotation or database cross references rather than a - * simple sequence feature. - * - * @param seq - * the sequence to annotate - * @param f - * the jalview sequence feature generated from the DAS feature - * @param map - * the sequence feature attributes - * @param source - * the source that emitted the feature - * @return true if feature was consumed as another kind of annotation. - */ - protected boolean parseSeqFeature(SequenceI seq, SequenceFeature f, - FEATURE feature, jalviewSourceI source) - { - SequenceI mseq = seq; - while (seq.getDatasetSequence() != null) - { - seq = seq.getDatasetSequence(); - } - if (f.getType() != null) - { - String type = f.getType(); - if (type.equalsIgnoreCase("protein_name")) - { - // parse name onto the alignment sequence or the dataset sequence. - if (seq.getDescription() == null - || seq.getDescription().trim().length() == 0) - { - // could look at the note series to pick out the first long name, for - // the moment just use the whole description string - seq.setDescription(f.getDescription()); - } - if (mseq.getDescription() == null - || mseq.getDescription().trim().length() == 0) - { - // could look at the note series to pick out the first long name, for - // the moment just use the whole description string - mseq.setDescription(f.getDescription()); - } - return true; - } - // check if source has biosapiens or other sequence ontology label - if (type.equalsIgnoreCase("DBXREF") || type.equalsIgnoreCase("DBREF")) - { - // try to parse the accession out - - DBRefEntry dbr = new DBRefEntry(); - dbr.setVersion(source.getTitle()); - StringTokenizer st = new StringTokenizer(f.getDescription(), ":"); - if (st.hasMoreTokens()) - { - dbr.setSource(st.nextToken()); - } - if (st.hasMoreTokens()) - { - dbr.setAccessionId(st.nextToken()); - } - seq.addDBRef(dbr); - - if (f.links != null && f.links.size() > 0) - { - // feature is also appended to enable links to be seen. - // TODO: consider extending dbrefs to have their own links ? - // TODO: new feature: extract dbref links from DAS servers and add the - // URL pattern to the list of DB name associated links in the user's - // preferences ? - // for the moment - just fix up the existing feature so it displays - // correctly. - // f.setType(dbr.getSource()); - // f.setDescription(); - f.setValue("linkonly", Boolean.TRUE); - // f.setDescription(""); - Vector newlinks = new Vector(); - Enumeration it = f.links.elements(); - while (it.hasMoreElements()) - { - String elm; - UrlLink urllink = new UrlLink(elm = (String) it.nextElement()); - if (urllink.isValid()) - { - urllink.setLabel(f.getDescription()); - newlinks.addElement(urllink.toString()); - } - else - { - // couldn't parse the link properly. Keep it anyway - just in - // case. - debug("couldn't parse link string - " + elm); - newlinks.addElement(elm); - } - } - f.links = newlinks; - seq.addSequenceFeature(f); - } - return true; - } - } - return false; - } - - /** - * creates a jalview sequence feature from a das feature document - * - * @param feat - * @return sequence feature object created using dasfeature information - */ - SequenceFeature newSequenceFeature(FEATURE feat, String nickname) - { - if (feat == null) - { - return null; - } - try - { - /** - * Different qNames for a DAS Feature - are string keys to the HashMaps in - * features "METHOD") || qName.equals("TYPE") || qName.equals("START") || - * qName.equals("END") || qName.equals("NOTE") || qName.equals("LINK") || - * qName.equals("SCORE") - */ - String desc = new String(); - if (feat.getNOTE() != null) - { - for (String note : feat.getNOTE()) - { - desc += note; - } - } - - int start = 0, end = 0; - float score = 0f; - - try - { - start = Integer.parseInt(feat.getSTART().toString()); - } catch (Exception ex) - { - } - try - { - end = Integer.parseInt(feat.getEND().toString()); - } catch (Exception ex) - { - } - try - { - Object scr = feat.getSCORE(); - if (scr != null) - { - score = (float) Double.parseDouble(scr.toString()); - - } - } catch (Exception ex) - { - } - - SequenceFeature f = new SequenceFeature(getTypeString(feat.getTYPE()), - desc, start, end, score, nickname); - - if (feat.getLINK() != null) - { - for (LINK link : feat.getLINK()) - { - // Do not put feature extent in link text for non-positional features - if (f.begin == 0 && f.end == 0) - { - f.addLink(f.getType() + " " + link.getContent() + "|" - + link.getHref()); - } - else - { - f.addLink(f.getType() + " " + f.begin + "_" + f.end + " " - + link.getContent() + "|" + link.getHref()); - } - } - } - - return f; - } catch (Exception e) - { - System.out.println("ERRR " + e); - e.printStackTrace(); - System.out.println("############"); - debug("Failed to parse " + feat.toString(), e); - return null; - } - } - - private String getTypeString(TYPE type) - { - return type.getContent(); - } - - public boolean isRunning() - { - return running; - } - -} diff --git a/src/jalview/ws/SequenceFetcher.java b/src/jalview/ws/SequenceFetcher.java index a0b77de..29d4ec7 100644 --- a/src/jalview/ws/SequenceFetcher.java +++ b/src/jalview/ws/SequenceFetcher.java @@ -29,12 +29,10 @@ import jalview.ws.dbsources.PfamFull; import jalview.ws.dbsources.PfamSeed; import jalview.ws.dbsources.RfamSeed; import jalview.ws.dbsources.Uniprot; -import jalview.ws.dbsources.das.api.jalviewSourceI; import jalview.ws.seqfetcher.ASequenceFetcher; import jalview.ws.seqfetcher.DbSourceProxy; import java.util.ArrayList; -import java.util.List; /** * This implements the run-time discovery of sequence database clients. @@ -50,11 +48,6 @@ public class SequenceFetcher extends ASequenceFetcher */ public SequenceFetcher() { - this(true); - } - - public SequenceFetcher(boolean addDas) - { addDBRefSourceImpl(EnsemblGene.class); addDBRefSourceImpl(EnsemblGenomes.class); addDBRefSourceImpl(EmblSource.class); @@ -64,26 +57,19 @@ public class SequenceFetcher extends ASequenceFetcher addDBRefSourceImpl(PfamFull.class); addDBRefSourceImpl(PfamSeed.class); addDBRefSourceImpl(RfamSeed.class); - - if (addDas) - { - registerDasSequenceSources(); - } } /** - * return an ordered list of database sources where non-das database classes - * appear before das database classes + * return an ordered list of database sources excluding alignment only databases */ public String[] getOrderedSupportedSources() { String[] srcs = this.getSupportedDb(); - ArrayList dassrc = new ArrayList(), - nondas = new ArrayList(); + ArrayList src = new ArrayList<>(); + for (int i = 0; i < srcs.length; i++) { - boolean das = false, skip = false; - String nm; + boolean skip = false; for (DbSourceProxy dbs : getSourceProxy(srcs[i])) { // Skip the alignment databases for the moment - they're not useful for @@ -92,86 +78,28 @@ public class SequenceFetcher extends ASequenceFetcher { skip = true; } - else - { - nm = dbs.getDbName(); - if (getSourceProxy( - srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) - { - if (nm.startsWith("das:")) - { - nm = nm.substring(4); - das = true; - } - break; - } - } } if (skip) { continue; } - if (das) { - dassrc.add(srcs[i]); - } - else - { - nondas.add(srcs[i]); + src.add(srcs[i]); } } - String[] tosort = nondas.toArray(new String[0]), - sorted = nondas.toArray(new String[0]); + String[] tosort = src.toArray(new String[0]), + sorted = src.toArray(new String[0]); for (int j = 0, jSize = sorted.length; j < jSize; j++) { tosort[j] = tosort[j].toLowerCase(); } jalview.util.QuickSort.sort(tosort, sorted); // construct array with all sources listed - - srcs = new String[sorted.length + dassrc.size()]; int i = 0; for (int j = sorted.length - 1; j >= 0; j--, i++) { srcs[i] = sorted[j]; - sorted[j] = null; - } - - sorted = dassrc.toArray(new String[0]); - tosort = dassrc.toArray(new String[0]); - for (int j = 0, jSize = sorted.length; j < jSize; j++) - { - tosort[j] = tosort[j].toLowerCase(); - } - jalview.util.QuickSort.sort(tosort, sorted); - for (int j = sorted.length - 1; j >= 0; j--, i++) - { - srcs[i] = sorted[j]; } return srcs; } - - /** - * query the currently defined DAS source registry for sequence sources and - * add a DasSequenceSource instance for each source to the SequenceFetcher - * source list. - */ - public void registerDasSequenceSources() - { - // TODO: define a context as a registry provider (either desktop, - // jalview.bin.cache, or something else). - for (jalviewSourceI source : jalview.bin.Cache.getDasSourceRegistry() - .getSources()) - { - if (source.isSequenceSource()) - { - List dassources = source.getSequenceSourceProxies(); - for (DbSourceProxy seqsrc : dassources) - { - addDbRefSourceImpl(seqsrc); - } - } - } - } - } diff --git a/src/jalview/ws/dbsources/das/api/DasSourceRegistryI.java b/src/jalview/ws/dbsources/das/api/DasSourceRegistryI.java deleted file mode 100644 index 55c50b2..0000000 --- a/src/jalview/ws/dbsources/das/api/DasSourceRegistryI.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.das.api; - -import java.util.List; - -import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI; - -/** - * API for a registry that provides datasources that jalview can access - * - * @author jprocter - * - */ -public interface DasSourceRegistryI -{ - - List getSources(); - - String getDasRegistryURL(); - - jalviewSourceI getSource(String nickname); - - // TODO: re JAL-424 - introduce form where local source is queried for - // metadata, rather than have it all provided by caller. - jalviewSourceI createLocalSource(String uri, String name, - boolean sequence, boolean features); - - boolean removeLocalSource(jalviewSourceI source); - - void refreshSources(); - - String getLocalSourceString(); - - List resolveSourceNicknames(List sources); - - // TODO: refactor to jDAS specific interface - MultipleConnectionPropertyProviderI getSessionHandler(); -} diff --git a/src/jalview/ws/dbsources/das/api/jalviewSourceI.java b/src/jalview/ws/dbsources/das/api/jalviewSourceI.java deleted file mode 100644 index bc3c8ea..0000000 --- a/src/jalview/ws/dbsources/das/api/jalviewSourceI.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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.das.api; - -import jalview.ws.seqfetcher.DbSourceProxy; - -import java.util.List; - -import org.biodas.jdas.schema.sources.MAINTAINER; -import org.biodas.jdas.schema.sources.VERSION; - -public interface jalviewSourceI -{ - - String getTitle(); - - VERSION getVersion(); - - String getDocHref(); - - String getDescription(); - - String getUri(); - - MAINTAINER getMAINTAINER(); - - String getEmail(); - - boolean isLocal(); - - boolean isSequenceSource(); - - String[] getCapabilityList(VERSION v); - - String[] getLabelsFor(VERSION v); - - /** - * - * @return null if not a sequence source, otherwise a series of database - * sources that can be used to retrieve sequence data for particular - * database coordinate systems - */ - List getSequenceSourceProxies(); - - boolean isFeatureSource(); - - /** - * returns the base URL for the latest version of a source's DAS endpoint set - * - * @return - */ - String getSourceURL(); - - /** - * test to see if this source's latest version is older than the given source - * - * @param jalviewSourceI - * @return true if newer than given source - */ - boolean isNewerThan(jalviewSourceI jalviewSourceI); - - /** - * test if the source is a reference source for the authority - * - * @return - */ - boolean isReferenceSource(); - -} diff --git a/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java b/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java deleted file mode 100644 index 84f6d4d..0000000 --- a/src/jalview/ws/dbsources/das/datamodel/DasSequenceSource.java +++ /dev/null @@ -1,354 +0,0 @@ -/* - * 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.das.datamodel; - -import jalview.bin.Cache; -import jalview.datamodel.Alignment; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.Sequence; -import jalview.datamodel.SequenceI; -import jalview.util.MessageManager; -import jalview.ws.dbsources.das.api.jalviewSourceI; -import jalview.ws.seqfetcher.DbSourceProxy; -import jalview.ws.seqfetcher.DbSourceProxyImpl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.biodas.jdas.client.SequenceClient; -import org.biodas.jdas.client.adapters.sequence.DasSequenceAdapter; -import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI; -import org.biodas.jdas.client.threads.SequenceClientMultipleSources; -import org.biodas.jdas.schema.sequence.SEQUENCE; -import org.biodas.jdas.schema.sources.COORDINATES; -import org.biodas.jdas.schema.sources.SOURCE; -import org.biodas.jdas.schema.sources.VERSION; - -import com.stevesoft.pat.Regex; - -/** - * an instance of this class is created for each unique DAS Sequence source (ie - * one capable of handling the 'sequence' for a particular MapMaster) - * - * @author JimP - * - */ -public class DasSequenceSource extends DbSourceProxyImpl - implements DbSourceProxy -{ - private jalviewSourceI jsrc; - - protected SOURCE source = null; - - protected VERSION version = null; - - protected COORDINATES coordsys = null; - - protected String dbname = "DASCS"; - - protected String dbrefname = "das:source"; - - protected MultipleConnectionPropertyProviderI connprops = null; - - /** - * DAS sources are tier 1 - if we have a direct DB connection then we should - * prefer it - */ - private int tier = 1; - - /** - * create a new DbSource proxy for a DAS 1 source - * - * @param dbnbame - * Human Readable Name to use when fetching from this source - * @param dbrefname - * DbRefName for DbRefs attached to sequences retrieved from this - * source - * @param source - * Das1Source - * @param coordsys - * specific coordinate system to use for this source - * @throws Exception - * if source is not capable of the 'sequence' command - */ - public DasSequenceSource(String dbname, String dbrefname, SOURCE source, - VERSION version, COORDINATES coordsys, - MultipleConnectionPropertyProviderI connprops) throws Exception - { - if (!(jsrc = new JalviewSource(source, connprops, false)) - .isSequenceSource()) - { - throw new Exception(MessageManager.formatMessage( - "exception.das_source_doesnt_support_sequence_command", - new String[] - { source.getTitle() })); - } - this.tier = 1 + ((jsrc.isLocal() || jsrc.isReferenceSource()) ? 0 : 1); - this.source = source; - this.dbname = dbname; - this.dbrefname = dbrefname.toUpperCase(); - if (coordsys != null) - { - this.coordsys = coordsys; - } - this.connprops = connprops; - } - - public String getAccessionSeparator() - { - return "\t"; - } - - public Regex getAccessionValidator() - { - /** ? * */ - return Regex.perlCode("m/([^:]+)(:\\d+,\\d+)?/"); - } - - public String getDbName() - { - // TODO: map to - return dbname + " (DAS)"; - } - - public String getDbSource() - { - return dbrefname; - } - - public String getDbVersion() - { - return coordsys != null ? coordsys.getVersion() : ""; - } - - public AlignmentI getSequenceRecords(String queries) throws Exception - { - StringTokenizer st = new StringTokenizer(queries, "\t"); - List toks = new ArrayList(), - src = new ArrayList(), acIds = new ArrayList(); - while (st.hasMoreTokens()) - { - String t; - toks.add(t = st.nextToken()); - acIds.add(t.replaceAll(":[0-9,]+", "")); - } - src.add(jsrc.getSourceURL()); - Map, DasSequenceAdapter>> resultset = new HashMap, DasSequenceAdapter>>(); - Map, Exception>> errors = new HashMap, Exception>>(); - - // First try multiple sources - boolean multiple = true, retry = false; - do - { - if (!multiple) - { - retry = false; - // slow, fetch one at a time. - for (String sr : src) - { - System.err.println( - "Retrieving IDs individually from das source: " + sr); - org.biodas.jdas.client.SequenceClient sq = new SequenceClient( - connprops.getConnectionPropertyProviderFor(sr)); - for (String q : toks) - { - List qset = Arrays.asList(new String[] { q }); - try - { - DasSequenceAdapter s = sq.fetchData(sr, qset); - Map, DasSequenceAdapter> dss = resultset.get(sr); - if (dss == null) - { - resultset.put(sr, - dss = new HashMap, DasSequenceAdapter>()); - } - dss.put(qset, s); - } catch (Exception x) - { - Map, Exception> ers = errors.get(sr); - if (ers == null) - { - errors.put(sr, - ers = new HashMap, Exception>()); - } - ers.put(qset, x); - } - } - } - } - else - { - SequenceClientMultipleSources sclient; - sclient = new SequenceClientMultipleSources(); - sclient.fetchData(src, toks, resultset, errors); - sclient.shutDown(); - while (!sclient.isTerminated()) - { - try - { - Thread.sleep(200); - - } catch (InterruptedException x) - { - } - } - if (resultset.isEmpty() && !errors.isEmpty()) - { - retry = true; - multiple = false; - } - } - } while (retry); - - if (resultset.isEmpty()) - { - System.err.println("Sequence Query to " + jsrc.getTitle() + " with '" - + queries + "' returned no sequences."); - return null; - } - else - { - Vector seqs = null; - for (Map.Entry, DasSequenceAdapter>> resset : resultset - .entrySet()) - { - for (Map.Entry, DasSequenceAdapter> result : resset - .getValue().entrySet()) - { - DasSequenceAdapter dasseqresp = result.getValue(); - List accessions = result.getKey(); - for (SEQUENCE e : dasseqresp.getSequence()) - { - String lbl = e.getId(); - - if (acIds.indexOf(lbl) == -1) - { - System.err.println( - "Warning - received sequence event for strange accession code (" - + lbl + ")"); - } - else - { - if (seqs == null) - { - if (e.getContent().length() == 0) - { - System.err.println( - "Empty sequence returned for accession code (" - + lbl + ") from " + resset.getKey() - + " (source is " + getDbName()); - continue; - } - } - seqs = new java.util.Vector(); - // JDAS returns a sequence complete with any newlines and spaces - // in the XML - Sequence sq = new Sequence(lbl, - e.getContent().replaceAll("\\s+", "")); - sq.setStart(e.getStart().intValue()); - sq.addDBRef(new DBRefEntry(getDbSource(), - getDbVersion() + ":" + e.getVersion(), lbl)); - seqs.addElement(sq); - } - } - } - } - - if (seqs == null || seqs.size() == 0) - return null; - SequenceI[] sqs = new SequenceI[seqs.size()]; - for (int i = 0, iSize = seqs.size(); i < iSize; i++) - { - sqs[i] = (SequenceI) seqs.elementAt(i); - } - Alignment al = new Alignment(sqs); - if (jsrc.isFeatureSource()) - { - java.util.Vector srcs = new java.util.Vector(); - srcs.addElement(jsrc); - try - { - jalview.ws.DasSequenceFeatureFetcher dssf = new jalview.ws.DasSequenceFeatureFetcher( - sqs, null, srcs, false, false, multiple); - while (dssf.isRunning()) - { - try - { - Thread.sleep(200); - } catch (InterruptedException x) - { - - } - } - - } catch (Exception x) - { - Cache.log.error( - "Couldn't retrieve features for sequence from its source.", - x); - } - } - - return al; - } - } - - public String getTestQuery() - { - return coordsys == null ? "" : coordsys.getTestRange(); - } - - public boolean isValidReference(String accession) - { - // TODO try to validate an accession against source - // We don't really know how to do this without querying source - - return true; - } - - /** - * @return the source - */ - public SOURCE getSource() - { - return source; - } - - /** - * @return the coordsys - */ - public COORDINATES getCoordsys() - { - return coordsys; - } - - @Override - public int getTier() - { - return tier; - } -} diff --git a/src/jalview/ws/dbsources/das/datamodel/DasSourceRegistry.java b/src/jalview/ws/dbsources/das/datamodel/DasSourceRegistry.java deleted file mode 100644 index de7f380..0000000 --- a/src/jalview/ws/dbsources/das/datamodel/DasSourceRegistry.java +++ /dev/null @@ -1,484 +0,0 @@ -/* - * 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.das.datamodel; - -import jalview.bin.Cache; -import jalview.ws.dbsources.das.api.DasSourceRegistryI; -import jalview.ws.dbsources.das.api.jalviewSourceI; - -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import java.util.StringTokenizer; - -import org.biodas.jdas.client.ConnectionPropertyProviderI; -import org.biodas.jdas.client.SourcesClient; -import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI; -import org.biodas.jdas.dassources.Capabilities; -import org.biodas.jdas.schema.sources.CAPABILITY; -import org.biodas.jdas.schema.sources.SOURCE; -import org.biodas.jdas.schema.sources.SOURCES; -import org.biodas.jdas.schema.sources.VERSION; - -/** - * - */ -public class DasSourceRegistry - implements DasSourceRegistryI, MultipleConnectionPropertyProviderI -{ - // private org.biodas.jdas.schema.sources.SOURCE[] dasSources = null; - private List dasSources = null; - - private Hashtable sourceNames = null; - - private Hashtable localSources = null; - - // public static String DEFAULT_REGISTRY = "http://www.dasregistry.org/das/"; - public static String DEFAULT_REGISTRY = "http://www.ebi.ac.uk/das-srv/registry/das/"; - - /** - * true if thread is running and we are talking to DAS registry service - */ - private boolean loadingDasSources = false; - - public boolean isLoadingDasSources() - { - return loadingDasSources; - } - - @Override - public String getDasRegistryURL() - { - String registry = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL", - DEFAULT_REGISTRY); - - if (registry.indexOf("/registry/das1/sources/") > -1) - { - jalview.bin.Cache.setProperty(jalview.bin.Cache.DAS_REGISTRY_URL, - DEFAULT_REGISTRY); - registry = DEFAULT_REGISTRY; - } - if (registry.lastIndexOf("sources.xml") == registry.length() - 11) - { - // no trailing sources.xml document for registry in JDAS - jalview.bin.Cache.setProperty(jalview.bin.Cache.DAS_REGISTRY_URL, - registry = registry.substring(0, - registry.lastIndexOf("sources.xml"))); - } - return registry; - } - - /** - * query the default DAS Source Registry for sources. Uses value of jalview - * property DAS_REGISTRY_URL and the DasSourceBrowser.DEFAULT_REGISTRY if that - * doesn't exist. - * - * @return list of sources - */ - private List getDASSources() - { - - return getDASSources(getDasRegistryURL(), this); - } - - /** - * query the given URL for DasSources. - * - * @param registryURL - * return sources from registryURL - */ - private static List getDASSources(String registryURL, - MultipleConnectionPropertyProviderI registry) - { - try - { - URL url = new URL(registryURL); - org.biodas.jdas.client.SourcesClientInterface client = new SourcesClient(); - - SOURCES sources = client.fetchDataRegistry(registryURL, null, null, - null, null, null, null); - - List dassources = sources.getSOURCE(); - ArrayList dsrc = new ArrayList(); - HashMap latests = new HashMap(); - Integer latest; - for (SOURCE src : dassources) - { - JalviewSource jsrc = new JalviewSource(src, registry, false); - latest = latests.get(jsrc.getSourceURL()); - if (latest != null) - { - if (jsrc.isNewerThan(dsrc.get(latest.intValue()))) - { - dsrc.set(latest.intValue(), jsrc); - } - else - { - System.out.println( - "Debug: Ignored older source " + jsrc.getTitle()); - } - } - else - { - latests.put(jsrc.getSourceURL(), Integer.valueOf(dsrc.size())); - dsrc.add(jsrc); - } - } - return dsrc; - } catch (Exception ex) - { - System.out.println( - "DAS1 registry at " + registryURL + " no longer exists"); - return new ArrayList(); - } - } - - public void run() - { - getSources(); - } - - @Override - public List getSources() - { - if (dasSources == null) - { - dasSources = getDASSources(); - } - return appendLocalSources(); - } - - /** - * generate Sources from the local das source list - * - */ - private void addLocalDasSources() - { - if (localSources == null) - { - // get local sources from properties and initialise the local source list - String local = jalview.bin.Cache.getProperty("DAS_LOCAL_SOURCE"); - - if (local != null) - { - int n = 1; - StringTokenizer st = new StringTokenizer(local, "\t"); - while (st.hasMoreTokens()) - { - String token = st.nextToken(); - int bar = token.indexOf("|"); - if (bar == -1) - { - System.err.println( - "Warning: DAS user local source appears to have no nickname (expected a '|' followed by nickname)\nOffending definition: '" - + token + "'"); - } - String url = token.substring(bar + 1); - boolean features = true, sequence = false; - if (url.startsWith("sequence:")) - { - url = url.substring(9); - // this source also serves sequences as well as features - sequence = true; - } - try - { - if (bar > -1) - { - createLocalSource(url, token.substring(0, bar), sequence, - features); - } - else - { - createLocalSource(url, "User Source" + n, sequence, features); - } - } catch (Exception q) - { - System.err.println( - "Unexpected exception when creating local source from '" - + token + "'"); - q.printStackTrace(); - } - n++; - } - } - } - } - - private List appendLocalSources() - { - List srclist = new ArrayList(); - addLocalDasSources(); - sourceNames = new Hashtable(); - if (dasSources != null) - { - for (jalviewSourceI src : dasSources) - { - sourceNames.put(src.getTitle(), src); - srclist.add(src); - } - } - - if (localSources == null) - { - return srclist; - } - Enumeration en = localSources.keys(); - while (en.hasMoreElements()) - { - String key = en.nextElement().toString(); - jalviewSourceI jvsrc = localSources.get(key); - sourceNames.put(key, jvsrc); - srclist.add(jvsrc); - } - return srclist; - } - - /* - * - */ - - @Override - public jalviewSourceI createLocalSource(String url, String name, - boolean sequence, boolean features) - { - SOURCE local = _createLocalSource(url, name, sequence, features); - - if (localSources == null) - { - localSources = new Hashtable(); - } - jalviewSourceI src = new JalviewSource(local, this, true); - localSources.put(local.getTitle(), src); - return src; - } - - private SOURCE _createLocalSource(String url, String name, - boolean sequence, boolean features) - { - SOURCE local = new SOURCE(); - - local.setUri(url); - local.setTitle(name); - local.setVERSION(new ArrayList()); - VERSION v = new VERSION(); - List cp = new ArrayList(); - if (sequence) - { - /* - * Could try and synthesize a coordinate system for the source if needbe - * COORDINATES coord = new COORDINATES(); coord.setAuthority("NCBI"); - * coord.setSource("Chromosome"); coord.setTaxid("9606"); - * coord.setVersion("35"); version.getCOORDINATES().add(coord); - */ - CAPABILITY cap = new CAPABILITY(); - cap.setType("das1:" + Capabilities.SEQUENCE.getName()); - cap.setQueryUri(url + "/sequence"); - cp.add(cap); - } - if (features) - { - CAPABILITY cap = new CAPABILITY(); - cap.setType("das1:" + Capabilities.FEATURES.getName()); - cap.setQueryUri(url + "/features"); - cp.add(cap); - } - - v.getCAPABILITY().addAll(cp); - local.getVERSION().add(v); - - return local; - } - - @Override - public jalviewSourceI getSource(String nickname) - { - return sourceNames.get(nickname); - } - - @Override - public boolean removeLocalSource(jalviewSourceI source) - { - if (localSources.containsValue(source)) - { - localSources.remove(source.getTitle()); - sourceNames.remove(source.getTitle()); - dasSources.remove(source); - jalview.bin.Cache.setProperty("DAS_LOCAL_SOURCE", - getLocalSourceString()); - - return true; - } - return false; - } - - @Override - public void refreshSources() - { - dasSources = null; - sourceNames = null; - run(); - } - - @Override - public List resolveSourceNicknames(List sources) - { - ArrayList resolved = new ArrayList(); - if (sourceNames != null) - { - for (String src : sources) - { - jalviewSourceI dsrc = sourceNames.get(src); - if (dsrc != null) - { - resolved.add(dsrc); - } - } - } - return resolved; - } - - @Override - public String getLocalSourceString() - { - if (localSources != null) - { - StringBuffer sb = new StringBuffer(); - Enumeration en = localSources.keys(); - while (en.hasMoreElements()) - { - String token = en.nextElement().toString(); - jalviewSourceI srco = localSources.get(token); - sb.append(token + "|" + (srco.isSequenceSource() ? "sequence:" : "") - + srco.getUri() + "\t"); - } - return sb.toString(); - } - return ""; - } - - private static final Hashtable authStash; - static - { - authStash = new Hashtable(); - - try - { - // TODO: allow same credentials for https and http - authStash.put( - new URL("http://www.compbio.dundee.ac.uk/geneweb/das/myseq/"), - "Basic SmltOm1pSg=="); - } catch (MalformedURLException e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Override - public MultipleConnectionPropertyProviderI getSessionHandler() - { - return this; - } - - @Override - public ConnectionPropertyProviderI getConnectionPropertyProviderFor( - String arg0) - { - - final ConnectionPropertyProviderI conprov = new ConnectionPropertyProviderI() - { - boolean authed = false; - - @Override - public void setConnectionProperties(HttpURLConnection connection) - { - String auth = authStash.get(connection.getURL()); - if (auth != null && auth.length() > 0) - { - connection.setRequestProperty("Authorisation", auth); - authed = true; - } - else - { - authed = false; - } - } - - @Override - public boolean getResponseProperties(HttpURLConnection connection) - { - String auth = authStash.get(connection.getURL()); - if (auth != null && auth.length() == 0) - { - // don't attempt to check if we authed or not - user entered empty - // password - return false; - } - if (!authed) - { - if (auth != null) - { - // try and pass credentials. - return true; - } - // see if we should try and create a new auth record. - String ameth = connection.getHeaderField("X-DAS-AuthMethods"); - Cache.log.debug("Could authenticate to " + connection.getURL() - + " with : " + ameth); - // TODO: search auth string and raise login box - return if auth was - // provided - return false; - } - else - { - // check to see if auth was successful - String asuc = connection - .getHeaderField("X-DAS_AuthenticatedUser"); - if (asuc != null && asuc.trim().length() > 0) - { - // authentication was successful - Cache.log.debug("Authenticated successfully to " - + connection.getURL().toString()); - return false; - } - // it wasn't - so we should tell the user it failed and ask if they - // want to attempt authentication again. - authStash.remove(connection.getURL()); - // open a new login/password dialog with cancel button - // set new authStash content with password and return true - return true; // - // User cancelled auth - so put empty string in stash to indicate we - // don't want to auth with this server. - // authStash.put(connection.getURL(), ""); - // return false; - } - } - }; - return conprov; - } - -} diff --git a/src/jalview/ws/dbsources/das/datamodel/JalviewSource.java b/src/jalview/ws/dbsources/das/datamodel/JalviewSource.java deleted file mode 100644 index 07ba027..0000000 --- a/src/jalview/ws/dbsources/das/datamodel/JalviewSource.java +++ /dev/null @@ -1,384 +0,0 @@ -/* - * 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.das.datamodel; - -import jalview.util.MessageManager; -import jalview.ws.dbsources.das.api.jalviewSourceI; -import jalview.ws.seqfetcher.DbSourceProxy; - -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Date; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; - -import org.biodas.jdas.client.threads.MultipleConnectionPropertyProviderI; -import org.biodas.jdas.dassources.Capabilities; -import org.biodas.jdas.dassources.utils.DasTimeFormat; -import org.biodas.jdas.schema.sources.CAPABILITY; -import org.biodas.jdas.schema.sources.COORDINATES; -import org.biodas.jdas.schema.sources.MAINTAINER; -import org.biodas.jdas.schema.sources.PROP; -import org.biodas.jdas.schema.sources.SOURCE; -import org.biodas.jdas.schema.sources.VERSION; - -public class JalviewSource implements jalviewSourceI -{ - SOURCE source; - - MultipleConnectionPropertyProviderI connprov; - - public JalviewSource(SOURCE local2, - MultipleConnectionPropertyProviderI connprov, boolean local) - { - this.connprov = connprov; - this.local = local; - source = local2; - } - - @Override - public String getTitle() - { - return source.getTitle(); - } - - @Override - public VERSION getVersion() - { - - return getVersionFor(source); - } - - @Override - public String getDocHref() - { - return source.getDocHref(); - } - - @Override - public String getDescription() - { - return source.getDescription(); - } - - @Override - public String getUri() - { - return source.getUri(); - } - - @Override - public MAINTAINER getMAINTAINER() - { - return source.getMAINTAINER(); - } - - @Override - public String getEmail() - { - return (local) ? null : source.getMAINTAINER().getEmail(); - } - - boolean local = false; - - @Override - public boolean isLocal() - { - return local; - } - - @Override - public boolean isSequenceSource() - { - String seqcap = "das1:" + Capabilities.SEQUENCE.getName(); - for (String cp : getCapabilityList(getVersionFor(source))) - { - if (cp.equals(seqcap)) - { - return true; - - } - } - return false; - } - - @Override - public boolean isFeatureSource() - { - String seqcap = "das1:" + Capabilities.FEATURES.getName(); - for (String cp : getCapabilityList(getVersionFor(source))) - { - if (cp.equals(seqcap)) - { - return true; - - } - } - return false; - } - - private VERSION getVersionFor(SOURCE ds) - { - VERSION latest = null; - for (VERSION v : ds.getVERSION()) - { - if (latest == null - || isLaterThan(latest.getCreated(), v.getCreated())) - { - // TODO: das 1.6 - should just get the first version - ignore other - // versions since not specified how to construct URL from version's URI - // + source URI - latest = v; - } - } - return latest; - } - - /** - * compare date strings. null or unparseable dates are assumed to be oldest - * - * @param ref - * @param newer - * @return true iff ref comes before newer - */ - private boolean isLaterThan(String ref, String newer) - { - Date refdate = null, newdate = null; - if (ref != null && ref.trim().length() > 0) - { - try - { - refdate = DasTimeFormat.fromDASString(ref.trim()); - - } catch (ParseException x) - { - } - } - if (newer != null && newer.trim().length() > 0) - { - try - { - newdate = DasTimeFormat.fromDASString(newer); - } catch (ParseException e) - { - } - } - if (refdate != null) - { - if (newdate != null) - { - return refdate.before(newdate); - } - return false; - } - if (newdate != null) - { - return true; - } - // assume first instance of source is newest in list. - TODO: check if - // natural ordering of source versions is newest first or oldest first - return false; - } - - public String[] getLabelsFor(VERSION v) - { - ArrayList labels = new ArrayList(); - for (PROP p : v.getPROP()) - { - if (p.getName().equalsIgnoreCase("LABEL")) - { - labels.add(p.getValue()); - } - } - return labels.toArray(new String[0]); - } - - private CAPABILITY getCapability(Capabilities capability) - { - for (CAPABILITY p : getVersion().getCAPABILITY()) - { - if (p.getType().equalsIgnoreCase(capability.getName()) || p.getType() - .equalsIgnoreCase("das1:" + capability.getName())) - { - return p; - } - } - return null; - } - - public String[] getCapabilityList(VERSION v) - { - - ArrayList labels = new ArrayList(); - for (CAPABILITY p : v.getCAPABILITY()) - { - // TODO: work out what to do with namespace prefix - // does SEQUENCE == das1:SEQUENCE and das2:SEQUENCE ? - // for moment, just show all capabilities... - if (p.getType().startsWith("das1:")) - { - labels.add(p.getType()); - } - } - return labels.toArray(new String[0]); - } - - @Override - public List getSequenceSourceProxies() - { - if (!isSequenceSource()) - { - return null; - } - ArrayList seqsources = new ArrayList(); - if (!local) - { - VERSION v = getVersion(); - Map latestc = new Hashtable(); - for (COORDINATES cs : v.getCOORDINATES()) - { - COORDINATES ltst = latestc.get(cs.getUri()); - if (ltst == null || ltst.getVersion() == null - || (ltst.getVersion() != null && cs.getVersion() != null - && isLaterThan(ltst.getVersion(), cs.getVersion()))) - { - latestc.put(cs.getUri(), cs); - } - } - for (COORDINATES cs : latestc.values()) - { - DasSequenceSource ds; - /* - * if (css == null || css.length == 0) { // TODO: query das source - * directly to identify coordinate system... or // have to make up a - * coordinate system css = new DasCoordinateSystem[] { new - * DasCoordinateSystem() }; css[0].setName(d1s.getNickname()); - * css[0].setUniqueId(d1s.getNickname()); } for (int c = 0; c < - * css.length; c++) { - */ - try - { - seqsources.add(ds = new DasSequenceSource( - getTitle() + " (" + cs.getAuthority() + " " - + cs.getSource() - + (cs.getVersion() != null ? " " + cs.getVersion() - : "") - + ")", - cs.getAuthority(), source, v, cs, connprov)); - if (seqsources.size() > 1) - { - System.err.println("Added another sequence DB source for " - + getTitle() + " (" + ds.getDbName() + ")"); - } - } catch (Exception e) - { - System.err.println("Ignoring sequence coord system " + cs + " (" - + cs.getContent() + ") for source " + getTitle() - + "- threw exception when constructing fetcher.\n"); - e.printStackTrace(); - } - } - } - else - { - try - { - seqsources.add(new DasSequenceSource(getTitle(), getTitle(), source, - getVersion(), null, connprov)); - } catch (Exception e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - if (seqsources.size() > 1) - { - // sort by name - DbSourceProxy[] tsort = seqsources.toArray(new DasSequenceSource[0]); - String[] nm = new String[tsort.length]; - for (int i = 0; i < nm.length; i++) - { - nm[i] = tsort[i].getDbName().toLowerCase(); - } - jalview.util.QuickSort.sort(nm, tsort); - seqsources.clear(); - for (DbSourceProxy ssrc : tsort) - { - seqsources.add(ssrc); - } - } - return seqsources; - } - - @Override - public String getSourceURL() - { - try - { - // kind of dumb, since - // org.biodas.jdas.dassources.utils.VersionAdapter.getSourceUriFromQueryUri() - // does this, - // but this way, we can access non DAS 1.6 compliant sources (which have - // to have a URL like /das/ and cause a validation exception) - - for (CAPABILITY cap : getVersion().getCAPABILITY()) - { - String capname = cap.getType() - .substring(cap.getType().indexOf(":") + 1); - int p = cap.getQueryUri().lastIndexOf(capname); - if (p < -1) - { - throw new Exception(MessageManager.formatMessage( - "exception.invalid_das_source", new String[] - { source.getUri() })); - } - if (cap.getQueryUri().charAt(p) == '/') - { - p--; - } - return cap.getQueryUri().substring(0, p); - } - } catch (Exception x) - { - System.err.println("Serious: Couldn't get the URL for source " - + source.getTitle()); - x.printStackTrace(); - } - return null; - } - - @Override - public boolean isNewerThan(jalviewSourceI other) - { - return isLaterThan(getVersion().getCreated(), - other.getVersion().getCreated()); - } - - @Override - public boolean isReferenceSource() - { - // TODO check source object for indication that we are the primary for a DAS - // coordinate system - return false; - } -} diff --git a/test/jalview/analysis/CrossRefTest.java b/test/jalview/analysis/CrossRefTest.java index 0265af3..b3c78be 100644 --- a/test/jalview/analysis/CrossRefTest.java +++ b/test/jalview/analysis/CrossRefTest.java @@ -427,7 +427,7 @@ public class CrossRefTest * argument false suppresses adding DAS sources * todo: define an interface type SequenceFetcherI and mock that */ - SequenceFetcher mockFetcher = new SequenceFetcher(false) + SequenceFetcher mockFetcher = new SequenceFetcher() { @Override public boolean isFetchable(String source) @@ -505,7 +505,7 @@ public class CrossRefTest * argument false suppresses adding DAS sources * todo: define an interface type SequenceFetcherI and mock that */ - SequenceFetcher mockFetcher = new SequenceFetcher(false) + SequenceFetcher mockFetcher = new SequenceFetcher() { @Override public boolean isFetchable(String source) @@ -651,7 +651,7 @@ public class CrossRefTest * passed in calls to getSequences() - important to verify that * duplicate sequence fetches are not requested */ - SequenceFetcher mockFetcher = new SequenceFetcher(false) + SequenceFetcher mockFetcher = new SequenceFetcher() { int call = 0; diff --git a/test/jalview/ws/PDBSequenceFetcherTest.java b/test/jalview/ws/PDBSequenceFetcherTest.java index cc3dca8..d1e32b9 100644 --- a/test/jalview/ws/PDBSequenceFetcherTest.java +++ b/test/jalview/ws/PDBSequenceFetcherTest.java @@ -62,7 +62,7 @@ public class PDBSequenceFetcherTest Cache.applicationProperties.setProperty("ADD_SS_ANN", Boolean.TRUE.toString()); - sf = new SequenceFetcher(false); + sf = new SequenceFetcher(); } /** diff --git a/test/jalview/ws/SequenceFetcherTest.java b/test/jalview/ws/SequenceFetcherTest.java index 32afd5f..0b501ee 100644 --- a/test/jalview/ws/SequenceFetcherTest.java +++ b/test/jalview/ws/SequenceFetcherTest.java @@ -52,26 +52,24 @@ public class SequenceFetcherTest */ public static void main(String[] argv) { - // TODO: extracted from SequenceFetcher - convert to proper unit test with + // TODO: extracted from SequenceFetcher - convert to network dependent + // functional integration test with // assertions String usage = "SequenceFetcher.main [-nodas] [ []]\n" + "With no arguments, all DbSources will be queried with their test Accession number.\n" + "With one argument, the argument will be resolved to one or more db sources and each will be queried with their test accession only.\n" - + "If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to and retrieve from it.\n" - + "The -nodas option will exclude DAS sources from the database fetchers Jalview will try to use."; - boolean withDas = true; - if (argv != null && argv.length > 0 - && argv[0].toLowerCase().startsWith("-nodas")) + + "If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to and retrieve from it."; + + if (argv != null && argv.length > 0) { - withDas = false; String targs[] = new String[argv.length - 1]; System.arraycopy(argv, 1, targs, 0, targs.length); argv = targs; } if (argv != null && argv.length > 0) { - List sps = new SequenceFetcher(withDas) + List sps = new SequenceFetcher() .getSourceProxy(argv[0]); if (sps != null) @@ -102,7 +100,7 @@ public class SequenceFetcherTest System.out.println(usage); return; } - ASequenceFetcher sfetcher = new SequenceFetcher(withDas); + ASequenceFetcher sfetcher = new SequenceFetcher(); String[] dbSources = sfetcher.getSupportedDb(); for (int dbsource = 0; dbsource < dbSources.length; dbsource++) { @@ -124,7 +122,7 @@ public class SequenceFetcherTest String testQuery) { AlignmentI ds = null; - Vector noProds = new Vector(); + Vector noProds = new Vector<>(); System.out.println("Source: " + sp.getDbName() + " (" + db + "): retrieving test:" + sp.getTestQuery()); { diff --git a/test/jalview/ws/dbsources/RemoteFormatTest.java b/test/jalview/ws/dbsources/RemoteFormatTest.java index 90d4472..e04d195 100644 --- a/test/jalview/ws/dbsources/RemoteFormatTest.java +++ b/test/jalview/ws/dbsources/RemoteFormatTest.java @@ -51,7 +51,7 @@ public class RemoteFormatTest Cache.applicationProperties.setProperty("ADD_SS_ANN", Boolean.TRUE.toString()); - sf = new SequenceFetcher(false); + sf = new SequenceFetcher(); } @DataProvider(name = "AccessionData") @@ -92,7 +92,7 @@ public class RemoteFormatTest @Test(groups = { "Network" }) public void testUniprotFreeTextSearch() throws Exception { - List wantedFields = new ArrayList(); + List wantedFields = new ArrayList<>(); FTSRestClientI client = UniProtFTSRestClient.getInstance(); wantedFields.add(client.getDataColumnByNameOrCode("id")); wantedFields.add(client.getDataColumnByNameOrCode("entry name")); diff --git a/test/jalview/ws/seqfetcher/DasSequenceFetcher.java b/test/jalview/ws/seqfetcher/DasSequenceFetcher.java deleted file mode 100644 index f1dafcb..0000000 --- a/test/jalview/ws/seqfetcher/DasSequenceFetcher.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.seqfetcher; - -import static org.testng.Assert.assertTrue; - -import jalview.bin.Cache; -import jalview.gui.JvOptionPane; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -public class DasSequenceFetcher -{ - - @BeforeClass(alwaysRun = true) - public void setUpJvOptionPane() - { - JvOptionPane.setInteractiveMode(false); - JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); - } - - @Test(groups = { "Network" }) - public void testDasRegistryContact() - { - Cache.getDasSourceRegistry().refreshSources(); - assertTrue(Cache.getDasSourceRegistry().getSources().isEmpty(), - "Expected to find no DAS sources at the registry. Check config."); - } - -} -- 1.7.10.2