From 5b9cc0f4318309879be677bb0278542217f6a0b5 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Tue, 1 Apr 2014 15:58:01 +0200 Subject: AbstractMain - remove usage and help, fail if config or connect args are missing or the files aren't found. Tests. Fixes #177 --- src/test/resources/server.conf | 1 + src/test/resources/test.clc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/test/resources/server.conf create mode 100644 src/test/resources/test.clc (limited to 'src/test/resources') diff --git a/src/test/resources/server.conf b/src/test/resources/server.conf new file mode 100644 index 0000000..476aeb0 --- /dev/null +++ b/src/test/resources/server.conf @@ -0,0 +1 @@ +ClusterStorage=MemoryOnlyClusterStorage \ No newline at end of file diff --git a/src/test/resources/test.clc b/src/test/resources/test.clc new file mode 100644 index 0000000..be1d5d0 --- /dev/null +++ b/src/test/resources/test.clc @@ -0,0 +1,16 @@ + +Name=Test Cristal Server + +// TCP server ports +ItemServer.name=localhost +ItemServer.iiop=1500 +ItemServer.Proxy.port=1553 + +// LDAP Lookup config +LDAP.GlobalPath=o=cern,c=ch +LDAP.RootPath=cn=cristal +LDAP.LocalPath=cn=test +LDAP.port=389 +LDAP.host=localhost +LDAP.user=cn=Manager,o=cern,c=ch +LDAP.password=test -- cgit v1.2.3 From 2be61d2c2db7c52077978a6bdbf71828d5e2e0e2 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 2 Apr 2014 15:23:26 +0200 Subject: Reuse single config file for testing --- src/test/java/MainTest.java | 2 +- src/test/resources/properties.conf | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 src/test/resources/properties.conf (limited to 'src/test/resources') diff --git a/src/test/java/MainTest.java b/src/test/java/MainTest.java index b0a179a..1ccc7e9 100644 --- a/src/test/java/MainTest.java +++ b/src/test/java/MainTest.java @@ -25,7 +25,7 @@ public class MainTest { public MainTest() throws Exception { Logger.addLogStream(System.out, 1); - Properties props = FileStringUtility.loadConfigFile(MainTest.class.getResource("properties.conf").getPath()); + Properties props = FileStringUtility.loadConfigFile(MainTest.class.getResource("server.conf").getPath()); Gateway.init(props); XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreComments(true); diff --git a/src/test/resources/properties.conf b/src/test/resources/properties.conf deleted file mode 100644 index 476aeb0..0000000 --- a/src/test/resources/properties.conf +++ /dev/null @@ -1 +0,0 @@ -ClusterStorage=MemoryOnlyClusterStorage \ No newline at end of file -- cgit v1.2.3 From c85dc62591ab2ce9eec3fd93004ba474f7b1fb19 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 9 Apr 2014 23:17:03 +0200 Subject: Expanded server predefined steps to include server and agent maintenance steps. Fixes #174 --- .../lifecycle/instance/predefined/Erase.java | 8 +-- .../instance/predefined/PredefinedStep.java | 13 +++- .../predefined/PredefinedStepContainer.java | 2 - .../predefined/ServerPredefinedStepContainer.java | 21 ++++-- .../predefined/entitycreation/CreateNewAgent.java | 1 + .../predefined/entitycreation/CreateNewItem.java | 1 + .../predefined/server/AddDomainContext.java | 48 ++++++++++++++ .../instance/predefined/server/RemoveAgent.java | 61 ++++++++++++++++++ .../predefined/server/RemoveDomainContext.java | 41 ++++++++++++ .../predefined/server/SetAgentPassword.java | 52 +++++++++++++++ .../instance/predefined/server/SetAgentRoles.java | 74 ++++++++++++++++++++++ src/main/java/com/c2kernel/lookup/LDAPLookup.java | 12 ++-- .../java/com/c2kernel/lookup/LDAPRoleManager.java | 13 ++++ src/test/resources/NewServerPredefStepTest.js | 12 ++++ 14 files changed, 338 insertions(+), 21 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 create mode 100644 src/test/resources/NewServerPredefStepTest.js (limited to 'src/test/resources') 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 305128b..0f3a246 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/Erase.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/Erase.java @@ -20,9 +20,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; @@ -48,12 +46,8 @@ public class Erase extends PredefinedStep try { - // FIXME: This should search for the entity key. Name shouldn't be unique. - // find entity name - Property name = (Property)Gateway.getStorage().get(itemSysKey, ClusterStorage.PROPERTY+"/Name", null); - // get all domain paths - Enumeration domPaths = Gateway.getLDAPLookup().search(new DomainPath(), name.getValue()); + Enumeration domPaths = Gateway.getLDAPLookup().searchAliases(new EntityPath(itemSysKey)); 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 3cf73ba..d0fde2a 100644 --- a/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStep.java +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/PredefinedStep.java @@ -26,6 +26,15 @@ public abstract class PredefinedStep extends Activity ******************************************************************************************************************************************************************************************************************************************************************************************************/ private boolean isPredefined = false; + public static final int DONE = 0; + public static final int AVAILABLE = 0; + + public PredefinedStep() { + super(); + getProperties().put("SchemaType", "PredefinedStepOutcome"); + getProperties().put("SchemaVersion", "0"); + } + @Override public boolean getActive() { @@ -35,8 +44,8 @@ public abstract class PredefinedStep extends Activity return super.getActive(); } - public static final int DONE = 0; - public static final int AVAILABLE = 0; + + @Override protected String getDefaultSMName() { return "PredefinedStep"; 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 bfab876..43cc8ca 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..667ae5d 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,22 @@ 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("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()); + //TODO: remove the following when agents have workflows + 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()); } - 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 b85cbc3..7715e2a 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 @@ -18,6 +18,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 2db4fe6..bddb39f 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 @@ -21,6 +21,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..7595711 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/AddDomainContext.java @@ -0,0 +1,48 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import java.util.Stack; + +import com.c2kernel.common.InvalidDataException; +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 + protected String runActivityLogic(AgentPath agent, int itemSysKey, + int transitionID, String requestData) throws InvalidDataException { + + Logger.msg(1, "AddDomainContext::request() - Starting."); + + 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(), ""); + } + } + return requestData; + } +} 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..75fe80b --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveAgent.java @@ -0,0 +1,61 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import com.c2kernel.common.InvalidDataException; +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 + protected String runActivityLogic(AgentPath agent, int itemSysKey, + int transitionID, String requestData) throws InvalidDataException { + + Logger.msg(1, "RemoveAgent::request() - Starting."); + + 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], ""); + } + return requestData; + + } + +} 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..77a7545 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/RemoveDomainContext.java @@ -0,0 +1,41 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import com.c2kernel.common.InvalidDataException; +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 + protected String runActivityLogic(AgentPath agent, int itemSysKey, + int transitionID, String requestData) throws InvalidDataException { + + Logger.msg(1, "RemoveDomainContext::request() - Starting."); + + 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(), ""); + } + return requestData; + } +} 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..bb19030 --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentPassword.java @@ -0,0 +1,52 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import java.security.NoSuchAlgorithmException; + +import com.c2kernel.common.InvalidDataException; +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 + protected String runActivityLogic(AgentPath agent, int itemSysKey, + int transitionID, String requestData) throws InvalidDataException { + + Logger.msg(1, "SetAgentPassword::request() - Starting."); + + 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.", ""); + } + + params[1] = "REDACTED"; // censor user's password from outcome + return bundleData(params); + } + +} 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..51be40a --- /dev/null +++ b/src/main/java/com/c2kernel/lifecycle/instance/predefined/server/SetAgentRoles.java @@ -0,0 +1,74 @@ +package com.c2kernel.lifecycle.instance.predefined.server; + +import java.util.ArrayList; + +import com.c2kernel.common.InvalidDataException; +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 + protected String runActivityLogic(AgentPath agent, int itemSysKey, + int transitionID, String requestData) throws InvalidDataException { + + Logger.msg(1, "SetAgentRoles::request() - Starting."); + + 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(), ""); + } + + return requestData; + } + +} diff --git a/src/main/java/com/c2kernel/lookup/LDAPLookup.java b/src/main/java/com/c2kernel/lookup/LDAPLookup.java index 08a80b6..4ea6e68 100644 --- a/src/main/java/com/c2kernel/lookup/LDAPLookup.java +++ b/src/main/java/com/c2kernel/lookup/LDAPLookup.java @@ -352,10 +352,6 @@ public class LDAPLookup else return search(start.getFullDN(),LDAPConnection.SCOPE_SUB,"(&"+query.toString()+")",searchCons); } - - public LDAPPathSet searchType(Path start, Path type) { - return null; - } protected LDAPPathSet search(String startDN, int scope, String filter, LDAPSearchConstraints searchCons) { @@ -396,6 +392,14 @@ public class LDAPLookup searchCons.setDereference(LDAPSearchConstraints.DEREF_NEVER); return search(start.getFullDN(), LDAPConnection.SCOPE_SUB, "objectClass=aliasObject", searchCons); } + + public LDAPPathSet searchAliases(EntityPath entity) { + LDAPSearchConstraints searchCons = new LDAPSearchConstraints(); + searchCons.setBatchSize(0); + searchCons.setDereference(LDAPSearchConstraints.DEREF_NEVER); + return search(new DomainPath().getFullDN(), LDAPConnection.SCOPE_SUB, "(&(objectClass=aliasObject)(aliasedObjectName="+ + LDAPLookupUtils.escapeDN(entity.getFullDN())+"))", searchCons); + } public boolean exists(Path path) { return LDAPLookupUtils.exists(getConnection(), path.getFullDN()); diff --git a/src/main/java/com/c2kernel/lookup/LDAPRoleManager.java b/src/main/java/com/c2kernel/lookup/LDAPRoleManager.java index b2cffc6..f40cd53 100644 --- a/src/main/java/com/c2kernel/lookup/LDAPRoleManager.java +++ b/src/main/java/com/c2kernel/lookup/LDAPRoleManager.java @@ -1,5 +1,6 @@ package com.c2kernel.lookup; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Enumeration; @@ -207,5 +208,17 @@ public class LDAPRoleManager { // set attribute LDAPLookupUtils.setAttributeValue(mLdap.getConnection(), roleEntry, "jobList", hasJobList?"TRUE":"FALSE"); } + + public void setAgentPassword(AgentPath agent, String newPassword) throws ObjectNotFoundException, ObjectCannotBeUpdated, NoSuchAlgorithmException { + String encPasswd = AgentPath.generateUserPassword(newPassword, "SHA"); + LDAPEntry agentEntry; + try { + agentEntry = LDAPLookupUtils.getEntry(mLdap.getConnection(), agent.getFullDN()); + } catch (ObjectNotFoundException e) { + throw new ObjectNotFoundException("Agent "+agent.getAgentName()+" does not exist", ""); + } + LDAPLookupUtils.setAttributeValue(mLdap.getConnection(), agentEntry, "userPassword", encPasswd); + + } } diff --git a/src/test/resources/NewServerPredefStepTest.js b/src/test/resources/NewServerPredefStepTest.js new file mode 100644 index 0000000..64d3d29 --- /dev/null +++ b/src/test/resources/NewServerPredefStepTest.js @@ -0,0 +1,12 @@ +var serverPath=new com.c2kernel.lookup.DomainPath("/servers/pcuwe04.cern.ch"); +var serverItem=proxy.getProxy(serverPath); + +var predef = "AddDomainContext"; var params = new Array(1); params[0] = "/test/context"; agent.execute(serverItem, predef, params); +var predef = "RemoveDomainContext"; agent.execute(serverItem, predef, params); +params[0] = "/test"; agent.execute(serverItem, predef, params); +var predef = "SetAgentPassword"; params = Array(2); params[0] = "dev"; params[1] = "hunter2"; agent.execute(serverItem, predef, params); +com.c2kernel.process.Gateway.login("dev", "hunter2"); +var predef = "SetAgentRoles"; agent.execute(serverItem, predef, params); //Role shouldn't exist +params = Array(3); params[0] = "dev"; params[1] = "Admin"; params[2] = "UserCode"; agent.execute(serverItem, predef, params); +params = Array(2); params[0] = "dev"; params[1] = "Admin"; agent.execute(serverItem, predef, params); +var predef = "RemoveAgent"; var params = new Array(1); params[0] = "dev"; agent.execute(serverItem, predef, params); -- cgit v1.2.3 From e8645422ab8c50d952f1651f2f0acdf0edc95e51 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 16 Apr 2014 17:46:13 +0200 Subject: XPath fixes, tests, and cleverer get and set FieldByXPath --- .../com/c2kernel/persistency/outcome/Outcome.java | 68 ++++++++++++++++++---- src/test/java/OutcomeTest.java | 37 ++++++++++++ src/test/resources/outcomeTest.xml | 6 ++ 3 files changed, 101 insertions(+), 10 deletions(-) create mode 100644 src/test/java/OutcomeTest.java create mode 100644 src/test/resources/outcomeTest.xml (limited to 'src/test/resources') diff --git a/src/main/java/com/c2kernel/persistency/outcome/Outcome.java b/src/main/java/com/c2kernel/persistency/outcome/Outcome.java index 5604332..9ad84b2 100644 --- a/src/main/java/com/c2kernel/persistency/outcome/Outcome.java +++ b/src/main/java/com/c2kernel/persistency/outcome/Outcome.java @@ -20,6 +20,7 @@ import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSSerializer; import org.xml.sax.InputSource; +import com.c2kernel.common.InvalidDataException; import com.c2kernel.common.ObjectNotFoundException; import com.c2kernel.common.PersistencyException; import com.c2kernel.entity.C2KLocalObject; @@ -73,7 +74,7 @@ public class Outcome implements C2KLocalObject { public Outcome(String path, String data) throws PersistencyException { // derive all the meta data from the path StringTokenizer tok = new StringTokenizer(path,"/"); - if (tok.countTokens() != 3 && !(tok.nextToken().equals("Outcome"))) + if (tok.countTokens() != 3 && !(tok.nextToken().equals(ClusterStorage.OUTCOME))) throw new PersistencyException("Outcome() - Outcome path must have three components: "+path, null); mSchemaType = tok.nextToken(); String verstring = tok.nextToken(); @@ -123,9 +124,63 @@ public class Outcome implements C2KLocalObject { mData = null; } - public void setFieldByXPath(String xpath, String data) throws XPathExpressionException { + public String getFieldByXPath(String xpath) throws XPathExpressionException, InvalidDataException { Node field = getNodeByXPath(xpath); - field.setNodeValue(data); + if (field == null) + throw new InvalidDataException(xpath, ""); + + else if (field.getNodeType()==Node.TEXT_NODE || field.getNodeType()==Node.CDATA_SECTION_NODE) + return field.getNodeValue(); + + else if (field.getNodeType()==Node.ELEMENT_NODE) { + NodeList fieldChildren = field.getChildNodes(); + if (fieldChildren.getLength() == 0) + throw new InvalidDataException("No child node for element", ""); + + else if (fieldChildren.getLength() == 1) { + Node child = fieldChildren.item(0); + if (child.getNodeType()==Node.TEXT_NODE || child.getNodeType()==Node.CDATA_SECTION_NODE) + return child.getNodeValue(); + else + throw new InvalidDataException("Can't get data from child node of type "+child.getNodeName(), ""); + } + else + throw new InvalidDataException("Element "+xpath+" has too many children", ""); + } + else if (field.getNodeType()==Node.ATTRIBUTE_NODE) + return field.getNodeValue(); + else + throw new InvalidDataException("Don't know what to do with node "+field.getNodeName(), ""); + } + + public void setFieldByXPath(String xpath, String data) throws XPathExpressionException, InvalidDataException { + Node field = getNodeByXPath(xpath); + if (field == null) + throw new InvalidDataException(xpath, ""); + + else if (field.getNodeType()==Node.ELEMENT_NODE) { + NodeList fieldChildren = field.getChildNodes(); + if (fieldChildren.getLength() == 0) { + field.appendChild(dom.createTextNode(data)); + } + else if (fieldChildren.getLength() == 1) { + Node child = fieldChildren.item(0); + switch (child.getNodeType()) { + case Node.TEXT_NODE: + case Node.CDATA_SECTION_NODE: + child.setNodeValue(data); + break; + default: + throw new InvalidDataException("Can't set child node of type "+child.getNodeName(), ""); + } + } + else + throw new InvalidDataException("Element "+xpath+" has too many children", ""); + } + else if (field.getNodeType()==Node.ATTRIBUTE_NODE) + field.setNodeValue(data); + else + throw new InvalidDataException("Don't know what to do with node "+field.getNodeName(), ""); } @@ -188,13 +243,6 @@ public class Outcome implements C2KLocalObject { return null; } - public String getFieldByXPath(String xpathExpr) throws XPathExpressionException { - - XPathExpression expr = xpath.compile(xpathExpr); - return (String)expr.evaluate(getDOM(), XPathConstants.STRING); - - } - public NodeList getNodesByXPath(String xpathExpr) throws XPathExpressionException { XPathExpression expr = xpath.compile(xpathExpr); diff --git a/src/test/java/OutcomeTest.java b/src/test/java/OutcomeTest.java new file mode 100644 index 0000000..d90f2ea --- /dev/null +++ b/src/test/java/OutcomeTest.java @@ -0,0 +1,37 @@ +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.c2kernel.persistency.outcome.Outcome; +import com.c2kernel.utils.FileStringUtility; + + +public class OutcomeTest { + + Outcome testOc; + + public OutcomeTest() throws Exception { + String ocData = FileStringUtility.url2String(OutcomeTest.class.getResource("outcomeTest.xml")); + testOc = new Outcome("/Outcome/Test/0/0", ocData); + } + + public void testDOMAccess() throws Exception { + assert "Field1contents".equals(testOc.getField("Field1")) : "getField() failed"; + } + + public void testXPath() throws Exception { + Node field1Node = testOc.getNodeByXPath("//Field1/text()"); + assert field1Node!=null : "XPath for Element query failed"; + assert field1Node.getNodeValue() != null : "Field1 node was null"; + assert field1Node.getNodeValue().equals("Field1contents") : "Incorrect value for element node through XPath"; + assert "Field1contents".equals(testOc.getFieldByXPath("//Field1")): "getFieldByXPath failed"; + testOc.setFieldByXPath("//Field2", "NewField2"); + assert "NewField2".equals(testOc.getFieldByXPath("//Field2")): "getFieldByXPath failed to retrieve updated value"; + assert testOc.getNodeByXPath("//Field2/text()").getNodeValue() != null : "Field2 text node is null"; + assert testOc.getNodeByXPath("//Field2/text()").getNodeValue().equals("NewField2") : "Failed to setFieldByXPath for element"; + Node field2attr = testOc.getNodeByXPath("//Field2/@attr"); + assert field2attr.getNodeValue().equals("attribute"): "Failed to retrieve attribute value via XPath"; + NodeList field3nodes = testOc.getNodesByXPath("//Field3"); + assert field3nodes.getLength()==2 : "getNodesByXPath returned wrong number of nodes"; + + } +} diff --git a/src/test/resources/outcomeTest.xml b/src/test/resources/outcomeTest.xml new file mode 100644 index 0000000..563c72c --- /dev/null +++ b/src/test/resources/outcomeTest.xml @@ -0,0 +1,6 @@ + + Field1contents + + repeating + element + \ No newline at end of file -- cgit v1.2.3