blob: b02e2db86cc484afbc45402d68e08c6f7ead0f12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.ws.internal.explorer.platform.engine;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Vector;
import org.eclipse.wst.ws.internal.explorer.platform.actions.Action;
import org.eclipse.wst.ws.internal.explorer.platform.actions.ShowPerspectiveAction;
import org.eclipse.wst.ws.internal.explorer.platform.constants.ActionInputs;
import org.eclipse.wst.ws.internal.explorer.platform.engine.constants.ActionDataConstants;
import org.eclipse.wst.ws.internal.explorer.platform.engine.data.ActionDescriptor;
import org.eclipse.wst.ws.internal.explorer.platform.engine.data.ScenarioDescriptor;
import org.eclipse.wst.ws.internal.explorer.platform.engine.data.TransactionDescriptor;
import org.eclipse.wst.ws.internal.explorer.platform.engine.transformer.ITransformer;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Controller;
public class ActionEngine
{
public static final byte MODE_DISABLED = 0x0;
public static final byte MODE_STOP = 0x1;
public static final byte MODE_RECORD = 0x2;
public static final byte MODE_PLAY = 0x3;
private Controller controller;
private byte mode;
private Vector actionDescriptors;
public ActionEngine(Controller controller)
{
this.controller = controller;
mode = MODE_DISABLED;
actionDescriptors = new Vector();
}
public void executeScenario(ScenarioDescriptor scenarioDescriptor)
{
TransactionDescriptor[] transactionDescriptors = scenarioDescriptor.getTransactionDescriptors();
for (int i = 0; i < transactionDescriptors.length; i++)
executeTransaction(transactionDescriptors[i]);
}
public boolean executeTransaction(TransactionDescriptor transactionDescriptor)
{
boolean result = true;
ActionDescriptor[] actionDescriptors = transactionDescriptor.getActionDescriptors();
for (int i = 0; i < actionDescriptors.length; i++)
{
if (result)
{
if (!executeAction(actionDescriptors[i]))
result = false;
}
else
actionDescriptors[i].setStatusId(ActionDataConstants.VALUE_STATUS_ID_UNATTEMPTED);
}
return result;
}
public boolean executeAction(ActionDescriptor actionDescriptor)
{
int attempts = actionDescriptor.getAttempts();
for (int i = 0; i < attempts; i++)
{
try
{
Class classAction = Class.forName(actionDescriptor.getId());
if (Action.class.isAssignableFrom(classAction))
{
Action action = (Action) newInstance(classAction);
if (action != null)
{
Hashtable properties = actionDescriptor.getProperties();
ITransformer[] transformers = action.getTransformers();
for (int j = 0; j < transformers.length; j++)
properties = transformers[j].deNormalize(properties);
action.setPropertyTable(properties);
boolean actionResult = action.run();
// TODO actionDescriptor.addStatus(action.getStatus());
if (actionResult)
{
actionDescriptor.setStatusId(ActionDataConstants.VALUE_STATUS_ID_PASSED);
return true;
}
}
else
throw new ClassNotFoundException(actionDescriptor.getId());
}
}
catch (ClassNotFoundException cnfe)
{
cnfe.printStackTrace();
StringWriter sw = new StringWriter();
cnfe.printStackTrace(new PrintWriter(sw));
actionDescriptor.addStatus(sw.getBuffer().toString());
}
catch (Throwable t)
{
t.printStackTrace();
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
actionDescriptor.addStatus(sw.getBuffer().toString());
}
}
actionDescriptor.setStatusId(ActionDataConstants.VALUE_STATUS_ID_FAILED);
return false;
}
private ScenarioDescriptor newScenarioDescriptor()
{
return new ScenarioDescriptor();
}
private TransactionDescriptor newTransactionDescriptor()
{
return new TransactionDescriptor();
}
private ActionDescriptor newActionDescriptor(Action action)
{
ActionDescriptor actionDescriptor = new ActionDescriptor();
actionDescriptor.setId(action.getClass().getName());
Hashtable properties = new Hashtable(action.getPropertyTable());
ITransformer[] transformers = action.getTransformers();
for (int i = 0; i < transformers.length; i++)
properties = transformers[i].normalize(properties);
actionDescriptor.setProperties(properties);
return actionDescriptor;
}
private Object newInstance(Class c)
{
try
{
// instantiates the action using the constructor that takes in a
// controller object
Constructor constructor = c.getConstructor(new Class[]{Controller.class});
return constructor.newInstance(new Object[]{controller});
}
catch (NoSuchMethodException nsme)
{
}
catch (InstantiationException ie)
{
}
catch (IllegalAccessException iae)
{
}
catch (InvocationTargetException ite)
{
}
catch (Throwable t)
{
}
Object instance = null;
try
{
// instantiates the action using the default constructor
Constructor constructor = c.getConstructor(new Class[0]);
instance = constructor.newInstance(new Object[0]);
Method method = c.getMethod("setController", new Class[]{Controller.class});
method.invoke(instance, new Object[]{controller});
}
catch (NoSuchMethodException nsme)
{
}
catch (InstantiationException ie)
{
}
catch (IllegalAccessException iae)
{
}
catch (IllegalArgumentException iae)
{
}
catch (InvocationTargetException ite)
{
}
catch (Throwable t)
{
}
return instance;
}
public byte getMode()
{
return mode;
}
public void setMode(byte mode)
{
this.mode = mode;
if (mode == MODE_RECORD)
{
actionDescriptors = new Vector();
ShowPerspectiveAction showPerspectiveAction = new ShowPerspectiveAction(controller);
showPerspectiveAction.addProperty(ActionInputs.PERSPECTIVE, String.valueOf(controller.getCurrentPerspective().getPerspectiveId()));
actionDescriptors.add(newActionDescriptor(showPerspectiveAction));
}
}
public boolean executeAction(Action action)
{
if (mode == MODE_RECORD)
{
ActionDescriptor actionDescriptor = newActionDescriptor(action);
actionDescriptors.add(actionDescriptor);
}
return action.run();
}
public ScenarioDescriptor getScenario()
{
ScenarioDescriptor scenarioDescriptor = newScenarioDescriptor();
TransactionDescriptor transactionDescriptor = newTransactionDescriptor();
ActionDescriptor[] actionDescriptorArray = (ActionDescriptor[])actionDescriptors.toArray(new ActionDescriptor[0]);
transactionDescriptor.setActionDescriptors(actionDescriptorArray);
scenarioDescriptor.setTransactionDescriptors(new TransactionDescriptor[] {transactionDescriptor});
return scenarioDescriptor;
}
}