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