DataArrayAbstractImpl.java

package eu.javaexperience.datareprez.abstractImpl;

import java.util.ArrayList;
import java.util.List;

import org.w3c.dom.Node;

import eu.javaexperience.datareprez.DataArray;
import eu.javaexperience.datareprez.DataCommonAbstractImpl;
import eu.javaexperience.datareprez.DataObject;
import eu.javaexperience.datareprez.DataReprezException;
import eu.javaexperience.datareprez.convertFrom.DataReprezType;
import eu.javaexperience.datareprez.xmlImpl.DataCommonXmlImpl;
import eu.javaexperience.reflect.Mirror;

public abstract class DataArrayAbstractImpl extends DataProtocolAbstractImpl implements DataArray
{
	protected abstract <T> void setSubjectValue(int index, Class<T> cls, T value);
	
	protected <T> T getValueAs(int index, Class<T> retType, boolean mayNull)
	{
		if(size() < index)
		{
			return null;
		}
		
		T ret = getValueAs(index, retType);
		
		if(!mayNull && null == ret)
		{
			throw new DataReprezException("No value present under index: "+index);
		}
		
		if(isObjectNull(ret))
		{
			return null;
		}
		
		return ret;
	}
	
	protected abstract <T> T getValueAs(int index, Class<T> retType);
	
	protected <T> T getValueOpt(int index, Class<T> cls, T defaultValue)
	{
		T ret = getValueAs(index, cls, true);
		if(null != ret)
		{
			return ret;
		}
		
		return defaultValue;
	}
	
	@Override
	public void putString(int i, String val)
	{
		setSubjectValue(i, String.class, val);
	}

	@Override
	public void putLong(int i, long val)
	{
		setSubjectValue(i, long.class, val);
	}

	@Override
	public void putDouble(int i, double val)
	{
		setSubjectValue(i, double.class, val);
	}

	@Override
	public void putInt(int i, int val)
	{
		setSubjectValue(i, int.class, val);
	}

	@Override
	public void putBoolean(int i, boolean val)
	{
		setSubjectValue(i, boolean.class, val);
	}

	@Override
	public void putObject(int i, DataObject val)
	{
		setSubjectValue(i, DataObject.class, val);
	}

	@Override
	public void putArray(int i, DataArray val)
	{
		setSubjectValue(i, DataArray.class, val);
	}

	@Override
	public void putNull(int i)
	{
		setSubjectValue(i, (Class) void.class, getProtocolHandler().getNullObject());
	}

	@Override
	public String getString(int i)
	{
		return getValueAs(i, String.class, false);
	}

	@Override
	public long getLong(int i)
	{
		return getValueAs(i, long.class, false);
	}

	@Override
	public double getDouble(int i)
	{
		return getValueAs(i, Double.class, false);
	}

	@Override
	public int getInt(int i)
	{
		return getValueAs(i, int.class, false);
	}

	@Override
	public boolean getBoolean(int i)
	{
		return getValueAs(i, boolean.class, false);
	}

	@Override
	public DataObject getObject(int i)
	{
		return getValueAs(i, DataObject.class, false);
	}

	@Override
	public DataArray getArray(int i)
	{
		return getValueAs(i, DataArray.class, false);
	}

	@Override
	public String optString(int i)
	{
		return getValueAs(i, String.class, true);
	}

	@Override
	public Long optLong(int i)
	{
		return getValueAs(i, long.class, true);
	}

	@Override
	public Double optDouble(int i)
	{
		return getValueAs(i, double.class, true);
	}

	@Override
	public Integer optInt(int i)
	{
		return getValueAs(i, int.class, true);
	}

	@Override
	public Boolean optBoolean(int i)
	{
		return getValueAs(i, boolean.class, true);
	}

	@Override
	public DataObject optObject(int i)
	{
		return getValueAs(i, DataObject.class, true);
	}

	@Override
	public DataArray optArray(int i)
	{
		return getValueAs(i, DataArray.class, true);
	}

	@Override
	public String optString(int i, String def)
	{
		return getValueOpt(i, String.class, def);
	}

	@Override
	public long optLong(int i, long def)
	{
		return getValueOpt(i, long.class, def);
	}

	@Override
	public double optDouble(int i, double val)
	{
		return getValueOpt(i, double.class, val);
	}

