GenericStoreDataWriter.java

package hu.ddsi.java.database;

import java.util.List;

public abstract class GenericStoreDataWriter<D extends GenericStoreDatabase,W>
{
	public abstract void writeField(String name, FieldData fd,Object value,W w) throws Exception;
	
	public abstract void writeArrayField(String name,GenericStoreDataArray arr,Object value,W w) throws Exception;

	public abstract W newWriter(D db, Class<? extends GenericStorable> store,boolean update);
	
	public static Object conventToLongArray(GenericStorable[] arr,GenericStoreDatabase gdb) throws GenericStoreException
	{
		Long[] ret = new Long[arr.length];
		for(int i=0;i<ret.length;i++)
			if(arr[i] == null)
				ret[i] = -1L;
			else
			{
				long id = GenericStorage.getID(arr[i]);
				if(id == -1)
				{
					GenericStorage.storeObject(arr[i], gdb);
				}
				ret[i] = GenericStorage.getID(arr[i]);
			}
		
		return ret;
	}
	
	public void writeObject(long id,GenericStorable stora, D gdb, FieldData[] fields,boolean update) throws Exception
	{
		W write = newWriter(gdb,stora.getClass(),update);
		
		for(FieldData fd:fields)
		{
			Object val = fd.getField().get(stora);
			//if(val == null)
			//	continue;
			
			if(fd.isArray())
			{
				if(fd.getArrayData().primitivType == GenericStoreDataType.GenericDataId)
					writeArrayField(fd.getField().getName(), fd.getArrayData(), conventToLongArray((GenericStorable[])val,gdb),write);
				else
					writeArrayField(fd.getField().getName(), fd.getArrayData(), val,write);
			}
			else
				writeField(fd.getField().getName(), fd, val, write);
		}
		
		writeID(id,write);
		flushObject(write);
	}
	
	/**
	 * Mentési hurkok megakadályozása miatt előre tudnunk kell az objektum leendő azonosítóját.
	 * Ha kereszbe hivatkozik két objektum mezője a másik objektumra akkor egymást próbálnák
	 * végtelen ciklusba menteni.
	 * Bár ebben az esetben előfordulhat az hogy egy objektum lementése sikertelen, ekkor az
	 * egyik objektum azonosítója érvénytelen objektumra fog mutatni.
	 * */
	public abstract void flushObject(W w) throws Exception;
	
	public abstract void writeID(long id,W w) throws Exception;

	public abstract void writeObjects(List<? extends GenericStorable> objects, GenericStoreDatabase gdb, FieldData[] fds) throws Exception;
}