]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrUtils.java
Minimal Hello World execution module
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.jcr / src / main / java / org / argeo / slc / jcr / SlcJcrUtils.java
index 0cda5a86d68e3d6149163633c907cab67bc3474b..c3cdda7573e421dd7b2408c6775628d8b5fa40c4 100644 (file)
@@ -1,31 +1,51 @@
 package org.argeo.slc.jcr;
 
-/** Utilities around the SLC JCR model. Note that it relies on fixed base paths. */
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.core.execution.PrimitiveAccessor;
+import org.argeo.slc.core.execution.PrimitiveUtils;
+import org.argeo.slc.deploy.ModuleDescriptor;
+
+/**
+ * Utilities around the SLC JCR model. Note that it relies on fixed base paths
+ * (convention over configuration) for optimization purposes.
+ */
 public class SlcJcrUtils {
        public final static Integer AGENT_FACTORY_DEPTH = 3;
-       public final static Integer EXECUTION_MODULES_DEPTH = AGENT_FACTORY_DEPTH + 2;
-       public final static Integer EXECUTION_FLOWS_DEPTH = EXECUTION_MODULES_DEPTH + 3;
 
        /** Extracts the path of a flow relative to its execution module */
        public static String flowRelativePath(String fullFlowPath) {
                String[] tokens = fullFlowPath.split("/");
                StringBuffer buf = new StringBuffer(fullFlowPath.length());
-               for (int i = EXECUTION_FLOWS_DEPTH; i < tokens.length; i++) {
+               for (int i = AGENT_FACTORY_DEPTH + 3; i < tokens.length; i++) {
                        buf.append('/').append(tokens[i]);
                }
                return buf.toString();
        }
 
+       /** Module node name based on module name and version */
+       public static String getModuleNodeName(ModuleDescriptor moduleDescriptor) {
+               return moduleDescriptor.getName() + "_" + moduleDescriptor.getVersion();
+       }
+
        /** Extracts the execution module name of a flow */
        public static String flowExecutionModuleName(String fullFlowPath) {
                String[] tokens = fullFlowPath.split("/");
-               return tokens[EXECUTION_MODULES_DEPTH + 1];
+               String moduleNodeName = tokens[AGENT_FACTORY_DEPTH + 2];
+               return moduleNodeName.substring(0, moduleNodeName.lastIndexOf('_'));
        }
 
        /** Extracts the execution module version of a flow */
        public static String flowExecutionModuleVersion(String fullFlowPath) {
                String[] tokens = fullFlowPath.split("/");
-               return tokens[EXECUTION_MODULES_DEPTH + 2];
+               String moduleNodeName = tokens[AGENT_FACTORY_DEPTH + 2];
+               return moduleNodeName.substring(moduleNodeName.lastIndexOf('_') + 1);
        }
 
        /** Extracts the agent factory of a flow */
@@ -39,16 +59,74 @@ public class SlcJcrUtils {
                return buf.toString();
        }
 
+       /** Create a new execution process path based on the current time */
+       public static String createExecutionProcessPath(String uuid) {
+               Calendar now = new GregorianCalendar();
+               return SlcJcrConstants.PROCESSES_BASE_PATH + '/'
+                               + JcrUtils.dateAsPath(now, true) + uuid;
+       }
+
+       /** Create a new execution result path based on the current time */
+       public static String createResultPath(String uuid) {
+               Calendar now = new GregorianCalendar();
+               return SlcJcrConstants.RESULTS_BASE_PATH + '/'
+                               + JcrUtils.dateAsPath(now, true) + uuid;
+       }
+
+       /**
+        * Set the value of the primitive accessor as a JCR property. Does nothing
+        * if the value is null.
+        */
+       public static void setPrimitiveAsProperty(Node node, String propertyName,
+                       PrimitiveAccessor primitiveAccessor) {
+               String type = primitiveAccessor.getType();
+               Object value = primitiveAccessor.getValue();
+               setPrimitiveAsProperty(node, propertyName, type, value);
+       }
+
+       /** Map a primitive value to JCR property value. */
+       public static void setPrimitiveAsProperty(Node node, String propertyName,
+                       String type, Object value) {
+               if (value == null)
+                       return;
+               if (value instanceof CharSequence)
+                       value = PrimitiveUtils.convert(type,
+                                       ((CharSequence) value).toString());
+
+               try {
+                       if (type.equals(PrimitiveAccessor.TYPE_STRING))
+                               node.setProperty(propertyName, value.toString());
+                       else if (type.equals(PrimitiveAccessor.TYPE_INTEGER))
+                               node.setProperty(propertyName, (long) ((Integer) value));
+                       else if (type.equals(PrimitiveAccessor.TYPE_LONG))
+                               node.setProperty(propertyName, ((Long) value));
+                       else if (type.equals(PrimitiveAccessor.TYPE_FLOAT))
+                               node.setProperty(propertyName, (double) ((Float) value));
+                       else if (type.equals(PrimitiveAccessor.TYPE_DOUBLE))
+                               node.setProperty(propertyName, ((Double) value));
+                       else if (type.equals(PrimitiveAccessor.TYPE_BOOLEAN))
+                               node.setProperty(propertyName, ((Boolean) value));
+                       else
+                               throw new SlcException("Unsupported type " + type);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot set primitive of " + type
+                                       + " as property " + propertyName + " on " + node, e);
+               }
+       }
+
        /** Prevents instantiation */
        private SlcJcrUtils() {
 
        }
 
-       // public static void main(String[] args) {
-       // String path =
-       // "/slc/agents/vm/54654654654/executionModules/org.argeo/1.2.3/myFlow";
-       // System.out.println(flowRelativePath(path));
-       // System.out.println(flowExecutionModuleName(path));
-       // System.out.println(flowAgentFactoryPath(path));
-       // }
+       public static void main(String[] args) {
+               String path = "/slc/agents/vm/default/org.argeo_1.2.3/myPath/myFlow";
+               System.out.println("Flow relative path: " + flowRelativePath(path));
+               System.out.println("Execution Module Name: "
+                               + flowExecutionModuleName(path));
+               System.out.println("Execution Module Version: "
+                               + flowExecutionModuleVersion(path));
+               System.out.println("Agent Factory path: " + flowAgentFactoryPath(path));
+       }
+
 }