Introduce JCR metadata writer
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 31 Oct 2012 07:47:03 +0000 (07:47 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 31 Oct 2012 07:47:03 +0000 (07:47 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@5680 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

demo/modules/org.argeo.slc.demo.basic/META-INF/spring/basic.xml
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/JcrMetadataWriter.java [new file with mode: 0644]
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcJcrUtils.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcNames.java

index b55754ab40ac276bdf99e2e9d1d684229d25c581..d0434549b9f613eb0ff8abbfcfaf051b49af3961 100644 (file)
@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <beans xmlns="http://www.springframework.org/schema/beans"\r
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"\r
-       xmlns:aop="http://www.springframework.org/schema/aop"\r
-       xmlns:flow="http://www.argeo.org/schema/slc-flow"\r
+       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:flow="http://www.argeo.org/schema/slc-flow"\r
        xsi:schemaLocation="\r
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd\r
                </property>\r
        </bean>\r
 \r
-       <!--\r
-               <bean id="basic.ref" factory-bean="basic.spec"\r
-               factory-method="createRef" abstract="true" />\r
-       -->\r
+       <!-- <bean id="basic.ref" factory-bean="basic.spec" factory-method="createRef" \r
+               abstract="true" /> -->\r
 \r
        <bean id="basic.flowTemplate" parent="slcTemplate.simpleFlow"\r
                abstract="true">\r
                                        <property name="testData" ref="ref1" />\r
                                </bean>\r
 \r
+                               <bean class="org.argeo.slc.jcr.JcrMetadataWriter">\r
+                                       <property name="metadata">\r
+                                               <map>\r
+                                                       <entry key="metadata1" value="value1" />\r
+                                                       <entry key="slc:metadata2" value="value2" />\r
+                                               </map>\r
+                                       </property>\r
+                                       <property name="baseNode">\r
+                                               <bean factory-bean="basic.testResult" factory-method="getNode" />\r
+                                       </property>\r
+                                       <flow:variable />\r
+                               </bean>\r
+\r
                                <!-- Attachments -->\r
                                <bean parent="task.echo">\r
                                        <property name="message" value="DATA" />\r
                <property name="repository" ref="repository" />\r
        </bean>\r
 \r
-<!--   <bean id="basic.testResult" parent="slcDefault.test.basicTreeTestResult" -->\r
-<!--           scope="execution"> -->\r
-<!--           <property name="listeners" ref="resultListeners" /> -->\r
-<!--           <property name="attributes"> -->\r
-<!--                   <map> -->\r
-<!--                           <entry key="testedComponentId" value="@{testedComponentId}" /> -->\r
-<!--                   </map> -->\r
-<!--           </property> -->\r
-<!--           <aop:scoped-proxy /> -->\r
-<!--   </bean> -->\r
+       <!-- <bean id="basic.testResult" parent="slcDefault.test.basicTreeTestResult" -->\r
+       <!-- scope="execution"> -->\r
+       <!-- <property name="listeners" ref="resultListeners" /> -->\r
+       <!-- <property name="attributes"> -->\r
+       <!-- <map> -->\r
+       <!-- <entry key="testedComponentId" value="@{testedComponentId}" /> -->\r
+       <!-- </map> -->\r
+       <!-- </property> -->\r
+       <!-- <aop:scoped-proxy /> -->\r
+       <!-- </bean> -->\r
 \r
        <bean id="basic.testRun" class="org.argeo.slc.core.test.SimpleTestRun"\r
                abstract="true">\r
diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/JcrMetadataWriter.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/JcrMetadataWriter.java
new file mode 100644 (file)
index 0000000..98e0183
--- /dev/null
@@ -0,0 +1,64 @@
+package org.argeo.slc.jcr;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+
+/**
+ * Writes arbitrary metadata into a child node of a given node (or the node
+ * itself if metadata node name is set to null)
+ */
+public class JcrMetadataWriter implements Runnable {
+       private final static Log log = LogFactory.getLog(JcrMetadataWriter.class);
+
+       private Node baseNode;
+       private String metadataNodeName = SlcNames.SLC_METADATA;
+
+       private Map<String, String> metadata = new HashMap<String, String>();
+
+       public void run() {
+               try {
+                       Node metadataNode;
+                       if (metadataNodeName != null)
+                               metadataNode = baseNode.hasNode(metadataNodeName) ? baseNode
+                                               .getNode(metadataNodeName) : baseNode
+                                               .addNode(metadataNodeName);
+                       else
+                               metadataNode = baseNode;
+
+                       for (String key : metadata.keySet())
+                               metadataNode.setProperty(key, metadata.get(key));
+
+                       baseNode.getSession().save();
+
+                       if (log.isDebugEnabled())
+                               log.debug("Wrote " + metadata.size() + " metadata entries to "
+                                               + metadataNode);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot write metadata to " + baseNode, e);
+               } finally {
+                       JcrUtils.discardUnderlyingSessionQuietly(baseNode);
+               }
+
+       }
+
+       public void setBaseNode(Node baseNode) {
+               this.baseNode = baseNode;
+       }
+
+       public void setMetadataNodeName(String metadataNodeName) {
+               this.metadataNodeName = metadataNodeName;
+       }
+
+       public void setMetadata(Map<String, String> metadata) {
+               this.metadata = metadata;
+       }
+
+}
index e0e52c0d517d4c071d50188f8ad6118ae1c99fe3..8e78d7fcdfd971ffdbf36aa74fda44b90f087a12 100644 (file)
@@ -59,6 +59,14 @@ public class SlcJcrUtils implements SlcNames {
                return buf.toString();
        }
 
+       /** Extracts the module name from a flow path */
+       public static String moduleName(String fullFlowPath) {
+               String[] tokens = fullFlowPath.split("/");
+               String moduleName = tokens[AGENT_FACTORY_DEPTH + 2];
+               moduleName = moduleName.substring(0, moduleName.indexOf('_'));
+               return moduleName;
+       }
+
        /** Module node name based on module name and version */
        public static String getModuleNodeName(ModuleDescriptor moduleDescriptor) {
                return moduleDescriptor.getName() + "_" + moduleDescriptor.getVersion();
index 6a310373854f7a068fde235483b48e9968228cee..4686e127006077e46edda3808407163ac0594a07 100644 (file)
@@ -26,6 +26,7 @@ public interface SlcNames {
        public final static String SLC_VERSION = "slc:version";
        public final static String SLC_VALUE = "slc:value";
        public final static String SLC_ADDRESS = "slc:address";
+       public final static String SLC_METADATA = "slc:metadata";
 
        public final static String SLC_STARTED = "slc:started";
        public final static String SLC_COMPLETED = "slc:completed";