package com.c2kernel.lifecycle.instance; import java.util.HashMap; import com.c2kernel.common.AccessRightsException; import com.c2kernel.common.InvalidDataException; import com.c2kernel.common.InvalidTransitionException; import com.c2kernel.common.ObjectAlreadyExistsException; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.common.PersistencyException; import com.c2kernel.graph.model.GraphableVertex; import com.c2kernel.lifecycle.routingHelpers.ViewpointDataHelper; import com.c2kernel.lookup.AgentPath; import com.c2kernel.lookup.EntityPath; import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.process.Gateway; import com.c2kernel.scripting.Script; import com.c2kernel.scripting.ScriptingEngineException; import com.c2kernel.utils.KeyValuePair; import com.c2kernel.utils.Logger; /** * @version $Revision: 1.38 $ $Date: 2005/09/07 13:46:31 $ * @author $Author: abranson $ */ public abstract class WfVertex extends GraphableVertex { /**sets the activity available to be executed on start of Workflow or composite activity (when it is the first one of the * (sub)process * @throws InvalidDataException * @throws ObjectAlreadyExistsException * @throws ObjectNotFoundException * @throws AccessRightsException * @throws InvalidTransitionException * @throws PersistencyException */ public abstract void runFirst(AgentPath agent, int itemSysKey) throws ScriptingEngineException, InvalidDataException, InvalidTransitionException, AccessRightsException, ObjectNotFoundException, ObjectAlreadyExistsException, PersistencyException; /** * @see java.lang.Object#Object() */ public WfVertex() { super(); setIsLayoutable(true); setIsComposite(false); } /** * Method runNext. * @throws InvalidDataException * @throws ObjectNotFoundException * @throws AccessRightsException * @throws InvalidTransitionException * @throws PersistencyException * @throws ObjectAlreadyExistsException */ public void runNext(AgentPath agent, int itemSysKey) throws InvalidDataException, InvalidTransitionException, AccessRightsException, ObjectNotFoundException, PersistencyException { try { ((CompositeActivity)getParent()).request(agent, itemSysKey, CompositeActivity.COMPLETE, null); } catch (Exception e) { //Logger.error(e); } } /** * Method reinit. * @param idLoop * @throws InvalidDataException * @throws ObjectNotFoundException */ public abstract void reinit( int idLoop ) throws InvalidDataException; /** * Method verify. * @return boolean */ public abstract boolean verify(); /** * Method getErrors. * @return String */ public abstract String getErrors(); /** * Method run. * @throws InvalidDataException * @throws ObjectAlreadyExistsException * @throws ObjectNotFoundException * @throws AccessRightsException * @throws InvalidTransitionException * @throws PersistencyException */ public abstract void run(AgentPath agent, int itemSysKey) throws InvalidDataException, InvalidTransitionException, AccessRightsException, ObjectNotFoundException, PersistencyException; /** * Method loop. * @return boolean */ public abstract boolean loop(); /** * Method addNext. * @param vertex */ public abstract Next addNext(WfVertex vertex); protected Object evaluateScript(String scriptName, String scriptVersion, int itemSysKey) throws ScriptingEngineException { try { Script script = getScript(scriptName, scriptVersion); KeyValuePair[] k = getProperties().getKeyValuePairs(); HashMap requiredInput = script.getAllInputParams(); for (KeyValuePair element : k) { if (requiredInput.containsKey(element.getKey())) { String value = element.getStringValue(); Object inputParam = value; if (value.startsWith("viewpoint//")) { value = value.substring(11); if (value.startsWith(".")) value = itemSysKey + value.substring(1); try { inputParam = ViewpointDataHelper.get(value)[0]; } catch (ArrayIndexOutOfBoundsException ex) { throw new InvalidDataException("Could not retrieve data from viewpoint: "+value, ""); } } if (value.startsWith("property//")) { value = value.substring(10); try { inputParam = Gateway.getStorage().get(itemSysKey, ClusterStorage.PROPERTY+"/"+value, null); } catch (ObjectNotFoundException ex) { inputParam = null; } } Logger.msg(5, "Split.evaluateScript() - Setting param " + element.getKey() + " to " + inputParam.toString()); script.setInputParamValue(element.getKey(), inputParam); } } if (requiredInput.containsKey("item")) { script.setInputParamValue("item", Gateway.getProxyManager().getProxy(new EntityPath(itemSysKey))); } if (requiredInput.containsKey("agent")) { AgentPath systemAgent = Gateway.getLDAPLookup().getRoleManager().getAgentPath("system"); script.setInputParamValue("agent", Gateway.getProxyManager().getProxy(systemAgent)); } Object retVal = script.execute(); Logger.msg(2, "Split.evaluateScript() - Script returned "+retVal); if (retVal == null) retVal = ""; return retVal; } catch (Exception e) { Logger.msg(1, "Split.evaluateScript() - Error: Script " + scriptName); Logger.error(e); throw new ScriptingEngineException(); } } private static Script getScript(String name, String version) throws ScriptingEngineException { if (name == null || name.length() == 0) throw new ScriptingEngineException("Script name is empty"); Script script; try { script = new Script(name, Integer.parseInt(version)); } catch (NumberFormatException e) { // version not valid int split = name.indexOf(":"); if (split > -1) { script = new Script(name.substring(0, split), name.substring(split + 1)); } else throw new ScriptingEngineException("Script version is invalid"); } return script; } public Workflow getWf() { return ((CompositeActivity)getParent()).getWf(); } }