JAL-3253 code tidies and tweaks to Desktop
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 21 May 2019 10:29:59 +0000 (11:29 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Tue, 21 May 2019 10:29:59 +0000 (11:29 +0100)
16 files changed:
src/jalview/datamodel/DBRefEntry.java
src/jalview/gui/Console.java
src/jalview/gui/Desktop.java
src/jalview/gui/JalviewDialog.java
src/jalview/gui/SplashScreen.java
src/jalview/gui/StructureChooser.java
src/jalview/httpserver/HttpServer.java
src/jalview/io/HTMLOutput.java
src/jalview/io/JalviewFileFilter.java
src/jalview/rest/RestHandler.java
src/jalview/structure/StructureSelectionManager.java
src/jalview/urls/IdOrgSettings.java
src/jalview/util/BrowserLauncher.java
test/jalview/analysis/AlignmentSorterTest.java
test/jalview/gui/SeqCanvasTest.java
test/jalview/io/FeaturesFileTest.java

index 54e8379..0004abe 100755 (executable)
@@ -21,7 +21,6 @@
 package jalview.datamodel;
 
 import jalview.api.DBRefEntryI;
-import jalview.io.vamsas.Dbref;
 import jalview.util.DBRefUtils;
 import jalview.util.MapList;
 
@@ -42,7 +41,7 @@ public class DBRefEntry implements DBRefEntryI
 
   private String version = "";
   
-  private String ucversion;
+  private String ucversion = "";
 
   private String accessionId = "";
   
index 3ff8c12..f44dae1 100644 (file)
@@ -136,7 +136,7 @@ public class Console extends WindowAdapter
     }
     quit = false; // signals the Threads that they should exit
 
-    // Starting two seperate threads to read from the PipedInputStreams
+    // Starting two separate threads to read from the PipedInputStreams
     //
     reader = new Thread(this);
     reader.setDaemon(true);
index bc892cf..2a972e3 100644 (file)
@@ -199,13 +199,14 @@ public class Desktop extends GDesktop
 
   public static MyDesktopPane getDesktopPane()
   {
-    return Desktop.getInstance().desktopPane;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.desktopPane;
   }
 
-  public StructureSelectionManager getStructureSelectionManager()
+  public static StructureSelectionManager getStructureSelectionManager()
   {
     return StructureSelectionManager
-            .getStructureSelectionManager(this);
+            .getStructureSelectionManager(getInstance());
   }
 
   static int openFrameCount = 0;
@@ -222,7 +223,9 @@ public class Desktop extends GDesktop
 
   private static int fileLoadingCount = 0;
 
