
package cust.cm.report;

import java.sql.Timestamp;
import java.util.Date;
import java.lang.String;
import java.lang.Boolean;

import wt.fc.PersistenceHelper;
import wt.fc.WTObject;
import wt.fc.QueryResult;
import wt.fc.ObjectReference;
import wt.fc.IdentificationObject;
import wt.fc.Identified;

import wt.inf.container.WTContainerHelper;
import wt.inf.container.WTContainer;

import wt.org.WTUser;
import wt.org.WTPrincipal;
import wt.org.WTOrganization;

import wt.change2.ChangeHelper2;
import wt.change2.WTChangeIssue;
import wt.change2.WTChangeOrder2;
import wt.change2.WTChangeRequest2;
import wt.change2.WTChangeActivity2;

import wt.query.QuerySpec;

import wt.workflow.engine.*;
import wt.workflow.definer.*;

import wt.method.RemoteMethodServer;
import wt.httpgw.GatewayAuthenticator;

public static void promoteChangeables(WTChangeOrder2 wtchangeorder2)
	throws WTException
{

	Transaction transaction = new Transaction();

	try {
		transaction.start();

		for(
			QueryResult queryresult = ChangeHelper2.service.getChangeablesAfter(wtchangeorder2);
			queryresult.hasMoreElements();
		)
		{


			Persistable persistable = (Persistable)queryresult.nextElement();

			if(persistable instanceof WTContained) {
				for(QueryResult queryresult1 = WfEngineHelper.service.getAssociatedProcesses(persistable, null, ((WTContained)persistable).getContainerReference());
					queryresult1.hasMoreElements();
				)
		{

				WfProcess wfprocess = (WfProcess)queryresult1.nextElement();

				if(
					wfprocess.getState().equals(WfState.OPEN) ||
					wfprocess.getState().equals(WfState.OPEN_RUNNING) ||
					wfprocess.getState().equals(WfState.OPEN_NOT_RUNNING) ||
					wfprocess.getState().equals(WfState.OPEN_NOT_RUNNING_NOT_STARTED) ||
					wfprocess.getState().equals(WfState.OPEN_NOT_RUNNING_SUSPENDED) ||
					wfprocess.getState().equals(WfState.OPEN_NOT_RUNNING_SUSPENDED_DISABLED) ||
					wfprocess.getState().equals(WfState.OPEN_NOT_RUNNING_SUSPENDED_INTERMITTED
				)
			)

			WfEngineHelper.service.changeState(wfprocess, WfTransition.TERMINATE);
		}

		LifeCycleManaged lifecyclemanaged = (LifeCycleManaged)persistable;


		try {
			LifeCycleTemplate lifecycletemplate = (LifeCycleTemplate)lifecyclemanaged.getLifeCycleTemplate().getObject();
			Vector vector = LifeCycleHelper.service.findStates(lifecycletemplate);
			State state = State.toState("RELEASED");

			if(vector.contains(state))
				LifeCycleHelper.service.setLifeCycleState(lifecyclemanaged, State.toState("RELEASED"));
		}
		catch(LifeCycleException lifecycleexception) {
			lifecycleexception.printStackTrace();
		}
		catch(Exception exception) {
			throw new WTException(exception);
		}
	}

	else {

		throw new WTException("com.ptc.windchill.pdmlink.change.server.impl.implResource", "5", new Object[] {persistable});
	}
}

		transaction.commit();
		transaction = null;
	}
	finally {
		if(transaction != null)
			transaction.rollback();
	}
}

