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;

/**
 * KROTKI OPIS...
 *
 * @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 );

	// wymaga przekazania parametrow Transaction i ProccessId (parametry formalne) jako dwoch pierwszych parametrow aplikacji
    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;

        // podaj identyfikator tworzonego procesu
        String sProcDefId = "identyfikator_tworzonego_procesu";

        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( "Tworzenie procesu o identyfikatorze " + sProcDefId );

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

                log.info( "Utworzono proces o identyfikatorze " + sProcDefId );
            }
            finally
            {
                sConn.disconnect( st );
            }

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

            mapNewProcessCtx = SharkFunctions.GetProcessContext( st, wfNewProcess );

            // mozliwosc uzupelnienia inicjatora procesu (wykonawcy pierwszego zadania)
            // usun // i podaj, jesli potrzebne
            // mapNewProcessCtx.put( "Initiator", "inicjator_procesu");

            // mozliwosc uzupelnienia pozostalych zmiennych tworzonego procesu
            // usun // i podaj nazwe zmiennej w nowym procesie i aktualnym procesie
            // skopiuj linie w celu uzupelnienia wiekszej ilosci zmiennych
            // mapNewProcessCtx.put( "zmienna_w_tworzonym_procesie", mapProcessCtx.get( "zmienna_w_obecnym_procesie" ) );

            SharkFunctions.SetProcessContext( st, wfNewProcess, mapNewProcessCtx );

            wfNewProcess.start( st );

            log.info( "Utworzono i uruchomiono proces o identyfikatorze " + sProcDefId );
        }
        catch ( Exception e )
        {
            // blad w obsludze aplikacji
            log.error( e.getMessage(), e );

            throw e;
        }
    }
}