From: hansonr Date: Wed, 22 May 2019 08:29:07 +0000 (-0500) Subject: Jalview-JS/JAL-3253-applet fix for original desktop, centralizing regex X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=commitdiff_plain;h=da1ce6ca071deb35b983a41f6eeed43f30b3c3b2 Jalview-JS/JAL-3253-applet fix for original desktop, centralizing regex and loadStaticResource --- diff --git a/buildcore.xml b/buildcore.xml index d2a2d26..66d1361 100644 --- a/buildcore.xml +++ b/buildcore.xml @@ -45,7 +45,6 @@ - diff --git a/libjs/VARNA-site.zip b/libjs/VARNA-site.zip index b8d60d6..36610bd 100644 Binary files a/libjs/VARNA-site.zip and b/libjs/VARNA-site.zip differ diff --git a/src/com/stevesoft/pat/Regex.java b/src/com/stevesoft/pat/Regex.java index b58a7a9..455f040 100755 --- a/src/com/stevesoft/pat/Regex.java +++ b/src/com/stevesoft/pat/Regex.java @@ -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. diff --git a/src/jalview/analysis/Finder.java b/src/jalview/analysis/Finder.java index 3cbef6d..3ee5be4 100644 --- a/src/jalview/analysis/Finder.java +++ b/src/jalview/analysis/Finder.java @@ -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(); diff --git a/src/jalview/analysis/ParseProperties.java b/src/jalview/analysis/ParseProperties.java index 629a8a3..9937a47 100644 --- a/src/jalview/analysis/ParseProperties.java +++ b/src/jalview/analysis/ParseProperties.java @@ -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 diff --git a/src/jalview/ext/ensembl/EnsemblCdna.java b/src/jalview/ext/ensembl/EnsemblCdna.java index e01ad17..bdfd208 100644 --- a/src/jalview/ext/ensembl/EnsemblCdna.java +++ b/src/jalview/ext/ensembl/EnsemblCdna.java @@ -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; } diff --git a/src/jalview/ext/ensembl/EnsemblGene.java b/src/jalview/ext/ensembl/EnsemblGene.java index 2d15f7c..63a6a6c 100644 --- a/src/jalview/ext/ensembl/EnsemblGene.java +++ b/src/jalview/ext/ensembl/EnsemblGene.java @@ -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; } diff --git a/src/jalview/ext/ensembl/EnsemblProtein.java b/src/jalview/ext/ensembl/EnsemblProtein.java index 0280f16..f586ed6 100644 --- a/src/jalview/ext/ensembl/EnsemblProtein.java +++ b/src/jalview/ext/ensembl/EnsemblProtein.java @@ -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; } diff --git a/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java b/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java index 7454eb6..21f9f7e 100644 --- a/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java +++ b/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java @@ -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; } diff --git a/src/jalview/gui/StructureViewer.java b/src/jalview/gui/StructureViewer.java index 8f4f29c..dc5d77d 100644 --- a/src/jalview/gui/StructureViewer.java +++ b/src/jalview/gui/StructureViewer.java @@ -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 "; diff --git a/src/jalview/io/IdentifyFile.java b/src/jalview/io/IdentifyFile.java index b312474..621cfac 100755 --- a/src/jalview/io/IdentifyFile.java +++ b/src/jalview/io/IdentifyFile.java @@ -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")) diff --git a/src/jalview/io/ModellerDescription.java b/src/jalview/io/ModellerDescription.java index f4de52d..4a12387 100755 --- a/src/jalview/io/ModellerDescription.java +++ b/src/jalview/io/ModellerDescription.java @@ -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 diff --git a/src/jalview/io/NewickFile.java b/src/jalview/io/NewickFile.java index 1e9c5ed..5a98605 100755 --- a/src/jalview/io/NewickFile.java +++ b/src/jalview/io/NewickFile.java @@ -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"); diff --git a/src/jalview/io/RnamlFile.java b/src/jalview/io/RnamlFile.java index 4d3ddc1..d5a8d81 100644 --- a/src/jalview/io/RnamlFile.java +++ b/src/jalview/io/RnamlFile.java @@ -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); + } } diff --git a/src/jalview/io/StockholmFile.java b/src/jalview/io/StockholmFile.java index 84e629e..92f73f4 100644 --- a/src/jalview/io/StockholmFile.java +++ b/src/jalview/io/StockholmFile.java @@ -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")) diff --git a/src/jalview/project/Jalview2XML.java b/src/jalview/project/Jalview2XML.java index 9d9faa1..801632f 100644 --- a/src/jalview/project/Jalview2XML.java +++ b/src/jalview/project/Jalview2XML.java @@ -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; diff --git a/src/jalview/util/DBRefUtils.java b/src/jalview/util/DBRefUtils.java index fb54bba..197261a 100755 --- a/src/jalview/util/DBRefUtils.java +++ b/src/jalview/util/DBRefUtils.java @@ -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 srcs = new HashSet(); + HashSet srcs = new HashSet<>(); for (String src : sources) { srcs.add(src.toUpperCase()); } int nrefs = dbrefs.size(); - List res = new ArrayList(); + List 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 searchRefs(List refs, String accId) { - List rfs = new ArrayList(); + List rfs = new ArrayList<>(); if (refs == null || accId == null) { return rfs; } @@ -243,7 +242,7 @@ public class DBRefUtils * @return */ static List searchRefs(List refs, DBRefEntry entry, DbRefComp comparator, int mode) { - List rfs = new ArrayList(); + List 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 searchRefsForSource(List dbRefs, String source) { - List matches = new ArrayList(); + List 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)) diff --git a/src/jalview/util/GroupUrlLink.java b/src/jalview/util/GroupUrlLink.java index 512e046..e4c4ad0 100644 --- a/src/jalview/util/GroupUrlLink.java +++ b/src/jalview/util/GroupUrlLink.java @@ -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 { diff --git a/src/jalview/util/Platform.java b/src/jalview/util/Platform.java index 9b57a5a..a1412f2 100644 --- a/src/jalview/util/Platform.java +++ b/src/jalview/util/Platform.java @@ -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); + } + } diff --git a/src/jalview/util/UrlLink.java b/src/jalview/util/UrlLink.java index 0141a6a..8a60b56 100644 --- a/src/jalview/util/UrlLink.java +++ b/src/jalview/util/UrlLink.java @@ -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 * diff --git a/src/jalview/ws/dbsources/EmblCdsSource.java b/src/jalview/ws/dbsources/EmblCdsSource.java index a73af61..c5159f2 100644 --- a/src/jalview/ws/dbsources/EmblCdsSource.java +++ b/src/jalview/ws/dbsources/EmblCdsSource.java @@ -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 diff --git a/src/jalview/ws/dbsources/EmblSource.java b/src/jalview/ws/dbsources/EmblSource.java index 6bbe2e1..ec75b04 100644 --- a/src/jalview/ws/dbsources/EmblSource.java +++ b/src/jalview/ws/dbsources/EmblSource.java @@ -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; } /* diff --git a/src/jalview/ws/dbsources/Pdb.java b/src/jalview/ws/dbsources/Pdb.java index a658089..d12c271 100644 --- a/src/jalview/ws/dbsources/Pdb.java +++ b/src/jalview/ws/dbsources/Pdb.java @@ -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 toremove = new ArrayList(); + List toremove = new ArrayList<>(); for (SequenceI pdbcs : pdbAlignment.getSequences()) { String chid = null; diff --git a/src/jalview/ws/dbsources/Uniprot.java b/src/jalview/ws/dbsources/Uniprot.java index d199963..a021d4a 100644 --- a/src/jalview/ws/dbsources/Uniprot.java +++ b/src/jalview/ws/dbsources/Uniprot.java @@ -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; } /* diff --git a/swingjs/SwingJS-site.zip b/swingjs/SwingJS-site.zip index eaeed6d..5fcd0b1 100644 Binary files a/swingjs/SwingJS-site.zip and b/swingjs/SwingJS-site.zip differ diff --git a/swingjs/timestamp b/swingjs/timestamp index 06df058..e223bf6 100644 --- a/swingjs/timestamp +++ b/swingjs/timestamp @@ -1 +1 @@ -20190518175634 +20190522032238 diff --git a/swingjs/ver/3.2.4/SwingJS-site.zip b/swingjs/ver/3.2.4/SwingJS-site.zip index eaeed6d..5fcd0b1 100644 Binary files a/swingjs/ver/3.2.4/SwingJS-site.zip and b/swingjs/ver/3.2.4/SwingJS-site.zip differ diff --git a/swingjs/ver/3.2.4/timestamp b/swingjs/ver/3.2.4/timestamp index 06df058..e223bf6 100644 --- a/swingjs/ver/3.2.4/timestamp +++ b/swingjs/ver/3.2.4/timestamp @@ -1 +1 @@ -20190518175634 +20190522032238