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      */
PatternSyntaxException(String desc, String regex, int index)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      */
getIndex()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      */
getDescription()83     public String getDescription() {
84         return desc;
85     }
86 
87     /**
88      * Retrieves the erroneous regular-expression pattern.
89      *
90      * @return  The erroneous pattern
91      */
getPattern()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      */
getMessage()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