X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2FEnfinEnvision2OneWay.java;h=058d9dda2f82b72db16407af23e9f90fb132236a;hb=ab43013b7e357b84b4abade0dba949668dfb2a0e;hp=53d5b4aaec081ad411fa5e7e31f3873b92a39175;hpb=d423f22792e47dbc800ae220a58677f988971d06;p=jalview.git diff --git a/src/jalview/ws/EnfinEnvision2OneWay.java b/src/jalview/ws/EnfinEnvision2OneWay.java index 53d5b4a..058d9dd 100644 --- a/src/jalview/ws/EnfinEnvision2OneWay.java +++ b/src/jalview/ws/EnfinEnvision2OneWay.java @@ -1,19 +1,22 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.5) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1) + * Copyright (C) 2014 The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * + * 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 . + * 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; @@ -23,19 +26,21 @@ import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.gui.Desktop; +import jalview.gui.JvSwingUtils; import jalview.util.GroupUrlLink; +import jalview.util.MessageManager; +import jalview.util.GroupUrlLink.UrlStringTooLongException; import java.awt.Component; import java.awt.Cursor; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.io.BufferedReader; -import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.net.URL; +import java.net.URLEncoder; import java.util.Hashtable; +import java.util.Map; import java.util.Vector; +import java.util.regex.Pattern; import javax.swing.JMenu; import javax.swing.JMenuItem; @@ -49,10 +54,15 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; +import com.lowagie.text.html.HtmlEncoder; + /** * Lightweight runnable to discover dynamic 'one way' group URL services * + * as of Jalview 2.8.1 this class is mothballed and will be dropped in v3. + * * @author JimP + * @deprecated * */ public class EnfinEnvision2OneWay extends DefaultHandler implements @@ -135,19 +145,34 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements System.err.println("Adding entry for " + wfname + " " + description); if (wfname.toLowerCase().indexOf("funcnet") == -1) { + description = Pattern.compile("\\s+", Pattern.MULTILINE) + .matcher(description).replaceAll(" "); groupURLdescr.addElement(description); groupURLdescr.addElement(description); + String urlstub = wfname; + if (wfname.indexOf(" ") > -1) + { + // make the name safe! + try + { + urlstub = URLEncoder.encode(wfname, "utf-8"); + } catch (UnsupportedEncodingException e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } groupURLLinks .addElement(wfname + "|" + "http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?tool=Jalview&workflow=" - + wfname + + urlstub + "&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCEIDS$&inputType=0|,"); // #"+description+"#"); groupURLLinks .addElement(wfname + "|" + "http://www.ebi.ac.uk/enfin-srv/envision2/pages/linkin.jsf?tool=Jalview&workflow=" - + wfname + + urlstub + "&datasetName=JalviewSeqs$DATASETID$&input=$SEQUENCES=/([A-Za-z]+)+/=$&inputType=1|,"); // #"+description+"#"); } } @@ -281,7 +306,8 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements * Object array returned from the makeUrlStubs function. */ private void addshowLink(JMenu linkMenu, String label, String descr, - final GroupUrlLink urlgenerator, final Object[] urlstub) + String dbname, final GroupUrlLink urlgenerator, + final Object[] urlstub) { Component[] jmi = linkMenu.getMenuComponents(); for (int i = 0; i < jmi.length; i++) @@ -293,10 +319,23 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements return; } } + try + { + descr = HtmlEncoder.encode(descr); + } catch (Exception e) + { + } + ; + + boolean seqsorids = (urlgenerator.getGroupURLType() & urlgenerator.SEQUENCEIDS) == 0; + int i = urlgenerator.getNumberInvolved(urlstub); JMenuItem item = new JMenuItem(label); - item.setToolTipText("Submit (" - + urlgenerator.getNumberInvolved(urlstub) - + " seqs) to workflow: " + descr); + // + if (dbname == null || dbname.trim().length() == 0) + { + dbname = ""; + } + item.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.submit_sequence", new String[]{Integer.valueOf(i).toString(), dbname, (seqsorids ? "sequence" : "sequence id"), (i > 1 ? "s" : "")}))); item.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) @@ -306,7 +345,13 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements public void run() { - showLink(urlgenerator.constructFrom(urlstub)); + try + { + showLink(urlgenerator.constructFrom(urlstub)); + } catch (UrlStringTooLongException ex) + { + Cache.log.warn("Not showing link: URL is too long!", ex); + } } }).start(); @@ -331,9 +376,8 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements JOptionPane .showInternalMessageDialog( Desktop.desktop, - "Unixers: Couldn't find default web browser." - + "\nAdd the full path to your browser in Preferences.", - "Web browser not found", JOptionPane.WARNING_MESSAGE); + MessageManager.getString("label.web_browser_not_found_unix"), + MessageManager.getString("label.web_browser_not_found"), JOptionPane.WARNING_MESSAGE); ex.printStackTrace(); } @@ -348,6 +392,10 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements private void buildGroupLinkMenu(JMenu enfinServiceMenu, AlignFrame alignFrame) { + if (running || !started) + { + return; + } SequenceI[] seqs = alignFrame.getViewport().getSelectionAsNewSequence(); SequenceGroup sg = alignFrame.getViewport().getSelectionGroup(); if (sg == null) @@ -382,16 +430,13 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements */ private JMenu buildGroupURLMenu(SequenceI[] seqs, SequenceGroup sg) { - + if (groupURLdescr == null || groupURLLinks == null) + return null; // TODO: usability: thread off the generation of group url content so root // menu appears asap // sequence only URLs // ID/regex match URLs - JMenu groupLinksMenu = new JMenu("Group Link"); - JMenu[] linkMenus = new JMenu[] - { null, new JMenu("IDS"), new JMenu("Sequences"), - new JMenu("IDS and Sequences") }; // three types of url that might be - // created. + JMenu groupLinksMenu = new JMenu(MessageManager.getString("action.group_link")); String[][] idandseqs = GroupUrlLink.formStrings(seqs); Hashtable commonDbrefs = new Hashtable(); for (int sq = 0; sq < seqs.length; sq++) @@ -453,12 +498,17 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements } } // now create group links for all distinct ID/sequence sets. - boolean addMenu = false; // indicates if there are any group links to give - // to user + Hashtable gurlMenus = new Hashtable(); + /** + * last number of sequences where URL generation failed + */ + int[] nsqtype = new int[] + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for (int i = 0; i < groupURLLinks.size(); i++) { - String link = groupURLLinks.elementAt(i).toString(); - String descr = groupURLdescr.elementAt(i).toString(); + String link = (String) groupURLLinks.elementAt(i); + String descr = (String) groupURLdescr.elementAt(i); + // boolean specialCase = // additionalPar.elementAt(i).toString().equals(BACKGROUND); GroupUrlLink urlLink = null; @@ -478,6 +528,18 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements continue; } final String label = urlLink.getLabel(); + // create/recover the sub menus that might be populated for this link. + JMenu[] wflinkMenus = gurlMenus.get(label); + if (wflinkMenus == null) + { + // three types of url that might be + // created. + wflinkMenus = new JMenu[] + { null, new JMenu(MessageManager.getString("action.ids")), new JMenu(MessageManager.getString("action.sequences")), + new JMenu(MessageManager.getString("action.ids_sequences")) }; + gurlMenus.put(label, wflinkMenus); + } + boolean usingNames = false; // Now see which parts of the group apply for this URL String ltarget; @@ -492,6 +554,11 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements String[] allids = ((String[]) idset[1]); seqstr = new String[numinput]; ids = new String[numinput]; + if (nsqtype[urlLink.getGroupURLType()] > 0 + && numinput >= nsqtype[urlLink.getGroupURLType()]) + { + continue; + } for (int sq = 0, idcount = 0; sq < seqs.length; sq++) { if (allids[sq] != null) @@ -500,30 +567,53 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements seqstr[idcount++] = idandseqs[1][sq]; } } - addMenu = addMenu - | createAndAddLinks(linkMenus, false, urlLink, label, - ltarget, descr, ids, seqstr); + try + { + createAndAddLinks(wflinkMenus, false, urlLink, ltarget, null, + descr, ids, seqstr); + } catch (UrlStringTooLongException ex) + { + nsqtype[urlLink.getGroupURLType()] = numinput; + } } } // also do names only. seqstr = idandseqs[1]; ids = idandseqs[0]; - addMenu = addMenu - | createAndAddLinks(linkMenus, true, urlLink, label, "Names", - descr, ids, seqstr); + if (nsqtype[urlLink.getGroupURLType()] > 0 + && idandseqs[0].length >= nsqtype[urlLink.getGroupURLType()]) + { + continue; + } + + try + { + createAndAddLinks(wflinkMenus, true, urlLink, "Any", null, descr, + ids, seqstr); + } catch (UrlStringTooLongException ex) + { + nsqtype[urlLink.getGroupURLType()] = idandseqs[0].length; + } } - if (addMenu) + boolean anyadded = false; // indicates if there are any group links to give + // to user + for (Map.Entry menues : gurlMenus.entrySet()) { - groupLinksMenu = new JMenu("Group Links"); - for (int m = 0; m < linkMenus.length; m++) + JMenu grouplinkset = new JMenu(menues.getKey()); + JMenu[] wflinkMenus = menues.getValue(); + for (int m = 0; m < wflinkMenus.length; m++) { - if (linkMenus[m] != null - && linkMenus[m].getMenuComponentCount() > 0) + if (wflinkMenus[m] != null + && wflinkMenus[m].getMenuComponentCount() > 0) { - groupLinksMenu.add(linkMenus[m]); + anyadded = true; + grouplinkset.add(wflinkMenus[m]); } } - + groupLinksMenu.add(grouplinkset); + } + if (anyadded) + { return groupLinksMenu; } return null; @@ -531,10 +621,11 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements private boolean createAndAddLinks(JMenu[] linkMenus, boolean usingNames, GroupUrlLink urlLink, String label, String ltarget, String descr, - String[] ids, String[] seqstr) + String[] ids, String[] seqstr) throws UrlStringTooLongException { Object[] urlset = urlLink.makeUrlStubs(ids, seqstr, "FromJalview" + System.currentTimeMillis(), false); + if (urlset != null) { int type = urlLink.getGroupURLType() & 3; @@ -542,10 +633,17 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements // +" "+((String[])urlset[3])[0]); // first two bits ofurlLink type bitfield are sequenceids and sequences // TODO: FUTURE: ensure the groupURL menu structure can be generalised - addshowLink(linkMenus[type], label - + " " - + (usingNames ? (((type & 1) == 1) ? "(Names)" : "") : ("(" - + ltarget + ")")), descr, urlLink, urlset); + addshowLink( + linkMenus[type], + label + + " " + + (ltarget == null ? (((type & 1) == 1 ? "ID" + : "Sequence") + (urlLink + .getNumberInvolved(urlset) > 1 ? "s" : "")) + : (usingNames ? (((type & 1) == 1) ? "(Names)" + : "") + : ("(" + ltarget + ")"))), descr, + usingNames ? null : label, urlLink, urlset); return true; } return false; @@ -577,18 +675,24 @@ public class EnfinEnvision2OneWay extends DefaultHandler implements public void menuSelected(MenuEvent e) { - if (refresh) + if (refresh && !isRunning()) { - try - { - buildGroupLinkMenu(enfinServiceMenu, alignFrame); - } catch (OutOfMemoryError ex) + new Thread(new Runnable() { - Cache.log.error( - "Out of memory when calculating the Envision2 links.", - ex); - enfinServiceMenu.setEnabled(false); - } + public void run() + { + try + { + buildGroupLinkMenu(enfinServiceMenu, alignFrame); + } catch (OutOfMemoryError ex) + { + Cache.log + .error("Out of memory when calculating the Envision2 links.", + ex); + enfinServiceMenu.setEnabled(false); + } + } + }).start(); refresh = false; } }