DataObjectXmlImpl.java

package eu.javaexperience.datareprez.xmlImpl;

import java.util.ArrayList;

import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import eu.javaexperience.datareprez.DataCommon;
import eu.javaexperience.reflect.Mirror;
import eu.javaexperience.document.DocumentTools;
import eu.javaexperience.datareprez.abstractImpl.DataObjectAbstractImpl;
import eu.javaexperience.datareprez.abstractImpl.DataProtocol;

public class DataObjectXmlImpl extends DataObjectAbstractImpl
{
	protected Node node;
	
	public static DataCommon PROTOTYPE = new DataObjectXmlImpl();
	
	//public static final DataAccessor DATA_ACCESSOR_DIALECT__DataXmlObject = DataReprezDialectTools.generateFieldDialectAccessor("DataXmlObject");
	
	/**
	 * <html>
	 * 	<head>
	 * 		<meta name="key1" content="value1"></meta>
	 * 		<meta name="key2" content="value2"></meta>
	 * 	</head>
	 * 	<body id="something"> </body>
	 * </html>
	 * 
	 * html => {head: ..., body: ...}
	 *
	 * html.head.meta[0].-name = "key1"
	 * html.head.meta[1].-name = "key2"
	 * 
	 * html.head => {meta:[{-name: "key1", -content:"value1"}, {-name:"key2", -content:"value2"}]}
	 * 
	 * html.body => {"-id": "something"}
	 * html.body.-id => "something"
	 * */
	public DataObjectXmlImpl()
	{
		this(DataCommonXmlImpl.NODE_NAME_MARK_NEED_ADOPT);
	}
	
	public DataObjectXmlImpl(String name)
	{
		node = DocumentTools.createEmptyDocument().createElement(name);
		node.getOwnerDocument().appendChild(node);
	}
	
	public DataObjectXmlImpl(Node node)
	{
		this.node = node;
	}
	
	@Override
	public Object getImpl()
	{
		return node;
	}

	@Override
	public Class getCommonsClass()
	{
		return Node.class;
	}

	@Override
	public byte[] toBlob()
	{
		return DataCommonXmlImpl.xmlToString(node).getBytes();
	}

	@Override
	public boolean has(String key)
	{
		return null != DataCommonXmlImpl.getOrCreateSubjectValue(node, key, false, false);
	}
	
	@Override
	public String[] keys()
	{
		ArrayList<String> ret = new ArrayList<>();
		NamedNodeMap nm = node.getAttributes();
		if(null != nm)
		{
			for(int i=0;i <nm.getLength();++i)
			{
				ret.add("-"+nm.item(i).getNodeName());
			}
		}
		NodeList nl = node.getChildNodes();
		for(int i=0; i < nl.getLength();++i)
		{
			String name = nl.item(i).getNodeName();
			if(!ret.contains(name))
			{
				ret.add(name);
			}
		}
		
		return ret.toArray(Mirror.emptyStringArray);
	}

	@Override
	protected void setSubjectValue(String key, Class<?> valueType, Object val)
	{
		DataCommonXmlImpl.setSubjectValue(node, null, key, valueType, val);
	}

	@Override
	protected <T> T getValueAs(String key, Class<T> retType)
	{
		return DataCommonXmlImpl.getValueAs(node, null, key, retType);
	}

	@Override
	protected DataProtocol getProtocolHandler()
	{
		return DataCommonXmlImpl.PROTOCOL;
	}
	
	@Override
	public String toString()
	{
		return "DataObjectXmlImpl: "+DataCommonXmlImpl.xmlToString(node);
	}
	
	@Override
	public boolean isNull(String key)
	{
		Object ret = getValueAs(key, String.class, true);
		return null == ret || "".equals(ret);
	}
	
	protected void deleteKey(String key)
	{
		DataCommonXmlImpl.deleteKey(node, key);
	}
}