das feature fetch followed by png output fixed (bug #0059977). Trial of utf8 decoding...
authorjprocter <Jim Procter>
Wed, 10 Feb 2010 14:48:27 +0000 (14:48 +0000)
committerjprocter <Jim Procter>
Wed, 10 Feb 2010 14:48:27 +0000 (14:48 +0000)
src/jalview/bin/Jalview.java

index f49a6b6..624ac58 100755 (executable)
@@ -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;
+  }
+};