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