PatternSyntaxException.java revision f6c387128427e121477c1b32ad35cdcaa5101ba3
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util.regex;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Encapsulates a syntax error that occurred during the compilation of a
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Pattern}. Might include a detailed description, the original regular
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expression, and the index at which the error occurred.
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Pattern#compile(String)
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Pattern#compile(java.lang.String,int)
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class PatternSyntaxException extends IllegalArgumentException {
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final long serialVersionUID = -3864639126226059218L;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the syntactically incorrect regular expression, or null if the
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * regular expression is not known.
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private String pattern;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the description of the syntax error, or null if the description is
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not known.
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private String description;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the index around which the error occured, or -1, in case it is
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * unknown.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int index = -1;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new PatternSyntaxException for a given message, pattern, and
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * error index.
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param description
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the description of the syntax error, or {@code null} if the
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            description is not known.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param pattern
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the syntactically incorrect regular expression, or
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code null} if the regular expression is not known.
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the character index around which the error occurred, or -1 if
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index is not known.
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public PatternSyntaxException(String description, String pattern, int index) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.pattern = pattern;
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.description = description;
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.index = index;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the syntactically incorrect regular expression.
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the regular expression.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getPattern() {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return pattern;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a detailed error message for the exception. The message is
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * potentially multi-line, and it might include a detailed description, the
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * original regular expression, and the index at which the error occured.
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the error message.
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getMessage() {
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder builder = new StringBuilder("Syntax error");
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (description != null) {
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(' ');
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(description);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index >= 0) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(" near index " + index + ":");
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (pattern != null) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append('\n');
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(pattern);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (index >= 0) {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                char[] spaces = new char[index];
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Arrays.fill(spaces, ' ');
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                builder.append('\n');
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                builder.append(spaces);
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                builder.append('^');
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return builder.toString();
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the description of the syntax error, or {@code null} if the
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * description is not known.
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the description.
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getDescription() {
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return description;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the character index around which the error occurred, or -1 if the
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * index is not known.
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the index.
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getIndex() {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return index;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
147