package %PACKAGE_NAME%;

import org.eclipse.cosmos.dc.provisional.cmdbf.services.common.CMDBfServiceException;
import org.eclipse.cosmos.dc.internal.cmdbf.services.CMDBfInternalUtility.XMLWritableString;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.IItemConstraintHandler;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.IItemTemplateHandler;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.IRelationshipTemplateHandler;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.impl.AbstractItemConstraintHandler;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.impl.AbstractItemTemplateHandler;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.impl.AbstractQueryHandlerFactory;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.service.impl.AbstractRelationshipTemplateHandler;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.transform.input.artifacts.IConstraint;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.transform.input.artifacts.IRelationshipTemplate;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.transform.response.artifacts.IEdges;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.transform.response.artifacts.INodes;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.transform.response.artifacts.IQueryResult;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.query.transform.response.artifacts.QueryOutputArtifactFactory;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.transform.artifacts.IItem;
import org.eclipse.cosmos.dc.provisional.cmdbf.services.transform.artifacts.IRecord;

public class %CLASS_NAME% extends AbstractQueryHandlerFactory
{
	private static %CLASS_NAME% instance;
	
	/**
	 * Make the constructor invisible
	 */
	private %CLASS_NAME%()
	{
	}
	
	public static %CLASS_NAME% getInstance()
	{
		if (instance == null)
		{
			instance = new %CLASS_NAME%();
		}
		return instance;
	}
	
	@Override
	protected IItemConstraintHandler createItemInstanceHandler()
	{	
		return new AbstractItemConstraintHandler() {

			protected INodes handle(INodes context, IConstraint constraint)
					throws CMDBfServiceException {
				// TODO Change this method to handle queries for your data source.
				// This example code simply returns a "Hello World" result.	
				
				IItem sampleItem = QueryOutputArtifactFactory.getInstance().createItem();
				sampleItem.addInstanceId(QueryOutputArtifactFactory.getInstance().createInstanceId("http://www.eclipse.org/cosmos/SampleMdr", "http://www.eclipse.org/cosmos/helloworld"));
				IRecord sampleRecord = QueryOutputArtifactFactory.getInstance().createRecord(sampleItem, "http://www.eclipse.org/cosmos/sampleRecord");
				sampleRecord.addNamespace("hw", "http://www.eclipse.org/cosmos/helloworld");
				sampleRecord.setValue(new XMLWritableString("Hello World!"));
				sampleItem.addRecord(sampleRecord);
				INodes sampleNodes = QueryOutputArtifactFactory.getInstance().createNodes("user");
				sampleNodes.addItem(sampleItem);
				return sampleNodes;
			}
			
		};
	}
	
	@Override
	protected IItemConstraintHandler createItemRecordHandler() throws CMDBfServiceException
	{
		return new AbstractItemConstraintHandler() {

			protected INodes handle(INodes context, IConstraint constraint) throws CMDBfServiceException{
				// TODO Change this method to handle queries for your data source.
				// This example code simply returns a "Hello World" result.	
				INodes result = QueryOutputArtifactFactory.getInstance().createNodes(context.getId());
				IItem sampleItem = QueryOutputArtifactFactory.getInstance().createItem();
				sampleItem.addInstanceId(QueryOutputArtifactFactory.getInstance().createInstanceId("http://www.eclipse.org/cosmos/SampleMdr", "http://www.eclipse.org/cosmos/helloworld"));
				IRecord sampleRecord = QueryOutputArtifactFactory.getInstance().createRecord(sampleItem, "http://www.eclipse.org/cosmos/sampleRecord");
				sampleRecord.addNamespace("hw", "http://www.eclipse.org/cosmos/helloworld");
				sampleRecord.setValue(new XMLWritableString("<hw:hello>Hello World!</hw:hello>"));
				sampleItem.addRecord(sampleRecord);
				result.addItem(sampleItem);				
				return result;
			}
			
		};
	}
	
	@Override
	protected IItemTemplateHandler createItemHandler() throws CMDBfServiceException
	{
		return new AbstractItemTemplateHandler() {

			protected void appendAllItems(INodes nodes) throws CMDBfServiceException{		
				// TODO Change this method to handle queries for your data source.
				// This example code simply returns a "Hello World" result.	
				
				IItem sampleItem = QueryOutputArtifactFactory.getInstance().createItem();
				sampleItem.addInstanceId(QueryOutputArtifactFactory.getInstance().createInstanceId("http://www.eclipse.org/cosmos/SampleMdr", "http://www.eclipse.org/cosmos/helloworld"));
				IRecord sampleRecord = QueryOutputArtifactFactory.getInstance().createRecord(sampleItem, "http://www.eclipse.org/cosmos/sampleRecord");
				sampleRecord.addNamespace("hw", "http://www.eclipse.org/cosmos/helloworld");
				sampleRecord.setValue(new XMLWritableString("<hw:hello>Hello World!</hw:hello>"));
				sampleItem.addRecord(sampleRecord);
				nodes.addItem(sampleItem);
			}
			
		};
	}
	
	@Override
	protected IRelationshipTemplateHandler createRelationshipHandler() throws CMDBfServiceException
	{
		// TODO Change this method to handle queries for your data source.
		// This example code simply returns an empty edge.	
		return new AbstractRelationshipTemplateHandler() {

			public IEdges execute(IQueryResult context,
					IRelationshipTemplate relationshipTemplate, IItem source,
					IItem target) throws CMDBfServiceException {
				IEdges results = QueryOutputArtifactFactory.getInstance().createEdges(relationshipTemplate);
				return results;
			}
			
		};
	}	
	
}
