From ae37055bc463df4b8ef6e3801ea0b7bb73b5b818 Mon Sep 17 00:00:00 2001 From: Pavel Rappo Date: Sat, 29 Mar 2014 20:20:04 +0000 Subject: [PATCH] 8037781: Remove sun.misc.Regexp* classes Reviewed-by: alanb, chegar --- .../share/classes/sun/misc/REException.java | 40 --- jdk/src/share/classes/sun/misc/Regexp.java | 141 -------- .../share/classes/sun/misc/RegexpPool.java | 319 ------------------ .../share/classes/sun/misc/RegexpTarget.java | 41 --- 4 files changed, 541 deletions(-) delete mode 100644 jdk/src/share/classes/sun/misc/REException.java delete mode 100644 jdk/src/share/classes/sun/misc/Regexp.java delete mode 100644 jdk/src/share/classes/sun/misc/RegexpPool.java delete mode 100644 jdk/src/share/classes/sun/misc/RegexpTarget.java diff --git a/jdk/src/share/classes/sun/misc/REException.java b/jdk/src/share/classes/sun/misc/REException.java deleted file mode 100644 index db68992d597..00000000000 --- a/jdk/src/share/classes/sun/misc/REException.java +++ /dev/null @@ -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); - } -} diff --git a/jdk/src/share/classes/sun/misc/Regexp.java b/jdk/src/share/classes/sun/misc/Regexp.java deleted file mode 100644 index 4d488363bb3..00000000000 --- a/jdk/src/share/classes/sun/misc/Regexp.java +++ /dev/null @@ -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: -
-
*.gif
Matches any string that ends in ".gif". -
/tmp/*
Matches any string that starts with "/tmp/". -
/tmp/*.gif
Matches any string that starts with "/tmp/" and ends - with ".gif". -
/tmp/*new*.gif
Matches any string that starts with "/tmp/" - and ends with ".gif" and has "new" somewhere in between. -
- */ - 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; ilimit) - return false; - spos+=ml; - } - return true; - } - -} diff --git a/jdk/src/share/classes/sun/misc/RegexpPool.java b/jdk/src/share/classes/sun/misc/RegexpPool.java deleted file mode 100644 index c82c66fee13..00000000000 --- a/jdk/src/share/classes/sun/misc/RegexpPool.java +++ /dev/null @@ -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 after - 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); -

Multithreading note: 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); - } - } -} diff --git a/jdk/src/share/classes/sun/misc/RegexpTarget.java b/jdk/src/share/classes/sun/misc/RegexpTarget.java deleted file mode 100644 index a44028acf7f..00000000000 --- a/jdk/src/share/classes/sun/misc/RegexpTarget.java +++ /dev/null @@ -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); -}