package org.itsnat.droid.impl.xmlinflater.shared.classtree;
import org.itsnat.droid.ItsNatDroidException;
import org.itsnat.droid.impl.dom.DOMAttr;
import org.itsnat.droid.impl.dom.DOMAttributeMap;
import org.itsnat.droid.impl.util.MapLight;
import org.itsnat.droid.impl.util.NamespaceUtil;
import org.itsnat.droid.impl.util.StringUtil;
import org.itsnat.droid.impl.xmlinflater.AttrContext;
import org.itsnat.droid.impl.xmlinflater.ClassDescMgr;
import org.itsnat.droid.impl.xmlinflater.XMLInflaterRegistry;
import org.itsnat.droid.impl.xmlinflater.shared.attr.AttrDesc;
import java.util.HashMap;
/**
* Created by jmarranz on 4/11/14.
*/
public abstract class ClassDesc<Tnative>
{
protected ClassDescMgr<? extends ClassDesc> classMgr;
protected String classOrDOMElemName;
protected ClassDesc<? super Tnative> parentClass;
protected boolean initiated;
protected HashMap<String, AttrDesc> attrDescAndroidNSMap;
protected MapLight<String, AttrDesc> attrDescNoNSMap;
public ClassDesc(ClassDescMgr<? extends ClassDesc> classMgr,String classOrDOMElemName,ClassDesc<? super Tnative> parentClass)
{
this.classMgr = classMgr;
this.classOrDOMElemName = classOrDOMElemName;
this.parentClass = parentClass;
}
public XMLInflaterRegistry getXMLInflaterRegistry()
{
return classMgr.getXMLInflaterRegistry();
}
public ClassDescMgr getClassDescMgr()
{
return classMgr;
}
public ClassDesc<? super Tnative> getParentClassDesc()
{
return parentClass;
}
public String getClassOrDOMElemName()
{
return classOrDOMElemName;
}
protected boolean isInit()
{
return initiated;
}
protected void init()
{
this.initiated = true;
}
protected <T extends AttrDesc> void addAttrDescAN(T attrDesc) // AN = Android Namespace
{
if (attrDescAndroidNSMap == null) this.attrDescAndroidNSMap = new HashMap<String, AttrDesc>();
AttrDesc old = attrDescAndroidNSMap.put(attrDesc.getName(),attrDesc);
if (old != null) throw new ItsNatDroidException("Internal Error, duplicated attribute in this class or element: " + getClassOrDOMElemName() + " " + NamespaceUtil.XMLNS_ANDROID + " " + attrDesc.getName());
}
protected <T extends AttrDesc> void addAttrDescNoNS(T attrDesc) // NoNS no namespace
{
if (attrDescNoNSMap == null) this.attrDescNoNSMap = new MapLight<String, AttrDesc>(3);
AttrDesc old = attrDescNoNSMap.put(attrDesc.getName(),attrDesc);
if (old != null) throw new ItsNatDroidException("Internal Error, duplicated attribute in this class or element: " + getClassOrDOMElemName() + " " + attrDesc.getName());
}
@SuppressWarnings("unchecked")
protected <TclassDesc extends ClassDesc,TattrTarget,TattrContext extends AttrContext> AttrDesc<TclassDesc,TattrTarget,TattrContext> getAttrDescAN(String name)
{
if (attrDescAndroidNSMap == null) return null;
return attrDescAndroidNSMap.get(name);
}
@SuppressWarnings("unchecked")
protected <TclassDesc extends ClassDesc,TattrTarget,TattrContext extends AttrContext> AttrDesc<TclassDesc,TattrTarget,TattrContext> getAttrDescNoNS(String name)
{
if (attrDescNoNSMap == null) return null;
return attrDescNoNSMap.get(name);
}
@SuppressWarnings("unchecked")
protected <TclassDesc extends ClassDesc,TattrTarget,TattrContext extends AttrContext> AttrDesc<TclassDesc,TattrTarget,TattrContext> getAttrDesc(String namespaceURI, String name)
{
if (NamespaceUtil.XMLNS_ANDROID.equals(namespaceURI))
return getAttrDescAN(name);
else if (StringUtil.isEmpty(namespaceURI))
return getAttrDescNoNS(name);
else
return null; // Namespace no gestionado aquĆ
}
protected static DOMAttr findAttribute(String namespaceURI, String attrName, DOMAttributeMap attribMap)
{
return attribMap.getDOMAttribute(namespaceURI, attrName);
}
public abstract Class<Tnative> getDeclaredClass();
}