1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
29140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  Licensed to the Apache Software Foundation (ASF) under one or more
39140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  contributor license agreements.  See the NOTICE file distributed with
49140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  this work for additional information regarding copyright ownership.
59140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  The ASF licenses this file to You under the Apache License, Version 2.0
69140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  (the "License"); you may not use this file except in compliance with
79140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
99140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
119140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  Unless required by applicable law or agreed to in writing, software
129140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  distributed under the License is distributed on an "AS IS" BASIS,
139140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  See the License for the specific language governing permissions and
159140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.util.regex;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Encapsulates a syntax error that occurred during the compilation of a
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Pattern}. Might include a detailed description, the original regular
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expression, and the index at which the error occurred.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Pattern#compile(String)
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see Pattern#compile(java.lang.String,int)
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class PatternSyntaxException extends IllegalArgumentException {
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final long serialVersionUID = -3864639126226059218L;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the description of the syntax error, or null if the description is
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not known.
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
389140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson    private String desc;
399140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson
409140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson    /**
419140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson     * Holds the syntactically incorrect regular expression, or null if the
429140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson     * regular expression is not known.
439140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson     */
449140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson    private String pattern;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holds the index around which the error occured, or -1, in case it is
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * unknown.
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int index = -1;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new PatternSyntaxException for a given message, pattern, and
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * error index.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param description
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the description of the syntax error, or {@code null} if the
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            description is not known.
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param pattern
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the syntactically incorrect regular expression, or
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            {@code null} if the regular expression is not known.
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the character index around which the error occurred, or -1 if
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index is not known.
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public PatternSyntaxException(String description, String pattern, int index) {
679140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson        this.desc = description;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.pattern = pattern;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.index = index;
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the syntactically incorrect regular expression.
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the regular expression.
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getPattern() {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return pattern;
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns a detailed error message for the exception. The message is
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * potentially multi-line, and it might include a detailed description, the
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * original regular expression, and the index at which the error occured.
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the error message.
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getMessage() {
919140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson        // BEGIN android-changed
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder builder = new StringBuilder("Syntax error");
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
949140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson        if (desc != null) {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(' ');
969140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson            builder.append(desc);
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (index >= 0) {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(" near index " + index + ":");
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (pattern != null) {
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append('\n');
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            builder.append(pattern);
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (index >= 0) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                char[] spaces = new char[index];
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Arrays.fill(spaces, ' ');
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                builder.append('\n');
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                builder.append(spaces);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                builder.append('^');
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return builder.toString();
1179140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson        // END android-changed
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the description of the syntax error, or {@code null} if the
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * description is not known.
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the description.
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getDescription() {
1279140e167caad80e4edef60eb788f9f9969b8daeeJesse Wilson        return desc;
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the character index around which the error occurred, or -1 if the
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * index is not known.
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the index.
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getIndex() {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return index;
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
141