From aaa9509c6f4e5ac0edb308041d1ffa361b468a5f Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 2 Apr 2014 15:30:06 +0200 Subject: ResourceImportHandler interface to allow custom types or override the structure of standard ones. Specify with ResourceImportHandler. c2kprop. DefaultResourceImportHandler is used if not defined, which handled the 5 standard types (CA,EA,OD,SC,SM). Fixes #178 --- .../resource/DefaultResourceImportHandler.java | 87 ++++++++++++++++++++++ .../process/resource/ResourceImportHandler.java | 47 ++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 src/main/java/com/c2kernel/process/resource/DefaultResourceImportHandler.java create mode 100644 src/main/java/com/c2kernel/process/resource/ResourceImportHandler.java (limited to 'src/main/java/com/c2kernel/process/resource') diff --git a/src/main/java/com/c2kernel/process/resource/DefaultResourceImportHandler.java b/src/main/java/com/c2kernel/process/resource/DefaultResourceImportHandler.java new file mode 100644 index 0000000..afcf021 --- /dev/null +++ b/src/main/java/com/c2kernel/process/resource/DefaultResourceImportHandler.java @@ -0,0 +1,87 @@ +package com.c2kernel.process.resource; + +import java.util.HashSet; +import java.util.Set; + +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.persistency.outcome.Outcome; +import com.c2kernel.process.Gateway; +import com.c2kernel.property.PropertyDescriptionList; + +public class DefaultResourceImportHandler implements ResourceImportHandler { + + String resType; + String schemaName; + String typeRoot; + DomainPath typeRootPath; + String wfDef; + PropertyDescriptionList props; + + public DefaultResourceImportHandler(String resType) throws Exception { + this.resType = resType; + if (resType.equals("CA")) { + wfDef = "ManageCompositeActDef"; + schemaName = "CompositeActivityDef"; + typeRoot = "/desc/ActivityDesc"; + } + else if (resType.equals("EA")) { + wfDef = "ManageElementaryActDef"; + schemaName = "ElementaryActivityDef"; + typeRoot = "/desc/ActivityDesc"; + } + else if (resType.equals("OD")) { + wfDef = "ManageSchema"; + schemaName = "Schema"; + typeRoot = "/desc/OutcomeDesc"; + } + else if (resType.equals("SC")) { + wfDef = "ManageScript"; + schemaName = "Script"; + typeRoot = "/desc/Script"; + } + else if (resType.equals("SM")) { + wfDef = "ManageStateMachine"; + schemaName = "StateMachine"; + typeRoot = "/desc/StateMachine"; + } + else throw new Exception("Unknown bootstrap item type: "+resType); + typeRootPath = new DomainPath(typeRoot); + props = (PropertyDescriptionList)Gateway.getMarshaller().unmarshall(Gateway.getResource().getTextResource(null, "boot/property/"+resType+"Prop.xml")); + } + + @Override + public DomainPath getTypeRoot() { + return typeRootPath; + } + + @Override + public String getName() { + return schemaName; + } + + @Override + public DomainPath getPath(String name, String ns) throws Exception { + return new DomainPath(typeRoot+"/system/"+(ns==null?"kernel":ns)+'/'+name); + } + + @Override + public Set getResourceOutcomes(String name, String ns, String location, int version) throws Exception { + HashSet retArr = new HashSet(); + String data = Gateway.getResource().getTextResource(ns, location); + if (data == null) + throw new Exception("No data found for "+schemaName+" "+name); + Outcome resOutcome = new Outcome(0, data, schemaName, 0); + retArr.add(resOutcome); + return retArr; + } + + @Override + public PropertyDescriptionList getPropDesc() throws Exception { + return props; + } + + @Override + public String getWorkflowName() throws Exception { + return wfDef; + } +} diff --git a/src/main/java/com/c2kernel/process/resource/ResourceImportHandler.java b/src/main/java/com/c2kernel/process/resource/ResourceImportHandler.java new file mode 100644 index 0000000..8f825b5 --- /dev/null +++ b/src/main/java/com/c2kernel/process/resource/ResourceImportHandler.java @@ -0,0 +1,47 @@ +package com.c2kernel.process.resource; + +import java.util.Set; + +import com.c2kernel.lookup.DomainPath; +import com.c2kernel.persistency.outcome.Outcome; +import com.c2kernel.property.PropertyDescriptionList; + +public interface ResourceImportHandler { + + + /** Returns the DomainPath for a specific resource + * @param ns - module namespace + * @param name - resource name + * @return + */ + public DomainPath getPath(String name, String ns) throws Exception; + + /** Generates the outcomes that the resource should contain. + * @param res - the module resource definition + * @return a set of outcomes to be synced with the resource item. + * @throws Exception - if the supplied resources are not valid + */ + public Set getResourceOutcomes(String name, String ns, String location, int version) throws Exception; + + /** Gives the CompActDef name to instantiate to provide the workflow for this type of resource. + * Should be found in the CA typeroot (/desc/ActivityDesc/) + * @return String workflow name + * @throws Exception + */ + public String getWorkflowName() throws Exception; + + /** Should return all of the Properties the resource Item + * will have on creation. The Property 'Name' will be created and populated automatically, even if not declared. + * @return a PropertyDescriptionList - an arraylist of PropertyDescriptions + * @throws Exception + */ + public PropertyDescriptionList getPropDesc() throws Exception; + + /** The directory context to search for existing resources. The name of the resource must be unique below this point. + * @return Root path + */ + public DomainPath getTypeRoot(); + + public String getName(); + +} -- cgit v1.2.3 From a399f7cb69c94f02a7942147a9c4766a0d5152e3 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 9 Apr 2014 11:48:45 +0200 Subject: BadArgumentsException - more specific exception thrown by readC2KArgs when the arguments are wrong. --- src/main/java/com/c2kernel/process/AbstractMain.java | 17 +++++++++-------- .../process/resource/BadArgumentsException.java | 17 +++++++++++++++++ src/test/java/LauncherTest.java | 9 +++++---- 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/c2kernel/process/resource/BadArgumentsException.java (limited to 'src/main/java/com/c2kernel/process/resource') diff --git a/src/main/java/com/c2kernel/process/AbstractMain.java b/src/main/java/com/c2kernel/process/AbstractMain.java index b594c1a..e241ee2 100644 --- a/src/main/java/com/c2kernel/process/AbstractMain.java +++ b/src/main/java/com/c2kernel/process/AbstractMain.java @@ -17,6 +17,7 @@ import java.io.PrintStream; import java.util.Enumeration; import java.util.Properties; +import com.c2kernel.process.resource.BadArgumentsException; import com.c2kernel.utils.FileStringUtility; import com.c2kernel.utils.Logger; @@ -33,7 +34,7 @@ abstract public class AbstractMain /************************************************************************** * reading and setting input paramaters **************************************************************************/ - public static Properties readC2KArgs( String[] args ) throws Exception { + public static Properties readC2KArgs( String[] args ) throws BadArgumentsException { Properties c2kProps; Properties argProps = new Properties(); int logLevel = 0; @@ -44,7 +45,7 @@ abstract public class AbstractMain if (args[i].startsWith("-") && args[i].length()>1) { String key = args[i].substring(1); if (argProps.containsKey(key)) - throw new Exception("Argument "+args[i]+" given twice"); + throw new BadArgumentsException("Argument "+args[i]+" given twice"); String value = ""; if (!args[i+1].startsWith("-")) value = args[++i]; @@ -52,7 +53,7 @@ abstract public class AbstractMain i++; } else - throw new Exception("Bad argument: "+args[i]); + throw new BadArgumentsException("Bad argument: "+args[i]); } @@ -61,7 +62,7 @@ abstract public class AbstractMain logStream = new PrintStream(new FileOutputStream(argProps.getProperty("logFile"), true)); } catch (FileNotFoundException e) { e.printStackTrace(); - throw new Exception("Logfile "+argProps.getProperty("logFile")+" cannot be created"); + throw new BadArgumentsException("Logfile "+argProps.getProperty("logFile")+" cannot be created"); } // Set up log stream @@ -78,10 +79,10 @@ abstract public class AbstractMain String configPath = argProps.getProperty("config"); if (configPath == null) - throw new Exception("Config file not specified"); + throw new BadArgumentsException("Config file not specified"); if (!new File(configPath).exists()) - throw new Exception("Config file "+configPath+" not found"); + throw new BadArgumentsException("Config file "+configPath+" not found"); else Logger.msg(0, "Config file: "+configPath); @@ -91,10 +92,10 @@ abstract public class AbstractMain String connectFile = c2kProps.getProperty("connect"); if (connectFile == null) - throw new Exception("Connect file not specified"); + throw new BadArgumentsException("Connect file not specified"); if (!new File(connectFile).exists()) - throw new Exception("Connect file "+connectFile+" not found"); + throw new BadArgumentsException("Connect file "+connectFile+" not found"); else Logger.msg(0, "Connect file: "+connectFile); diff --git a/src/main/java/com/c2kernel/process/resource/BadArgumentsException.java b/src/main/java/com/c2kernel/process/resource/BadArgumentsException.java new file mode 100644 index 0000000..c7fe7cf --- /dev/null +++ b/src/main/java/com/c2kernel/process/resource/BadArgumentsException.java @@ -0,0 +1,17 @@ +package com.c2kernel.process.resource; + +public class BadArgumentsException extends Exception { + + public BadArgumentsException() { + super(); + } + + public BadArgumentsException(String message) { + super(message); + } + + public BadArgumentsException(Throwable cause) { + super(cause); + } + +} diff --git a/src/test/java/LauncherTest.java b/src/test/java/LauncherTest.java index 39c2b6e..8abba93 100644 --- a/src/test/java/LauncherTest.java +++ b/src/test/java/LauncherTest.java @@ -1,6 +1,7 @@ import java.util.Properties; import com.c2kernel.process.AbstractMain; +import com.c2kernel.process.resource.BadArgumentsException; import com.c2kernel.utils.Logger; @@ -40,7 +41,7 @@ public class LauncherTest { try { props = AbstractMain.readC2KArgs(args); throw new Exception("Invalid connect file not detected"); - } catch (Exception ex) { } + } catch (BadArgumentsException ex) { } } public void testWrongConnectFileName() throws Exception { @@ -49,7 +50,7 @@ public class LauncherTest { try { props = AbstractMain.readC2KArgs(args); throw new Exception("Invalid connect file not detected"); - } catch (Exception ex) { } + } catch (BadArgumentsException ex) { } } public void testMissingConnectArg() throws Exception { @@ -59,7 +60,7 @@ public class LauncherTest { try { props = AbstractMain.readC2KArgs(args); throw new Exception("Missing connect file not detected"); - } catch (Exception ex) { } + } catch (BadArgumentsException ex) { } } public void testMissingConfigArg() throws Exception { @@ -69,6 +70,6 @@ public class LauncherTest { try { props = AbstractMain.readC2KArgs(args); throw new Exception("Missing config file not detected"); - } catch (Exception ex) { } + } catch (BadArgumentsException ex) { } } } -- cgit v1.2.3 From c7f54d570ab6a8a3c3ba1db6045d003f988f191d Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 9 Apr 2014 11:50:42 +0200 Subject: ResourceLoader.getModuleDefURLs interface method to allow the ResourceLoader to specify exactly where the module.xml files come from. Dumpc2kProps cleanup --- src/main/java/com/c2kernel/process/Gateway.java | 8 ++------ src/main/java/com/c2kernel/process/resource/Resource.java | 6 ++++++ src/main/java/com/c2kernel/process/resource/ResourceLoader.java | 3 +++ 3 files changed, 11 insertions(+), 6 deletions(-) (limited to 'src/main/java/com/c2kernel/process/resource') diff --git a/src/main/java/com/c2kernel/process/Gateway.java b/src/main/java/com/c2kernel/process/Gateway.java index 0d9dbe6..ea49ded 100644 --- a/src/main/java/com/c2kernel/process/Gateway.java +++ b/src/main/java/com/c2kernel/process/Gateway.java @@ -108,7 +108,7 @@ public class Gateway // init module manager try { - mModules = new ModuleManager(ClassLoader.getSystemResources("META-INF/cristal/module.xml"), AbstractMain.runningAsWrapper); + mModules = new ModuleManager(mResource.getModuleDefURLs(), AbstractMain.runningAsWrapper); } catch (Exception e) { Logger.error(e); throw new InvalidDataException("Could not load module definitions.", ""); @@ -437,11 +437,7 @@ public class Gateway static public void dumpC2KProps(int logLevel) { if (!Logger.doLog(logLevel)) return; - Logger.msg(logLevel, "C2K Properties:"); - for (Enumeration e = propertyNames(); e.hasMoreElements();) { - String name = (String) e.nextElement(); - Logger.msg(" "+name+": "+getProperty(name)); - } + mC2KProps.dumpProps(logLevel); } static public ObjectProperties getProperties() { diff --git a/src/main/java/com/c2kernel/process/resource/Resource.java b/src/main/java/com/c2kernel/process/resource/Resource.java index 4d07f35..2ee95c5 100644 --- a/src/main/java/com/c2kernel/process/resource/Resource.java +++ b/src/main/java/com/c2kernel/process/resource/Resource.java @@ -3,6 +3,7 @@ package com.c2kernel.process.resource; //Java import java.net.MalformedURLException; import java.net.URL; +import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; @@ -160,4 +161,9 @@ public class Resource implements ResourceLoader { throw new ObjectNotFoundException(e.getMessage(),null); } } + + @Override + public Enumeration getModuleDefURLs() throws Exception { + return ClassLoader.getSystemResources("META-INF/cristal/module.xml"); + } } diff --git a/src/main/java/com/c2kernel/process/resource/ResourceLoader.java b/src/main/java/com/c2kernel/process/resource/ResourceLoader.java index fdf2508..2bbc4d1 100644 --- a/src/main/java/com/c2kernel/process/resource/ResourceLoader.java +++ b/src/main/java/com/c2kernel/process/resource/ResourceLoader.java @@ -2,6 +2,7 @@ package com.c2kernel.process.resource; import java.net.MalformedURLException; import java.net.URL; +import java.util.Enumeration; import java.util.HashMap; import com.c2kernel.common.InvalidDataException; @@ -38,4 +39,6 @@ public interface ResourceLoader { public Class getClassForName(String name) throws ClassNotFoundException; + public Enumeration getModuleDefURLs() throws Exception; + } \ No newline at end of file -- cgit v1.2.3