Jalview-JS/JAL-3253-applet fix for original desktop, centralizing regex
authorhansonr <hansonr@STO24954W.ad.stolaf.edu>
Wed, 22 May 2019 08:29:07 +0000 (03:29 -0500)
committerhansonr <hansonr@STO24954W.ad.stolaf.edu>
Wed, 22 May 2019 08:29:07 +0000 (03:29 -0500)
and loadStaticResource

28 files changed:
buildcore.xml
libjs/VARNA-site.zip
src/com/stevesoft/pat/Regex.java
src/jalview/analysis/Finder.java
src/jalview/analysis/ParseProperties.java
src/jalview/ext/ensembl/EnsemblCdna.java
src/jalview/ext/ensembl/EnsemblGene.java
src/jalview/ext/ensembl/EnsemblProtein.java
src/jalview/ext/ensembl/EnsemblSequenceFetcher.java
src/jalview/gui/StructureViewer.java
src/jalview/io/IdentifyFile.java
src/jalview/io/ModellerDescription.java
src/jalview/io/NewickFile.java
src/jalview/io/RnamlFile.java
src/jalview/io/StockholmFile.java
src/jalview/project/Jalview2XML.java
src/jalview/util/DBRefUtils.java
src/jalview/util/GroupUrlLink.java
src/jalview/util/Platform.java
src/jalview/util/UrlLink.java
src/jalview/ws/dbsources/EmblCdsSource.java
src/jalview/ws/dbsources/EmblSource.java
src/jalview/ws/dbsources/Pdb.java
src/jalview/ws/dbsources/Uniprot.java
swingjs/SwingJS-site.zip
swingjs/timestamp
swingjs/ver/3.2.4/SwingJS-site.zip
swingjs/ver/3.2.4/timestamp

index d2a2d26..66d1361 100644 (file)
@@ -45,7 +45,6 @@
     <concat destfile="${site.path}/j2s/com/stevesoft/core.js">
         <fileset dir="${site.path}/j2s/com/stevesoft/pat">
           <include name="**/*.js" />
-               <exclude name="Regex.js" />
         </fileset>
     </concat>
     <antcall target="call-core">
index b8d60d6..36610bd 100644 (file)
Binary files a/libjs/VARNA-site.zip and b/libjs/VARNA-site.zip differ
index b58a7a9..455f040 100755 (executable)
@@ -308,19 +308,6 @@ class UnicodeLower extends UniValidator
 public class Regex extends RegRes implements FilenameFilter
 {
 
-  static
-  {
-    /**
-     * This is the entry class. Load the core file directly, if it exists. See
-     * buildcore.xml.
-     * 
-     * 
-     * @j2sNative
-     * 
-     *            swingjs.JSUtil.loadStaticResource$S("core/core_stevesoft.z.js");
-     */
-  }
-
   /**
    * BackRefOffset gives the identity number of the first pattern. Version 1.0
    * used zero, version 1.1 uses 1 to be more compatible with perl.
index 3cbef6d..3ee5be4 100644 (file)
@@ -31,6 +31,7 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.datamodel.VisibleContigsIterator;
 import jalview.util.Comparison;
+import jalview.util.Platform;
 
 import java.util.List;
 import java.util.Vector;
@@ -129,7 +130,7 @@ public class Finder implements FinderI
   {
     String searchString = matchCase ? theSearchString
             : theSearchString.toUpperCase();
-    Regex searchPattern = new Regex(searchString);
+    Regex searchPattern = Platform.newRegex(searchString, null);
     searchPattern.setIgnoreCase(!matchCase);
 
     searchResults = new SearchResults();
index 629a8a3..9937a47 100644 (file)
@@ -23,6 +23,7 @@ package jalview.analysis;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
@@ -90,7 +91,7 @@ public class ParseProperties
           String[] ScoreDescriptions, String regex, boolean repeat)
   {
     int count = 0;
-    Regex pattern = new Regex(regex);
+    Regex pattern = Platform.newRegex(regex, null);
     if (pattern.numSubs() > ScoreNames.length)
     {
       // Check that we have enough labels and descriptions for any parsed
index e01ad17..bdfd208 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.io.gff.SequenceOntologyI;
+import jalview.util.Platform;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -44,9 +45,7 @@ public class EnsemblCdna extends EnsemblSeqProxy
    * or ENSMUST or similar for other species
    * or CCDSnnnnn.nn with at least 3 digits
    */
-  private static final Regex ACCESSION_REGEX = new Regex(
-          "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
-
+  private static Regex ACCESSION_REGEX;
   /*
    * fetch exon features on genomic sequence (to identify the cdna regions)
    * and cds and variation features (to retain)
@@ -88,6 +87,16 @@ public class EnsemblCdna extends EnsemblSeqProxy
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      /*
+       * accepts ENSG/T/E/P with 11 digits
+       * or ENSMUSP or similar for other species
+       * or CCDSnnnnn.nn with at least 3 digits
+       */
+      ACCESSION_REGEX = Platform.newRegex(
+              "(ENS([A-Z]{3}|)[TG][0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)", null);
+    }
     return ACCESSION_REGEX;
   }
 
index 2d15f7c..63a6a6c 100644 (file)
@@ -56,7 +56,7 @@ public class EnsemblGene extends EnsemblSeqProxy
    * accepts anything as we will attempt lookup of gene or 
    * transcript id or gene name
    */