-  public JInternalFrame conservationSlider, PIDSlider;
+  public JInternalFrame conservationSlider;
+
+  public JInternalFrame PIDSlider;
 
   /**
    * just an instance (for testng, probably); no actual frames
@@ -363,8 +366,9 @@ public class Desktop extends GDesktop
    */
   public static Desktop getInstance()
   {
-    return (Desktop) ApplicationSingletonProvider
-            .getInstance(Desktop.class);
+    return Jalview.isHeadlessMode() ? null
+            : (Desktop) ApplicationSingletonProvider
+                    .getInstance(Desktop.class);
   }
 
   /**
@@ -384,6 +388,8 @@ public class Desktop extends GDesktop
   @SuppressWarnings("unused")
   private Desktop()
   {
+    try
+    {
     /**
      * A note to implementors. It is ESSENTIAL that any activities that might
      * block are spawned off as threads rather than waited for during this
@@ -549,6 +555,10 @@ public class Desktop extends GDesktop
       }
     });
     desktopPane.addMouseListener(ma);
+    } catch (Throwable t)
+    {
+      t.printStackTrace();
+    }
   }
 
   /**
@@ -567,7 +577,8 @@ public class Desktop extends GDesktop
   public void doConfigureStructurePrefs()
   {
     // configure services
-    StructureSelectionManager ssm = getStructureSelectionManager();
+    StructureSelectionManager ssm = StructureSelectionManager
+            .getStructureSelectionManager(this);
     if (jalview.bin.Cache.getDefault(Preferences.ADD_SS_ANN, true))
     {
       ssm.setAddTempFacAnnot(jalview.bin.Cache
@@ -3485,7 +3496,8 @@ public class Desktop extends GDesktop
 
   public static groovy.ui.Console getGroovyConsole()
   {
-    return Desktop.getInstance().groovyConsole;
+    Desktop desktop = Desktop.getInstance();
+    return desktop == null ? null : desktop.groovyConsole;
   }
 
   /**
index 0ff5606..eb69230 100644 (file)
@@ -77,12 +77,12 @@ public abstract class JalviewDialog extends JPanel
   protected void initDialogFrame(Container content, boolean modal,
           boolean block, String title, int width, int height)
   {
-
-    frame = new JDialog(Desktop.getInstance(), modal);
+    Desktop desktop = Desktop.getInstance();
+    frame = new JDialog(desktop, modal);
     frame.setTitle(title);
-    if (Desktop.getInstance() != null)
+    if (desktop != null)
     {
-      Rectangle deskr = Desktop.getInstance().getBounds();
+      Rectangle deskr = desktop.getBounds();
       frame.setBounds(new Rectangle((int) (deskr.getCenterX() - width / 2),
               (int) (deskr.getCenterY() - height / 2), width, height));
     }
index 98b24d1..f5648d2 100755 (executable)
@@ -101,7 +101,7 @@ public class SplashScreen extends JPanel
        */
       {
         authlist = new JTextPane();
-        Thread t = new Thread(this);
+        Thread t = new Thread(this, "SplashScreen");
         t.start();
       }
     }
