summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/entity/agent/ActiveEntity.java
diff options
context:
space:
mode:
Diffstat (limited to 'source/com/c2kernel/entity/agent/ActiveEntity.java')
-rwxr-xr-xsource/com/c2kernel/entity/agent/ActiveEntity.java281
1 files changed, 281 insertions, 0 deletions
diff --git a/source/com/c2kernel/entity/agent/ActiveEntity.java b/source/com/c2kernel/entity/agent/ActiveEntity.java
new file mode 100755
index 0000000..cb77bbb
--- /dev/null
+++ b/source/com/c2kernel/entity/agent/ActiveEntity.java
@@ -0,0 +1,281 @@
+/**************************************************************************
+ * BasicAgent.java
+ *
+ * $Revision: 1.39 $
+ * $Date: 2005/04/26 06:48:12 $
+ *
+ * Copyright (C) 2001-2003 CERN - European Organization for Nuclear Research
+ * All rights reserved.
+ **************************************************************************/
+
+package com.c2kernel.entity.agent;
+
+import java.util.Iterator;
+
+import com.c2kernel.common.*;
+import com.c2kernel.entity.AgentPOA;
+import com.c2kernel.entity.C2KLocalObject;
+import com.c2kernel.lookup.AgentPath;
+import com.c2kernel.lookup.InvalidEntityPathException;
+import com.c2kernel.lookup.RolePath;
+import com.c2kernel.persistency.ClusterStorageException;
+import com.c2kernel.persistency.TransactionManager;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.property.PropertyArrayList;
+import com.c2kernel.utils.CastorXMLUtility;
+import com.c2kernel.utils.Logger;
+
+/**************************************************************************
+ * ActiveEntity
+ *
+ * @author $Author: abranson $ $Date: 2005/04/26 06:48:12 $
+ * @version $Revision: 1.39 $
+ **************************************************************************/
+public class ActiveEntity extends AgentPOA
+{
+
+ /**************************************************************************
+ * The CORBA Portable Object Adapter which holds the Agent
+ **************************************************************************/
+ private org.omg.PortableServer.POA mPOA = null;
+
+ /**************************************************************************
+ * The C2Kernel system key of the Agent
+ **************************************************************************/
+ private int mSystemKey = -1;
+
+ /**************************************************************************
+ * Connection to the persistency backeng
+ **************************************************************************/
+ private TransactionManager mDatabase = null;
+
+ /**************************************************************************
+ * The agent's joblist
+ **************************************************************************/
+ private JobList currentJobs;
+ /**
+ *
+ * @param key
+ * @param poa
+ */
+ public ActiveEntity( int key,
+ org.omg.PortableServer.POA poa )
+ {
+ Logger.msg(5, "ActiveEntity::constructor() - SystemKey:" + key );
+
+ mSystemKey = key;
+ mPOA = poa;
+ mDatabase = Gateway.getStorage();
+
+ Logger.msg(5, "ActiveEntity::constructor - completed.");
+ }
+
+ /**
+ * initialise cristal2 properties & collector
+ */
+ public void initialise( String agentProps )
+ throws AccessRightsException,
+ InvalidDataException,
+ PersistencyException
+ {
+ PropertyArrayList props = null;
+ Logger.msg(1, "ActiveEntity::initialise("+mSystemKey+")");
+ //initialise cristal2 properties & collector
+ try
+ {
+ props = initProps( agentProps );
+ mDatabase.commit( props );
+ }
+ catch( ClusterStorageException ex )
+ {
+ Logger.error("ActiveEntity::init() - Failed to init props/collector, aborting!");
+ Logger.error(ex);
+
+ mDatabase.abort( props );
+ throw new PersistencyException("Failed to init props => transaction aborted!");
+ }
+
+ Logger.msg(5, "ActiveEntity::init() - completed.");
+ }
+
+ /**
+ *
+ * @param propsString
+ * @return Properties
+ * @throws InvalidDataException Properties cannot be unmarshalled
+ * @throws ClusterStorageException
+ */
+ private PropertyArrayList initProps( String propsString )
+ throws InvalidDataException,
+ ClusterStorageException
+ {
+ PropertyArrayList props = null;
+
+ // create properties
+ if( !propsString.equals("") && propsString != null )
+ {
+ try
+ {
+ props = (PropertyArrayList)CastorXMLUtility.unmarshall(propsString);
+ }
+ catch( Exception ex )
+ {
+ //any exception during unmarshall indicates that data was
+ //incorrect or the castor mapping was not set up
+ Logger.error(ex);
+ throw new InvalidDataException(ex.toString(), null);
+ }
+
+ Iterator iter = props.list.iterator();
+
+ while( iter.hasNext() )
+ mDatabase.put( mSystemKey, (C2KLocalObject)iter.next(), props );
+ }
+ else
+ {
+ Logger.warning("ActiveEntity::initProps() - NO Properties!");
+ }
+
+ return props;
+ }
+
+ /**************************************************************************
+ *
+ *
+ **************************************************************************/
+ public org.omg.PortableServer.POA _default_POA()
+ {
+ if(mPOA != null)
+ return mPOA;
+ else
+ return super._default_POA();
+ }
+
+
+ /**************************************************************************
+ *
+ *
+ **************************************************************************/
+ public int getSystemKey()
+ {
+ return mSystemKey;
+ }
+
+
+ /**************************************************************************
+ *
+ *
+ **************************************************************************/
+ public String queryData(String xpath)
+ throws AccessRightsException,
+ ObjectNotFoundException,
+ PersistencyException
+ {
+ String result = "";
+ int allPos = -1;
+
+ Logger.msg(1, "ActiveEntity::queryData("+mSystemKey+") - " + xpath );
+
+ try
+ {
+ if( (allPos=xpath.indexOf("all")) != -1 )
+ {
+ String query = xpath.substring(0,allPos);
+ String[] ids = mDatabase.getClusterContents( mSystemKey, query );
+
+ for( int i=0; i<ids.length; i++ )
+ {
+
+ result += ids[i];
+
+ if( i != ids.length-1 )
+ result += ",";
+ }
+ }
+ //****************************************************************
+ else
+ {
+ C2KLocalObject obj = mDatabase.get( mSystemKey, xpath, null );
+
+ result = CastorXMLUtility.marshall(obj);
+ }
+
+ }
+ catch (ObjectNotFoundException ex) {
+ throw ex;
+ }
+ catch(Throwable ex)
+ {
+ Logger.error("ActiveEntity::queryData("+mSystemKey+") - " +
+ xpath + " FAILED");
+ Logger.error(ex);
+ result = "<ERROR/>";
+ }
+
+ Logger.msg(7, "ActiveEntity::queryData("+mSystemKey+") - result:" + result );
+
+ return result;
+ }
+
+
+
+ /**
+ * Called by an activity when it reckons we need to update our joblist for it
+ */
+
+ public synchronized void refreshJobList(int sysKey, String stepPath, String newJobs) {
+ try {
+ JobArrayList newJobList = (JobArrayList)CastorXMLUtility.unmarshall(newJobs);
+
+ // get our joblist
+ if (currentJobs == null)
+ currentJobs = new JobList( mSystemKey, null);
+
+ // remove old jobs for this item
+ currentJobs.removeJobsForStep( sysKey, stepPath );
+
+ // merge new jobs in
+ for (Iterator iter = newJobList.list.iterator(); iter.hasNext();) {
+ Job newJob = (Job)iter.next();
+ Logger.msg(6, "Adding job for "+newJob.getItemSysKey()+"/"+newJob.getStepPath()+":"+newJob.getPossibleTransition());
+ currentJobs.addJob(newJob);
+ }
+
+ } catch (Throwable ex) {
+ Logger.error("Could not refresh job list.");
+ Logger.error(ex);
+ }
+
+ }
+
+ public void addRole(String roleName) throws CannotManageException, ObjectNotFoundException {
+ RolePath newRole = Gateway.getLDAPLookup().getRoleManager().getRolePath(roleName);
+ try {
+ newRole.addAgent(new AgentPath(mSystemKey));
+ } catch (InvalidEntityPathException ex) {
+ throw new CannotManageException("Invalid syskey for agent: "+mSystemKey, "");
+ } catch (ObjectCannotBeUpdated ex) {
+ throw new CannotManageException("Could not update role");
+ }
+ }
+
+ public void removeRole(String roleName) throws CannotManageException, ObjectNotFoundException {
+ RolePath rolePath = Gateway.getLDAPLookup().getRoleManager().getRolePath(roleName);
+ try {
+ rolePath.removeAgent(new AgentPath(mSystemKey));
+ } catch (InvalidEntityPathException e) {
+ throw new CannotManageException("Invalid syskey for agent: "+mSystemKey, "");
+ } catch (ObjectCannotBeUpdated ex) {
+ throw new CannotManageException("Could not update role");
+ }
+ }
+ /**
+ *
+ */
+ protected void finalize() throws Throwable {
+ Logger.msg(7, "Agent "+mSystemKey+" reaped");
+ Gateway.getStorage().clearCache(mSystemKey, null);
+ super.finalize();
+ }
+
+}