/*
* Jopr Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program 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 General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.jboss.jbossnetwork.product.jbpm.handlers;
import org.jbpm.graph.exe.ExecutionContext;
import org.rhq.core.pluginapi.operation.OperationServicesResult;
import org.rhq.core.pluginapi.operation.OperationServicesResultCode;
/**
* JBPM handler which executes an action on the JBoss AS instance being manipulated.
*
* @author Jason Dobies
*/
public class ControlActionHandler extends BaseHandler {
/**
* Name of the action being performed on the JBoss AS server.
*/
private String actionName;
public void run(ExecutionContext executionContext) {
ControlActionFacade facade =
(ControlActionFacade)executionContext.getVariable(ContextVariables.CONTROL_ACTION_FACADE);
ControlActions action;
try {
action = Enum.valueOf(ControlActions.class, actionName.toUpperCase());
} catch (IllegalArgumentException e) {
error(executionContext, null, "Invalid action specified [" + actionName + "] to be executed on server.",
TRANSITION_ERROR);
return;
}
OperationServicesResult result = null;
Throwable operationError = null;
try {
switch (action) {
case START: {
result = facade.start();
break;
}
case STOP: {
result = facade.stop();
break;
}
case STOPIFRUNNING: {
if (facade.isRunning()) {
result = facade.stop();
}
break;
}
case RESTART: {
result = facade.stop();
if (result.getResultCode() == OperationServicesResultCode.SUCCESS) {
result = facade.start();
}
break;
}
}
} catch (Throwable e) {
operationError = e;
}
OperationServicesResultCode code;
if (result != null) {
code = result.getResultCode();
} else {
// If the server is not running, the STOPIFRUNNING case won't execute something and we won't have a result.
// Assume that's a success and continue.
code = (operationError == null) ? OperationServicesResultCode.SUCCESS : OperationServicesResultCode.FAILURE;
}
switch (code) {
case SUCCESS: {
complete(executionContext, "Successfully called [" + actionName + "] action on server.");
break;
}
case FAILURE: {
error(executionContext, operationError, "Failed calling [" + actionName + "] action on server.",
TRANSITION_ERROR);
break;
}
case CANCELED: {
error(executionContext, operationError, "Canceled [" + actionName + "] action on server.", TRANSITION_ERROR);
break;
}
case TIMED_OUT: {
error(executionContext, operationError, "Action [" + actionName +
"] timed out while executing on server.", TRANSITION_ERROR);
break;
}
}
}
public String getDescription() {
return "Carry out [" + actionName + "] action on the server.";
}
protected void checkProperties() throws ActionHandlerException {
HandlerUtils.checkIsSet("actionName", actionName);
}
public String getActionName() {
return actionName;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
/**
* These correspond to the possible actions returned as part of the workflow. These should be an uppercase exact
* match of the action name in the workflow. This allows for simple lookup and switching to determine which action
* to execute.
*/
private enum ControlActions {
START, STOP, STOPIFRUNNING, RESTART
}
}