X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Frest%2FRestClient.java;h=202ea129b8ea781e4c654c39a745c2479fe3feb2;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=04c956167b417cb58a2fadbf15c51c8327c158d9;hpb=f5d48464f668eb2ffd8f6cdcd0d04ff5658c54fc;p=jalview.git diff --git a/src/jalview/ws/rest/RestClient.java b/src/jalview/ws/rest/RestClient.java index 04c9561..202ea12 100644 --- a/src/jalview/ws/rest/RestClient.java +++ b/src/jalview/ws/rest/RestClient.java @@ -1,33 +1,49 @@ -/** +/* + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) + * Copyright (C) 2015 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.rest; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.Hashtable; -import java.util.Vector; - -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.event.MenuEvent; -import javax.swing.event.MenuListener; - -import com.sun.org.apache.bcel.internal.generic.ISHL; - +import jalview.bin.Cache; import jalview.datamodel.AlignmentView; -import jalview.datamodel.SequenceGroup; import jalview.gui.AlignFrame; import jalview.gui.AlignViewport; import jalview.gui.AlignmentPanel; import jalview.gui.Desktop; import jalview.gui.WebserviceInfo; import jalview.io.packed.DataProvider.JvDataType; +import jalview.util.MessageManager; import jalview.ws.WSClient; import jalview.ws.WSClientI; import jalview.ws.WSMenuEntryProviderI; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Hashtable; +import java.util.Vector; + +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; + /** * @author JimP * @@ -64,16 +80,26 @@ public class RestClient extends WSClient implements WSClientI, public RestClient(RestServiceDescription service2, AlignFrame alignFrame) { + this(service2, alignFrame, false); + } + + boolean headless = false; + + public RestClient(RestServiceDescription service2, AlignFrame alignFrame, + boolean nogui) + { service = service2; af = alignFrame; av = alignFrame.getViewport(); + headless = nogui; constructJob(); } public void setWebserviceInfo(boolean headless) { - WebServiceJobTitle = service.details.Action + " using " - + service.details.Name; + WebServiceJobTitle = MessageManager.formatMessage( + "label.webservice_job_title", new String[] { + service.details.Action, service.details.Name }); WebServiceName = service.details.Name; WebServiceReference = "No reference - go to url for more info"; if (service.details.description != null) @@ -83,7 +109,7 @@ public class RestClient extends WSClient implements WSClientI, if (!headless) { wsInfo = new WebserviceInfo(WebServiceJobTitle, WebServiceName + "\n" - + WebServiceReference); + + WebServiceReference, true); wsInfo.setRenderAsHtml(true); } @@ -116,7 +142,9 @@ public class RestClient extends WSClient implements WSClientI, final AlignFrame alignFrame) { JMenuItem submit = new JMenuItem(service.details.Name); - submit.setToolTipText(service.details.Action+" using "+service.details.Name); + submit.setToolTipText(MessageManager.formatMessage( + "label.rest_client_submit", new String[] { + service.details.Action, service.details.Name })); submit.addActionListener(new ActionListener() { @@ -175,14 +203,19 @@ public class RestClient extends WSClient implements WSClientI, */ protected boolean isAlignmentModified() { - if (undoredo == null) + if (undoredo == null || av == null || av.getAlignment() == null) { + // always return modified if we don't have access to live GUI elements + // anymore. return true; } if (av.isUndoRedoHashModified(undoredo)) { - + // alignment has been modified in some way. + return true; } + // TODO: look deeper into modification of selection state, etc that may + // affect RestJobThread.realiseResults(boolean merge); return false; } @@ -197,10 +230,14 @@ public class RestClient extends WSClient implements WSClientI, */ jalview.io.packed.JalviewDataset jds; + /** + * informative name for results + */ + public String viewTitle; + protected void constructJob() { service.setInvolvesFlags(); - // record all aspects of alignment view so we can merge back or recreate // later undoredo = av.getUndoRedoHash(); @@ -211,92 +248,121 @@ public class RestClient extends WSClient implements WSClientI, */ boolean selExists = (av.getSelectionGroup() != null) && (av.getSelectionGroup().getSize() > 1); - // TODO: revise to full focus+context+dataset input data staging model + // TODO: JAL-715: refactor to alignViewport methods and revise to full + // focus+context+dataset input data staging model if (selExists) { if (service.partitiondata) { - if (av.getAlignment().getGroups()!=null && av.getAlignment().getGroups().size() > 0) + if (av.getAlignment().getGroups() != null + && av.getAlignment().getGroups().size() > 0) { // intersect groups with selected region - _input = new AlignmentView(av.getAlignment(), - av.getColumnSelection(), - av.getSelectionGroup(), - av.hasHiddenColumns(), - true, - true); + _input = new AlignmentView(av.getAlignment(), + av.getColumnSelection(), av.getSelectionGroup(), + av.hasHiddenColumns(), true, true); + viewTitle = MessageManager.formatMessage( + "label.select_visible_region_of", + new String[] { + (av.hasHiddenColumns() ? MessageManager + .getString("label.visible") : ""), + af.getTitle() }); } else { // use selected region to partition alignment - _input = new AlignmentView(av.getAlignment(), - av.getColumnSelection(), - av.getSelectionGroup(), - av.hasHiddenColumns(), - false, - true); + _input = new AlignmentView(av.getAlignment(), + av.getColumnSelection(), av.getSelectionGroup(), + av.hasHiddenColumns(), false, true); } - // TODO: verify that some kind of partition can be constructed from input + viewTitle = MessageManager.formatMessage( + "label.select_unselect_visible_regions_from", + new String[] { + (av.hasHiddenColumns() ? MessageManager + .getString("label.visible") : ""), + af.getTitle() }); } else { // just take selected region intersection - _input = new AlignmentView(av.getAlignment(), - av.getColumnSelection(), - av.getSelectionGroup(), - av.hasHiddenColumns(), - true, - true); + _input = new AlignmentView(av.getAlignment(), + av.getColumnSelection(), av.getSelectionGroup(), + av.hasHiddenColumns(), true, true); + viewTitle = MessageManager.formatMessage( + "label.select_visible_region_of", + new String[] { + (av.hasHiddenColumns() ? MessageManager + .getString("label.visible") : ""), + af.getTitle() }); } - } else { + } + else + { // standard alignment view without selection present - _input = new AlignmentView(av.getAlignment(), - av.getColumnSelection(), - null, - av.hasHiddenColumns(), - false, + _input = new AlignmentView(av.getAlignment(), + av.getColumnSelection(), null, av.hasHiddenColumns(), false, true); + viewTitle = "" + + (av.hasHiddenColumns() ? (new StringBuffer(" ") + .append(MessageManager + .getString("label.visible_region_of")) + .toString()) : "") + af.getTitle(); } - + RestJobThread jobsthread = new RestJobThread(this); - + if (jobsthread.isValid()) { - setWebserviceInfo(false); - wsInfo.setthisService(this); - jobsthread.setWebServiceInfo(wsInfo); + setWebserviceInfo(headless); + if (!headless) + { + wsInfo.setthisService(this); + jobsthread.setWebServiceInfo(wsInfo); + } jobsthread.start(); } else { // TODO: try to tell the user why the job couldn't be started. - JOptionPane.showMessageDialog(Desktop.desktop, - "Unable to start web service analysis", - "Internal Jalview Error", JOptionPane.WARNING_MESSAGE); + JOptionPane + .showMessageDialog( + Desktop.desktop, + (jobsthread.hasWarnings() ? jobsthread.getWarnings() + : MessageManager + .getString("label.job_couldnt_be_started_check_input")), + MessageManager + .getString("label.unable_start_web_service_analysis"), + JOptionPane.WARNING_MESSAGE); } } public static RestClient makeShmmrRestClient() { - String action = "Analyse", description = "Sequence Harmony and Multi-Relief", name = "SHMR"; + String action = "Analysis", description = "Sequence Harmony and Multi-Relief (Brandt et al. 2010)", name = MessageManager + .getString("label.multiharmony"); Hashtable iparams = new Hashtable(); jalview.ws.rest.params.JobConstant toolp; - //toolp = new jalview.ws.rest.JobConstant("tool","jalview"); - //iparams.put(toolp.token, toolp); - toolp = new jalview.ws.rest.params.JobConstant("mbjob[method]","shmr"); - iparams.put(toolp.token, toolp); - toolp = new jalview.ws.rest.params.JobConstant("mbjob[description]","step 1"); - iparams.put(toolp.token, toolp); - toolp = new jalview.ws.rest.params.JobConstant("start_search","1"); - iparams.put(toolp.token, toolp); - toolp = new jalview.ws.rest.params.JobConstant("blast","0"); - iparams.put(toolp.token, toolp); - + // toolp = new jalview.ws.rest.JobConstant("tool","jalview"); + // iparams.put(toolp.token, toolp); + // toolp = new jalview.ws.rest.params.JobConstant("mbjob[method]","shmr"); + // iparams.put(toolp.token, toolp); + // toolp = new + // jalview.ws.rest.params.JobConstant("mbjob[description]","step 1"); + // iparams.put(toolp.token, toolp); + // toolp = new jalview.ws.rest.params.JobConstant("start_search","1"); + // iparams.put(toolp.token, toolp); + // toolp = new jalview.ws.rest.params.JobConstant("blast","0"); + // iparams.put(toolp.token, toolp); + jalview.ws.rest.params.Alignment aliinput = new jalview.ws.rest.params.Alignment(); + // SHMR server has a 65K limit for content pasted into the 'ali' parameter, + // so we always upload our files. aliinput.token = "ali_file"; - aliinput.writeAsFile=true; - iparams.put("ali_file", aliinput); + aliinput.writeAsFile = true; + iparams.put(aliinput.token, aliinput); jalview.ws.rest.params.SeqGroupIndexVector sgroups = new jalview.ws.rest.params.SeqGroupIndexVector(); + sgroups.setMinsize(2); + sgroups.min = 2;// need at least two group defined to make a partition iparams.put("groups", sgroups); sgroups.token = "groups"; sgroups.sep = " "; @@ -304,7 +370,7 @@ public class RestClient extends WSClient implements WSClientI, action, description, name, - "http://www.ibi.vu.nl/programs/shmrwww/index.php?tool=jalview",// ?tool=jalview&mbjob[method]=shmr&mbjob[description]=step1", + "http://zeus.few.vu.nl/programs/shmrwww/index.php?tool=jalview",// ?tool=jalview&mbjob[method]=shmr&mbjob[description]=step1", "?tool=jalview", iparams, true, false, '-'); // a priori knowledge of the data returned from the service shmrService.addResultDatatype(JvDataType.ANNOTATION); @@ -313,8 +379,9 @@ public class RestClient extends WSClient implements WSClientI, public AlignmentPanel recoverAlignPanelForView() { - AlignmentPanel[] aps = Desktop.getAlignmentPanels(av.getSequenceSetId()); - for (AlignmentPanel alp:aps) + AlignmentPanel[] aps = Desktop + .getAlignmentPanels(av.getSequenceSetId()); + for (AlignmentPanel alp : aps) { if (alp.av == av) { @@ -330,4 +397,78 @@ public class RestClient extends WSClient implements WSClientI, return true; } + protected static Vector services = null; + + public static final String RSBS_SERVICES = "RSBS_SERVICES"; + + public static RestClient[] getRestClients() + { + if (services == null) + { + services = new Vector(); + try + { + for (RestServiceDescription descr : RestServiceDescription + .parseDescriptions(jalview.bin.Cache.getDefault( + RSBS_SERVICES, + makeShmmrRestClient().service.toString()))) + { + services.add(descr.toString()); + } + } catch (Exception ex) + { + System.err + .println("Serious - RSBS descriptions in user preferences are corrupt!"); + ex.printStackTrace(); + } + + } + RestClient[] lst = new RestClient[services.size()]; + int i = 0; + for (String svc : services) + { + lst[i++] = new RestClient(new RestServiceDescription(svc)); + } + return lst; + } + + public String getAction() + { + return service.details.Action; + } + + public RestServiceDescription getRestDescription() + { + return service; + } + + public static Vector getRsbsDescriptions() + { + Vector rsbsDescrs = new Vector(); + for (RestClient rsbs : getRestClients()) + { + rsbsDescrs.add(rsbs.getRestDescription().toString()); + } + return rsbsDescrs; + } + + public static void setRsbsServices(Vector rsbsUrls) + { + if (rsbsUrls != null) + { + // TODO: consider validating services ? + services = new Vector(rsbsUrls); + StringBuffer sprop = new StringBuffer(); + for (String s : services) + { + sprop.append(s); + } + Cache.setProperty(RSBS_SERVICES, sprop.toString()); + } + else + { + Cache.removeProperty(RSBS_SERVICES); + } + } + }