package org.itsnat.droid.impl.domparser.layout;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.dom.DOMAttr;
import org.itsnat.droid.impl.dom.DOMAttrRemote;
import org.itsnat.droid.impl.dom.DOMElement;
import org.itsnat.droid.impl.dom.XMLDOM;
import org.itsnat.droid.impl.dom.layout.DOMElemLayout;
import org.itsnat.droid.impl.dom.layout.DOMElemMerge;
import org.itsnat.droid.impl.dom.layout.DOMElemView;
import org.itsnat.droid.impl.dom.layout.XMLDOMLayout;
import org.itsnat.droid.impl.domparser.XMLDOMParser;
import org.itsnat.droid.impl.domparser.XMLDOMParserContext;
import org.itsnat.droid.impl.util.NamespaceUtil;
/**
* Created by jmarranz on 27/10/14.
*/
public abstract class XMLDOMLayoutParser extends XMLDOMParser<XMLDOMLayout>
{
public enum LayoutType { PAGE, PAGE_FRAGMENT, STANDALONE };
protected XMLDOMLayoutParser(XMLDOMParserContext xmlDOMParserContext)
{
super(xmlDOMParserContext);
}
public static XMLDOMLayoutParser createXMLDOMLayoutParser(String itsNatServerVersion,LayoutType layoutType,XMLDOMParserContext xmlDOMParserContext)
{
XMLDOMLayoutParser layoutParser;
if (layoutType == LayoutType.PAGE)
{
if (itsNatServerVersion != null)
layoutParser = new XMLDOMLayoutParserPageItsNat(xmlDOMParserContext,itsNatServerVersion);
else
layoutParser = new XMLDOMLayoutParserPageNotItsNat(xmlDOMParserContext);
}
else if (layoutType == LayoutType.PAGE_FRAGMENT) // Los fragmentos pueden usarse en páginas generadas por ItsNat y no generadas por ItsNat (itsNatServerVersion es indiferente)
layoutParser = new XMLDOMLayoutParserPageFragment(xmlDOMParserContext);
else if (layoutType == LayoutType.STANDALONE)
layoutParser = new XMLDOMLayoutParserStandalone(xmlDOMParserContext);
else
layoutParser = null; // Internal Error
return layoutParser;
}
@Override
protected boolean isAndroidNSPrefixNeeded()
{
return true;
}
public abstract XMLDOMLayout createXMLDOMLayout();
@Override
protected void prepareDOMAttrToLoadResource(DOMAttr attrib, XMLDOM xmlDOMParent)
{
if (!(attrib instanceof DOMAttrRemote))
{
if (NamespaceUtil.XMLNS_ITSNATDROID_RESOURCE.equals(attrib.getNamespaceURI()))
throw new ItsNatDroidException("Values of attributes with namespace " + NamespaceUtil.XMLNS_ITSNATDROID_RESOURCE + " must reference remote resources");
// Los atributos con namespace XMLNS_ITSNATDROID_RESOURCE sirven para que sean detectados en el parseo como atributos remotos y se cargue automáticamente el recurso asociado
// para poder ser accedidos via ItsNatResources.getLayout() etc e ignorados en el proceso normal de atributos
}
super.prepareDOMAttrToLoadResource(attrib,xmlDOMParent);
}
@Override
protected DOMElement createElement(String tagName,DOMElement parent)
{
if ("merge".equals(tagName))
{
if (parent != null) throw new ItsNatDroidException("<merge> only can be used as a root element of the XML layout");
return new DOMElemMerge(tagName, null);
}
else
return new DOMElemView(tagName,(DOMElemLayout)parent);
}
}