/**
 * TokenSuspendCommand.java
 * Created Dec 26, 2008
 * Copyright (c) Tandberg Television 2008
 */
package com.tandbergtv.workflow.exe.token;

import java.util.Collection;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import org.apache.log4j.Logger;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;

import com.tandbergtv.workflow.core.CustomToken;
import com.tandbergtv.workflow.core.service.ServiceRegistry;
import com.tandbergtv.workflow.driver.service.IProcessManagerService;

/**
 * Suspends the current token
 * 
 * @author Sahil Verma
 */
public class Suspend implements ActionHandler {

	private static final long serialVersionUID = -1369290087636316974L;
	
	private static final Logger logger = Logger.getLogger(Suspend.class);

	public Suspend() {
		super();
	}

	/* (non-Javadoc)
	 * @see org.jbpm.graph.def.ActionHandler#execute(org.jbpm.graph.exe.ExecutionContext)
	 */
	public void execute(ExecutionContext context) throws Exception {
		CustomToken token = CustomToken.class.cast(context.getToken());
		IProcessManagerService service = ServiceRegistry.getDefault().lookup(IProcessManagerService.class);
		Collection<Future<CustomToken>> futures = service.pause(token.getActiveChildTokens());
		
		for (Future<CustomToken> future : futures) {
			try {
				future.get();
			} catch (InterruptedException e) {
				logger.warn(token + " interrupted while waiting", e);
			} catch (ExecutionException e) {
				logger.warn(token + ", execution failed", e);
			}
		}
	}
}
