/**
 * Maestro4BPEL - SOA Tools Platform.
 * Copyright (c) 2008 EBM Websourcing, http://www.ebmwebsourcing.com/
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * -------------------------------------------------------------------------
 * $id.java
 * -------------------------------------------------------------------------
 */
package com.ebmwebsourcing.easybpel.usecase.sales;


import static org.junit.Assert.*;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.xml.namespace.QName;

import org.jdom.JDOMException;
import org.junit.Test;

import com.ebmwebsourcing.easybpel.model.bpel.api.BPELException;
import com.ebmwebsourcing.easybpel.model.bpel.api.message.BPELExternalMessage;
import com.ebmwebsourcing.easybpel.model.bpel.impl.BPELFactoryImpl;
import com.ebmwebsourcing.easybpel.model.bpel.impl.message.BPELExternalMessageImpl;
import com.ebmwebsourcing.easybpel.model.bpel.impl.message.DefaultBPELMessageConverter;
import com.ebmwebsourcing.easyviper.core.api.Core;
import com.ebmwebsourcing.easyviper.core.api.CoreException;
import com.ebmwebsourcing.easyviper.core.api.engine.Execution;
import com.ebmwebsourcing.easyviper.core.impl.model.registry.ProcessContextDefinitionImpl;
import com.ebmwebsourcing.easyviper.environment.test.env.ExecutionEnvironmentTestFactory;
import com.ebmwebsourcing.easyviper.environment.test.env.TestSenderImpl;
import com.ebmwebsourcing.easyviper.environment.test.env.api.ClientEndpoint;
import com.ebmwebsourcing.easyviper.environment.test.env.api.ExecutionEnvironmentTest;
import com.ebmwebsourcing.easyviper.environment.test.env.api.ProviderEndpoint;
import com.ebmwebsourcing.easyviper.tools.MemoryReceiverImpl;

/**
 * @author Nicolas Salatge - eBM WebSourcing
 */
public class TestSalesProcess {


    @Test
    public void testSalesProcess() throws CoreException, URISyntaxException, BPELException, InterruptedException, JDOMException, IOException  {
		final boolean explorer = false;

		// create execution environment
		ExecutionEnvironmentTest env = ExecutionEnvironmentTestFactory.newInstance().newEnvironment("TestEnvironnement", explorer);

		//// create maestro
		final Core core = BPELFactoryImpl.getInstance().newBPELEngine(DefaultBPELMessageConverter.get(), 1, MemoryReceiverImpl.class, 1, TestSenderImpl.class);
		env.setCore(core);

		//// create client
		ClientEndpoint client = env.createClientEndpoint("client");
		ClientEndpoint stock = env.createClientEndpoint("stock");

		//// create providers
		ProviderEndpoint stockProvider = env.createProviderEndpoint("stockPort", StockService.class);
		ProviderEndpoint salesCallBackProvider = env.createProviderEndpoint("salesPortClient", SalesCallBackService.class);


		// store the definition
		core.getModel().getRegistry().storeProcessDefinition(new URI("./src/test/resources/sales.bpel"),
				new ProcessContextDefinitionImpl());

		// send client message
		BPELExternalMessage message = new BPELExternalMessageImpl();
		message.setService(new QName("http://petals.ow2.org/sales", "salesAsync"));
		message.setEndpoint("salesPort");
		message.setQName(new QName("http://petals.ow2.org/sales", "salesRequestMessage"));
		message.setMessage("" +
				"<sal:salesRequest xmlns:sal=\"http://petals.ow2.org/sales\">" +
				"         <sal:article>" +
				"            <sal:refId>4</sal:refId>" +
				"            <sal:name>shirt</sal:name>" +
				"            <sal:quantity>3</sal:quantity>" +
				"         </sal:article>" +
				"</sal:salesRequest>"
		);
		client.send(message);

		com.ebmwebsourcing.easyviper.core.api.engine.Process process = null;
		while(core.getEngine().getProcessInstanceRegistry().getProcessInstances().size() == 0) {
			System.out.println("Wait the creation of process");
			Thread.sleep(1000);
		}
		process = core.getEngine().getProcessInstanceRegistry().getProcessInstances().get(0);

		while(process.getParentExecution() == null) {
			System.out.println("Wait that the process start");
			Thread.sleep(1000);
		}

		while(process.getParentExecution().getState() != Execution.State.SUSPENDED) {
			System.out.println("Wait that the process arrive on the second receive");
			Thread.sleep(1000);
		}


		BPELExternalMessage stockMessage = new BPELExternalMessageImpl();
		stockMessage.setService(new QName("http://petals.ow2.org/sales", "salesAsync"));
		stockMessage.setEndpoint("salesPort");
		stockMessage.setQName(new QName("http://petals.ow2.org/sales", "stockResponseMessage"));
		stockMessage.setMessage("" +
				"<sal:stockResponse xmlns:sal=\"http://petals.ow2.org/sales\">" +
				"         <sal:refId>4</sal:refId>" +
				"         <sal:result>true</sal:result>" +
				"</sal:stockResponse>" 
		);
		stock.send(stockMessage);



		while(salesCallBackProvider.getService().getOperations().get(0).getSuccessfulInvocation() == 0) {
			System.out.println("wait the end of process");
		}

		assertEquals(salesCallBackProvider.getService().getOperations().get(0).getSuccessfulInvocation(), 1);



		if(explorer) {
			Thread.sleep(10000000);
		}


	}

}

