<?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
--- /dev/null
+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;
+ }
+
+}
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();
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";