8037781: Remove sun.misc.Regexp* classes
authorchegar
Sat, 29 Mar 2014 20:20:04 +0000
changeset 23598 e62acb17ed9e
parent 23597 d4ca7cc9c0c9
child 23599 e1bdea08040e
8037781: Remove sun.misc.Regexp* classes Reviewed-by: alanb, chegar Contributed-by: Pavel Rappo <pavel.rappo@oracle.com>
jdk/src/share/classes/sun/misc/REException.java
jdk/src/share/classes/sun/misc/Regexp.java
jdk/src/share/classes/sun/misc/RegexpPool.java
jdk/src/share/classes/sun/misc/RegexpTarget.java
--- 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);
-}