package com.k_int.aggr2.mimsy.rdf;

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

import com.k_int.aggr2.mimsy.data.GroupHierarchyDTO;
import com.k_int.aggr2.mimsy.data.MimsyCuratedGroupDTO;
import com.k_int.aggr2.mimsy.data.DataContextDTO;
import com.k_int.aggr2.mimsy.data.MimsyAgentDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyEventDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyMediaDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyObjectDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyPlaceDataDTO;
import com.k_int.aggr2.mimsy.data.MimsyPublicationDataDTO;
import com.k_int.aggr2.mimsy.data.MimsySiteDataDTO;
import com.k_int.aggr2.mimsy.data.MimsySubjectDataDTO;
import com.k_int.aggr2.mimsy.data.conversion.FormatConverter;
import com.k_int.mimsy.ref.DataException;

public class RDFFormatConverter implements FormatConverter<MimsyDataDTO, byte[]>
{
	ByteArrayOutputStream os; 
    Writer writer;
    
	public RDFFormatConverter()
	{
		try
		{
			os = new ByteArrayOutputStream();
			writer = new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	    
	}
	public byte[] convert(MimsyDataDTO data) throws DataException
	{
		if(data instanceof MimsyAgentDataDTO)
		{
			RDFAgentConverter  converter = new RDFAgentConverter(writer);
			converter.convertMain((MimsyAgentDataDTO)data);
		}
		else if (data instanceof MimsyCuratedGroupDTO)
		{
			RDFCuratedGroupConverter converter = new RDFCuratedGroupConverter(writer);
			converter.convertMain((MimsyCuratedGroupDTO)data);
			
		}
		else if (data instanceof DataContextDTO)
		{
			RDFDataContextConverter converter = new RDFDataContextConverter(writer);
			converter.convertMain((DataContextDTO)data);
		}
		else if (data instanceof MimsyEventDataDTO)
		{
			RDFEventConverter converter = new RDFEventConverter(writer);
			converter.convertMain((MimsyEventDataDTO) data);
		}
		else if (data instanceof MimsyMediaDataDTO)
		{
			RDFMediaConverter converter = new RDFMediaConverter(writer);
			converter.convertMain((MimsyMediaDataDTO) data);
		}	
		else if (data instanceof MimsyObjectDataDTO)
		{
			RDFObjectConverter converter = new RDFObjectConverter(writer);
			converter.convertMain((MimsyObjectDataDTO) data);
		}
		else if (data instanceof MimsyPlaceDataDTO)
		{
			RDFPlaceConverter converter = new RDFPlaceConverter(writer);
			converter.convertMain((MimsyPlaceDataDTO) data);
		}
		else if (data instanceof MimsyPublicationDataDTO)
		{
			RDFPublicationConverter converter = new RDFPublicationConverter(writer);
			converter.convertMain((MimsyPublicationDataDTO) data);
		}
		else if (data instanceof MimsySiteDataDTO)
		{
			RDFSiteConverter converter = new RDFSiteConverter(writer);
			converter.convertMain((MimsySiteDataDTO) data);
		}
		else if (data instanceof MimsySubjectDataDTO)
		{
			RDFSubjectConverter converter = new RDFSubjectConverter(writer);
			converter.convertMain((MimsySubjectDataDTO) data);
		}
		else if (data instanceof GroupHierarchyDTO)
		{
			RDFHierarchyConverter converter = new RDFHierarchyConverter(writer);
			converter.convertMain((GroupHierarchyDTO) data);
		}
		else
			throw new DataException("No rdf converter for data "+data.getClass());
			
		return os.toByteArray();
	}
}
