Converted activities to use JSON configuration.
Moved port generation code from activity configuration to activity factories.

git-svn-id: 
http://taverna.googlecode.com/svn/taverna/engine/net.sf.taverna.t2.activities/trunk/dependency-activity@15846
 bf327186-88b3-11dd-a302-d386e5130c1c


Project: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/commit/10b17505
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/tree/10b17505
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/diff/10b17505

Branch: refs/heads/master
Commit: 10b17505123da056785e0f4fbf4dc70a600c1094
Parents: 13491a0
Author: [email protected] 
<[email protected]@bf327186-88b3-11dd-a302-d386e5130c1c>
Authored: Mon Jul 8 10:00:17 2013 +0000
Committer: [email protected] 
<[email protected]@bf327186-88b3-11dd-a302-d386e5130c1c>
Committed: Mon Jul 8 10:00:17 2013 +0000

----------------------------------------------------------------------
 pom.xml                                         |  5 ++
 .../AbstractAsynchronousDependencyActivity.java | 67 ++++++++------------
 src/main/resources/schema.json                  | 25 ++++++++
 3 files changed, 58 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/10b17505/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index a91b407..3dfe3d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,6 +21,11 @@
                        <artifactId>taverna-app-configuration-api</artifactId>
                        <version>${taverna.configuration.version}</version>
                </dependency>
+               <dependency>
+                       <groupId>com.fasterxml.jackson.core</groupId>
+                       <artifactId>jackson-databind</artifactId>
+                       <version>2.2.2</version>
+               </dependency>
        </dependencies>
 </project>
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/10b17505/src/main/java/net/sf/taverna/t2/activities/dependencyactivity/AbstractAsynchronousDependencyActivity.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/net/sf/taverna/t2/activities/dependencyactivity/AbstractAsynchronousDependencyActivity.java
 
b/src/main/java/net/sf/taverna/t2/activities/dependencyactivity/AbstractAsynchronousDependencyActivity.java
index d804b0e..fbd31d2 100644
--- 
a/src/main/java/net/sf/taverna/t2/activities/dependencyactivity/AbstractAsynchronousDependencyActivity.java
+++ 
b/src/main/java/net/sf/taverna/t2/activities/dependencyactivity/AbstractAsynchronousDependencyActivity.java
@@ -39,6 +39,8 @@ import org.apache.log4j.Logger;
 
 import uk.org.taverna.configuration.app.ApplicationConfiguration;
 
+import com.fasterxml.jackson.databind.JsonNode;
+
 /**
  * A parent abstract class for activities that require dependency management, 
such as
  * API Consumer and Beanshell. Defines dependencies on local JAR files
@@ -47,11 +49,8 @@ import 
uk.org.taverna.configuration.app.ApplicationConfiguration;
  * @author Alex Nenadic
  * @author Tom Oinn
  * @author Stian Soiland-Reyes
- *
- * @param <ConfigType> the configuration type used for this activity
- *
  */
