From 9bd010f09cff41f5d25763406a0ac4d61815a8c5 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 9 Apr 2014 16:37:26 +0200 Subject: Expanded server predefined steps to include server and agent maintenance steps. Fixes #174 Fixed schema of CreateNewItem and CreateNewAgent. --- .../lifecycle/instance/predefined/Erase.java | 8 +-- .../instance/predefined/PredefinedStep.java | 9 +++ .../predefined/PredefinedStepContainer.java | 2 - .../predefined/ServerPredefinedStepContainer.java | 20 ++++-- .../predefined/entitycreation/CreateNewAgent.java | 1 + .../predefined/entitycreation/CreateNewItem.java | 1 + .../predefined/server/AddDomainContext.java | 54 +++++++++++++++ .../instance/predefined/server/RemoveAgent.java | 67 ++++++++++++++++++ .../predefined/server/RemoveDomainContext.java | 47 +++++++++++++ .../predefined/server/SetAgentPassword.java | 56 +++++++++++++++ .../instance/predefined/server/SetAgentRoles.java | 79 ++++++++++++++++++++++ 11 files changed, 329 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/server/AddDomainContext.java create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveAgent.java create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveDomainContext.java create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentPassword.java create mode 100644 src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentRoles.java (limited to 'src/main/java/com/c2kernel/lifecycle/instance/predefined') diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/Erase.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/Erase.java index 84b1b78..c26d5b8 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/Erase.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/Erase.java @@ -22,9 +22,7 @@ import com.c2kernel.lookup.AgentPath; import com.c2kernel.lookup.DomainPath; import com.c2kernel.lookup.EntityPath; import com.c2kernel.lookup.Path; -import com.c2kernel.persistency.ClusterStorage; import com.c2kernel.process.Gateway; -import com.c2kernel.property.Property; import com.c2kernel.utils.Logger; @@ -53,12 +51,8 @@ public class Erase extends PredefinedStep try { EntityPath entityPath = getItemEntityPath(); - // FIXME: This should search for the entity key. Name shouldn't be unique. - // find entity name - Property name = (Property)Gateway.getStorage().get(entityPath.getSysKey(), ClusterStorage.PROPERTY+"/Name", null); - // get all domain paths - Enumeration domPaths = Gateway.getLDAPLookup().search(new DomainPath(), name.getValue()); + Enumeration domPaths = Gateway.getLDAPLookup().searchAliases(new EntityPath(entityPath.getSysKey())); while (domPaths.hasMoreElements()) { DomainPath path = (DomainPath)domPaths.nextElement(); // delete them diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStep.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStep.java index 9531ede..2e2869d 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStep.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStep.java @@ -33,6 +33,15 @@ public class PredefinedStep extends Activity else return super.getActive(); } + + public PredefinedStep() { + super(); + getProperties().put("SchemaType", "PredefinedStepOutcome"); + getProperties().put("SchemaVersion", "0"); + } + + public static final int DONE = 0; + public static final int AVAILABLE = 0; @Override public String getTransitions() { diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java index f17e5e8..340ce0b 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStepContainer.java @@ -37,8 +37,6 @@ public class PredefinedStepContainer extends CompositeActivity act.setName(alias); act.setType(alias); act.getProperties().put("Description", Description); - act.getProperties().put("SchemaType", "PredefinedStepOutcome"); - act.getProperties().put("SchemaVersion", "0"); act.setCentrePoint(new GraphPoint()); act.setIsPredefined(true); addChild(act, new GraphPoint(100, 75 * ++num)); diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/ServerPredefinedStepContainer.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/ServerPredefinedStepContainer.java index d11c05b..55bac52 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/ServerPredefinedStepContainer.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/ServerPredefinedStepContainer.java @@ -3,6 +3,11 @@ package com.c2kernel.lifecycle.instance.predefined; import com.c2kernel.graph.model.GraphPoint; import com.c2kernel.lifecycle.instance.predefined.entitycreation.CreateNewAgent; import com.c2kernel.lifecycle.instance.predefined.entitycreation.CreateNewItem; +import com.c2kernel.lifecycle.instance.predefined.server.AddDomainContext; +import com.c2kernel.lifecycle.instance.predefined.server.RemoveAgent; +import com.c2kernel.lifecycle.instance.predefined.server.RemoveDomainContext; +import com.c2kernel.lifecycle.instance.predefined.server.SetAgentPassword; +import com.c2kernel.lifecycle.instance.predefined.server.SetAgentRoles; /************************************************************************** * @@ -21,18 +26,21 @@ public class ServerPredefinedStepContainer extends PredefinedStepContainer { public void createChildren() { super.createChildren(); - serverPredInit("CreateNewItem", "Creates a new Item in this Server without description.", new CreateNewItem(), "NewItem"); - serverPredInit("CreateNewAgent", "Creates a new Agent in this Server without description.", new CreateNewAgent(), "NewAgent"); + serverPredInit("CreateNewItem", "Creates a new Item in this Server without description.", new CreateNewItem()); + serverPredInit("CreateNewAgent", "Creates a new Agent in this Server without description.", new CreateNewAgent()); + serverPredInit("RemoveAgent", "Deletes the named Agent in this Server.", new RemoveAgent()); + serverPredInit("SetAgentPassword", "Changes the named Agent's password in this Server.", new SetAgentPassword()); + serverPredInit("SetAgentRoles", "Sets the roles of the named Agent.", new SetAgentRoles()); + serverPredInit("RemoveDomainContext", "Deletes an existing context in the domain tree, but only if empty", new RemoveDomainContext()); + serverPredInit("AddDomainContext", "Creates an empty domain context in the tree", new AddDomainContext()); } - public void serverPredInit(String alias, String Description, PredefinedStep act, String schema) + public void serverPredInit(String alias, String Description, PredefinedStep act) { act.setName(alias); act.setType(alias); act.getProperties().put("Description", Description); - act.getProperties().put("SchemaType", schema); - act.getProperties().put("SchemaVersion", "0"); - act.getProperties().put("AgentRole", "Admin"); + act.getProperties().put("Agent Role", "Admin"); act.setCentrePoint(new GraphPoint()); act.setIsPredefined(true); addChild(act, new GraphPoint(100, 75 * ++num)); diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewAgent.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewAgent.java index 9ec6519..bf5449a 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewAgent.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewAgent.java @@ -20,6 +20,7 @@ public class CreateNewAgent extends PredefinedStep public CreateNewAgent() { super(); + getProperties().put("SchemaType", "Agent"); } //requestdata is xmlstring diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewItem.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewItem.java index 5776a5a..d29e8c0 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewItem.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/entitycreation/CreateNewItem.java @@ -23,6 +23,7 @@ public class CreateNewItem extends PredefinedStep public CreateNewItem() { super(); + getProperties().put("SchemaType", "Item"); } //requestdata is xmlstring diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/AddDomainContext.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/AddDomainContext.java new file mode 100644 index 0000000..ebaf74b --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/AddDomainContext.java @@ -0,0 +1,54 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import java.util.Stack; + +import com.c2kernel.common.AccessRightsException; +import com.c2kernel.common.InvalidDataException; +import com.c2kernel.common.InvalidTransitionException; +import com.c2kernel.common.ObjectAlreadyExistsException; +import com.c2kernel.common.ObjectCannotBeUpdated; +import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Logger; + +public class AddDomainContext extends PredefinedStep { + + public AddDomainContext() { + super(); + } + + @Override + public void request(AgentPath agent, int transitionID, String requestData) + throws AccessRightsException, + InvalidTransitionException, + InvalidDataException + { + + Logger.msg(1, "AddDomainContext::request() - Starting."); + checkAccessRights(agent); + + DomainPath pathToAdd = new DomainPath(getDataList(requestData)[0]); + if (pathToAdd.exists()) + throw new InvalidDataException("Context "+pathToAdd+" already exists", ""); + // collect parent paths if they don't exist + Stack pathsToAdd = new Stack(); + while(pathToAdd!= null && !pathToAdd.exists()) { + pathsToAdd.push(pathToAdd); + pathToAdd = pathToAdd.getParent(); + } + while(!pathsToAdd.empty()) { + pathToAdd = pathsToAdd.pop(); + try { + Gateway.getLDAPLookup().add(pathToAdd); + } catch (ObjectAlreadyExistsException e) { + Logger.error("Context "+pathToAdd+" inconsistently exists."); + } catch (ObjectCannotBeUpdated e) { + Logger.error(e); + throw new InvalidDataException("Exception adding path "+pathToAdd+": "+e.getMessage(), ""); + } + } + sendEventStoreOutcome(transitionID, requestData, agent); + } +} diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveAgent.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveAgent.java new file mode 100644 index 0000000..0ab042c --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveAgent.java @@ -0,0 +1,67 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import com.c2kernel.common.AccessRightsException; +import com.c2kernel.common.InvalidDataException; +import com.c2kernel.common.InvalidTransitionException; +import com.c2kernel.common.ObjectCannotBeUpdated; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.RolePath; +import com.c2kernel.persistency.ClusterStorageException; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Logger; + +public class RemoveAgent extends PredefinedStep { + + public RemoveAgent() { + super(); + } + + @Override + public void request(AgentPath agent, int transitionID, String requestData) + throws AccessRightsException, + InvalidTransitionException, + InvalidDataException + { + + Logger.msg(1, "RemoveAgent::request() - Starting."); + checkAccessRights(agent); + + String[] params = getDataList(requestData); + AgentPath targetAgent; + try { + targetAgent = Gateway.getLDAPLookup().getRoleManager().getAgentPath(params[0]); + } catch (ObjectNotFoundException e) { + throw new InvalidDataException("Agent "+params[0]+" not found", ""); + } + //remove from roles + for (RolePath role: targetAgent.getRoles()) { + try { + role.removeAgent(targetAgent); + } catch (ObjectCannotBeUpdated e) { + Logger.error(e); + throw new InvalidDataException("Error removing "+params[0]+" from Role "+role.getName(), ""); + } catch (ObjectNotFoundException e) { + Logger.error(e); + throw new InvalidDataException("Tried to remove "+params[0]+" from Role "+role.getName()+" that doesn't exist.", ""); + } + } + //clear out all storages + try { + Gateway.getStorage().removeCluster(targetAgent.getSysKey(), "", null); + } catch (ClusterStorageException e) { + Logger.error(e); + throw new InvalidDataException("Error deleting storage for "+params[0], ""); + } + //remove entity path + try { + Gateway.getLDAPLookup().delete(targetAgent); + } catch (ObjectCannotBeUpdated e) { + throw new InvalidDataException("Error deleting AgentPath for "+params[0], ""); + } + + sendEventStoreOutcome(transitionID, requestData, agent); + } + +} diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveDomainContext.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveDomainContext.java new file mode 100644 index 0000000..8bfa016 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveDomainContext.java @@ -0,0 +1,47 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import com.c2kernel.common.AccessRightsException; +import com.c2kernel.common.InvalidDataException; +import com.c2kernel.common.InvalidTransitionException; +import com.c2kernel.common.ObjectCannotBeUpdated; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Logger; + +public class RemoveDomainContext extends PredefinedStep { + public RemoveDomainContext() { + super(); + } + + @Override + public void request(AgentPath agent, int transitionID, String requestData) + throws AccessRightsException, + InvalidTransitionException, + InvalidDataException + { + Logger.msg(1, "RemoveDomainContext::request() - Starting."); + + checkAccessRights(agent); + + DomainPath pathToDelete = new DomainPath(getDataList(requestData)[0]); + if (!pathToDelete.exists()) + throw new InvalidDataException("Context "+pathToDelete+" does not exist", ""); + try { + pathToDelete.getEntity(); + throw new InvalidDataException("Path "+pathToDelete+" is an Entity. Use its own Erase step instead, or RemoveAgent.", ""); + } catch (ObjectNotFoundException ex) { } + if (pathToDelete.getChildren().hasMoreElements()) + throw new InvalidDataException("Context "+pathToDelete+" is not empty. Cannot delete.", ""); + + try { + Gateway.getLDAPLookup().delete(pathToDelete); + } catch (ObjectCannotBeUpdated e) { + Logger.error(e); + throw new InvalidDataException("Exception deleting path"+pathToDelete+": "+e.getMessage(), ""); + } + sendEventStoreOutcome(transitionID, requestData, agent); + } +} diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentPassword.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentPassword.java new file mode 100644 index 0000000..bf4347e --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentPassword.java @@ -0,0 +1,56 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import java.security.NoSuchAlgorithmException; + +import com.c2kernel.common.AccessRightsException; +import com.c2kernel.common.InvalidDataException; +import com.c2kernel.common.InvalidTransitionException; +import com.c2kernel.common.ObjectCannotBeUpdated; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Logger; + +public class SetAgentPassword extends PredefinedStep { + + public SetAgentPassword() { + super(); + } + + @Override + public void request(AgentPath agent, int transitionID, String requestData) + throws AccessRightsException, + InvalidTransitionException, + InvalidDataException + { + Logger.msg(1, "SetAgentPassword::request() - Starting."); + checkAccessRights(agent); + + String[] params = getDataList(requestData); + if (params.length!=2) + throw new InvalidDataException("Requires 2 params: agent name and new password", ""); + AgentPath targetAgent; + try { + targetAgent = Gateway.getLDAPLookup().getRoleManager().getAgentPath(params[0]); + } catch (ObjectNotFoundException e) { + throw new InvalidDataException("Agent "+params[0]+" not found", ""); + } + + try { + Gateway.getLDAPLookup().getRoleManager().setAgentPassword(targetAgent, params[1]); + } catch (ObjectNotFoundException e) { + Logger.error(e); + throw new InvalidDataException("Agent "+params[0]+" not found.", ""); + } catch (ObjectCannotBeUpdated e) { + Logger.error(e); + throw new InvalidDataException("Error updating LDAP entry.", ""); + } catch (NoSuchAlgorithmException e) { + Logger.error(e); + throw new InvalidDataException("Cryptographic libraries for password hashing not found.", ""); + } + + sendEventStoreOutcome(transitionID, requestData, agent); + } + +} diff --git a/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentRoles.java b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentRoles.java new file mode 100644 index 0000000..4c36530 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentRoles.java @@ -0,0 +1,79 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import java.util.ArrayList; + +import com.c2kernel.common.AccessRightsException; +import com.c2kernel.common.InvalidDataException; +import com.c2kernel.common.InvalidTransitionException; +import com.c2kernel.common.ObjectNotFoundException; +import com.c2kernel.lifecycle.instance.predefined.PredefinedStep; +import com.c2kernel.lookup.AgentPath; +import com.c2kernel.lookup.LDAPRoleManager; +import com.c2kernel.lookup.RolePath; +import com.c2kernel.process.Gateway; +import com.c2kernel.utils.Logger; + +public class SetAgentRoles extends PredefinedStep { + + public SetAgentRoles() { + super(); + } + + @Override + public void request(AgentPath agent, int transitionID, String requestData) + throws AccessRightsException, + InvalidTransitionException, + InvalidDataException + { + Logger.msg(1, "SetAgentRoles::request() - Starting."); + checkAccessRights(agent); + + String[] params = getDataList(requestData); + AgentPath targetAgent; + try { + targetAgent = Gateway.getLDAPLookup().getRoleManager().getAgentPath(params[0]); + } catch (ObjectNotFoundException e) { + throw new InvalidDataException("Agent "+params[0]+" not found", ""); + } + + LDAPRoleManager roleMan = Gateway.getLDAPLookup().getRoleManager(); + RolePath[] currentRoles = targetAgent.getRoles(); + ArrayList requestedRoles = new ArrayList(); + if (params.length>1) + for (int i=1; i rolesToRemove = new ArrayList(); + for (RolePath existingRole : currentRoles) { // + if (requestedRoles.contains(existingRole)) // if we have it, and it's requested, then it will be kept + requestedRoles.remove(existingRole); // so remove it from request - this will be left with roles to be added + else + rolesToRemove.add(existingRole); // else this role will be removed + } + + // remove roles not in new list + for (RolePath roleToRemove : rolesToRemove) + try { + roleToRemove.removeAgent(targetAgent); + } catch (Exception e) { + Logger.error(e); + throw new InvalidDataException("Error removing role "+roleToRemove.getName(), ""); + } + + // add requested roles we don't already have + for (RolePath roleToAdd : requestedRoles) + try { + roleToAdd.addAgent(targetAgent); + } catch (Exception e) { + Logger.error(e); + throw new InvalidDataException("Error adding role "+roleToAdd.getName(), ""); + } + + sendEventStoreOutcome(transitionID, requestData, agent); + } + +} -- cgit v1.2.3