package org.itsnat.droid.impl.domparser.values; import org.itsnat.droid.ItsNatDroidException; import org.itsnat.droid.impl.dom.DOMAttr; import org.itsnat.droid.impl.dom.DOMElement; import org.itsnat.droid.impl.dom.XMLDOM; import org.itsnat.droid.impl.dom.values.DOMElemValuesArrayBase; import org.itsnat.droid.impl.dom.values.DOMElemValuesItemArrayBase; import org.itsnat.droid.impl.dom.values.DOMElemValuesItemNormal; import org.itsnat.droid.impl.dom.values.DOMElemValuesItemStyle; import org.itsnat.droid.impl.dom.values.DOMElemValuesNoChildElem; import org.itsnat.droid.impl.dom.values.DOMElemValuesResources; import org.itsnat.droid.impl.dom.values.DOMElemValuesStyle; import org.itsnat.droid.impl.dom.values.XMLDOMValues; import org.itsnat.droid.impl.dommini.DMNode; import org.itsnat.droid.impl.dommini.DOMMiniParser; import org.itsnat.droid.impl.dommini.DOMMiniRender; import org.itsnat.droid.impl.domparser.XMLDOMParser; import org.itsnat.droid.impl.domparser.XMLDOMParserContext; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_ARRAY; import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_INTEGER_ARRAY; import static org.itsnat.droid.impl.dom.values.XMLDOMValues.TYPE_STRING_ARRAY; /** * Created by jmarranz on 31/10/14. */ public class XMLDOMValuesParser extends XMLDOMParser<XMLDOMValues> { protected XMLDOMValuesParser(XMLDOMParserContext xmlDOMParserContext) { super(xmlDOMParserContext); } public static XMLDOMValuesParser createXMLDOMValuesParser(XMLDOMParserContext xmlDOMParserContext) { return new XMLDOMValuesParser(xmlDOMParserContext); } @Override protected boolean isAndroidNSPrefixNeeded() { return false; } @Override protected DOMElement createElement(String tagName,DOMElement parent) { if (hasChildElements(tagName)) { if ("resources".equals(tagName)) { if (parent != null) throw new ItsNatDroidException("<resources> element must be root"); return new DOMElemValuesResources(); } else { if ("style".equals(tagName)) return new DOMElemValuesStyle((DOMElemValuesResources) parent); else if (TYPE_STRING_ARRAY.equals(tagName) || TYPE_INTEGER_ARRAY.equals(tagName) || TYPE_ARRAY.equals(tagName)) return new DOMElemValuesArrayBase(tagName, (DOMElemValuesResources) parent); else if ("declare-styleable".equals(tagName)) throw new ItsNatDroidException("Not supported yet:" + tagName); } throw new ItsNatDroidException("Unrecognized element name in this context:" + tagName); } else { if (parent instanceof DOMElemValuesStyle) return new DOMElemValuesItemStyle((DOMElemValuesStyle)parent); else if (parent instanceof DOMElemValuesArrayBase) return new DOMElemValuesItemArrayBase((DOMElemValuesArrayBase)parent); else return new DOMElemValuesItemNormal(tagName, (DOMElemValuesResources) parent); } } @Override protected void processChildElements(DOMElement parentElement,XmlPullParser parser,XMLDOM xmlDOM) throws IOException, XmlPullParserException { if (parentElement instanceof DOMElemValuesNoChildElem) { DOMElemValuesNoChildElem parentElementNoChildElem = (DOMElemValuesNoChildElem)parentElement; // Lo normal es que esperemos un único nodo de texto hijo, pero también podemos esperar un texto con HTML, que será tolerado y procesado por Resources.getText() DMNode[] nodeList = DOMMiniParser.parse(parser); String text = DOMMiniRender.toString(nodeList); /* while (parser.next() != XmlPullParser.TEXT) ; String text = parser.getText(); while (parser.next() != XmlPullParser.END_TAG) ; */ DOMAttr valueAsDOMAttr = parentElementNoChildElem.setTextNode(text); // El nodo de texto lo tratamos de forma especial como un atributo para resolver si es asset o remote y así cargarlo addDOMAttr(parentElementNoChildElem,valueAsDOMAttr, xmlDOM); } else { super.processChildElements(parentElement, parser, xmlDOM); } } public static boolean hasChildElements(String elemName) { // http://developer.android.com/guide/topics/resources/available-resources.html return "resources".equals(elemName) || "style".equals(elemName) || "declare-styleable".equals(elemName) || TYPE_STRING_ARRAY.equals(elemName) || TYPE_INTEGER_ARRAY.equals(elemName) || TYPE_ARRAY.equals(elemName); } }