-public abstract class AbstractAsynchronousDependencyActivity<ConfigType> 
extends AbstractAsynchronousActivity<ConfigType>{
+public abstract class AbstractAsynchronousDependencyActivity extends 
AbstractAsynchronousActivity<JsonNode> {
 
        private static final String LOCAL_JARS = "Local jars";
 
@@ -78,13 +77,10 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
         */
        protected ClassLoader classLoader = null;
 
-       private ApplicationConfiguration applicationConfiguration;
-
        /**
         * The location of the <code>lib</code> directory in TAVERNA_HOME,
         * where local JAR files the activity depends on should be located.
         */
-//     public static File libDir = new 
File(ApplicationRuntime.getInstance().getApplicationHomeDir(), "lib");
        public File libDir;
 
        /**
@@ -131,15 +127,14 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
         * @return A new or existing {@link ClassLoader} according to the
         *         classloader sharing policy
         */
-       protected ClassLoader 
findClassLoader(DependencyActivityConfigurationBean configurationBean, String 
workflowRunID) throws RuntimeException{
-
-               ClassLoaderSharing classLoaderSharing = 
configurationBean.getClassLoaderSharing();
+       protected ClassLoader findClassLoader(JsonNode json, String 
workflowRunID) throws RuntimeException{
+               ClassLoaderSharing classLoaderSharing = 
ClassLoaderSharing.valueOf(json.get("classLoaderSharing").textValue());
 
                if (classLoaderSharing == ClassLoaderSharing.workflow) {
                        synchronized (workflowClassLoaders) {
                                ClassLoader cl = 
workflowClassLoaders.get(workflowRunID);
                                if (cl == null) {
-                                       cl = makeClassLoader(configurationBean, 
workflowRunID);
+                                       cl = makeClassLoader(json, 
workflowRunID);
                                        workflowClassLoaders.put(workflowRunID, 
cl);
                                }
                                return cl;
@@ -176,15 +171,12 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
         *
         * @return A {@link ClassLoader} capable of accessing all the 
dependencies (both local jar and artifact)
         */
-       private ClassLoader makeClassLoader(
-                       DependencyActivityConfigurationBean configurationBean,
-                       String workflowID) {
-
+       private ClassLoader makeClassLoader(JsonNode json, String workflowID) {
                // Find all artifact dependencies
 //             HashSet<URL> urls = findDependencies(ARTIFACTS, 
configurationBean, workflowID);
 
                // Add all local jar dependencies
-               HashSet<URL> urls = findDependencies(LOCAL_JARS, 
configurationBean, workflowID);
+               HashSet<URL> urls = findDependencies(LOCAL_JARS, json, 
workflowID);
 
                // Create the classloader capable of loading both local jar and 
artifact dependencies
                ClassLoader parent = this.getClass().getClassLoader(); // this 
will be a LocalArtifactClassLoader
@@ -236,11 +228,8 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
         * sharing policy (passed inside configuration bean) and a 
workflowRunID (used to
         * retrieve the workflow) that will be added to this activity 
classloader's list of URLs.
         */
-       private HashSet<URL> findDependencies(String dependencyType,
-                       DependencyActivityConfigurationBean configurationBean,
-                       String workflowRunID) {
-
-               ClassLoaderSharing classLoaderSharing = 
configurationBean.getClassLoaderSharing();
+       private HashSet<URL> findDependencies(String dependencyType, JsonNode 
json, String workflowRunID) {
+               ClassLoaderSharing classLoaderSharing = 
ClassLoaderSharing.valueOf(json.get("classLoaderSharing").textValue());
                // Get the WorkflowInstanceFacade which contains the current 
workflow
                WeakReference<WorkflowInstanceFacade> wfFacadeRef = 
WorkflowInstanceFacade.workflowRunFacades.get(workflowRunID);
                WorkflowInstanceFacade wfFacade = null;
@@ -265,23 +254,25 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
                                if (!proc.getActivityList().isEmpty() && 
proc.getActivityList().get(0) instanceof NestedDataflow){
                                        // Get the nested workflow
                                        Dataflow nestedWorkflow = 
((NestedDataflow) proc.getActivityList().get(0)).getNestedDataflow();
-                                       
dependenciesURLs.addAll(findNestedDependencies(dependencyType, 
configurationBean, nestedWorkflow));
+                                       
dependenciesURLs.addAll(findNestedDependencies(dependencyType, json, 
nestedWorkflow));
                                }
                                else{ // Not nested - go through all of the 
processor's activities
                                        Activity<?> activity = 
proc.getActivityList().get(0);
                                        if (activity instanceof 
AbstractAsynchronousDependencyActivity){
-                                               if 
(((DependencyActivityConfigurationBean) activity
-                                                               
.getConfiguration()).getClassLoaderSharing() == classLoaderSharing) {
+                                               
AbstractAsynchronousDependencyActivity dependencyActivity = 
(AbstractAsynchronousDependencyActivity) activity;
+                                               if 
(ClassLoaderSharing.valueOf(dependencyActivity.getConfiguration().get("classLoaderSharing").textValue())
 == classLoaderSharing) {
 //                                                     if 
(dependencyType.equals(LOCAL_JARS)){
                                                                // Collect the 
files of all found local dependencies
-                                                               for (String jar 
: 
((DependencyActivityConfigurationBean)activity.getConfiguration()).getLocalDependencies())
 {
+                                                       if 
(dependencyActivity.getConfiguration().has("localDependency")) {
+                                                               for (JsonNode 
jar : dependencyActivity.getConfiguration().get("localDependency")) {
                                                                        try {
-                                                                               
dependencies.add(new File(libDir, jar));
+                                                                               
dependencies.add(new File(libDir, jar.textValue()));
                                                                        } catch 
(Exception ex) {
                                                                                
logger.warn("Invalid URL for " + jar, ex);
                                                                                
continue;
                                                                        }
                                                                }
+                                                       }
 //                                                     } else if 
(dependencyType.equals(ARTIFACTS) && this.getClass().getClassLoader() 
instanceof LocalArtifactClassLoader){
 //                                                             
LocalArtifactClassLoader cl = (LocalArtifactClassLoader) 
this.getClass().getClassLoader(); // this class is always loaded with 
LocalArtifactClassLoader
 //                                                             // Get the 
LocalReposotpry capable of finding artifact jar files
@@ -298,14 +289,16 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
                        }
                } else { // Just add dependencies for this activity since we 
can't get hold of the whole workflow
 //                     if (dependencyType.equals(LOCAL_JARS)){
-                               for (String jar : 
configurationBean.getLocalDependencies()) {
+                       if (json.has("localDependency")) {
+                               for (JsonNode jar : 
json.get("localDependency")) {
                                        try {
-                                               dependencies.add(new 
File(libDir, jar));
+                                               dependencies.add(new 
File(libDir, jar.textValue()));
                                        } catch (Exception ex) {
                                                logger.warn("Invalid URL for " 
+ jar, ex);
                                                continue;
                                        }
                                }
+                       }
 //                     }
 //                     else if (dependencyType.equals(ARTIFACTS)){
 //                             if (this.getClass().getClassLoader() instanceof 
LocalArtifactClassLoader){ // This should normally be the case
@@ -341,11 +334,8 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
        /**
         * Finds dependencies for a nested workflow.
         */
-       private HashSet<URL> findNestedDependencies(String dependencyType,
-                       DependencyActivityConfigurationBean configurationBean,
-                       Dataflow nestedWorkflow) {
-
-               ClassLoaderSharing classLoaderSharing = 
configurationBean.getClassLoaderSharing();
+       private HashSet<URL> findNestedDependencies(String dependencyType, 
JsonNode json, Dataflow nestedWorkflow) {
+               ClassLoaderSharing classLoaderSharing = 
ClassLoaderSharing.valueOf(json.get("classLoaderSharing").textValue());
 
                // Files of dependencies for all activities in the nested 
workflow that share the classloading policy
                HashSet<File> dependencies = new HashSet<File>();
@@ -357,20 +347,19 @@ public abstract class 
AbstractAsynchronousDependencyActivity<ConfigType> extends
                        if (!proc.getActivityList().isEmpty() && 
proc.getActivityList().get(0) instanceof NestedDataflow){
                                // Get the nested workflow
                                Dataflow nestedNestedWorkflow = 
((NestedDataflow) proc.getActivityList().get(0)).getNestedDataflow();
-                               
dependenciesURLs.addAll(findNestedDependencies(dependencyType, 
configurationBean, nestedNestedWorkflow));
+                               
dependenciesURLs.addAll(findNestedDependencies(dependencyType, json, 
nestedNestedWorkflow));
                        }
                        else{ // Not nested - go through all of the processor's 
activities
                                Activity<?> activity = 
proc.getActivityList().get(0);
                                if (activity instanceof 
AbstractAsynchronousDependencyActivity){
-
-                                       if 
(((DependencyActivityConfigurationBean) activity
-                                                       
.getConfiguration()).getClassLoaderSharing() == classLoaderSharing) {
+                                       AbstractAsynchronousDependencyActivity 
dependencyActivity = (AbstractAsynchronousDependencyActivity) activity;
+                                       if 
(ClassLoaderSharing.valueOf(dependencyActivity.getConfiguration().get("classLoaderSharing").textValue())
 == classLoaderSharing) {
 
 //                                             if 
(dependencyType.equals(LOCAL_JARS)){
                                                        // Collect the files of 
all found local dependencies
-                                                       for (String jar : 
((DependencyActivityConfigurationBean)activity.getConfiguration()).getLocalDependencies())
 {
+                                                       for (JsonNode jar : 
dependencyActivity.getConfiguration().get("localDependency")) {
                                                                try {
-                                                                       
dependencies.add(new File(libDir, jar));
+                                                                       
dependencies.add(new File(libDir, jar.textValue()));
                                                                } catch 
(Exception ex) {
                                                                        
logger.warn("Invalid URL for " + jar, ex);
                                                                        
continue;

http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/10b17505/src/main/resources/schema.json
----------------------------------------------------------------------
diff --git a/src/main/resources/schema.json b/src/main/resources/schema.json
new file mode 100644
index 0000000..c30459f
--- /dev/null
+++ b/src/main/resources/schema.json
@@ -0,0 +1,25 @@
+{
+    "$schema": "http://json-schema.org/draft-03/schema#";,
+    "id": "http://ns.taverna.org.uk/2010/activity/dependency.schema.json";,
+    "title": "Dependency activity configuration",
+    "type": "object",
+    "properties": {
+        "@context": {
+            "description": "JSON-LD context for interpreting the configuration 
as RDF",
+            "required": true,
+            "enum": 
["http://ns.taverna.org.uk/2010/activity/dependency.context.json";]
+        },
+        "classLoaderSharing": {
+            "title": "ClassLoader Sharing Policy",
+            "description": "Policy for sharing class loaders across multiple 
beanshell activities",
+            "default": "workflow",
+            "enum": ["workflow", "system"]
+        },
+        "localDependency": {
+            "title": "Local Dependencies",
+            "description": "Location of jar files to be added to the beanshell 
class loader",
+            "type": "array",
+            "items": { "type" : "string" }
+        }
+    }
+}

Reply via email to