14665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka/* 24665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka * Copyright (C) 2011 The Android Open Source Project 34665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka * 48aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); 58aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * you may not use this file except in compliance with the License. 68aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * You may obtain a copy of the License at 74665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka * 88aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 94665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka * 104665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 118aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, 128aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * See the License for the specific language governing permissions and 148aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * limitations under the License. 154665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka */ 164665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 17e28eba5074664d5716b8e58b8d0a235746b261ebKen Wakasapackage com.android.inputmethod.latin.utils; 184665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 194665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaokaimport android.content.res.TypedArray; 204665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 214665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaokaimport org.xmlpull.v1.XmlPullParser; 224665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaokaimport org.xmlpull.v1.XmlPullParserException; 234665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 244665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaokaimport java.io.IOException; 254665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 261e11c44d1b5f9ddf593c5407cb14c458be0056f2Tadashi G. Takaokapublic final class XmlParseUtils { 27660776e09b9a3b321074a94721d901a035ca1b9fKen Wakasa private XmlParseUtils() { 28660776e09b9a3b321074a94721d901a035ca1b9fKen Wakasa // This utility class is not publicly instantiable. 29660776e09b9a3b321074a94721d901a035ca1b9fKen Wakasa } 30660776e09b9a3b321074a94721d901a035ca1b9fKen Wakasa 314665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka @SuppressWarnings("serial") 324665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka public static class ParseException extends XmlPullParserException { 33d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public ParseException(final String msg, final XmlPullParser parser) { 3405bfd189a88be79ddfc74d0ea21792e2fb78f2aaTadashi G. Takaoka super(msg + " at " + parser.getPositionDescription()); 354665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 364665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 374665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 384665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka @SuppressWarnings("serial") 39a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaoka public static final class IllegalStartTag extends ParseException { 40d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public IllegalStartTag(final XmlPullParser parser, final String tag, final String parent) { 41d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka super("Illegal start tag " + tag + " in " + parent, parser); 424665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 434665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 444665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 454665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka @SuppressWarnings("serial") 46a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaoka public static final class IllegalEndTag extends ParseException { 47d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public IllegalEndTag(final XmlPullParser parser, final String tag, final String parent) { 48d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka super("Illegal end tag " + tag + " in " + parent, parser); 494665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 504665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 514665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 524665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka @SuppressWarnings("serial") 53a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaoka public static final class IllegalAttribute extends ParseException { 54d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public IllegalAttribute(final XmlPullParser parser, final String tag, 55d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka final String attribute) { 56d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka super("Tag " + tag + " has illegal attribute " + attribute, parser); 574665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 584665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 594665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 604665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka @SuppressWarnings("serial") 61a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaoka public static final class NonEmptyTag extends ParseException{ 62d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public NonEmptyTag(final XmlPullParser parser, final String tag) { 634665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka super(tag + " must be empty tag", parser); 644665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 654665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 664665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 67d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public static void checkEndTag(final String tag, final XmlPullParser parser) 684665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka throws XmlPullParserException, IOException { 694665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka if (parser.next() == XmlPullParser.END_TAG && tag.equals(parser.getName())) 704665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka return; 71d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka throw new NonEmptyTag(parser, tag); 724665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 734665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka 74d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka public static void checkAttributeExists(final TypedArray attr, final int attrId, 75d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka final String attrName, final String tag, final XmlPullParser parser) 76d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka throws XmlPullParserException { 77d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka if (attr.hasValue(attrId)) { 784665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka return; 79d17b69ec000adc02f057fa69055411fd5438885fTadashi G. Takaoka } 804665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka throw new ParseException( 814665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka "No " + attrName + " attribute found in <" + tag + "/>", parser); 824665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka } 834665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka} 84