-  private static final Regex ACCESSION_REGEX = new Regex(".*");
+  private static Regex ACCESSION_REGEX;
 
   private static final EnsemblFeatureType[] FEATURES_TO_FETCH = {
       EnsemblFeatureType.gene, EnsemblFeatureType.transcript,
@@ -606,6 +606,10 @@ public class EnsemblGene extends EnsemblSeqProxy
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex(".*", null);
+    }
     return ACCESSION_REGEX;
   }
 
index 0280f16..f586ed6 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -42,8 +43,7 @@ public class EnsemblProtein extends EnsemblSeqProxy
    * or ENSMUSP or similar for other species
    * or CCDSnnnnn.nn with at least 3 digits
    */
-  private static final Regex ACCESSION_REGEX = new Regex(
-          "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)");
+  private static Regex ACCESSION_REGEX;
 
   /**
    * Default constructor (to use rest.ensembl.org)
@@ -119,6 +119,11 @@ public class EnsemblProtein extends EnsemblSeqProxy
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex(
+              "(ENS([A-Z]{3}|)P[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)", null);
+    }
     return ACCESSION_REGEX;
   }
 
index 7454eb6..21f9f7e 100644 (file)
@@ -23,6 +23,7 @@ package jalview.ext.ensembl;
 import jalview.analysis.AlignmentUtils;
 import jalview.bin.Cache;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 import jalview.ws.seqfetcher.DbSourceProxyImpl;
 
 import com.stevesoft.pat.Regex;
@@ -45,14 +46,7 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl
   // ensemblgenomes REST service merged to ensembl 9th April 2019
   protected static final String DEFAULT_ENSEMBL_GENOMES_BASEURL = DEFAULT_ENSEMBL_BASEURL;
 
-  /*
-   * accepts ENSG/T/E/P with 11 digits
-   * or ENSMUSP or similar for other species
-   * or CCDSnnnnn.nn with at least 3 digits
-   */
-  private static final Regex ACCESSION_REGEX = new Regex(
-          "(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|"
-                  + "(CCDS[0-9.]{3,}$)");
+  private static Regex ACCESSION_REGEX;
 
   protected final String ensemblGenomesDomain;
 
@@ -121,6 +115,17 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl
   @Override
   public Regex getAccessionValidator()
   {
+    if (ACCESSION_REGEX == null)
+    {
+      /*
+       * accepts ENSG/T/E/P with 11 digits
+       * or ENSMUSP or similar for other species
+       * or CCDSnnnnn.nn with at least 3 digits
+       */
+      ACCESSION_REGEX = Platform
+              .newRegex("(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|"
+                      + "(CCDS[0-9.]{3,}$)", null);
+    }
     return ACCESSION_REGEX;
   }
 
index 8f4f29c..dc5d77d 100644 (file)
@@ -28,6 +28,7 @@ import jalview.datamodel.StructureViewerModel;
 import jalview.structure.StructureMapping;
 import jalview.structure.StructureSelectionManager;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 import jalview.ws.DBRefFetcher;
 import jalview.ws.sifts.SiftsSettings;
 
@@ -52,15 +53,8 @@ public class StructureViewer
 
   static
   {
-    /**
-     * This is the entry class. Load the core file directly, if it exists. See
-     * buildcore.xml.
-     * 
-     * 
-     * @j2sNative
-     * 
-     *            swingjs.JSUtil.loadStaticResource$S("core/core_jvjmol.z.js");
-     */
+    Platform.loadStaticResource("core/core_jvjmol.z.js",
+            "org.jmol.viewer.Viewer");
   }
 
   private static final String UNKNOWN_VIEWER_TYPE = "Unknown structure viewer type ";
index b312474..621cfac 100755 (executable)
@@ -151,7 +151,7 @@ public class IdentifyFile
         {
           for (int i = 0; !isBinary && i < data.length(); i++)
           {
-            char c = data.charAt(i);
+            int c = data.charAt(i);
             isBinary = (c < 32 && c != '\t' && c != '\n' && c != '\r'
                     && c != 5 && c != 27); // nominal binary character filter
             // excluding CR, LF, tab,DEL and ^E
@@ -165,11 +165,12 @@ public class IdentifyFile
           if (source.inFile != null)
           {
             String fileStr = source.inFile.getName();
-            if (fileStr.contains(".jar")
-                    || fileStr.contains(".zip") || fileStr.contains(".jvp"))
+            if (fileStr.contains(".jar") || fileStr.contains(".zip")
+                    || fileStr.contains(".jvp"))
             {
               // possibly a Jalview archive (but check further)
               reply = FileFormat.Jalview;
+              break;
             }
           }
           if (!lineswereskipped && data.startsWith("PK"))
index f4de52d..4a12387 100755 (executable)
@@ -22,6 +22,7 @@ package jalview.io;
 
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.SequenceI;
+import jalview.util.Platform;
 
 import java.util.List;
 
@@ -95,12 +96,20 @@ public class ModellerDescription
     }
   };
 
