Home | History | Annotate | Download | only in regex
      1 /*
      2  * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 
     26 package java.util.regex;
     27 
     28 import sun.security.action.GetPropertyAction;
     29 
     30 
     31 /**
     32  * Unchecked exception thrown to indicate a syntax error in a
     33  * regular-expression pattern.
     34  *
     35  * @author  unascribed
     36  * @since 1.4
     37  * @spec JSR-51
     38  */
     39 
     40 public class PatternSyntaxException
     41     extends IllegalArgumentException
     42 {
     43     private static final long serialVersionUID = -3864639126226059218L;
     44 
     45     private final String desc;
     46     private final String pattern;
     47     private final int index;
     48 
     49     /**
     50      * Constructs a new instance of this class.
     51      *
     52      * @param  desc
     53      *         A description of the error
     54      *
     55      * @param  regex
     56      *         The erroneous pattern
     57      *
     58      * @param  index
     59      *         The approximate index in the pattern of the error,
     60      *         or <tt>-1</tt> if the index is not known
     61      */
     62     public PatternSyntaxException(String desc, String regex, int index) {
     63         this.desc = desc;
     64         this.pattern = regex;
     65         this.index = index;
     66     }
     67 
     68     /**
     69      * Retrieves the error index.
     70      *
     71      * @return  The approximate index in the pattern of the error,
     72      *         or <tt>-1</tt> if the index is not known
     73      */
     74     public int getIndex() {
     75         return index;
     76     }
     77 
     78     /**
     79      * Retrieves the description of the error.
     80      *
     81      * @return  The description of the error
     82      */
     83     public String getDescription() {
     84         return desc;
     85     }
     86 
     87     /**
     88      * Retrieves the erroneous regular-expression pattern.
     89      *
     90      * @return  The erroneous pattern
     91      */
     92     public String getPattern() {
     93         return pattern;
     94     }
     95 
     96     private static final String nl =
     97         java.security.AccessController
     98             .doPrivileged(new GetPropertyAction("line.separator"));
     99 
    100     /**
    101      * Returns a multi-line string containing the description of the syntax
    102      * error and its index, the erroneous regular-expression pattern, and a
    103      * visual indication of the error index within the pattern.
    104      *
    105      * @return  The full detail message
    106      */
    107     public String getMessage() {
    108         StringBuffer sb = new StringBuffer();
    109         sb.append(desc);
    110         if (index >= 0) {
    111             sb.append(" near index ");
    112             sb.append(index);
    113         }
    114         sb.append(nl);
    115         sb.append(pattern);
    116         if (index >= 0) {
    117             sb.append(nl);
    118             for (int i = 0; i < index; i++) sb.append(' ');
    119             sb.append('^');
    120         }
    121         return sb.toString();
    122     }
    123 
    124 }
    125