Home | History | Annotate | Download | only in layout
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.ide.eclipse.adt.internal.editors.layout;
     18 
     19 import com.android.ide.common.rendering.legacy.ILegacyPullParser;
     20 
     21 import org.xmlpull.v1.XmlPullParserException;
     22 
     23 import java.io.InputStream;
     24 import java.io.Reader;
     25 
     26 /**
     27  * Base implementation of an {@link ILegacyPullParser} for cases where the parser is not sitting
     28  * on top of an actual XML file.
     29  * <p/>It's designed to work on layout files, and will most likely not work on other resource
     30  * files.
     31  */
     32 public abstract class BasePullParser implements ILegacyPullParser {
     33 
     34     protected int mParsingState = START_DOCUMENT;
     35 
     36     public BasePullParser() {
     37     }
     38 
     39     // --- new methods to override ---
     40 
     41     public abstract void onNextFromStartDocument();
     42     public abstract void onNextFromStartTag();
     43     public abstract void onNextFromEndTag();
     44 
     45     // --- basic implementation of IXmlPullParser ---
     46 
     47     public void setFeature(String name, boolean state) throws XmlPullParserException {
     48         if (FEATURE_PROCESS_NAMESPACES.equals(name) && state) {
     49             return;
     50         }
     51         if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name) && state) {
     52             return;
     53         }
     54         throw new XmlPullParserException("Unsupported feature: " + name);
     55     }
     56 
     57     public boolean getFeature(String name) {
     58         if (FEATURE_PROCESS_NAMESPACES.equals(name)) {
     59             return true;
     60         }
     61         if (FEATURE_REPORT_NAMESPACE_ATTRIBUTES.equals(name)) {
     62             return true;
     63         }
     64         return false;
     65     }
     66 
     67     public void setProperty(String name, Object value) throws XmlPullParserException {
     68         throw new XmlPullParserException("setProperty() not supported");
     69     }
     70 
     71     public Object getProperty(String name) {
     72         return null;
     73     }
     74 
     75     public void setInput(Reader in) throws XmlPullParserException {
     76         throw new XmlPullParserException("setInput() not supported");
     77     }
     78 
     79     public void setInput(InputStream inputStream, String inputEncoding)
     80             throws XmlPullParserException {
     81         throw new XmlPullParserException("setInput() not supported");
     82     }
     83 
     84     public void defineEntityReplacementText(String entityName, String replacementText)
     85             throws XmlPullParserException {
     86         throw new XmlPullParserException("defineEntityReplacementText() not supported");
     87     }
     88 
     89     public String getNamespacePrefix(int pos) throws XmlPullParserException {
     90         throw new XmlPullParserException("getNamespacePrefix() not supported");
     91     }
     92 
     93     public String getInputEncoding() {
     94         return null;
     95     }
     96 
     97     public String getNamespace(String prefix) {
     98         throw new RuntimeException("getNamespace() not supported");
     99     }
    100 
    101     public int getNamespaceCount(int depth) throws XmlPullParserException {
    102         throw new XmlPullParserException("getNamespaceCount() not supported");
    103     }
    104 
    105     public String getNamespaceUri(int pos) throws XmlPullParserException {
    106         throw new XmlPullParserException("getNamespaceUri() not supported");
    107     }
    108 
    109     public int getColumnNumber() {
    110         return -1;
    111     }
    112 
    113     public int getLineNumber() {
    114         return -1;
    115     }
    116 
    117     public String getAttributeType(int arg0) {
    118         return "CDATA";
    119     }
    120 
    121     public int getEventType() {
    122         return mParsingState;
    123     }
    124 
    125     public String getText() {
    126         return null;
    127     }
    128 
    129     public char[] getTextCharacters(int[] arg0) {
    130         return null;
    131     }
    132 
    133     public boolean isAttributeDefault(int arg0) {
    134         return false;
    135     }
    136 
    137     public boolean isWhitespace() {
    138         return false;
    139     }
    140 
    141     public int next() throws XmlPullParserException {
    142         switch (mParsingState) {
    143             case END_DOCUMENT:
    144                 throw new XmlPullParserException("Nothing after the end");
    145             case START_DOCUMENT:
    146                 onNextFromStartDocument();
    147                 break;
    148             case START_TAG:
    149                 onNextFromStartTag();
    150                 break;
    151             case END_TAG:
    152                 onNextFromEndTag();
    153                 break;
    154             case TEXT:
    155                 // not used
    156                 break;
    157             case CDSECT:
    158                 // not used
    159                 break;
    160             case ENTITY_REF:
    161                 // not used
    162                 break;
    163             case IGNORABLE_WHITESPACE:
    164                 // not used
    165                 break;
    166             case PROCESSING_INSTRUCTION:
    167                 // not used
    168                 break;
    169             case COMMENT:
    170                 // not used
    171                 break;
    172             case DOCDECL:
    173                 // not used
    174                 break;
    175         }
    176 
    177         return mParsingState;
    178     }
    179 
    180     public int nextTag() throws XmlPullParserException {
    181         int eventType = next();
    182         if (eventType != START_TAG && eventType != END_TAG) {
    183             throw new XmlPullParserException("expected start or end tag", this, null);
    184         }
    185         return eventType;
    186     }
    187 
    188     public String nextText() throws XmlPullParserException {
    189         if (getEventType() != START_TAG) {
    190             throw new XmlPullParserException("parser must be on START_TAG to read next text", this,
    191                     null);
    192         }
    193         int eventType = next();
    194         if (eventType == TEXT) {
    195             String result = getText();
    196             eventType = next();
    197             if (eventType != END_TAG) {
    198                 throw new XmlPullParserException(
    199                         "event TEXT it must be immediately followed by END_TAG", this, null);
    200             }
    201             return result;
    202         } else if (eventType == END_TAG) {
    203             return "";
    204         } else {
    205             throw new XmlPullParserException("parser must be on START_TAG or TEXT to read text",
    206                     this, null);
    207         }
    208     }
    209 
    210     public int nextToken() throws XmlPullParserException {
    211         return next();
    212     }
    213 
    214     public void require(int type, String namespace, String name) throws XmlPullParserException {
    215         if (type != getEventType() || (namespace != null && !namespace.equals(getNamespace()))
    216                 || (name != null && !name.equals(getName())))
    217             throw new XmlPullParserException("expected " + TYPES[type] + getPositionDescription());
    218     }
    219 }
    220