@@ -203,7 +203,8 @@ public class SplashScreen extends JPanel
   @SuppressWarnings("unused")
   protected boolean refreshText()
   {
-    String newtext = Desktop.getInstance().getAboutMessage(true).toString();
+    Desktop desktop = Desktop.getInstance();
+    String newtext = desktop.getAboutMessage(true).toString();
     // System.err.println("Text found: \n"+newtext+"\nEnd of newtext.");
     if (oldtext != newtext.length())
     {
@@ -236,8 +237,8 @@ public class SplashScreen extends JPanel
       authlist.setSize(new Dimension(750, 375));
       add(authlist, BorderLayout.CENTER);
       revalidate();
-      iframe.setBounds((Desktop.getInstance().getWidth() - 750) / 2,
-              (Desktop.getInstance().getHeight() - 375) / 2, 750,
+      iframe.setBounds((desktop.getWidth() - 750) / 2,
+              (desktop.getHeight() - 375) / 2, 750,
               authlist.getHeight() + iconimg.getHeight());
       iframe.validate();
       iframe.setVisible(true);
index cb09b7c..9c4f6c8 100644 (file)
@@ -143,20 +143,22 @@ public class StructureChooser extends GStructureChooser
    */
   protected void discoverStructureViews()
   {
-    if (Desktop.getInstance() != null)
+    Desktop desktop = Desktop.getInstance();
+    if (desktop != null)
     {
       targetView.removeAllItems();
-      Desktop d = Desktop.getInstance();
-      if (d.lastTargetedView != null && !d.lastTargetedView.isVisible())
+      if (desktop.lastTargetedView != null
+              && !desktop.lastTargetedView.isVisible())
       {
-        d.lastTargetedView = null;
+        desktop.lastTargetedView = null;
       }
       int linkedViewsAt = 0;
-      for (StructureViewerBase view : Desktop.getInstance()
+      for (StructureViewerBase view : desktop
               .getStructureViewers(null, null))
       {
-        StructureViewer viewHandler = (d.lastTargetedView != null
-                && d.lastTargetedView.sview == view) ? d.lastTargetedView
+        StructureViewer viewHandler = (desktop.lastTargetedView != null
+                && desktop.lastTargetedView.sview == view)
+                        ? desktop.lastTargetedView
                         : StructureViewer.reconfigure(view);
 
         if (view.isLinkedWith(ap))
@@ -177,9 +179,9 @@ public class StructureChooser extends GStructureChooser
       if (targetView.getItemCount() > 0)
       {
         targetView.setVisible(true);
-        if (d.lastTargetedView != null)
+        if (desktop.lastTargetedView != null)
         {
-          targetView.setSelectedItem(d.lastTargetedView);
+          targetView.setSelectedItem(desktop.lastTargetedView);
         }
         else
         {
index 8cb1846..f2daf2b 100644 (file)
@@ -53,6 +53,31 @@ import org.eclipse.jetty.util.thread.QueuedThreadPool;
  */
 public class HttpServer implements ApplicationSingletonI
 {
+  /*
+   * 'context root' - actually just prefixed to the path for each handler for
+   * now - see registerHandler
+   */
+  private static final String JALVIEW_PATH = "jalview";
+
+  /*
+   * The Http server
+   */
+  private Server server;
+
+  /*
+   * Registered handlers for context paths
+   */
+  private HandlerCollection contextHandlers;
+
+  /*
+   * Lookup of ContextHandler by its wrapped handler
+   */
+  Map<Handler, ContextHandler> myHandlers = new HashMap<>();
+
+  /*
+   * The context root for the server
+   */
+  private URI contextRoot;
 
   /**
    * Returns the singleton instance of this class.
@@ -86,32 +111,6 @@ public class HttpServer implements ApplicationSingletonI
     registerHandler(RestHandler.getInstance());
   }
 
-  /*
-   * 'context root' - actually just prefixed to the path for each handler for
-   * now - see registerHandler
-   */
-  private static final String JALVIEW_PATH = "jalview";
-
-  /*
-   * The Http server
-   */
-  private Server server;
-
-  /*
-   * Registered handlers for context paths
-   */
-  private HandlerCollection contextHandlers;
-
-  /*
-   * Lookup of ContextHandler by its wrapped handler
-   */
-  Map<Handler, ContextHandler> myHandlers = new HashMap<>();
-
-  /*
-   * The context root for the server
-   */
-  private URI contextRoot;
-
   /**
    * Start the http server
    * 
index 9729ec8..e7054c7 100644 (file)
@@ -243,17 +243,6 @@ public abstract class HTMLOutput implements Runnable
     }
   }
 
-  // /**
-  // * Answers true if HTML export is invoke in headless mode or false otherwise
-  // *
-  // * @return
-  // */
-  // protected boolean isHeadless()
-  // {
-  // return System.getProperty("java.awt.headless") != null
-  // && System.getProperty("java.awt.headless").equals("true");
-  // }
-
   /**
    * This method provides implementation of consistent behaviour which should
    * occur after a HTML file export. It MUST be called at the end of the
index a702aae..cc63a22 100755 (executable)
@@ -30,8 +30,6 @@ import javax.swing.filechooser.FileFilter;
 
 public class JalviewFileFilter extends FileFilter
 {
-  // public static Hashtable suffixHash = new Hashtable();
-
   private Map<String, JalviewFileFilter> filters = null;
 
   private String description = "no description";
@@ -135,8 +133,6 @@ public class JalviewFileFilter extends FileFilter
       {
         return filename.substring(i + 1).toLowerCase();
       }
-
-      ;
     }
 
     return "";
index fefdc57..7c8c9a6 100644 (file)
@@ -33,7 +33,6 @@ import javax.servlet.http.HttpServletResponse;
 
 /**
  * A simple handler to process (or delegate) HTTP requests on /jalview/rest.
- * Accessed only by HttpServer.
  */
 public class RestHandler extends AbstractRequestHandler
         implements ApplicationSingletonI
index e7835f3..012dff3 100644 (file)
@@ -116,7 +116,8 @@ public class StructureSelectionManager implements ApplicationSingletonI
   /**
    * Answers an instance of this class scoped to the given context. The instance
    * is created on the first request for the context, thereafter the same
-   * instance is returned.
+   * instance is returned. Note that the context may be null (this is the case
+   * when running headless without a Desktop).
    * 
    * @param context
    * @return
index 10c3478..cd7e98e 100644 (file)
@@ -29,11 +29,9 @@ import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
  */
 public class IdOrgSettings implements ApplicationSingletonI
 {
+  private String url;
 
-  private IdOrgSettings()
-  {
-    // private singleton
-  }
+  private String location;
 
   private static IdOrgSettings getInstance()
   {
@@ -41,10 +39,6 @@ public class IdOrgSettings implements ApplicationSingletonI
             .getInstance(IdOrgSettings.class);
   }
 
-  private String url;
-
-  private String location;
-
   public static void setUrl(String seturl)
   {
     getInstance().url = seturl;
@@ -64,4 +58,9 @@ public class IdOrgSettings implements ApplicationSingletonI
   {
     return getInstance().location;
   }
+
+  private IdOrgSettings()
+  {
+    // private singleton
+  }
 }
index 94d66f4..ca2e55e 100755 (executable)
@@ -28,13 +28,6 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /**
- * 
- * SwingJS note: Do not use methods in this class directly. Use
- * 
- * Platform.openURL(String url) only.
- * 
- * JavaScript does not see this class.
- * 
  * BrowserLauncher is a class that provides two static methods:
  * 
  * openURL(String url), which opens the default web browser for the current user
@@ -42,7 +35,6 @@ import java.lang.reflect.Method;
  * 
  * resetBrowser(), which allows switching browsers in Java.
  * 
- * 
  * openURL may support other protocols depending on the system -- mailto, ftp,
  * etc. -- but that has not been rigorously tested and is not guaranteed to
  * work.
@@ -92,6 +84,14 @@ import java.lang.reflect.Method;
  *         "mailto:ejalbert@cs.stanford.edu">ejalbert@cs.stanford.edu</a>)
  * @version 1.4b1 (Released June 20, 2001)
  */
+/*
+ * 
+ * SwingJS note: Do not use methods in this class directly. Use
+ * 
+ * Platform.openURL(String url) only.
+ * 
+ * JavaScript does not see this class.
+ */
 public class BrowserLauncher
 {
   /**
index 3b9be23..090ae1a 100644 (file)
@@ -11,10 +11,10 @@ import jalview.datamodel.SequenceI;
 import java.util.Arrays;
 import java.util.List;
 
-import junit.extensions.PA;
-
 import org.testng.annotations.Test;
 
+import junit.extensions.PA;
+
 public class AlignmentSorterTest
 {
   @Test(groups = "Functional")
@@ -31,7 +31,10 @@ public class AlignmentSorterTest
     /*
      * sort with no score features does nothing
      */
-    PA.setValue(AlignmentSorter.class, "sortByFeatureCriteria", null);
+    AlignmentSorter sorter = (AlignmentSorter) PA
+            .invokeMethod(AlignmentSorter.class, "getInstance()",
+                    new Object[] {});
+    PA.setValue(sorter, "sortByFeatureCriteria", null);
 
     AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
             AlignmentSorter.FEATURE_SCORE);
@@ -64,7 +67,7 @@ public class AlignmentSorterTest
      * sort by ascending score, no filter on feature type or group
      * NB sort order for the same feature set (none) gets toggled, so descending
      */
-    PA.setValue(AlignmentSorter.class, "sortByFeatureAscending", true);
+    PA.setValue(sorter, "sortByFeatureAscending", true);
     AlignmentSorter.sortByFeature(null, null, 0, al.getWidth(), al,
             AlignmentSorter.FEATURE_SCORE);
     assertSame(al.getSequenceAt(3), seq3); // -0.5
index 73aeb79..7d0e256 100644 (file)
@@ -22,6 +22,7 @@ package jalview.gui;
 
 import static org.testng.Assert.assertEquals;
 
+import jalview.bin.Cache;
 import jalview.datamodel.AlignmentI;
 import jalview.io.DataSourceType;
 import jalview.io.FileLoader;
@@ -29,12 +30,19 @@ import jalview.io.FileLoader;
 import java.awt.Font;
 import java.awt.FontMetrics;
 
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import junit.extensions.PA;
 
 public class SeqCanvasTest
 {
+  @BeforeClass(alwaysRun = true)
+  public void setUp()
+  {
+    Cache.initLogger();
+  }
+
   /**
    * Test the method that computes wrapped width in residues, height of wrapped
    * widths in pixels, and the number of widths visible
index 59d024c..04ddeb0 100644 (file)
@@ -61,6 +61,7 @@ import org.testng.annotations.Test;
 
 public class FeaturesFileTest
 {
+  private static final String LINE_SEPARATOR = System.getProperty("line.separator");
   private static String simpleGffFile = "examples/testdata/simpleGff3.gff";
 
   @AfterClass(alwaysRun = true)
@@ -69,7 +70,7 @@ public class FeaturesFileTest
     /*
      * remove any sequence mappings created so they don't pollute other tests
      */
-    Desktop.getInstance().getStructureSelectionManager().resetAll();
+    Desktop.getStructureSelectionManager().resetAll();
   }
 
   @BeforeClass(alwaysRun = true)
@@ -489,7 +490,7 @@ public class FeaturesFileTest
             + "desc1\tFER_CAPAN\t-1\t0\t0\tPfam\t1.3\n\n"
             + "desc3\tFER1_SOLLC\t-1\t0\t0\tPfam\n"; // NaN is not output
     assertEquals(
-            expected.replace("\n", System.getProperty("line.separator")),
+            expected.replace("\n", LINE_SEPARATOR),
             exported);
 
     /*
@@ -646,7 +647,7 @@ public class FeaturesFileTest
     // METAL feature has null group: description used for column 2
     expected = gffHeader + "FER_CAPAA\tCath\tMETAL\t39\t39\t1.2\t.\t.\n";
     assertEquals(
-            expected.replace("\n", System.getProperty("line.separator")),
+            expected.replace("\n", LINE_SEPARATOR),
             exported);
 
     /*
@@ -659,7 +660,7 @@ public class FeaturesFileTest
     expected = gffHeader + "FER_CAPAA\tCath\tMETAL\t39\t39\t1.2\t.\t.\n"
             + "FER_CAPAN\ts3dm\tGAMMA-TURN\t36\t38\t2.1\t.\t.\n";
     assertEquals(
-            expected.replace("\n", System.getProperty("line.separator")),
+            expected.replace("\n", LINE_SEPARATOR),
             exported);
 
     /*
@@ -673,14 +674,12 @@ public class FeaturesFileTest
             + "FER_CAPAA\tCath\tMETAL\t39\t39\t1.2\t.\t.\n"
             + "FER_CAPAN\ts3dm\tGAMMA-TURN\t36\t38\t2.1\t.\t.\n"
             + "FER_CAPAN\tUniprot\tPfam\t20\t20\t0.0\t+\t2\tx=y;black=white\n";
-    assertEquals(
-            expected.replace("\n", System.getProperty("line.separator")),
-            exported);
+    assertEquals(fixLineEnd(expected), exported);
   }
 
   private String fixLineEnd(String s)
   {
-    return s.replace("\n", System.getProperty("line.separator"));
+    return s.replace("\n", LINE_SEPARATOR);
   }
 
   /**
@@ -888,7 +887,7 @@ public class FeaturesFileTest
             + "Cath\tFER_CAPAA\t-1\t39\t39\tMETAL\t1.2\n"
             + "ENDGROUP\tgrp1\n";
     assertEquals(
-            expected.replace("\n", System.getProperty("line.separator")),
+            expected.replace("\n", LINE_SEPARATOR),
             exported);
   
     /*