package com.ebmwebsourcing.easybpel.usecase.crisis;

import javax.xml.namespace.QName;

import com.ebmwebsourcing.easybpel.model.bpel.api.BPELException;
import com.ebmwebsourcing.easybpel.model.bpel.api.message.BPELExternalMessage;
import com.ebmwebsourcing.easybpel.model.bpel.impl.message.BPELExternalMessageImpl;
import com.ebmwebsourcing.easyviper.core.api.CoreException;
import com.ebmwebsourcing.easyviper.environment.test.env.api.Operation;
import com.ebmwebsourcing.easyviper.environment.test.env.api.ProviderEndpoint;
import com.ebmwebsourcing.easyviper.environment.test.env.api.Service;
import com.ebmwebsourcing.easyviper.environment.test.env.impl.AbstractServiceImpl;
import com.ebmwebsourcing.easyviper.environment.test.env.impl.OperationImpl;

public class PolicemenService extends AbstractServiceImpl implements Service {


	public PolicemenService(ProviderEndpoint pep) throws BPELException {
		super(pep);
		this.setName(new QName("http://petals.ow2.org/policemen/", "Policemen"));

		// Create operation
		setSecurityPerimeter();
		setEquipment();
		maintainPerimeter();
		endOfCrisis();
	}

	private void setSecurityPerimeter() throws BPELException {
		try {
			Operation setSecurityPerimeter = new OperationImpl("setSecurityPerimeter", Operation.IN_OUT, this);
			this.addOperation(setSecurityPerimeter);
			
			
			BPELExternalMessage in = new BPELExternalMessageImpl();
			in.setService(this.getName());
			in.setEndpoint(this.getProviderEndpoint().getName());
			in.setQName(new QName("http://petals.ow2.org/policemen/", "setSecurityPerimeterRequest"));
			in.setMessage("" +
					"<ns0:setSecurityPerimeter xmlns:ns0=\"http://petals.ow2.org/policemen/\">" +
					"  <setSecurityPerimeterRequest xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">start isycri process</setSecurityPerimeterRequest>" +
					"</ns0:setSecurityPerimeter>" 
			);
			BPELExternalMessage out = new BPELExternalMessageImpl();
			out.setService(this.getName());
			out.setEndpoint(this.getProviderEndpoint().getName());
			out.setQName(new QName("http://petals.ow2.org/policemen/", "setSecurityPerimeterResponse"));
			out.setMessage("" +
					"<pol:setSecurityPerimeterResponse xmlns:pol=\"http://petals.ow2.org/policemen/\">" +
					"    <setSecurityPerimeterResponse>OK</setSecurityPerimeterResponse>" +
					"</pol:setSecurityPerimeterResponse>"
			);
			setSecurityPerimeter.addMessageExchangeInstances(in, out, null);
			
		} catch (CoreException e) {
			throw new BPELException(e);
		}
	}
	
	
	private void setEquipment() throws BPELException {
		try {
			Operation setEquipment = new OperationImpl("setEquipment", Operation.IN_OUT, this);
			this.addOperation(setEquipment);
			
			
			BPELExternalMessage in = new BPELExternalMessageImpl();
			in.setService(this.getName());
			in.setEndpoint(this.getProviderEndpoint().getName());
			in.setQName(new QName("http://petals.ow2.org/policemen/", "setEquipement"));
			in.setMessage("" +
					"<ns0:setEquipment xmlns:ns0=\"http://petals.ow2.org/policemen/\">" +
					"  <setEquipmentRequest xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">OK</setEquipmentRequest>" +
					"</ns0:setEquipment>" 
			);
			BPELExternalMessage out = new BPELExternalMessageImpl();
			out.setService(this.getName());
			out.setEndpoint(this.getProviderEndpoint().getName());
			out.setQName(new QName("http://petals.ow2.org/policemen/", "setEquipementResponse"));
			out.setMessage("" +
					"<pol:setEquipmentResponse xmlns:pol=\"http://petals.ow2.org/policemen/\">" +
					"    <setEquipmentResponse>OK</setEquipmentResponse>" +
					"</pol:setEquipmentResponse>"
			);
			setEquipment.addMessageExchangeInstances(in, out, null);
			
		} catch (CoreException e) {
			throw new BPELException(e);
		}
	}

	private void maintainPerimeter() throws BPELException {
		try {
			Operation maintainPerimeter = new OperationImpl("maintainPerimeter", Operation.IN_OUT, this);
			this.addOperation(maintainPerimeter);
			
			
			BPELExternalMessage in = new BPELExternalMessageImpl();
			in.setService(this.getName());
			in.setEndpoint(this.getProviderEndpoint().getName());
			in.setQName(new QName("http://petals.ow2.org/policemen/", "maintainPerimeterRequest"));
			in.setMessage("" +
					"<ns0:maintainPerimeter xmlns:ns0=\"http://petals.ow2.org/policemen/\">" +
					"  <maintainPerimeterRequest xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">OK</maintainPerimeterRequest>" +
					"</ns0:maintainPerimeter>" 
			);
			BPELExternalMessage out = new BPELExternalMessageImpl();
			out.setService(this.getName());
			out.setEndpoint(this.getProviderEndpoint().getName());
			out.setQName(new QName("http://petals.ow2.org/policemen/", "maintainPerimeterResponse"));
			out.setMessage("" +
					"<pol:maintainPerimeterResponse xmlns:pol=\"http://petals.ow2.org/policemen/\">" +
					"         <maintainPerimeterResponse>?</maintainPerimeterResponse>" +
					"</pol:maintainPerimeterResponse>"
			);
			maintainPerimeter.addMessageExchangeInstances(in, out, null);
			
		} catch (CoreException e) {
			throw new BPELException(e);
		}
	}
	
	private void endOfCrisis() throws BPELException {
		try {
			Operation endOfCrisis = new OperationImpl("endOfCrisis", Operation.IN_OUT, this);
			this.addOperation(endOfCrisis);
			
			
			BPELExternalMessage in = new BPELExternalMessageImpl();
			in.setService(this.getName());
			in.setEndpoint(this.getProviderEndpoint().getName());
			in.setQName(new QName("http://petals.ow2.org/policemen/", "endOfCrisisRequest"));
			in.setMessage("" +
					"<ns0:endOfCrisis xmlns:ns0=\"http://petals.ow2.org/policemen/\">" +
					"  <endOfCrisisRequest xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"xs:string\">?</endOfCrisisRequest>" +
					"</ns0:endOfCrisis>" 
			);
			BPELExternalMessage out = new BPELExternalMessageImpl();
			out.setService(this.getName());
			out.setEndpoint(this.getProviderEndpoint().getName());
			out.setQName(new QName("http://petals.ow2.org/policemen/", "endOfCrisisResponse"));
			out.setMessage("" +
					"<pol:endOfCrisisResponse xmlns:pol=\"http://petals.ow2.org/policemen/\">" +
					"         <endOfCrisisResponse>?</endOfCrisisResponse>" +
					"</pol:endOfCrisisResponse>" 
			);
			endOfCrisis.addMessageExchangeInstances(in, out, null);
			
		} catch (CoreException e) {
			throw new BPELException(e);
		}
	}

}
