8037781: Remove sun.misc.Regexp* classes
Reviewed-by: alanb, chegar
Contributed-by: Pavel Rappo <pavel.rappo@oracle.com>
--- a/jdk/src/share/classes/sun/misc/REException.java Thu Mar 06 17:16:20 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-
-/**
- * A class to signal exception from the RegexpPool class.
- * @author James Gosling
- */
-
-public class REException extends Exception {
-
- private static final long serialVersionUID = 4656584872733646963L;
-
- REException (String s) {
- super(s);
- }
-}
--- a/jdk/src/share/classes/sun/misc/Regexp.java Thu Mar 06 17:16:20 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,141 +0,0 @@
-/*
- * Copyright (c) 1995, 2004, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-
-/**
- * A class to represent a regular expression. Only handles '*'s.
- * @author James Gosling
- */
-
-public class Regexp {
- /** if true then the matching process ignores case. */
- public boolean ignoreCase;
-
- /*
- * regular expressions are carved into three regions: a constant string
- * prefix, a constant string suffix, and a series of floating strings in
- * between. In the input regular expression, they are separated by *s
- */
- public String exp;
- public String prefix, suffix;
- public boolean exact;
- public int prefixLen, suffixLen, totalLen;
- public String mids[];
-
- /** Create a new regular expression object. The regular expression
- is a series of constant strings separated by *s. For example:
- <dl>
- <dt>*.gif <dd>Matches any string that ends in ".gif".
- <dt>/tmp/* <dd>Matches any string that starts with "/tmp/".
- <dt>/tmp/*.gif <dd>Matches any string that starts with "/tmp/" and ends
- with ".gif".
- <dt>/tmp/*new*.gif <dd>Matches any string that starts with "/tmp/"
- and ends with ".gif" and has "new" somewhere in between.
- </dl>
- */
- public Regexp (String s) {
- exp = s;
- int firstst = s.indexOf('*');
- int lastst = s.lastIndexOf('*');
- if (firstst < 0) {
- totalLen = s.length();
- exact = true; // no * s
- } else {
- prefixLen = firstst;
- if (firstst == 0)
- prefix = null;
- else
- prefix = s.substring(0, firstst);
- suffixLen = s.length() - lastst - 1;
- if (suffixLen == 0)
- suffix = null;
- else
- suffix = s.substring(lastst + 1);
- int nmids = 0;
- int pos = firstst;
- while (pos < lastst && pos >= 0) {
- nmids++;
- pos = s.indexOf('*', pos + 1);
- }
- totalLen = prefixLen + suffixLen;
- if (nmids > 0) {
- mids = new String[nmids];
- pos = firstst;
- for (int i = 0; i < nmids; i++) {
- pos++;
- int npos = s.indexOf('*', pos);
- if (pos < npos) {
- mids[i] = s.substring(pos, npos);
- totalLen += mids[i].length();
- }
- pos = npos;
- }
- }
- }
- }
-
- /** Returns true iff the String s matches this regular expression. */
- final boolean matches(String s) {
- return matches(s, 0, s.length());
- }
-
- /** Returns true iff the substring of s from offset for len characters
- matches this regular expression. */
- boolean matches(String s, int offset, int len) {
- if (exact)
- return len == totalLen &&
- exp.regionMatches(ignoreCase, 0, s, offset, len);
- if (len < totalLen)
- return false;
- if (prefixLen > 0 &&
- !prefix.regionMatches(ignoreCase,
- 0, s, offset, prefixLen)
- ||
- suffixLen > 0 &&
- !suffix.regionMatches(ignoreCase,
- 0, s, offset + len - suffixLen,
- suffixLen))
- return false;
- if (mids == null)
- return true;
- int nmids = mids.length;
- int spos = offset + prefixLen;
- int limit = offset+len-suffixLen;
- for (int i = 0; i<nmids; i++) {
- String ms = mids[i];
- int ml = ms.length();
- while (spos+ml<=limit &&
- !ms.regionMatches(ignoreCase,
- 0, s, spos, ml))
- spos++;
- if (spos+ml>limit)
- return false;
- spos+=ml;
- }
- return true;
- }
-
-}
--- a/jdk/src/share/classes/sun/misc/RegexpPool.java Thu Mar 06 17:16:20 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,319 +0,0 @@
-/*
- * Copyright (c) 1995, 2001, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-import java.io.*;
-
-/**
- * A class to represent a pool of regular expressions. A string
- * can be matched against the whole pool all at once. It is much
- * faster than doing individual regular expression matches one-by-one.
- *
- * @see java.misc.RegexpTarget
- * @author James Gosling
- */
-
-public class RegexpPool {
- private RegexpNode prefixMachine = new RegexpNode();
- private RegexpNode suffixMachine = new RegexpNode();
- private static final int BIG = 0x7FFFFFFF;
- private int lastDepth = BIG;
-
- public RegexpPool () {
- }
-
- /**
- * Add a regular expression to the pool of regular expressions.
- * @param re The regular expression to add to the pool.
- For now, only handles strings that either begin or end with
- a '*'.
- * @param ret The object to be returned when this regular expression is
- matched. If ret is an instance of the RegexpTarget class, ret.found
- is called with the string fragment that matched the '*' as its
- parameter.
- * @exception REException error
- */
- public void add(String re, Object ret) throws REException {
- add(re, ret, false);
- }
-
- /**
- * Replace the target for the regular expression with a different
- * target.
- *
- * @param re The regular expression to be replaced in the pool.
- * For now, only handles strings that either begin or end with
- * a '*'.
- * @param ret The object to be returned when this regular expression is
- * matched. If ret is an instance of the RegexpTarget class, ret.found
- * is called with the string fragment that matched the '*' as its
- * parameter.
- */
- public void replace(String re, Object ret) {
- try {
- add(re, ret, true);
- } catch(Exception e) {
- // should never occur if replace is true
- }
- }
-
- /**
- * Delete the regular expression and its target.
- * @param re The regular expression to be deleted from the pool.
- * must begin or end with a '*'
- * @return target - the old target.
- */
- public Object delete(String re) {
- Object o = null;
- RegexpNode p = prefixMachine;
- RegexpNode best = p;
- int len = re.length() - 1;
- int i;
- boolean prefix = true;
-
- if (!re.startsWith("*") ||
- !re.endsWith("*"))
- len++;
-
- if (len <= 0)
- return null;
-
- /* March forward through the prefix machine */
- for (i = 0; p != null; i++) {
- if (p.result != null && p.depth < BIG
- && (!p.exact || i == len)) {
- best = p;
- }
- if (i >= len)
- break;
- p = p.find(re.charAt(i));
- }
-
- /* march backward through the suffix machine */
- p = suffixMachine;
- for (i = len; --i >= 0 && p != null;) {
- if (p.result != null && p.depth < BIG) {
- prefix = false;
- best = p;
- }
- p = p.find(re.charAt(i));
- }
-
- // delete only if there is an exact match
- if (prefix) {
- if (re.equals(best.re)) {
- o = best.result;
- best.result = null;
-
- }
- } else {
- if (re.equals(best.re)) {
- o = best.result;
- best.result = null;
- }
- }
- return o;
- }
-
- /** Search for a match to a string & return the object associated
- with it with the match. When multiple regular expressions
- would match the string, the best match is returned first.
- The next best match is returned the next time matchNext is
- called.
- @param s The string to match against the regular expressions
- in the pool.
- @return null on failure, otherwise the object associated with
- the regular expression when it was added to the pool.
- If the object is an instance of RegexpTarget, then
- the return value is the result from calling
- return.found(string_that_matched_wildcard).
- */
- public Object match(String s) {
- return matchAfter(s, BIG);
- }
-
- /** Identical to match except that it will only find matches to
- regular expressions that were added to the pool <i>after</i>
- the last regular expression that matched in the last call
- to match() or matchNext() */
- public Object matchNext(String s) {
- return matchAfter(s, lastDepth);
- }
-
- private void add(String re, Object ret, boolean replace) throws REException {
- int len = re.length();
- RegexpNode p;
- if (re.charAt(0) == '*') {
- p = suffixMachine;
- while (len > 1)
- p = p.add(re.charAt(--len));
- } else {
- boolean exact = false;
- if (re.charAt(len - 1) == '*')
- len--;
- else
- exact = true;
- p = prefixMachine;
- for (int i = 0; i < len; i++)
- p = p.add(re.charAt(i));
- p.exact = exact;
- }
-
- if (p.result != null && !replace)
- throw new REException(re + " is a duplicate");
-
- p.re = re;
- p.result = ret;
- }
-
- private Object matchAfter(String s, int lastMatchDepth) {
- RegexpNode p = prefixMachine;
- RegexpNode best = p;
- int bst = 0;
- int bend = 0;
- int len = s.length();
- int i;
- if (len <= 0)
- return null;
- /* March forward through the prefix machine */
- for (i = 0; p != null; i++) {
- if (p.result != null && p.depth < lastMatchDepth
- && (!p.exact || i == len)) {
- lastDepth = p.depth;
- best = p;
- bst = i;
- bend = len;
- }
- if (i >= len)
- break;
- p = p.find(s.charAt(i));
- }
- /* march backward through the suffix machine */
- p = suffixMachine;
- for (i = len; --i >= 0 && p != null;) {
- if (p.result != null && p.depth < lastMatchDepth) {
- lastDepth = p.depth;
- best = p;
- bst = 0;
- bend = i+1;
- }
- p = p.find(s.charAt(i));
- }
- Object o = best.result;
- if (o != null && o instanceof RegexpTarget)
- o = ((RegexpTarget) o).found(s.substring(bst, bend));
- return o;
- }
-
- /** Resets the pool so that the next call to matchNext looks
- at all regular expressions in the pool. match(s); is equivalent
- to reset(); matchNext(s);
- <p><b>Multithreading note:</b> reset/nextMatch leave state in the
- regular expression pool. If multiple threads could be using this
- pool this way, they should be syncronized to avoid race hazards.
- match() was done in such a way that there are no such race
- hazards: multiple threads can be matching in the same pool
- simultaneously. */
- public void reset() {
- lastDepth = BIG;
- }
-
- /** Print this pool to standard output */
- public void print(PrintStream out) {
- out.print("Regexp pool:\n");
- if (suffixMachine.firstchild != null) {
- out.print(" Suffix machine: ");
- suffixMachine.firstchild.print(out);
- out.print("\n");
- }
- if (prefixMachine.firstchild != null) {
- out.print(" Prefix machine: ");
- prefixMachine.firstchild.print(out);
- out.print("\n");
- }
- }
-
-}
-
-/* A node in a regular expression finite state machine. */
-class RegexpNode {
- char c;
- RegexpNode firstchild;
- RegexpNode nextsibling;
- int depth;
- boolean exact;
- Object result;
- String re = null;
-
- RegexpNode () {
- c = '#';
- depth = 0;
- }
- RegexpNode (char C, int depth) {
- c = C;
- this.depth = depth;
- }
- RegexpNode add(char C) {
- RegexpNode p = firstchild;
- if (p == null)
- p = new RegexpNode (C, depth+1);
- else {
- while (p != null)
- if (p.c == C)
- return p;
- else
- p = p.nextsibling;
- p = new RegexpNode (C, depth+1);
- p.nextsibling = firstchild;
- }
- firstchild = p;
- return p;
- }
- RegexpNode find(char C) {
- for (RegexpNode p = firstchild;
- p != null;
- p = p.nextsibling)
- if (p.c == C)
- return p;
- return null;
- }
- void print(PrintStream out) {
- if (nextsibling != null) {
- RegexpNode p = this;
- out.print("(");
- while (p != null) {
- out.write(p.c);
- if (p.firstchild != null)
- p.firstchild.print(out);
- p = p.nextsibling;
- out.write(p != null ? '|' : ')');
- }
- } else {
- out.write(c);
- if (firstchild != null)
- firstchild.print(out);
- }
- }
-}
--- a/jdk/src/share/classes/sun/misc/RegexpTarget.java Thu Mar 06 17:16:20 2014 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 1995, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-
-/**
- * A class to define actions to be performed when a regular expression match
- * occurs.
- * @author James Gosling
- */
-
-public interface RegexpTarget {
- /** Gets called when a pattern in a RegexpPool matches.
- * This method is called by RegexpPool.match() who passes the return
- * value from found() back to its caller.
- * @param remainder the string that matched the * in the pattern.
- */
- Object found(String remainder);
-}