From bd6ce583c00bc78edfc027df4e6b7cc9180ff9d0 Mon Sep 17 00:00:00 2001 From: jprocter Date: Wed, 10 Feb 2010 14:48:27 +0000 Subject: [PATCH] das feature fetch followed by png output fixed (bug #0059977). Trial of utf8 decoding of command line arguments to fix applet-application parameter transfer problems. --- src/jalview/bin/Jalview.java | 121 +++++++++++++++++++++++++++++++----------- 1 file changed, 91 insertions(+), 30 deletions(-) diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index f49a6b6..624ac58 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -26,6 +26,7 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.lang.reflect.Constructor; import java.net.URL; +import java.net.URLDecoder; import java.security.AllPermission; import java.security.CodeSource; import java.security.PermissionCollection; @@ -222,8 +223,8 @@ public class Jalview String groovyscript = null; // script to execute after all loading is // completed one way or another // extract groovy argument and execute if necessary - groovyscript = aparser.getValue("groovy"); - file = aparser.getValue("open"); + groovyscript = aparser.getValue("groovy",true); + file = aparser.getValue("open",true); if (file == null && desktop == null) { @@ -343,7 +344,7 @@ public class Jalview return; } - data = aparser.getValue("colour"); + data = aparser.getValue("colour",true); if (data != null) { data.replaceAll("%20", " "); @@ -364,20 +365,20 @@ public class Jalview } // Must maintain ability to use the groups flag - data = aparser.getValue("groups"); + data = aparser.getValue("groups",true); if (data != null) { af.parseFeaturesFile(data, checkProtocol(data)); System.out.println("Added " + data); } - data = aparser.getValue("features"); + data = aparser.getValue("features",true); if (data != null) { af.parseFeaturesFile(data, checkProtocol(data)); System.out.println("Added " + data); } - data = aparser.getValue("annotations"); + data = aparser.getValue("annotations",true); if (data != null) { af.loadJalviewDataFile(data); @@ -392,7 +393,7 @@ public class Jalview { af.getViewport().setSortByTree(false); } - data = aparser.getValue("tree"); + data = aparser.getValue("tree",true); if (data != null) { jalview.io.NewickFile fin = null; @@ -411,22 +412,27 @@ public class Jalview ex.printStackTrace(System.err); } } + // todo - load PDB structure to alignment + // (associate with identical sequence in alignment, or a specified sequence) + + getFeatures = checkDasArguments(aparser); if (af != null && getFeatures != null) { - startFeatureFetching(getFeatures); - // need to block until fetching is complete. - while (af.operationInProgress()) - { - // wait around until fetching is finished. + FeatureFetcher ff = startFeatureFetching(getFeatures); + if (ff!=null) + while (!ff.allFinished() || af.operationInProgress()) + { + // wait around until fetching is finished. try { - Thread.sleep(10); + Thread.sleep(100); } catch (Exception e) { } } + getFeatures = null; // have retrieved features - forget them now. } if (groovyscript != null) { @@ -520,7 +526,10 @@ public class Jalview getFeatures = checkDasArguments(aparser); // extract groovy arguments before anything else. } - // Once all loading is done. Retrieve features. + // If the user has specified features to be retrieved, + // or a groovy script to be executed, do them if they + // haven't been done already + // fetch features for the default alignment if (getFeatures != null) { if (startUpAlframe != null) @@ -528,6 +537,7 @@ public class Jalview startFeatureFetching(getFeatures); } } + // execute a groovy script. if (groovyscript != null) { if (jalview.bin.Cache.groovyJarsPresent()) @@ -701,7 +711,7 @@ public class Jalview Vector source = null; String data; String locsources = Cache.getProperty(Cache.DAS_LOCAL_SOURCE); - while ((data = aparser.getValue("dasserver")) != null) + while ((data = aparser.getValue("dasserver",true)) != null) { String nickname = null; String url = null; @@ -746,7 +756,7 @@ public class Jalview + locsources); Cache.setProperty(Cache.DAS_LOCAL_SOURCE, locsources); } - while ((data = aparser.getValue("fetchfrom")) != null) + while ((data = aparser.getValue("fetchfrom",true)) != null) { System.out.println("adding source '" + data + "'"); if (source == null) @@ -763,28 +773,20 @@ public class Jalview * * @param dasSources */ - private static void startFeatureFetching(final Vector dasSources) + private static FeatureFetcher startFeatureFetching(final Vector dasSources) { + FeatureFetcher ff = new FeatureFetcher(); AlignFrame afs[] = Desktop.getAlignframes(); if (afs == null || afs.length == 0) { - return; + return null; } for (int i = 0; i < afs.length; i++) { - final AlignFrame af = afs[i]; - SwingUtilities.invokeLater(new Runnable() - { - - public void run() - { - af.featureSettings_actionPerformed(null); - af.featureSettings.fetchDasFeatures(dasSources); - } - }); + ff.addFetcher(afs[i], dasSources); } + return ff; } - private static String checkProtocol(String file) { String protocol = jalview.io.FormatAdapter.FILE; @@ -832,13 +834,27 @@ class ArgsParser */ public String getValue(String arg) { + return getValue(arg, false); + } + public String getValue(String arg, boolean utf8decode) + { int index = vargs.indexOf(arg); - String ret = null; + 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; } @@ -873,3 +889,48 @@ class ArgsParser } } +/** + * 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() + { + + public void run() + { + synchronized (us) { + queued--; + running++; + } + + af.setProgressBar("DAS features being retrieved...", 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; + } +}; -- 1.7.10.2