+  private static Regex VALIDATION_REGEX;
+
+  private static Regex getRegex()
+  {
+    return (VALIDATION_REGEX == null
+            ? VALIDATION_REGEX = Platform
+                    .newRegex("\\s*((([-0-9]+).?)|FIRST|LAST|@)", null)
+            : VALIDATION_REGEX);
+  }
+
   private resCode validResidueCode(String field)
   {
     Integer val = null;
-    Regex r = new Regex(
-            "\\s*((([-0-9]+).?)|FIRST|LAST|@)");
-
+    Regex r = getRegex();
     if (!r.search(field))
     {
       return null; // invalid
index 1e9c5ed..5a98605 100755 (executable)
@@ -28,6 +28,7 @@ package jalview.io;
 
 import jalview.datamodel.SequenceNode;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -37,6 +38,8 @@ import java.util.StringTokenizer;
 
 import com.stevesoft.pat.Regex;
 
+// TODO This class does not conform to Java standards for field name capitalization.
+
 /**
  * Parse a new hanpshire style tree Caveats: NHX files are NOT supported and the
  * tree distances and topology are unreliable when they are parsed. TODO: on
@@ -76,7 +79,7 @@ import com.stevesoft.pat.Regex;
  */
 public class NewickFile extends FileParse
 {
-  SequenceNode root;
+  private SequenceNode root;
 
   private boolean HasBootstrap = false;
 
@@ -85,21 +88,90 @@ public class NewickFile extends FileParse
   private boolean RootHasDistance = false;
 
   // File IO Flags
-  boolean ReplaceUnderscores = false;
+  private boolean ReplaceUnderscores = false;
+
+  private boolean printRootInfo = true;
+
+  private static final int REGEX_PERL_NODE_REQUIRE_QUOTE = 0;
+
+  private static final int REGEX_PERL_NODE_ESCAPE_QUOTE = 1;
+
+  private static final int REGEX_PERL_NODE_UNQUOTED_WHITESPACE = 2;
+
+  private static final int REGEX_MAJOR_SYMS = 3;
+
+  private static final int REGEX_QNODE_NAME = 4;
+
+  private static final int REGEX_COMMENT = 5;
+
+  private static final int REGEX_UQNODE_NAME = 6;
 
-  boolean printRootInfo = true;
+  private static final int REGEX_NBOOTSTRAP = 7;
+
+  private static final int REGEX_NDIST = 8;
+
+  private static final int REGEX_NO_LINES = 9;
+
+  private static final int REGEX_PERL_EXPAND_QUOTES = 10;
+
+  private static final int REGEX_MAX = 11;
+
+  private static final Regex[] REGEX = new Regex[REGEX_MAX];
+
+  private static Regex getRegex(int id)
+  {
+    if (REGEX[id] == null)
+    {
+      String code = null;
+      String code2 = null;
+      String codePerl = null;
+      switch (id)
+      {
+      case REGEX_PERL_NODE_REQUIRE_QUOTE:
+        codePerl = "m/[\\[,:'()]/";
+        break;
+      case REGEX_PERL_NODE_ESCAPE_QUOTE:
+        codePerl = "s/'/''/";
+        break;
+      case REGEX_PERL_NODE_UNQUOTED_WHITESPACE:
+        codePerl = "s/\\/w/_/";
+        break;
+      case REGEX_PERL_EXPAND_QUOTES:
+        codePerl = "s/''/'/";
+        break;
+      case REGEX_MAJOR_SYMS:
+        code = "[(\\['),;]";
+        break;
+      case REGEX_QNODE_NAME:
+        code = "'([^']|'')+'";
+        break;
+      case REGEX_COMMENT:
+        code = "]";
+        break;
+      case REGEX_UQNODE_NAME:
+        code = "\\b([^' :;\\](),]+)";
+        break;
+      case REGEX_NBOOTSTRAP:
+        code = "\\s*([0-9+]+)\\s*:";
+        break;
+      case REGEX_NDIST:
+        code = ":([-0-9Ee.+]+)";
+        break;
+      case REGEX_NO_LINES:
+        code = "\n+";
+        code2 = "";
+        break;
+      default:
+        return null;
+      }
+      return codePerl == null ? Platform.newRegex(code, code2)
+              : Platform.newRegexPerl(code2);
+    }
+    return REGEX[id];
+  }
 
-  private Regex[] NodeSafeName = new Regex[] {
-      new Regex().perlCode("m/[\\[,:'()]/"), // test for
-      // requiring
-      // quotes
-      new Regex().perlCode("s/'/''/"), // escaping quote
-      // characters
-      new Regex().perlCode("s/\\/w/_/") // unqoted whitespace
-      // transformation
-  };
 
-  char QuoteChar = '\'';
+  private char quoteChar = '\'';
 
   /**
    * Creates a new NewickFile object.
@@ -257,6 +329,7 @@ public class NewickFile extends FileParse
    */
   public void parse() throws IOException
   {
+    Platform.ensureRegex();
     String nf;
 
     { // fill nf with complete tree file
@@ -294,8 +367,7 @@ public class NewickFile extends FileParse
     boolean ascending = false; // flag indicating that we are leaving the
     // current node
 
-    Regex majorsyms = new Regex(
-            "[(\\['),;]");
+    Regex majorsyms = getRegex(REGEX_MAJOR_SYMS); // "[(\\['),;]"
 
     int nextcp = 0;
     int ncp = cp;
@@ -354,8 +426,7 @@ public class NewickFile extends FileParse
       // Deal with quoted fields
       case '\'':
 
-        Regex qnodename = new Regex(
-                "'([^']|'')+'");
+        Regex qnodename = getRegex(REGEX_QNODE_NAME);// "'([^']|'')+'");
 
         if (qnodename.searchFrom(nf, fcp))
         {
@@ -363,8 +434,7 @@ public class NewickFile extends FileParse
           nodename = new String(
                   qnodename.stringMatched().substring(1, nl - 1));
           // unpack any escaped colons
-          Regex xpandquotes = Regex
-                  .perlCode("s/''/'/");
+          Regex xpandquotes = getRegex(REGEX_PERL_EXPAND_QUOTES);
           String widernodename = xpandquotes.replaceAll(nodename);
           nodename = widernodename;
           // jump to after end of quoted nodename
@@ -398,8 +468,7 @@ public class NewickFile extends FileParse
            * '"+nf.substring(cp,fcp)+"'"); }
            */
           // verify termination.
-          Regex comment = new Regex(
-                  "]");
+          Regex comment = getRegex(REGEX_COMMENT); // "]"
           if (comment.searchFrom(nf, fcp))
           {
             // Skip the comment field
@@ -430,12 +499,9 @@ public class NewickFile extends FileParse
                   + fstring.substring(cend + 1);
 
         }
-        Regex uqnodename = new Regex(
-                "\\b([^' :;\\](),]+)");
-        Regex nbootstrap = new Regex(
-                "\\s*([0-9+]+)\\s*:");
-        Regex ndist = new Regex(
-                ":([-0-9Ee.+]+)");
+        Regex uqnodename = getRegex(REGEX_UQNODE_NAME);// "\\b([^' :;\\](),]+)"
+        Regex nbootstrap = getRegex(REGEX_NBOOTSTRAP);// "\\s*([0-9+]+)\\s*:");
+        Regex ndist = getRegex(REGEX_NDIST);// ":([-0-9Ee.+]+)");
 
         if (!parsednodename && uqnodename.search(fstring)
                 && ((uqnodename.matchedFrom(1) == 0) || (fstring
@@ -790,7 +856,7 @@ public class NewickFile extends FileParse
    */
   char getQuoteChar()
   {
-    return QuoteChar;
+    return quoteChar;
   }
 
   /**
@@ -803,8 +869,8 @@ public class NewickFile extends FileParse
    */
   char setQuoteChar(char c)
   {
-    char old = QuoteChar;
-    QuoteChar = c;
+    char old = quoteChar;
+    quoteChar = c;
 
     return old;
   }
@@ -819,13 +885,15 @@ public class NewickFile extends FileParse
    */
   private String nodeName(String name)
   {
-    if (NodeSafeName[0].search(name))
+    if (getRegex(REGEX_PERL_NODE_REQUIRE_QUOTE).search(name))
     {
-      return QuoteChar + NodeSafeName[1].replaceAll(name) + QuoteChar;
+      return quoteChar
+              + getRegex(REGEX_PERL_NODE_ESCAPE_QUOTE).replaceAll(name)
+              + quoteChar;
     }
     else
     {
-      return NodeSafeName[2].replaceAll(name);
+      return getRegex(REGEX_PERL_NODE_UNQUOTED_WHITESPACE).replaceAll(name);
     }
   }
 
@@ -972,7 +1040,7 @@ public class NewickFile extends FileParse
       trf.parse();
       System.out.println("Original file :\n");
 
-      Regex nonl = new Regex("\n+", "");
+      Regex nonl = getRegex(REGEX_NO_LINES);// "\n+", "");
       System.out.println(nonl.replaceAll(newickfile.toString()) + "\n");
 
       System.out.println("Parsed file.\n");
index 4d3ddc1..d5a8d81 100644 (file)
@@ -26,6 +26,7 @@ import jalview.datamodel.Annotation;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
@@ -227,7 +228,7 @@ public class RnamlFile extends AlignFile
       dataName = dataName.substring(0, b - 1);
     }
     b = 0;
-    Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?");
+    Regex m = getSafeRegex();
     String mm = dataName;
     while (m.searchFrom(dataName, b))
     {
@@ -236,4 +237,13 @@ public class RnamlFile extends AlignFile
     }
     return mm;
   }
+
+  private static Regex SAFE_REGEX;
+
+  private static Regex getSafeRegex()
+  {
+    return (SAFE_REGEX == null
+            ? SAFE_REGEX = Platform.newRegex("[\\/]?([-A-Za-z0-9]+)\\.?", null)
+            : SAFE_REGEX);
+  }
 }
index 84e629e..92f73f4 100644 (file)
@@ -36,6 +36,7 @@ import jalview.schemes.ResidueProperties;
 import jalview.util.Comparison;
 import jalview.util.Format;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.FileReader;
@@ -76,20 +77,105 @@ public class StockholmFile extends AlignFile
 {
   private static final String ANNOTATION = "annotation";
 
-//  private static final Regex OPEN_PAREN = new Regex("(<|\\[)", "(");
-//
-//  private static final Regex CLOSE_PAREN = new Regex("(>|\\])", ")");
+  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using
+  // NOT_RNASS first.
 
-  public static final Regex DETECT_BRACKETS = new Regex(
-          "(<|>|\\[|\\]|\\(|\\)|\\{|\\})");
-
-  // WUSS extended symbols. Avoid ambiguity with protein SS annotations by using NOT_RNASS first.
   public static final String RNASS_BRACKETS = "<>[](){}AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
 
+  public static final int REGEX_STOCKHOLM = 0;
+
+  public static final int REGEX_BRACKETS = 1;
+
   // use the following regex to decide an annotations (whole) line is NOT an RNA
   // SS (it contains only E,H,e,h and other non-brace/non-alpha chars)
-  private static final Regex NOT_RNASS = new Regex(
-          "^[^<>[\\](){}A-DF-Za-df-z]*$");
+  public static final int REGEX_NOT_RNASS = 2;
+
+  private static final int REGEX_ANNOTATION = 3;
+
+  private static final int REGEX_PFAM = 4;
+
+  private static final int REGEX_RFAM = 5;
+
+  private static final int REGEX_ALIGN_END = 6;
+
+  private static final int REGEX_SPLIT_ID = 7;
+
+  private static final int REGEX_SUBTYPE = 8;
+
+  private static final int REGEX_ANNOTATION_LINE = 9;
+
+  private static final int REGEX_REMOVE_ID = 10;
+
+  private static final int REGEX_OPEN_PAREN = 11;
+
+  private static final int REGEX_CLOSE_PAREN = 12;
+
+  public static final int REGEX_MAX = 13;
+
+  private static Regex REGEX[] = new Regex[REGEX_MAX];
+
+  /**
+   * Centralize all actual Regex instantialization in Platform.
+   * 
+   * @param id
+   * @return
+   */
+  private static Regex getRegex(int id)
+  {
+    if (REGEX[id] == null)
+    {
+      String pat = null, pat2 = null;
+      switch (id)
+      {
+      case REGEX_STOCKHOLM:
+        pat = "# STOCKHOLM ([\\d\\.]+)";
+        break;
+      case REGEX_BRACKETS:
+        // for reference; not used
+        pat = "(<|>|\\[|\\]|\\(|\\)|\\{|\\})";
+        break;
+      case REGEX_NOT_RNASS:
+        pat = "^[^<>[\\](){}A-DF-Za-df-z]*$";
+        break;
+      case REGEX_ANNOTATION:
+        pat = "(\\w+)\\s*(.*)";
+        break;
+      case REGEX_PFAM:
+        pat = "PF[0-9]{5}(.*)";
+        break;
+      case REGEX_RFAM:
+        pat = "RF[0-9]{5}(.*)";
+        break;
+      case REGEX_ALIGN_END:
+        pat = "^\\s*\\/\\/";
+        break;
+      case REGEX_SPLIT_ID:
+        pat = "(\\S+)\\/(\\d+)\\-(\\d+)";
+        break;
+      case REGEX_SUBTYPE:
+        pat = "(\\S+)\\s+(\\S*)\\s+(.*)";
+        break;
+      case REGEX_ANNOTATION_LINE:
+        pat = "#=(G[FSRC]?)\\s+(.*)";
+        break;
+      case REGEX_REMOVE_ID:
+        pat = "(\\S+)\\s+(\\S+)";
+        break;
+      case REGEX_OPEN_PAREN:
+        pat = "(<|\\[)";
+        pat2 = "(";
+        break;
+      case REGEX_CLOSE_PAREN:
+        pat = "(>|\\])";
+        pat2 = ")";
+        break;
+      default:
+        return null;
+      }
+      REGEX[id] = Platform.newRegex(pat, pat2);
+    }
+    return REGEX[id];
+  }
 
   StringBuffer out; // output buffer
 
@@ -214,7 +300,7 @@ public class StockholmFile extends AlignFile
     // First, we have to check that this file has STOCKHOLM format, i.e. the
     // first line must match
 
-    r = new Regex("# STOCKHOLM ([\\d\\.]+)");
+    r = getRegex(REGEX_STOCKHOLM);
     if (!r.search(nextLine()))
     {
       throw new IOException(MessageManager
@@ -228,19 +314,22 @@ public class StockholmFile extends AlignFile
     }
 
     // We define some Regexes here that will be used regularily later
-    rend = new Regex("^\\s*\\/\\/"); // Find the end of an alignment
-    p = new Regex("(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in
+    rend = getRegex(REGEX_ALIGN_END);//"^\\s*\\/\\/"); // Find the end of an alignment
+    p = getRegex(REGEX_SPLIT_ID);//"(\\S+)\\/(\\d+)\\-(\\d+)"); // split sequence id in
     // id/from/to
-    s = new Regex("(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses annotation subtype
-    r = new Regex("#=(G[FSRC]?)\\s+(.*)"); // Finds any annotation line
-    x = new Regex("(\\S+)\\s+(\\S+)"); // split id from sequence
+    s = getRegex(REGEX_SUBTYPE);// "(\\S+)\\s+(\\S*)\\s+(.*)"); // Parses
+                                // annotation subtype
+    r = getRegex(REGEX_ANNOTATION_LINE);// "#=(G[FSRC]?)\\s+(.*)"); // Finds any
+                                        // annotation line
+    x = getRegex(REGEX_REMOVE_ID);// "(\\S+)\\s+(\\S+)"); // split id from
+                                  // sequence
 
     // Convert all bracket types to parentheses (necessary for passing to VARNA)
-    Regex openparen = new Regex("(<|\\[)", "(");
-    Regex closeparen = new Regex("(>|\\])", ")");
+    Regex openparen = getRegex(REGEX_OPEN_PAREN);//"(<|\\[)", "(");
+    Regex closeparen = getRegex(REGEX_CLOSE_PAREN);//"(>|\\])", ")");
 
 //    // Detect if file is RNA by looking for bracket types
-//    Regex detectbrackets = new Regex("(<|>|\\[|\\]|\\(|\\))");
+    // Regex detectbrackets = getRegex("(<|>|\\[|\\]|\\(|\\))");
 
     rend.optimize();
     p.optimize();
@@ -262,8 +351,8 @@ public class StockholmFile extends AlignFile
         this.noSeqs = seqs.size();
 
         String dbsource = null;
-        Regex pf = new Regex("PF[0-9]{5}(.*)"); // Finds AC for Pfam
-        Regex rf = new Regex("RF[0-9]{5}(.*)"); // Finds AC for Rfam
+        Regex pf = getRegex(REGEX_PFAM); // Finds AC for Pfam
+        Regex rf = getRegex(REGEX_RFAM); // Finds AC for Rfam
         if (getAlignmentProperty("AC") != null)
         {
           String dbType = getAlignmentProperty("AC").toString();
@@ -507,7 +596,7 @@ public class StockholmFile extends AlignFile
            */
           // Let's save the annotations, maybe we'll be able to do something
           // with them later...
-          Regex an = new Regex("(\\w+)\\s*(.*)");
+          Regex an = getRegex(REGEX_ANNOTATION);
           if (an.search(annContent))
           {
             if (an.stringMatched(1).equals("NH"))
@@ -837,7 +926,8 @@ public class StockholmFile extends AlignFile
     if (type.equalsIgnoreCase("secondary structure"))
     {
       ss = true;
-      isrnass = !NOT_RNASS.search(annots); // sorry about the double negative
+      isrnass = !getRegex(REGEX_NOT_RNASS).search(annots); // sorry about the double
+                                                     // negative
                                            // here (it's easier for dealing with
                                            // other non-alpha-non-brace chars)
     }
@@ -998,7 +1088,7 @@ public class StockholmFile extends AlignFile
       while (en.hasMoreElements())
       {
         Object idd = en.nextElement();
-        String type = (String) dataRef.remove(idd);
+        String type = dataRef.remove(idd);
         out.append(new Format("%-" + (maxid - 2) + "s")
                 .form("#=GS " + idd.toString() + " "));
         if (type.contains("PFAM") || type.contains("RFAM"))
index 9d9faa1..801632f 100644 (file)
@@ -2854,8 +2854,10 @@ public class Jalview2XML
         {
           jarentry = jin.getNextJarEntry();
         }
-
-        if (jarentry != null && jarentry.getName().endsWith(".xml"))
+        String name = (jarentry == null ? null : jarentry.getName());
+        if (name != null && name.endsWith(".xml")
+                && name.indexOf(" Dataset for ") < 0 // BH 2019.05.21
+        )
         {
           JAXBContext jc = JAXBContext
                   .newInstance("jalview.xml.binding.jalview");
@@ -4973,8 +4975,18 @@ public class Jalview2XML
       viewport.setViewName(view.getViewName());
       af.setInitialTabVisible();
     }
-    af.setBounds(safeInt(view.getXpos()), safeInt(view.getYpos()),
-            safeInt(view.getWidth()), safeInt(view.getHeight()));
+    int x = safeInt(view.getXpos());
+    int y = safeInt(view.getYpos());
+    int w = safeInt(view.getWidth());
+    int h = safeInt(view.getHeight());
+    // // BH we cannot let the title bar go off the top
+    // if (Platform.isJS())
+    // {
+    // x = Math.max(50 - w, x);
+    // y = Math.max(0, y);
+    // }
+
+    af.setBounds(x, y, w, h);
     // startSeq set in af.alignPanel.updateLayout below
     af.alignPanel.updateLayout();
     ColourSchemeI cs = null;
index fb54bba..197261a 100755 (executable)
@@ -32,7 +32,6 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import com.stevesoft.pat.Regex;
 
@@ -96,14 +95,14 @@ public class DBRefUtils
        }
 
        // BH TODO (what?)
-       HashSet<String> srcs = new HashSet<String>();
+       HashSet<String> srcs = new HashSet<>();
        for (String src : sources) 
        {
          srcs.add(src.toUpperCase());
        }
 
        int nrefs = dbrefs.size();
-       List<DBRefEntry> res = new ArrayList<DBRefEntry>();
+       List<DBRefEntry> res = new ArrayList<>();
        for (int ib = 0; ib < nrefs; ib++) 
        {
          DBRefEntry dbr = dbrefs.get(ib);
@@ -217,7 +216,7 @@ public class DBRefUtils
         * @return
         */
        public static List<DBRefEntry> searchRefs(List<DBRefEntry> refs, String accId) {
-               List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+               List<DBRefEntry> rfs = new ArrayList<>();
                if (refs == null || accId == null) {
                        return rfs;
                }
@@ -243,7 +242,7 @@ public class DBRefUtils
         * @return
         */
        static List<DBRefEntry> searchRefs(List<DBRefEntry> refs, DBRefEntry entry, DbRefComp comparator, int mode) {
-               List<DBRefEntry> rfs = new ArrayList<DBRefEntry>();
+               List<DBRefEntry> rfs = new ArrayList<>();
                if (refs == null || entry == null) {
                        return rfs;
                }
@@ -450,6 +449,14 @@ public class DBRefUtils
     return matches;
   }
 
+  private static Regex PARSE_REGEX;
+
+  private static Regex getParseRegex()
+  {
+    return (PARSE_REGEX == null ? PARSE_REGEX = Platform.newRegex(
+            "([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)", null)
+            : PARSE_REGEX);
+  }
        /**
         * Parses a DBRefEntry and adds it to the sequence, also a PDBEntry if the
         * database is PDB.
@@ -471,7 +478,7 @@ public class DBRefUtils
                                /*
                                 * Check for PFAM style stockhom PDB accession id citation e.g. "1WRI A; 7-80;"
                                 */
-                               Regex r = new com.stevesoft.pat.Regex("([0-9][0-9A-Za-z]{3})\\s*(.?)\\s*;\\s*([0-9]+)-([0-9]+)");
+        Regex r = getParseRegex();
                                if (r.search(acn.trim())) {
                                        String pdbid = r.stringMatched(1);
                                        String chaincode = r.stringMatched(2);
@@ -558,7 +565,7 @@ public class DBRefUtils
         * @return
         */
        public static List<DBRefEntry> searchRefsForSource(List<DBRefEntry> dbRefs, String source) {
-               List<DBRefEntry> matches = new ArrayList<DBRefEntry>();
+               List<DBRefEntry> matches = new ArrayList<>();
                if (dbRefs != null && source != null) {
                        for (DBRefEntry dbref : dbRefs) {
                                if (source.equalsIgnoreCase(dbref.getSource())) {
@@ -621,7 +628,9 @@ public class DBRefUtils
                bsSelect.set(0, dbrefs.size());
 
                if (!selectRefsBS(dbrefs, isProtein ? DBRefSource.PROTEIN_MASK : DBRefSource.DNA_CODING_MASK, bsSelect))
-                       return;
+    {
+      return;
+    }
 
 //      selfs.addAll(selfArray);
 //    }
@@ -631,7 +640,9 @@ public class DBRefUtils
                        DBRefEntry p = pr.get(ip);
                        for (int i = bsSelect.nextSetBit(0); i >= 0; i = bsSelect.nextSetBit(i + 1)) {
                                if (dbrefs.get(i) == p)
-                                       bsSelect.clear(i);
+        {
+          bsSelect.clear(i);
+        }
                        }
 //      while (selfs.contains(p))
 //      {
@@ -655,7 +666,9 @@ public class DBRefUtils
                                // TODO: promote transcript refs ??
                        }
                        if (keys == 0 || !selectRefsBS(dbrefs, keys, bsSelect))
-                               return;
+      {
+        return;
+      }
 //      if (candidates != null)
                        {
                                for (int ic = bsSelect.nextSetBit(0); ic >= 0; ic = bsSelect.nextSetBit(ic + 1))
index 512e046..e4c4ad0 100644 (file)
@@ -24,6 +24,8 @@ import jalview.datamodel.SequenceI;
 
 import java.util.Hashtable;
 
+import com.stevesoft.pat.Regex;
+
 /**
  * This class is not implemented because Preferences never puts anything in
  * groupURLLinks.
@@ -219,8 +221,7 @@ public class GroupUrlLink
         regexReplace[pass] = link.substring(ptok[pass] + mlength, p);
         try
         {
-          com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
-                  .perlCode("/" + regexReplace[pass] + "/");
+          Regex rg = Platform.newRegexPerl("/" + regexReplace[pass] + "/");
           if (rg == null)
           {
             invalidMessage = "Invalid Regular Expression : '"
@@ -484,14 +485,13 @@ public class GroupUrlLink
     // iterate through input, collating segments to be inserted into url
     StringBuffer matched[] = new StringBuffer[idseq.length];
     // and precompile regexes
-    com.stevesoft.pat.Regex[] rgxs = new com.stevesoft.pat.Regex[matched.length];
+    Regex[] rgxs = new Regex[matched.length];
     for (pass = 0; pass < matched.length; pass++)
     {
       matched[pass] = new StringBuffer();
       if (regexReplace[pass] != null)
       {
-        rgxs[pass] = com.stevesoft.pat.Regex
-                .perlCode("/" + regexReplace[pass] + "/");
+        rgxs[pass] = Platform.newRegexPerl("/" + regexReplace[pass] + "/");
       }
       else
       {
index 9b57a5a..a1412f2 100644 (file)
@@ -41,6 +41,8 @@ import javax.swing.SwingUtilities;
 import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
+import com.stevesoft.pat.Regex;
+
 /**
  * System platform information used by Applet and Application
  * 
@@ -657,4 +659,42 @@ public class Platform
     return null;
   }
 
+  /**
+   * load a resource -- probably a core file -- if and only if a particular
+   * class has not been instantialized. We use a String here because if we used
+   * a .class object, that reference itself would simply load the class, and we
+   * want the core package to include that as well.
+   * 
+   * @param resourcePath
+   * @param className
+   */
+  public static void loadStaticResource(Object resourcePath,
+          String className)
+  {
+    /**
+     * 
+     * @j2sNative if (!swingjs.JSUtil.isClassLoaded$S(className))
+     *            swingjs.JSUtil.loadStaticResource$S(resourcePath);
+     */
+  }
+
+  public static void ensureRegex()
+  {
+    loadStaticResource("core/core_stevesoft.z.js",
+            "com.stevesoft.pat.Regex");
+  }
+
+  public static Regex newRegex(String searchString, String replaceString)
+  {
+    ensureRegex();
+    return (replaceString == null ? new Regex(searchString)
+            : new Regex(searchString, replaceString));
+  }
+
+  public static Regex newRegexPerl(String code)
+  {
+    ensureRegex();
+    return Regex.perlCode(code);
+  }
+
 }
index 0141a6a..8a60b56 100644 (file)
@@ -35,6 +35,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 
+import com.stevesoft.pat.Regex;
+
 /**
  * A helper class to parse URL Link strings taken from applet parameters or
  * jalview properties file using the com.stevesoft.pat.Regex implementation.
@@ -302,8 +304,7 @@ public class UrlLink
     {
       if (regexReplace != null)
       {
-        com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
-                .perlCode("/" + regexReplace + "/");
+        Regex rg = Platform.newRegexPerl("/" + regexReplace + "/");
         if (rg.search(idstring))
         {
           int ns = rg.numSubs();
@@ -507,21 +508,8 @@ public class UrlLink
     {
       // Extract Regex and suffix
       urlSuffix = link.substring(p + endDelimiter.length());
-      regexReplace = link.substring(sqidPos + startLength, p);
-      try
-      {
-        com.stevesoft.pat.Regex rg = com.stevesoft.pat.Regex
-                .perlCode("/" + regexReplace + "/");
-        if (rg == null)
-        {
-          invalidMessage = "Invalid Regular Expression : '" + regexReplace
-                  + "'\n";
-        }
-      } catch (Exception e)
-      {
-        invalidMessage = "Invalid Regular Expression : '" + regexReplace
-                + "'\n";
-      }
+      testRegexPerl(
+              regexReplace = link.substring(sqidPos + startLength, p));
     }
     else
     {
@@ -550,6 +538,21 @@ public class UrlLink
     return p;
   }
 
+  private void testRegexPerl(String r)
+  {
+    Regex rg = null;
+    try
+    {
+      rg = Platform.newRegexPerl("/" + r + "/");
+    } catch (Exception e)
+    {
+    }
+    if (rg == null)
+    {
+      invalidMessage = "Invalid Regular Expression : '" + r + "'\n";
+    }
+  }
+
   /**
    * Create a set of URL links for a sequence
    * 
index a73af61..c5159f2 100644 (file)
@@ -22,12 +22,15 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
 public class EmblCdsSource extends EmblXmlSource
 {
 
+  private Regex ACCESSION_REGEX = null;
+
   public EmblCdsSource()
   {
     super();
@@ -42,7 +45,11 @@ public class EmblCdsSource extends EmblXmlSource
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("^[A-Z]+[0-9]+");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex("^[A-Z]+[0-9]+", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   @Override
index 6bbe2e1..ec75b04 100644 (file)
@@ -22,6 +22,7 @@ package jalview.ws.dbsources;
 
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
+import jalview.util.Platform;
 
 import com.stevesoft.pat.Regex;
 
@@ -32,6 +33,8 @@ import com.stevesoft.pat.Regex;
 public class EmblSource extends EmblXmlSource
 {
 
+  private static Regex ACCESSION_REGEX;
+
   public EmblSource()
   {
     super();
@@ -57,7 +60,11 @@ public class EmblSource extends EmblXmlSource
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("^[A-Z]+[0-9]+");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform.newRegex("^[A-Z]+[0-9]+", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   /*
index a658089..d12c271 100644 (file)
@@ -36,6 +36,7 @@ import jalview.io.FormatAdapter;
 import jalview.io.PDBFeatureSettings;
 import jalview.structure.StructureImportSettings;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 import jalview.ws.ebi.EBIFetchClient;
 
 import java.io.File;
@@ -56,6 +57,8 @@ public class Pdb extends EbiFileRetrievedProxy
 
   private static final int PDB_ID_LENGTH = 4;
 
+  private static Regex ACCESSION_REGEX;
+
   public Pdb()
   {
     super();
@@ -80,7 +83,12 @@ public class Pdb extends EbiFileRetrievedProxy
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform
+              .newRegex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   /*
@@ -169,7 +177,7 @@ public class Pdb extends EbiFileRetrievedProxy
               fileFormat);
       if (pdbAlignment != null)
       {
-        List<SequenceI> toremove = new ArrayList<SequenceI>();
+        List<SequenceI> toremove = new ArrayList<>();
         for (SequenceI pdbcs : pdbAlignment.getSequences())
         {
           String chid = null;
index d199963..a021d4a 100644 (file)
@@ -31,6 +31,7 @@ import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceI;
 import jalview.gui.Preferences;
 import jalview.schemes.ResidueProperties;
+import jalview.util.Platform;
 import jalview.util.StringUtils;
 import jalview.ws.seqfetcher.DbSourceProxyImpl;
 import jalview.xml.binding.uniprot.DbReferenceType;
@@ -71,6 +72,8 @@ public class Uniprot extends DbSourceProxyImpl
 
   private static final String BAR_DELIMITER = "|";
 
+  private static Regex ACCESSION_REGEX;
+
   /**
    * Constructor
    */
@@ -103,7 +106,12 @@ public class Uniprot extends DbSourceProxyImpl
   @Override
   public Regex getAccessionValidator()
   {
-    return new Regex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)");
+    if (ACCESSION_REGEX == null)
+    {
+      ACCESSION_REGEX = Platform
+              .newRegex("([A-Z]+[0-9]+[A-Z0-9]+|[A-Z0-9]+_[A-Z0-9]+)", null);
+    }
+    return ACCESSION_REGEX;
   }
 
   /*
index eaeed6d..5fcd0b1 100644 (file)
Binary files a/swingjs/SwingJS-site.zip and b/swingjs/SwingJS-site.zip differ
index 06df058..e223bf6 100644 (file)
@@ -1 +1 @@
-20190518175634 
+20190522032238 
index eaeed6d..5fcd0b1 100644 (file)
Binary files a/swingjs/ver/3.2.4/SwingJS-site.zip and b/swingjs/ver/3.2.4/SwingJS-site.zip differ
index 06df058..e223bf6 100644 (file)
@@ -1 +1 @@
-20190518175634 
+20190522032238