public static void promoteChangeables(WTChangeOrder2 cOrder)
	throws WTException
{
	Transaction trx = new Transaction();
	trx.start();
	QueryResult result = ChangeHelper2.service.getChangeablesAfter(cOrder);
	WTKeyedMap keyedMap = new WTKeyedHashMap();
	while(result.hasMoreElements())
	{
		Persistable persistable = (Persistable)result.nextElement();
		if(persistable instanceof WTContained)
		{
			Enumeration enumeration = WfEngineHelper.service.getAssociatedProcesses(persistable, null, ((WTContained)persistable).getContainerReference());
			do
			{
				if(!enumeration.hasMoreElements())
					break;
				WfProcess wfProcess = (WfProcess)enumeration.nextElement();
				if(wfProcess.getState().equals(WfState.OPEN) || wfProcess.getState().equals(WfState.OPEN_RUNNING) || wfProcess.getState().equals(WfState.OPEN_NOT_RUNNING) || wfProcess.getState().equals(WfState.OPEN_NOT_RUNNING_NOT_STARTED) || wfProcess.getState().equals(WfState.OPEN_NOT_RUNNING_SUSPENDED) || wfProcess.getState().equals(WfState.OPEN_NOT_RUNNING_SUSPENDED_DISABLED) || wfProcess.getState().equals(WfState.OPEN_NOT_RUNNING_SUSPENDED_INTERMITTED))
					WfEngineHelper.service.changeState(wfProcess, WfTransition.TERMINATE);
			} while(true);
			LifeCycleManaged life_cycle_managed = (LifeCycleManaged)persistable;
			State state = life_cycle_managed.getState().getState();
			Set set = new HashSet();
			set.add(state);
			keyedMap.put(life_cycle_managed, set);
		} else
		{
			throw new WTException("com.ptc.windchill.pdmlink.change.server.impl.implResource", "5", new Object[] {
				persistable
			});
		}
	}
	Map resultMap = LifeCycleHelper.service.navigate(keyedMap, Transition.CHANGE, true);
	Set keySet = resultMap.keySet();
	Iterator i = keySet.iterator();
	HashMap setStateMap = new HashMap();
	ArrayList underflow = new ArrayList();
	HashMap overflow = new HashMap();
	do
	{
		if(!i.hasNext())
			break;
		ObjectReference key = (ObjectReference)i.next();
		WTKeyedHashMap statesMap = (WTKeyedHashMap)resultMap.get(key);
		Iterator j = statesMap.keySet().iterator();
		ObjectReference key2 = (ObjectReference)j.next();
		WTArrayList list = (WTArrayList)statesMap.get(key2);
		if(list != null && list.size() == 1)
		{
			ObjectReference or = (ObjectReference)list.get(0);
			PhaseSuccession ps = (PhaseSuccession)or.getObject();
			State successorState = ps.getSuccessor().getPhaseState();
			if(setStateMap.get(successorState) != null)
			{
				WTList objects = (WTList)setStateMap.get(successorState);
				objects.add(key.getObject());
				setStateMap.put(successorState, objects);
			} else
			{
				WTList objects = new WTArrayList();
				objects.add(key.getObject());
				setStateMap.put(successorState, objects);
			}
		} else
		if(list == null)
			underflow.add(key.getObject());
		else
		if(list.size() > 1)
			overflow.put(key.getObject(), list);
	} while(true);
	if(underflow.size() > 0)
	{
		Object param[] = {
			Transition.CHANGE.getDisplay(), ((LifeCycleManaged)underflow.get(0)).getLifeCycleTemplate().getName(), ((LifeCycleManaged)underflow.get(0)).getState().getState()
		};
		throw new WTException("wt.lifecycle.lifecycleResource", "196", param);
	}
	if(overflow.size() > 0)
	{
		Iterator it = overflow.keySet().iterator();
		LifeCycleManaged lcm = (LifeCycleManaged)it.next();
		List dest_states = (List)overflow.get(lcm);
		StringBuffer dest_states_buf = null;
		for(int cnt = 0; cnt < dest_states.size(); cnt++)
		{
			dest_states_buf.append(dest_states.get(cnt));
			if(cnt > 0 && cnt < dest_states.size())
				dest_states_buf.append(", ");
		}

		Object param[] = {
			Transition.CHANGE.getDisplay(), lcm.getLifeCycleTemplate().getName(), lcm.getState().getState(), dest_states_buf.toString()
		};
		throw new WTException("wt.lifecycle.lifecycleResource", "195", param);
	}
	State targetState;
	WTList objects;
	for(Iterator it = setStateMap.keySet().iterator(); it.hasNext(); LifeCycleServerHelper.service.setState(objects, targetState))
	{
		targetState = (State)it.next();
		objects = (WTList)setStateMap.get(targetState);
	}

	trx.commit();
	trx = null;
	if(trx != null)
		trx.rollback();
	break MISSING_BLOCK_LABEL_934;
	Exception exception;
	exception;
	if(trx != null)
		trx.rollback();
	throw exception;
}

private static void printProcesses(Persistable p, String indent) throws Exception{
	System.out.println(indent+"Processes:");
	//for(Enumeration e = WfEngineHelper.service.getAssociatedProcesses(p, null, ((WTContained)p).getContainerReference()); e.hasMoreElements();){
	for(Enumeration e = WfEngineHelper.service.getAssociatedProcesses(p, null); e.hasMoreElements();){
		WfProcess process = (WfProcess)e.nextElement();
		String warn="";
		if(!  ((WTContained)p).getContainerReference().equals(process.getContainerReference()))
			warn=" (WARN: container="+process.getContainerName()+")";
		//WfTemplateObjectReference templateRef = process.getTemplate();
		System.out.println(indent+"   "+ToolUtils.getOR(process)+warn);
	}
}

QueryResult runningProcesses = WfEngineHelper.service.getAssociatedProcesses(part, WfState.OPEN_RUNNING, null);

//WfEngineHelper.service.getAssociatedProcesses(persistable, null, ((WTContained)persistable).getContainerReference());
