From ea7b9666447dea727e9d607de3694cfe27bc811e Mon Sep 17 00:00:00 2001 From: gmungoc Date: Mon, 2 May 2016 09:06:28 +0100 Subject: [PATCH] JAL-1812 bind Groovy to Jalview rather than Desktop, remove reflection --- examples/groovy/printtitle.groovy | 13 +- resources/lang/Messages.properties | 1 - resources/lang/Messages_es.properties | 1 - src/jalview/bin/ArgsParser.java | 97 +++++ src/jalview/bin/Jalview.java | 434 ++++++++------------ src/jalview/gui/AlignFrame.java | 4 +- src/jalview/gui/Desktop.java | 24 +- .../workers/AlignmentAnnotationFactory.java | 10 +- test/jalview/bin/ArgsParserTest.java | 65 +++ 9 files changed, 346 insertions(+), 303 deletions(-) create mode 100644 src/jalview/bin/ArgsParser.java create mode 100644 test/jalview/bin/ArgsParserTest.java diff --git a/examples/groovy/printtitle.groovy b/examples/groovy/printtitle.groovy index 813df63..b3387ea 100644 --- a/examples/groovy/printtitle.groovy +++ b/examples/groovy/printtitle.groovy @@ -19,14 +19,17 @@ * The Jalview Authors are detailed in the 'AUTHORS' file. */ // do something groovy in jalview -print "Hello World.\n"; -def alf = Jalview.getAlignFrames(); +println "Hello World.\n" +println "First sequence is " + currentAlFrame.viewport.alignment.getSequenceAt(0).getDisplayId(true) + +def alf = Jalview.getAlignFrames() for (ala in alf) { // ala is an jalview.gui.AlignFrame object - print ala.getTitle()+"\n"; + println ala.getTitle() // get the parent jalview.datamodel.Alignment from the alignment viewport - def alignment = ala.viewport.alignment; + def alignment = ala.viewport.alignment // get the first sequence from the jalview.datamodel.Alignment object - def seq = alignment.getSequenceAt(0); + def seq = alignment.getSequenceAt(0) } +Jalview.quit() diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index b68a358..6bd4d4e 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -970,7 +970,6 @@ error.eps_generation_not_implemented = EPS Generation not yet implemented error.png_generation_not_implemented = PNG Generation not yet implemented error.try_join_vamsas_session_another = Trying to join a vamsas session when another is already connected error.invalid_vamsas_session_id = Invalid vamsas session id -error.implementation_error_cannot_create_groovyshell = Implementation Error. Cannot create groovyShell without Groovy on the classpath! label.groovy_support_failed = Jalview Groovy Support Failed label.couldnt_create_groovy_shell = Couldn't create the groovy Shell. Check the error log for the details of what went wrong. error.unsupported_version_calcIdparam = Unsupported Version for calcIdparam {0} diff --git a/resources/lang/Messages_es.properties b/resources/lang/Messages_es.properties index 3535f4b..18e3b05 100644 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@ -905,7 +905,6 @@ error.eps_generation_not_implemented = La generaci error.png_generation_not_implemented = La generación de PNG no se ha implementado todavía error.try_join_vamsas_session_another = Tratando de establecer una sesión VAMSAS cuando ya había otra conectada error.invalid_vamsas_session_id = Identificador de sesión VAMSAS no válido -error.implementation_error_cannot_create_groovyshell = Error de implementación:no se puede crear groovyShell sin Groovy en el classpath label.groovy_support_failed = El soporte Groovy de Jalview ha fallado label.couldnt_create_groovy_shell = No es posible crear el shell de Groovy. Compruebe el fichero de log para conocer los detalles. error.unsupported_version_calcIdparam = Versión no soportada de {0} diff --git a/src/jalview/bin/ArgsParser.java b/src/jalview/bin/ArgsParser.java new file mode 100644 index 0000000..9c8d0df --- /dev/null +++ b/src/jalview/bin/ArgsParser.java @@ -0,0 +1,97 @@ +package jalview.bin; + +import java.net.URLDecoder; +import java.util.Vector; + +/** + * Notes: this argParser does not distinguish between parameter switches, + * parameter values and argument text. If an argument happens to be identical to + * a parameter, it will be taken as such (even though it didn't have a '-' + * prefixing it). + * + * @author Andrew Waterhouse and JBP documented. + * + */ +public class ArgsParser +{ + Vector vargs = null; + + public ArgsParser(String[] args) + { + vargs = new Vector(); + for (int i = 0; i < args.length; i++) + { + String arg = args[i].trim(); + if (arg.charAt(0) == '-') + { + arg = arg.substring(1); + } + vargs.addElement(arg); + } + } + + /** + * check for and remove first occurence of arg+parameter in arglist. + * + * @param arg + * @return return the argument following the given arg if arg was in list. + */ + public String getValue(String arg) + { + return getValue(arg, false); + } + + public String getValue(String arg, boolean utf8decode) + { + int index = vargs.indexOf(arg); + String dc = null, ret = null; + if (index != -1) + { + ret = vargs.elementAt(index + 1).toString(); + vargs.removeElementAt(index); + vargs.removeElementAt(index); + if (utf8decode && ret != null) + { + try + { + dc = URLDecoder.decode(ret, "UTF-8"); + ret = dc; + } catch (Exception e) + { + // TODO: log failure to decode + } + } + } + return ret; + } + + /** + * check for and remove first occurence of arg in arglist. + * + * @param arg + * @return true if arg was present in argslist. + */ + public boolean contains(String arg) + { + if (vargs.contains(arg)) + { + vargs.removeElement(arg); + return true; + } + else + { + return false; + } + } + + public String nextValue() + { + return vargs.remove(0); + } + + public int getSize() + { + return vargs.size(); + } + +} \ No newline at end of file diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 6c8750f..2d068a4 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -20,27 +20,36 @@ */ package jalview.bin; +import groovy.lang.Binding; +import groovy.util.GroovyScriptEngine; + import jalview.gui.AlignFrame; import jalview.gui.Desktop; +import jalview.gui.PromptUserConfig; +import jalview.io.AppletFormatAdapter; import jalview.io.BioJsHTMLOutput; +import jalview.io.FileLoader; +import jalview.io.FormatAdapter; import jalview.io.HtmlSvgOutput; +import jalview.io.IdentifyFile; +import jalview.io.NewickFile; +import jalview.schemes.ColourSchemeI; +import jalview.schemes.ColourSchemeProperty; +import jalview.schemes.UserColourScheme; import jalview.util.MessageManager; import jalview.util.Platform; import jalview.ws.jws2.Jws2Discoverer; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.lang.reflect.Constructor; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; -import java.net.URLDecoder; import java.security.AllPermission; import java.security.CodeSource; import java.security.PermissionCollection; @@ -62,6 +71,15 @@ import javax.swing.UIManager; */ public class Jalview { + /* + * singleton instance of this class + */ + private static Jalview instance; + + private Desktop desktop; + + public static AlignFrame currentAlignFrame; + static { // grab all the rights we can the JVM @@ -83,6 +101,71 @@ public class Jalview } /** + * keep track of feature fetching tasks. + * + * @author JimP + * + */ + class FeatureFetcher + { + /* + * TODO: generalise to track all jalview events to orchestrate batch + * processing events. + */ + + private int queued = 0; + + private int running = 0; + + public FeatureFetcher() + { + + } + + public void addFetcher(final AlignFrame af, + final Vector dasSources) + { + final long id = System.currentTimeMillis(); + queued++; + final FeatureFetcher us = this; + new Thread(new Runnable() + { + + @Override + public void run() + { + synchronized (us) + { + queued--; + running++; + } + + 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) + { + running--; + } + } + }).start(); + } + + public synchronized boolean allFinished() + { + return queued == 0 && running == 0; + } + + } + + public static Jalview getInstance() + { + return instance; + } + + /** * main class for Jalview application * * @param args @@ -90,6 +173,15 @@ public class Jalview */ public static void main(String[] args) { + instance = new Jalview(); + instance.doMain(args); + } + + /** + * @param args + */ + void doMain(String[] args) + { System.out.println("Java version: " + System.getProperty("java.version")); System.out.println(System.getProperty("os.arch") + " " @@ -162,7 +254,7 @@ public class Jalview try { Cache.initLogger(); - } catch (java.lang.NoClassDefFoundError error) + } catch (NoClassDefFoundError error) { error.printStackTrace(); System.out @@ -171,7 +263,7 @@ public class Jalview System.exit(0); } - Desktop desktop = null; + desktop = null; try { @@ -252,8 +344,9 @@ public class Jalview } String file = null, protocol = null, format = null, data = null; - jalview.io.FileLoader fileLoader = new jalview.io.FileLoader(!headless); - Vector getFeatures = null; // vector of das source nicknames to fetch + FileLoader fileLoader = new FileLoader(!headless); + Vector getFeatures = null; // vector of das source nicknames to + // fetch // features from // loading is done. String groovyscript = null; // script to execute after all loading is @@ -267,8 +360,8 @@ public class Jalview System.out.println("No files to open!"); System.exit(1); } - String vamsasImport = aparser.getValue("vdoc"), vamsasSession = aparser - .getValue("vsess"); + String vamsasImport = aparser.getValue("vdoc"); + String vamsasSession = aparser.getValue("vsess"); if (vamsasImport != null || vamsasSession != null) { if (desktop == null || headless) @@ -283,13 +376,13 @@ public class Jalview { try { - String viprotocol = jalview.io.AppletFormatAdapter + String viprotocol = AppletFormatAdapter .checkProtocol(vamsasImport); if (viprotocol == jalview.io.FormatAdapter.FILE) { inSession = desktop.vamsasImport(new File(vamsasImport)); } - else if (viprotocol == jalview.io.FormatAdapter.URL) + else if (viprotocol == FormatAdapter.URL) { inSession = desktop.vamsasImport(new URL(vamsasImport)); } @@ -366,7 +459,7 @@ public class Jalview if (!file.startsWith("http://")) { - if (!(new java.io.File(file)).exists()) + if (!(new File(file)).exists()) { System.out.println("Can't find " + file); if (headless) @@ -376,9 +469,9 @@ public class Jalview } } - protocol = jalview.io.AppletFormatAdapter.checkProtocol(file); + protocol = AppletFormatAdapter.checkProtocol(file); - format = new jalview.io.IdentifyFile().identify(file, protocol); + format = new IdentifyFile().identify(file, protocol); AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); @@ -388,19 +481,18 @@ public class Jalview } else { - Desktop.setCurrentAlignFrame(af); + setCurrentAlignFrame(af); data = aparser.getValue("colour", true); if (data != null) { data.replaceAll("%20", " "); - jalview.schemes.ColourSchemeI cs = jalview.schemes.ColourSchemeProperty - .getColour(af.getViewport().getAlignment(), data); + ColourSchemeI cs = ColourSchemeProperty.getColour(af + .getViewport().getAlignment(), data); if (cs == null) { - jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme( - "white"); + UserColourScheme ucs = new UserColourScheme("white"); ucs.parseAppletParameter(data); cs = ucs; } @@ -417,7 +509,7 @@ public class Jalview if (data != null) { af.parseFeaturesFile(data, - jalview.io.AppletFormatAdapter.checkProtocol(data)); + AppletFormatAdapter.checkProtocol(data)); // System.out.println("Added " + data); System.out.println("CMD groups[-" + data + "] executed successfully!"); @@ -426,7 +518,7 @@ public class Jalview if (data != null) { af.parseFeaturesFile(data, - jalview.io.AppletFormatAdapter.checkProtocol(data)); + AppletFormatAdapter.checkProtocol(data)); // System.out.println("Added " + data); System.out.println("CMD [-features " + data + "] executed successfully!"); @@ -474,8 +566,8 @@ public class Jalview { System.out.println("CMD [-tree " + data + "] executed successfully!"); - fin = new jalview.io.NewickFile(data, - jalview.io.AppletFormatAdapter.checkProtocol(data)); + fin = new NewickFile(data, + AppletFormatAdapter.checkProtocol(data)); if (fin != null) { af.getViewport().setCurrentTree( @@ -516,7 +608,7 @@ public class Jalview // Execute the groovy script after we've done all the rendering stuff // and before any images or figures are generated. System.out.println("Executing script " + groovyscript); - executeGroovyScript(groovyscript, new Object[] { desktop, af }); + executeGroovyScript(groovyscript, af); System.out.println("CMD groovy[" + groovyscript + "] executed successfully!"); groovyscript = null; @@ -529,14 +621,14 @@ public class Jalview if (format.equalsIgnoreCase("png")) { - af.createPNG(new java.io.File(file)); - imageName = (new java.io.File(file)).getName(); + af.createPNG(new File(file)); + imageName = (new File(file)).getName(); System.out.println("Creating PNG image: " + file); continue; } else if (format.equalsIgnoreCase("svg")) { - File imageFile = new java.io.File(file); + File imageFile = new File(file); imageName = imageFile.getName(); af.createSVG(imageFile); System.out.println("Creating SVG image: " + file); @@ -544,21 +636,21 @@ public class Jalview } else if (format.equalsIgnoreCase("html")) { - File imageFile = new java.io.File(file); + File imageFile = new File(file); imageName = imageFile.getName(); - new HtmlSvgOutput(new java.io.File(file), af.alignPanel); + new HtmlSvgOutput(new File(file), af.alignPanel); System.out.println("Creating HTML image: " + file); continue; } else if (format.equalsIgnoreCase("imgMap")) { - af.createImageMap(new java.io.File(file), imageName); + af.createImageMap(new File(file), imageName); System.out.println("Creating image map: " + file); continue; } else if (format.equalsIgnoreCase("eps")) { - File outputFile = new java.io.File(file); + File outputFile = new File(file); System.out.println("Creating EPS file: " + outputFile.getAbsolutePath()); af.createEPS(outputFile); @@ -618,7 +710,7 @@ public class Jalview } else { - format = new jalview.io.IdentifyFile().identify(file, protocol); + format = new IdentifyFile().identify(file, protocol); } startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol, @@ -640,11 +732,10 @@ public class Jalview // Once all other stuff is done, execute any groovy scripts (in order) if (groovyscript != null) { - if (jalview.bin.Cache.groovyJarsPresent()) + if (Cache.groovyJarsPresent()) { System.out.println("Executing script " + groovyscript); - executeGroovyScript(groovyscript, new Object[] { desktop, - startUpAlframe }); + executeGroovyScript(groovyscript, startUpAlframe); } else { @@ -711,8 +802,8 @@ public class Jalview /** * start a User Config prompt asking if we can log usage statistics. */ - jalview.gui.PromptUserConfig prompter = new jalview.gui.PromptUserConfig( - desktop.desktop, + PromptUserConfig prompter = new PromptUserConfig( + Desktop.desktop, "USAGESTATS", "Jalview Usage Statistics", "Do you want to help make Jalview better by enabling " @@ -748,14 +839,8 @@ public class Jalview * the Jalview Desktop object passed in to the groovy binding as the * 'Jalview' object. */ - private static void executeGroovyScript(String groovyscript, - Object[] jalviewContext) + private void executeGroovyScript(String groovyscript, AlignFrame af) { - if (jalviewContext == null) - { - System.err - .println("Sorry. Groovy support is currently only available when running with the Jalview GUI enabled."); - } /** * for scripts contained in files */ @@ -772,8 +857,8 @@ public class Jalview tfile = File.createTempFile("jalview", "groovy"); PrintWriter outfile = new PrintWriter(new OutputStreamWriter( new FileOutputStream(tfile))); - BufferedReader br = new BufferedReader( - new java.io.InputStreamReader(System.in)); + BufferedReader br = new BufferedReader(new InputStreamReader( + System.in)); String line = null; while ((line = br.readLine()) != null) { @@ -837,75 +922,23 @@ public class Jalview } } } - boolean success = false; try { - /* - * The following code performs the GroovyScriptEngine invocation using - * reflection, and is equivalent to this fragment from the embedding - * groovy documentation on the groovy site: import - * groovy.lang.Binding; import groovy.util.GroovyScriptEngine; - * - * String[] roots = new String[] { "/my/groovy/script/path" }; - * GroovyScriptEngine gse = new GroovyScriptEngine(roots); Binding binding - * = new Binding(); binding.setVariable("input", "world"); - * gse.run("hello.groovy", binding); - */ - Class[] bspec; - Object[] binding; - int blen = ((jalviewContext[0] == null) ? 0 : 1) - + ((jalviewContext[1] == null) ? 0 : 1); - String cnames[] = new String[] { "Jalview", "currentAlFrame" }; - bspec = new Class[blen * 2]; - binding = new Object[blen * 2]; - blen = 0; - ClassLoader cl = null; Map vbinding = new HashMap(); - for (int jc = 0; jc < jalviewContext.length; jc++) + vbinding.put("Jalview", this); + if (af != null) { - if (jalviewContext[jc] != null) - { - if (cl == null) - { - cl = jalviewContext[jc].getClass().getClassLoader(); - } - bspec[blen * 2] = String.class; - bspec[blen * 2 + 1] = Object.class; - binding[blen * 2] = cnames[jc]; - binding[blen * 2 + 1] = jalviewContext[jc]; - vbinding.put(cnames[jc], jalviewContext[jc]); - blen++; - } + vbinding.put("currentAlFrame", af); } - Class gbindingc = cl.loadClass("groovy.lang.Binding"); - Constructor gbcons; - Object gbinding; - try - { - gbcons = gbindingc.getConstructor(Map.class); - gbinding = gbcons.newInstance(vbinding); - } catch (NoSuchMethodException x) + Binding gbinding = new Binding(vbinding); + GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile }); + gse.run(sfile.toString(), gbinding); + if ("STDIN".equals(groovyscript)) { - // old style binding config - using series of string/object values to - // setVariable. - gbcons = gbindingc.getConstructor(); - gbinding = gbcons.newInstance(); - java.lang.reflect.Method setvar = gbindingc.getMethod( - "setVariable", bspec); - setvar.invoke(gbinding, binding); + // delete temp file that we made - + // only if it was successfully executed + tfile.delete(); } - - Class gsec = cl.loadClass("groovy.util.GroovyScriptEngine"); - Constructor gseccons = gsec - .getConstructor(new Class[] { URL[].class }); // String[].class - // }); - Object gse = gseccons - .newInstance(new Object[] { new URL[] { sfile } }); // .toString() - // } }); - java.lang.reflect.Method run = gsec.getMethod("run", new Class[] { - String.class, gbindingc }); - run.invoke(gse, new Object[] { sfile.toString(), gbinding }); - success = true; } catch (Exception e) { System.err.println("Exception Whilst trying to execute file " + sfile @@ -913,12 +946,6 @@ public class Jalview e.printStackTrace(System.err); } - if (success && groovyscript.equals("STDIN")) - { - // delete temp file that we made - but only if it was successfully - // executed - tfile.delete(); - } } /** @@ -926,16 +953,15 @@ public class Jalview * * @return vector of DAS source nicknames to retrieve from */ - private static Vector checkDasArguments(ArgsParser aparser) + private static Vector checkDasArguments(ArgsParser aparser) { - Vector source = null; + Vector source = null; String data; String locsources = Cache.getProperty(Cache.DAS_LOCAL_SOURCE); while ((data = aparser.getValue("dasserver", true)) != null) { String nickname = null; String url = null; - boolean seq = false, feat = true; int pos = data.indexOf('='); // determine capabilities if (pos > 0) @@ -965,7 +991,7 @@ public class Jalview + nickname + "|" + url); if (source == null) { - source = new Vector(); + source = new Vector(); } source.addElement(nickname); } @@ -983,7 +1009,7 @@ public class Jalview System.out.println("adding source '" + data + "'"); if (source == null) { - source = new Vector(); + source = new Vector(); } source.addElement(data); } @@ -995,7 +1021,8 @@ public class Jalview * * @param dasSources */ - private static FeatureFetcher startFeatureFetching(final Vector dasSources) + private FeatureFetcher startFeatureFetching( + final Vector dasSources) { FeatureFetcher ff = new FeatureFetcher(); AlignFrame afs[] = Desktop.getAlignFrames(); @@ -1019,176 +1046,37 @@ public class Jalview } return false; } -} - -/** - * Notes: this argParser does not distinguish between parameter switches, - * parameter values and argument text. If an argument happens to be identical to - * a parameter, it will be taken as such (even though it didn't have a '-' - * prefixing it). - * - * @author Andrew Waterhouse and JBP documented. - * - */ - -class rnabuttonlistener implements ActionListener -{ - @Override - public void actionPerformed(ActionEvent arg0) - { - System.out.println("Good idea ! "); - - } -} - -class pbuttonlistener implements ActionListener -{ - @Override - public void actionPerformed(ActionEvent arg0) - { - - } -} - -class ArgsParser -{ - Vector vargs = null; - public ArgsParser(String[] args) - { - vargs = new Vector(); - for (int i = 0; i < args.length; i++) - { - String arg = args[i].trim(); - if (arg.charAt(0) == '-') - { - arg = arg.substring(1); - } - vargs.addElement(arg); - } - } - - /** - * check for and remove first occurence of arg+parameter in arglist. - * - * @param arg - * @return return the argument following the given arg if arg was in list. - */ - public String getValue(String arg) + public AlignFrame[] getAlignFrames() { - return getValue(arg, false); - } + return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() } + : Desktop.getAlignFrames(); - public String getValue(String arg, boolean utf8decode) - { - int index = vargs.indexOf(arg); - String dc = null, ret = null; - if (index != -1) - { - ret = vargs.elementAt(index + 1).toString(); - vargs.removeElementAt(index); - vargs.removeElementAt(index); - if (utf8decode && ret != null) - { - try - { - dc = URLDecoder.decode(ret, "UTF-8"); - ret = dc; - } catch (Exception e) - { - // TODO: log failure to decode - } - } - } - return ret; } /** - * check for and remove first occurence of arg in arglist. - * - * @param arg - * @return true if arg was present in argslist. + * Quit method delegates to Desktop.quit - unless running in headless mode + * when it just ends the JVM */ - public boolean contains(String arg) + public void quit() { - if (vargs.contains(arg)) + if (desktop != null) { - vargs.removeElement(arg); - return true; + desktop.quit(); } else { - return false; + System.exit(0); } } - public String nextValue() + public static AlignFrame getCurrentAlignFrame() { - return vargs.remove(0).toString(); + return Jalview.currentAlignFrame; } - public int getSize() + public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) { - return vargs.size(); + Jalview.currentAlignFrame = currentAlignFrame; } - -} - -/** - * keep track of feature fetching tasks. - * - * @author JimP - * - */ -class FeatureFetcher -{ - /* - * TODO: generalise to track all jalview events to orchestrate batch - * processing events. - */ - - private int queued = 0; - - private int running = 0; - - public FeatureFetcher() - { - - } - - public void addFetcher(final AlignFrame af, final Vector dasSources) - { - final long id = System.currentTimeMillis(); - queued++; - final FeatureFetcher us = this; - new Thread(new Runnable() - { - - @Override - public void run() - { - synchronized (us) - { - queued--; - running++; - } - - 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) - { - running--; - } - } - }).start(); - } - - public synchronized boolean allFinished() - { - return queued == 0 && running == 0; - } - } diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 8ec5366..7701d3e 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -473,7 +473,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void focusGained(FocusEvent e) { - Desktop.setCurrentAlignFrame(AlignFrame.this); + Jalview.setCurrentAlignFrame(AlignFrame.this); } }); @@ -6119,7 +6119,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void runGroovy_actionPerformed() { - Desktop.setCurrentAlignFrame(this); + Jalview.setCurrentAlignFrame(this); groovy.ui.Console console = Desktop.getGroovyConsole(); if (console != null) { diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 7f36f7f..f570217 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -169,8 +169,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements static final int yOffset = 30; - private static AlignFrame currentAlignFrame; - public static jalview.ws.jws1.Discoverer discoverer; public static Object[] jalviewClipboard; @@ -2409,7 +2407,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (Jalview.isHeadlessMode()) { // Desktop.desktop is null in headless mode - return new AlignFrame[] { currentAlignFrame }; + return new AlignFrame[] { Jalview.currentAlignFrame }; } JInternalFrame[] frames = Desktop.desktop.getAllFrames(); @@ -2529,7 +2527,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements @Override public void windowClosed(WindowEvent e) { - groovyShell.setEnabled(true); enableExecuteGroovy(false); } }); @@ -2538,7 +2535,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements * if we got this far, enable 'Run Groovy' in AlignFrame menus * and disable opening a second console */ - groovyShell.setEnabled(false); enableExecuteGroovy(true); } @@ -2546,9 +2542,16 @@ public class Desktop extends jalview.jbgui.GDesktop implements * Enable or disable 'Run Groovy script' in AlignFrame calculate menus * * @param enabled + * true if Groovy console is open */ public void enableExecuteGroovy(boolean enabled) { + /* + * disable opening a second Groovy console + * (or re-enable when the console is closed) + */ + groovyShell.setEnabled(!enabled); + AlignFrame[] alignFrames = getAlignFrames(); if (alignFrames != null) { @@ -3172,17 +3175,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements * The dust settles...give focus to the tab we did this from. */ myTopFrame.setDisplayedView(myTopFrame.alignPanel); - - } - - public static AlignFrame getCurrentAlignFrame() - { - return currentAlignFrame; - } - - public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) - { - Desktop.currentAlignFrame = currentAlignFrame; } public static groovy.ui.Console getGroovyConsole() diff --git a/src/jalview/workers/AlignmentAnnotationFactory.java b/src/jalview/workers/AlignmentAnnotationFactory.java index 37f3ca5..520b232 100644 --- a/src/jalview/workers/AlignmentAnnotationFactory.java +++ b/src/jalview/workers/AlignmentAnnotationFactory.java @@ -1,9 +1,9 @@ package jalview.workers; +import jalview.bin.Jalview; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.gui.AlignFrame; -import jalview.gui.Desktop; import java.awt.Color; @@ -28,9 +28,9 @@ public class AlignmentAnnotationFactory */ public static void newCalculator(FeatureCounterI counter) { - if (Desktop.getCurrentAlignFrame() != null) + if (Jalview.getCurrentAlignFrame() != null) { - newCalculator(Desktop.getCurrentAlignFrame(), counter); + newCalculator(Jalview.getCurrentAlignFrame(), counter); } else { @@ -60,9 +60,9 @@ public class AlignmentAnnotationFactory */ public static void newCalculator(AnnotationProviderI calculator) { - if (Desktop.getCurrentAlignFrame() != null) + if (Jalview.getCurrentAlignFrame() != null) { - newCalculator(Desktop.getCurrentAlignFrame(), calculator); + newCalculator(Jalview.getCurrentAlignFrame(), calculator); } else { diff --git a/test/jalview/bin/ArgsParserTest.java b/test/jalview/bin/ArgsParserTest.java new file mode 100644 index 0000000..06e79de --- /dev/null +++ b/test/jalview/bin/ArgsParserTest.java @@ -0,0 +1,65 @@ +package jalview.bin; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertTrue; + +import org.testng.annotations.Test; + +public class ArgsParserTest +{ + @Test(groups = "Functional") + public void testGetValue() + { + ArgsParser ap = new ArgsParser(new String[] { "-name", "Henry", "-job", + "Tester" }); + assertEquals(4, ap.getSize()); + assertNull(ap.getValue("rubbish")); + assertEquals("Tester", ap.getValue("job")); + // call to getValue removes the argument and its value + assertEquals(2, ap.getSize()); + assertNull(ap.getValue("job")); + assertFalse(ap.contains("job")); + assertFalse(ap.contains("Tester")); + + assertEquals("Henry", ap.getValue("name")); + assertEquals(0, ap.getSize()); + assertNull(ap.getValue("name")); + } + + @Test(groups = "Functional") + public void testGetValue_decoded() + { + ArgsParser ap = new ArgsParser(new String[] { "-name%241", "Henry", + "-job", "Test%203%2a" }); + // parameter value is decoded + assertEquals("Test 3*", ap.getValue("job", true)); + // parameter name is not decoded + assertNull(ap.getValue("name$1", true)); + assertEquals("Henry", ap.getValue("name%241", true)); + } + + @Test(groups = "Functional") + public void testNextValue() + { + ArgsParser ap = new ArgsParser(new String[] { "-name", "Henry", "-job", + "Tester" }); + assertEquals("name", ap.nextValue()); + assertEquals("Henry", ap.nextValue()); + assertEquals("job", ap.nextValue()); + assertEquals("Tester", ap.nextValue()); + } + + @Test(groups = "Functional") + public void testContains() + { + ArgsParser ap = new ArgsParser(new String[] { "-name", "Henry", "-job", + "Tester" }); + assertFalse(ap.contains("Susan")); + assertFalse(ap.contains("-name")); + assertTrue(ap.contains("name")); + // testing for contains removes the argument + assertFalse(ap.contains("name")); + } +} -- 1.7.10.2