	@Override
	public int optInt(int i, int def)
	{
		return getValueOpt(i, int.class, def);
	}

	@Override
	public boolean optBoolean(int i, boolean def)
	{
		return getValueOpt(i, boolean.class, def);
	}

	@Override
	public DataObject optObject(int i, DataObject def)
	{
		return getValueOpt(i, DataObject.class, def);
	}

	@Override
	public DataArray optArray(int i, DataArray def)
	{
		return getValueOpt(i, DataArray.class, def);
	}

	@Override
	public void unset(int i)
	{
		setSubjectValue(i, null, null);
	}

	@Override
	public boolean isString(int i)
	{
		return getValueAs(i, String.class, true) instanceof String;
	}

	@Override
	public boolean isLong(int i)
	{
		return getValueAs(i, Long.class, true) instanceof Long;
	}

	@Override
	public boolean isDouble(int i)
	{
		return getValueAs(i, Double.class, true) instanceof Double;
	}

	@Override
	public boolean isInt(int i)
	{
		return getValueAs(i, Integer.class, true) instanceof Integer;
	}

	@Override
	public boolean isBoolean(int i)
	{
		return getValueAs(i, Boolean.class, true) instanceof Boolean;
	}

	@Override
	public boolean isObject(int i)
	{
		return getValueAs(i, DataObject.class, true) instanceof DataObject;
	}

	@Override
	public boolean isArray(int i)
	{
		return getValueAs(i, DataArray.class, true) instanceof DataArray;
	}

	@Override
	public boolean isNull(int i)
	{
		return isObjectNull(opt(i));
	}

	@Override
	public void putString(String val)
	{
		setSubjectValue(size(), String.class, val);
	}

	@Override
	public void putLong(long val)
	{
		setSubjectValue(size(), long.class, val);
	}

	@Override
	public void putDouble(double val)
	{
		setSubjectValue(size(), double.class, val);
	}

	@Override
	public void putInt(int val)
	{
		setSubjectValue(size(), int.class, val);
	}

	@Override
	public void putBoolean(boolean val)
	{
		setSubjectValue(size(), boolean.class, val);
	}

	@Override
	public void putObject(DataObject val)
	{
		setSubjectValue(size(), DataObject.class, val);
	}

	@Override
	public void putArray(DataArray val)
	{
		setSubjectValue(size(), DataArray.class, val);
	}

	@Override
	public void putNull()
	{
		setSubjectValue(size(), void.class, null);
	}
	
	@Override
	public Object get(int key)
	{
		return getValueAs(key, null, false);
	}

	@Override
	public Object opt(int key)
	{
		return getValueAs(key, null, true);
	}

	@Override
	public Object opt(int key, Object obj)
	{
		Object o = opt(key);
		if(o == null)
			return obj;
		return o;
	}

	@Override
	public List<Object> asJavaList()
	{
		List<Object> ret = new ArrayList<>();
		int s = size();
		for(int i=0;i<s;i++)
		{
			Object curr = opt(i);
			if(curr instanceof DataArray)
				ret.add(((DataArray)curr).asJavaList());
			else if(curr instanceof DataObject)
				ret.add(((DataObject)curr).asJavaMap());
			else
				ret.add(curr);
		}
		
		return ret;
	}

	@Override
	public void putBlob(byte[] blob)
	{
		setSubjectValue(size(), byte[].class, blob);
	}

	@Override
	public void putBlob(int i, byte[] blob)
	{
		setSubjectValue(i, byte[].class, blob);
	}

	@Override
	public byte[] getBlob(int i)
	{
		return getValueAs(i, byte[].class, false);
	}

	@Override
	public byte[] optBlob(int i)
	{
		return getValueAs(i, byte[].class, true);
	}

	@Override
	public byte[] optBlob(int i, byte[] blob)
	{
		try
		{
			byte[] ret = getValueAs(i, byte[].class, true);
			if(null == ret)
			{
				return blob;
			}
			
			return ret;
		}
		catch(Exception e)
		{
			return blob;
		}
	}

	@Override
	public boolean isBlob(int i)
	{
		return getValueAs(i, byte[].class, true) instanceof byte[];
	}

	@Override
	public DataReprezType getDataReprezType()
	{
		return DataReprezType.ARRAY;
	}	
}