import java.util.Map;

import org.apache.log4j.Logger;
import org.enhydra.shark.Shark;
import org.enhydra.shark.api.SharkTransaction;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
import org.enhydra.shark.api.internal.toolagent.AppParameter;
import org.enhydra.shark.xpdl.elements.Package;

import com.plusmpm.util.SharkFunctions;
import com.plusmpm.util.Constants;
import com.plusmpm.util.Tools;
import com.plusmpm.util.XpdlPackageManager;

/**
 * SHORT DESCRIPTION...
 *
 * @author @BPMN_JAVA_CLASS_AUTHOR_TAG@ @BPMN_JAVA_CLASS_DATE_TAG@
 */
public class @BPMN_JAVA_CLASS_NAME_TAG@
{
    public static Logger log = Logger.getLogger( @BPMN_JAVA_CLASS_NAME_TAG@.class );

	// requires transfer of Transaction and ProccessId parameters (formal parameters) as the first two parameters of the application
    public static void execute( @BPMN_JAVA_CLASS_PARAMS_TAG@ )
        throws Exception
    {
        log.trace( "*** @BPMN_JAVA_CLASS_NAME_TAG@ application ***" );

        SharkTransaction st = null;
        String sProcessId = null;

        Package pack = null;
        SharkConnection sConn = null;
        String sharkUsername = null;
        String sharkPassword = null;
        String engineName = null;

        WfProcess wfProcess = null;
        Map<String, Object> mapProcessCtx = null;

        WfProcess wfNewProcess = null;
        Map<String, Object> mapNewProcessCtx = null;

        // type created process id
        String sProcDefId = "created_process_id";

        try
        {
            st = (SharkTransaction) arg0.the_value;
            sProcessId = (String) arg1.the_value;

            wfProcess = SharkFunctions.getWfProcess( st, sProcessId );
            mapProcessCtx = SharkFunctions.GetProcessContext( st, wfProcess );

            sharkUsername = Shark.getInstance().getProperties().getProperty( "SchedulerToolAgent.sharkUsername" ).replaceAll( "[\"]", "" );
            sharkPassword = Shark.getInstance().getProperties().getProperty( "SchedulerToolAgent.sharkPassword" ).replaceAll( "[\"]", "" );
            engineName = Constants.SHARK_SURVEY_CLIENT_ENGINE_NAME;

            pack = XpdlPackageManager.getInstance().getPackageByProcessId( sProcessId );

            try
            {
                log.info( "Process creation with " + sProcDefId + " id" );

                sConn = Shark.getInstance().getSharkConnection();
                sConn.connect( st, sharkUsername, sharkPassword, engineName, null );
                wfNewProcess = sConn.createProcess( st, pack.getId(), sProcDefId );

                log.info( "Process with id " + sProcDefId + " created" );
            }
            finally
            {
                sConn.disconnect( st );
            }

            Tools.SetDefaultVariablesForCreateProcess( st, sharkUsername, wfNewProcess, sProcDefId, pack );

            mapNewProcessCtx = SharkFunctions.GetProcessContext( st, wfNewProcess );

            // possibility of process initiator setup (first activity performer)
            // remove // and type, if necessary
            // mapNewProcessCtx.put( "Initiator", "process_initiator");

            // possibility of created process variables values supplement
            // remove // and type variable in new process and actual process
            // copy line for more variables values supplement
            // mapNewProcessCtx.put( "variable_in_new_process", mapProcessCtx.get( "variable_in_actual_process" ) );

            SharkFunctions.SetProcessContext( st, wfNewProcess, mapNewProcessCtx );

            wfNewProcess.start( st );

            log.info( "Process with id " + sProcDefId + " created and started" );
        }
        catch ( Exception e )
        {
            // error in application handling
            log.error( e.getMessage(), e );

            throw e;
        }
    }
}