summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/entity/TraceableEntity.java
diff options
context:
space:
mode:
Diffstat (limited to 'source/com/c2kernel/entity/TraceableEntity.java')
-rwxr-xr-xsource/com/c2kernel/entity/TraceableEntity.java335
1 files changed, 335 insertions, 0 deletions
diff --git a/source/com/c2kernel/entity/TraceableEntity.java b/source/com/c2kernel/entity/TraceableEntity.java
new file mode 100755
index 0000000..49bbe47
--- /dev/null
+++ b/source/com/c2kernel/entity/TraceableEntity.java
@@ -0,0 +1,335 @@
+/**************************************************************************
+ * TraceableEntity
+ *
+ * $Workfile$
+ * $Revision: 1.108 $
+ * $Date: 2005/10/06 14:46:22 $
+ *
+ * Copyright (C) 2001 CERN - European Organization for Nuclear Research
+ * All rights reserved.
+ **************************************************************************/
+
+package com.c2kernel.entity;
+
+import java.util.Iterator;
+
+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.entity.agent.JobArrayList;
+import com.c2kernel.lifecycle.instance.CompositeActivity;
+import com.c2kernel.lifecycle.instance.Workflow;
+import com.c2kernel.lifecycle.instance.stateMachine.Transitions;
+import com.c2kernel.lookup.AgentPath;
+import com.c2kernel.lookup.InvalidEntityPathException;
+import com.c2kernel.persistency.ClusterStorage;
+import com.c2kernel.persistency.ClusterStorageException;
+import com.c2kernel.persistency.TransactionManager;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.property.Property;
+import com.c2kernel.property.PropertyArrayList;
+import com.c2kernel.utils.CastorXMLUtility;
+import com.c2kernel.utils.Logger;
+
+/**************************************************************************
+*
+* @author $Author: abranson $ $Date: 2005/10/06 14:46:22 $
+* @version $Revision: 1.108 $
+* <pre>
+* ,. '\'\ ,---.
+* . | \\ l\\l_ // |
+* _ _ | \\/ `/ `.| |
+* /~\\ \ //~\ | Y | | || Y |
+* | \\ \ // | | \| | |\ / |
+* [ || || ] \ | o|o | > /
+* ] Y || || Y [ \___\_--_ /_/__/
+* | \_|l,------.l|_/ | /.-\(____) /--.\
+* | >' `< | `--(______)----'
+* \ (/~`--____--'~\) / u// u / \
+* `-_>-__________-<_-' / \ / /|
+* /(_#(__)#_)\ ( .) / / ]
+* \___/__\___/ `.`' / [
+* /__`--'__\ |`-' |
+* /\(__,>-~~ __) | |_
+* /\//\\( `--~~ ) _l |-:.
+* '\/ <^\ /^> | ` ( < \\
+* _\ >-__-< /_ ,-\ ,-~~->. \ `:._,/
+* (___\ /___) (____/ (____) `-'
+* Kovax and, paradoxically, Kovax
+* </pre>
+***************************************************************************/
+
+public class TraceableEntity extends ItemPOA
+{
+
+ private int mSystemKey;
+ private org.omg.PortableServer.POA mPoa;
+ private TransactionManager mStorage;
+
+
+ /**************************************************************************
+ * Constructor used by the Locator only
+ **************************************************************************/
+ public TraceableEntity( int key,
+ org.omg.PortableServer.POA poa )
+ {
+ Logger.msg(5,"TraceableEntity::constructor() - SystemKey:" + key );
+
+ mSystemKey = key;
+ mPoa = poa;
+ mStorage = Gateway.getStorage();
+ }
+
+
+ /**************************************************************************
+ *
+ **************************************************************************/
+ public org.omg.PortableServer.POA _default_POA()
+ {
+ if(mPoa != null)
+ return mPoa;
+ else
+ return super._default_POA();
+ }
+
+
+ /**************************************************************************
+ *
+ **************************************************************************/
+ public int getSystemKey()
+ {
+ Logger.msg(8, "TraceableEntity::getSystemKey() - " + mSystemKey);
+ return mSystemKey;
+ }
+
+ /**************************************************************************
+ *
+ **************************************************************************/
+ public void initialise( int agentId,
+ String propString,
+ String initWfString
+ )
+ throws AccessRightsException,
+ InvalidDataException,
+ PersistencyException
+ {
+ Logger.msg(1, "TraceableEntity::initialise("+mSystemKey+") - agent:"+agentId);
+ synchronized (this) {
+ Workflow lc = null;
+ PropertyArrayList props = null;
+
+ AgentPath agentPath;
+ try {
+ agentPath = new AgentPath(agentId);
+ } catch (InvalidEntityPathException e) {
+ throw new AccessRightsException("Invalid Agent Id:" + agentId);
+ }
+
+ //unmarshalling checks the validity of the received strings
+
+ // create properties
+ if (!propString.equals("")) {
+ try {
+ props = (PropertyArrayList)CastorXMLUtility.unmarshall(propString);
+ for (Iterator i = props.list.iterator(); i.hasNext();) {
+ Property thisProp = (Property)i.next();
+ mStorage.put(mSystemKey, thisProp, props);
+ }
+ } catch (Throwable ex) {
+ Logger.msg(8, "TraceableEntity::initialise("+mSystemKey+ ") - Properties were invalid: "+propString);
+ Logger.error(ex);
+ mStorage.abort(props);
+ }
+ mStorage.commit(props);
+ }
+
+ // create wf
+ try {
+ if (initWfString == null || initWfString.equals(""))
+ lc = new Workflow(new CompositeActivity());
+ else
+ lc = new Workflow((CompositeActivity)CastorXMLUtility.unmarshall(initWfString));
+ lc.initialise(mSystemKey, agentPath);
+ mStorage.put(mSystemKey, lc, null);
+ } catch (Throwable ex) {
+ Logger.msg(8, "TraceableEntity::initialise("+mSystemKey+") - Workflow was invalid: "+initWfString);
+ Logger.error(ex);
+ }
+ }
+ }
+
+ /**************************************************************************
+ *
+ **************************************************************************/
+ //requestdata is xmlstring
+ public void requestAction( int agentId,
+ String stepPath,
+ int transitionID,
+ String requestData
+ )
+ throws AccessRightsException,
+ InvalidTransitionException,
+ ObjectNotFoundException,
+ InvalidDataException,
+ PersistencyException,
+ ObjectAlreadyExistsException
+ {
+ synchronized (this) {
+ try {
+
+ Logger.msg(1, "TraceableEntity::request("+mSystemKey+") - " +
+ Transitions.getTransitionName(transitionID) + " "+stepPath + " by " +agentId );
+
+ AgentPath agent = new AgentPath(agentId);
+ Workflow lifeCycle = (Workflow)mStorage.get(mSystemKey, ClusterStorage.LIFECYCLE+"/workflow", null);
+
+ lifeCycle.requestAction( agent,
+ stepPath,
+ transitionID,
+ requestData );
+
+ // store the workflow if we've changed the state of the domain wf
+ if (!(stepPath.startsWith("workflow/predefined")))
+ mStorage.put(mSystemKey, lifeCycle, null);
+
+ // Normal operation exceptions
+ } catch (AccessRightsException ex) {
+ Logger.msg("Propagating AccessRightsException back to the calling agent");
+ throw ex;
+ } catch (InvalidTransitionException ex) {
+ Logger.msg("Propagating InvalidTransitionException back to the calling agent");
+ throw ex;
+ } catch (ObjectNotFoundException ex) {
+ Logger.msg("Propagating ObjectNotFoundException back to the calling agent");
+ throw ex;
+ // errors
+ } catch (ClusterStorageException ex) {
+ Logger.error(ex);
+ throw new PersistencyException("Error on storage: "+ex.getMessage(), "");
+ } catch (InvalidEntityPathException ex) {
+ Logger.error(ex);
+ throw new AccessRightsException("Invalid Agent Id: "+agentId, "");
+ } catch (InvalidDataException ex) {
+ Logger.error(ex);
+ Logger.msg("Propagating InvalidDataException back to the calling agent");
+ throw ex;
+ } catch (ObjectAlreadyExistsException ex) {
+ Logger.error(ex);
+ Logger.msg("Propagating ObjectAlreadyExistsException back to the calling agent");
+ throw ex;
+ // non-CORBA exception hasn't been caught!
+ } catch (Throwable ex) {
+ Logger.error("Unknown Error: requestAction on "+mSystemKey+" by "+agentId+" executing "+stepPath);
+ Logger.error(ex);
+ throw new InvalidDataException("Extraordinary Exception during execution:"+ex.getClass().getName()+" - "+ex.getMessage(), "");
+ }
+ }
+ }
+
+ /**************************************************************************
+ *
+ **************************************************************************/
+ public String queryLifeCycle( int agentId,
+ boolean filter
+ )
+ throws AccessRightsException,
+ ObjectNotFoundException,
+ PersistencyException
+ {
+ synchronized (this) {
+ Logger.msg(1, "TraceableEntity::queryLifeCycle("+mSystemKey+") - agent: " + agentId);
+
+ try
+ {
+ AgentPath agent = new AgentPath(agentId);
+ Workflow wf = (Workflow)mStorage.get(mSystemKey, ClusterStorage.LIFECYCLE+"/workflow", null);
+ JobArrayList jobBag = new JobArrayList();
+ CompositeActivity domainWf = (CompositeActivity)wf.search("workflow/domain");
+ jobBag.list = filter?domainWf.calculateJobs(agent, true):domainWf.calculateAllJobs(agent, true);
+ Logger.msg(1, "TraceableEntity::queryLifeCycle("+mSystemKey+") - Returning "+jobBag.list.size()+" jobs.");
+ return CastorXMLUtility.marshall( jobBag );
+ }
+ catch( Throwable ex )
+ {
+ Logger.error(ex);
+ return "<ERROR/>";
+ }
+ }
+ }
+
+ /**************************************************************************
+ * The description for operation getData.
+ *
+ * @param path - the path to the object required
+ * the suffix 'all' retrieves a listing of all keys on that level
+ *
+ * @return The result string in xml format
+ * except 'all' which returns a comma sep list
+ *
+ * @exception ObjectNotFoundException
+ * ************************************************************************/
+ public String queryData(String path)
+ throws AccessRightsException,
+ ObjectNotFoundException,
+ PersistencyException
+ {
+ synchronized (this) {
+ String result = "";
+
+ Logger.msg(1, "TraceableEntity::queryData("+mSystemKey+") - " + path );
+
+ try
+ { // check for cluster contents query
+
+ if (path.endsWith("/all"))
+ {
+ int allPos = path.lastIndexOf("all");
+ String query = path.substring(0,allPos);
+ String[] ids = mStorage.getClusterContents( mSystemKey, query );
+
+ for( int i=0; i<ids.length; i++ )
+ {
+ result += ids[i];
+
+ if( i != ids.length-1 )
+ result += ",";
+ }
+ }
+ //****************************************************************
+ else
+ { // retrieve the object instead
+ C2KLocalObject obj = mStorage.get( mSystemKey, path, null );
+
+ // marshall it, or in the case of an outcome get the data.
+ result = CastorXMLUtility.marshall(obj);
+ }
+ }
+ catch (ObjectNotFoundException ex) {
+ throw ex;
+ }
+ catch(Throwable ex)
+ {
+ Logger.warning("TraceableEntity::queryData("+mSystemKey+") - "+
+ path + " Failed: "+ex.getClass().getName());
+ throw new PersistencyException("Server exception: "+ex.getClass().getName(), "");
+ }
+
+ if( Logger.doLog(9) )
+ Logger.msg(9, "TraceableEntity::queryData("+mSystemKey+") - result:" + result );
+
+ return result;
+ }
+ }
+ /**
+ *
+ */
+ protected void finalize() throws Throwable {
+ Logger.msg(7, "Item "+mSystemKey+" reaped");
+ Gateway.getStorage().clearCache(mSystemKey, null);
+ super.finalize();
+ }
+
+}