]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
JCR based execution modules view
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Apr 2011 16:52:25 +0000 (16:52 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Apr 2011 16:52:25 +0000 (16:52 +0000)
NEW - bug 17: Generalize agent management and registration beyond JMS
https://bugzilla.argeo.org/show_bug.cgi?id=17

git-svn-id: https://svn.argeo.org/slc/trunk@4450 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

18 files changed:
eclipse/plugins/org.argeo.slc.client.rcp/icons/slc_execution_perspective.gif [deleted file]
eclipse/plugins/org.argeo.slc.client.ui/META-INF/MANIFEST.MF
eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/jcr.xml [new file with mode: 0644]
eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/osgi.xml
eclipse/plugins/org.argeo.slc.client.ui/icons/slc_execution_perspective.gif [new file with mode: 0644]
eclipse/plugins/org.argeo.slc.client.ui/plugin.xml
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/SlcExecutionPerspective.java
eclipse/plugins/org.argeo.slc.client.ui/src/main/java/org/argeo/slc/client/ui/views/JcrExecutionModulesView.java
modules/server/org.argeo.slc.node.jackrabbit/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.node.jackrabbit/META-INF/spring/jackrabbit.xml
modules/server/org.argeo.slc.server.jcr/META-INF/spring/jcr-osgi.xml
modules/server/org.argeo.slc.server.jcr/META-INF/spring/jcr.xml
runtime/org.argeo.slc.repo/src/main/resources/org/argeo/slc/repo/repo.cnd
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/SlcTypes.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrAgent.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/execution/JcrExecutionModulesListener.java
runtime/org.argeo.slc.support.jcr/src/main/resources/org/argeo/slc/jcr/slc.cnd [new file with mode: 0644]
runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/OsgiExecutionModulesManager.java

diff --git a/eclipse/plugins/org.argeo.slc.client.rcp/icons/slc_execution_perspective.gif b/eclipse/plugins/org.argeo.slc.client.rcp/icons/slc_execution_perspective.gif
deleted file mode 100644 (file)
index b8ca14a..0000000
Binary files a/eclipse/plugins/org.argeo.slc.client.rcp/icons/slc_execution_perspective.gif and /dev/null differ
index 611233eb06a1d038c937b862ad73504dd7d05252..212722d7b95241775d18d32f4108dedfb2d60223 100644 (file)
@@ -13,11 +13,15 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.argeo.slc.client.ui,
  org.argeo.slc.client.ui.listeners,
  org.argeo.slc.client.ui.views
-Import-Package: org.apache.commons.io;version="1.4.0",
+Import-Package: javax.jcr;version="2.0.0",
+ javax.jcr.observation;version="2.0.0",
+ org.apache.commons.io;version="1.4.0",
  org.apache.commons.logging;version="1.1.1",
  org.argeo,
  org.argeo.eclipse.spring,
  org.argeo.eclipse.ui,
+ org.argeo.eclipse.ui.jcr,
+ org.argeo.jcr.spring,
  org.argeo.slc,
  org.argeo.slc.build,
  org.argeo.slc.client.oxm,
@@ -32,6 +36,7 @@ Import-Package: org.apache.commons.io;version="1.4.0",
  org.argeo.slc.dao.test.tree,
  org.argeo.slc.deploy,
  org.argeo.slc.execution,
+ org.argeo.slc.jcr,
  org.argeo.slc.msg.test.tree,
  org.argeo.slc.process,
  org.argeo.slc.runtime,
diff --git a/eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/jcr.xml b/eclipse/plugins/org.argeo.slc.client.ui/META-INF/spring/jcr.xml
new file mode 100644 (file)
index 0000000..072ed63
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+       <!-- Views -->
+       <bean id="jcrExecutionModulesView" class="org.argeo.slc.client.ui.views.JcrExecutionModulesView"
+               scope="prototype">
+               <property name="processController" ref="processController" />
+               <property name="session" ref="session" />
+       </bean>
+
+
+       <bean id="session" class="org.argeo.jcr.spring.ThreadBoundSession">
+               <property name="repository" ref="repository" />
+       </bean>
+</beans>
index 917cf66ac62c3822c9560818c55dadf3d109ce08..8b613485e0d505a9c26530e96e857003ad413adc 100644 (file)
        <service ref="slcExecutionServiceAdapter" interface="org.argeo.slc.process.SlcExecutionNotifier" />\r
 \r
        <!-- References needed by the current bundle -->\r
+       <reference id="repository" interface="javax.jcr.Repository"\r
+               filter="(argeo.jcr.repository.alias=slc)" />\r
+\r
+\r
        <reference id="slcExecutionService" interface="org.argeo.slc.services.SlcExecutionService" />\r
        <reference id="testManagerService" interface="org.argeo.slc.services.TestManagerService" />\r
        <reference id="oxmBean" interface="org.argeo.slc.client.oxm.OxmInterface" />\r
diff --git a/eclipse/plugins/org.argeo.slc.client.ui/icons/slc_execution_perspective.gif b/eclipse/plugins/org.argeo.slc.client.ui/icons/slc_execution_perspective.gif
new file mode 100644 (file)
index 0000000..b8ca14a
Binary files /dev/null and b/eclipse/plugins/org.argeo.slc.client.ui/icons/slc_execution_perspective.gif differ
index 36aa61d6d5a0e76fc5fbdea720bd790aecd06793..a32b219997747c3d9a0d5accfbd06cd0280c9680 100644 (file)
                 name="Execution Modules"
                 restorable="true">
           </view>
+          <view
+                class="org.argeo.eclipse.spring.SpringExtensionFactory"
+                icon="icons/execution_module.gif"
+                id="org.argeo.slc.client.ui.jcrExecutionModulesView"
+                name="Execution Modules"
+                restorable="true">
+          </view>
           <view
                 class="org.argeo.eclipse.spring.SpringExtensionFactory"
                 icon="icons/results.gif"
          point="org.eclipse.ui.perspectives">
       <perspective
             class="org.argeo.slc.client.ui.SlcExecutionPerspective"
+            icon="icons/slc_execution_perspective.gif"
             id="org.argeo.slc.client.ui.slcExecutionPerspective"
             name="SLC Execution">
       </perspective>
index abc013020db7bd6ed20f9e4cba80d9a9b4d86b6c..81547347b89278d24b5b4d714efe1851006f008f 100644 (file)
@@ -29,7 +29,7 @@ public class SlcExecutionPerspective implements IPerspectiveFactory {
                                IPageLayout.RIGHT, 0.6f, "main");
 
                // add the views to the corresponding place holder
-               left.addView("org.argeo.slc.client.ui.executionModulesView");
+               left.addView("org.argeo.slc.client.ui.jcrExecutionModulesView");
                left.addView("org.argeo.slc.client.ui.resultListView");
 
                main.addView("org.argeo.slc.client.ui.processBuilderView");
index a06509c2102f7ad490bbf066cdddab26a3243de7..210ac342872271793ea2c21f7ba927b1f53c4efc 100644 (file)
@@ -3,28 +3,42 @@ package org.argeo.slc.client.ui.views;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Properties;
 import java.util.UUID;
 
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider;
+import org.argeo.eclipse.ui.jcr.NodesWrapper;
+import org.argeo.eclipse.ui.jcr.SimpleNodeContentProvider;
+import org.argeo.eclipse.ui.jcr.WrappedNode;
 import org.argeo.slc.SlcException;
-import org.argeo.slc.client.oxm.OxmInterface;
 import org.argeo.slc.client.ui.ClientUiPlugin;
 import org.argeo.slc.client.ui.controllers.ProcessController;
 import org.argeo.slc.client.ui.providers.ExecutionModulesContentProvider;
 import org.argeo.slc.client.ui.providers.ExecutionModulesContentProvider.FlowNode;
-import org.argeo.slc.execution.ExecutionModuleDescriptor;
+import org.argeo.slc.jcr.SlcJcrConstants;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
 import org.argeo.slc.process.RealizedFlow;
 import org.argeo.slc.process.SlcExecution;
 import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IContentProvider;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
@@ -34,25 +48,26 @@ import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.part.ViewPart;
 
-public class JcrExecutionModulesView extends ViewPart {
+public class JcrExecutionModulesView extends ViewPart implements SlcTypes,
+               SlcNames {
        private final static Log log = LogFactory
                        .getLog(JcrExecutionModulesView.class);
 
-       public static final String ID = "org.argeo.slc.client.ui.executionModulesView";
+       public static final String ID = "org.argeo.slc.client.ui.jcrExecutionModulesView";
 
        private TreeViewer viewer;
 
-       // Ioc
-       private IContentProvider contentProvider;
-       private OxmInterface oxmBean;
+       private Session session;
+
        private ProcessController processController;
 
        public void createPartControl(Composite parent) {
                viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+
+               ViewContentProvider contentProvider = new ViewContentProvider(session);
+
                viewer.setContentProvider(contentProvider);
                viewer.setLabelProvider(new ViewLabelProvider());
                viewer.setInput(getViewSite());
@@ -60,6 +75,19 @@ public class JcrExecutionModulesView extends ViewPart {
                int operations = DND.DROP_COPY | DND.DROP_MOVE;
                Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
                viewer.addDragSupport(operations, tt, new ViewDragListener());
+
+               try {
+                       session.getWorkspace()
+                                       .getObservationManager()
+                                       .addEventListener(
+                                                       new VmAgentObserver(),
+                                                       Event.NODE_ADDED | Event.NODE_REMOVED
+                                                                       | Event.NODE_MOVED,
+                                                       SlcJcrConstants.VM_AGENT_FACTORY_PATH, true, null,
+                                                       null, false);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot add observer", e);
+               }
        }
 
        public void setFocus() {
@@ -74,41 +102,118 @@ public class JcrExecutionModulesView extends ViewPart {
                viewer.setInput(getViewSite());
        }
 
-       class ViewLabelProvider extends LabelProvider implements
+       class ViewContentProvider extends SimpleNodeContentProvider {
+
+               public ViewContentProvider(Session session) {
+                       super(session,
+                                       new String[] { SlcJcrConstants.VM_AGENT_FACTORY_PATH });
+               }
+
+               @Override
+               protected Object[] getChildren(Node node) throws RepositoryException {
+                       if (node.isNodeType(SlcTypes.SLC_AGENT_PROXY)) {
+                               List<AgentNodesWrapper> wrappers = new ArrayList<AgentNodesWrapper>();
+                               for (NodeIterator nit = node.getNodes(); nit.hasNext();) {
+                                       wrappers.add(new AgentNodesWrapper(nit.nextNode()));
+                               }
+                               return wrappers.toArray();
+                       }
+                       return super.getChildren(node);
+               }
+
+               @Override
+               protected Object[] sort(Object parent, Object[] children) {
+                       Object[] sorted = new Object[children.length];
+                       System.arraycopy(children, 0, sorted, 0, children.length);
+                       Arrays.sort(sorted, new ViewComparator());
+                       return sorted;
+               }
+       }
+
+       static class ViewComparator implements Comparator<Object> {
+
+               public int compare(Object o1, Object o2) {
+                       try {
+                               if (o1 instanceof Node && o2 instanceof Node) {
+                                       Node node1 = (Node) o1;
+                                       Node node2 = (Node) o2;
+                                       if (node1.isNodeType(SLC_EXECUTION_FLOW)
+                                                       && node2.isNodeType(SLC_EXECUTION_FLOW)) {
+                                               return node1.getName().compareTo(node2.getName());
+                                       } else if (node1.isNodeType(SLC_EXECUTION_FLOW)
+                                                       && !node2.isNodeType(SLC_EXECUTION_FLOW)) {
+                                               return 1;
+                                       } else if (!node1.isNodeType(SLC_EXECUTION_FLOW)
+                                                       && node2.isNodeType(SLC_EXECUTION_FLOW)) {
+                                               return -1;
+                                       } else {
+                                               // TODO: check title
+                                               return node1.getName().compareTo(node2.getName());
+                                       }
+                               }
+                       } catch (RepositoryException e) {
+                               throw new ArgeoException("Cannot compare " + o1 + " and " + o2,
+                                               e);
+                       }
+                       return 0;
+               }
+
+       }
+
+       /** Wraps the execution modules of an agent. */
+       static class AgentNodesWrapper extends NodesWrapper {
+
+               public AgentNodesWrapper(Node node) {
+                       super(node);
+               }
+
+               protected List<WrappedNode> getWrappedNodes()
+                               throws RepositoryException {
+                       List<WrappedNode> children = new ArrayList<WrappedNode>();
+                       Node executionModules = getNode().getNode(
+                                       SlcNames.SLC_EXECUTION_MODULES);
+                       for (NodeIterator nit = executionModules.getNodes(); nit.hasNext();) {
+                               for (NodeIterator nitVersions = nit.nextNode().getNodes(); nitVersions
+                                               .hasNext();) {
+                                       children.add(new WrappedNode(this, nitVersions.nextNode()));
+                               }
+                       }
+                       return children;
+               }
+
+       }
+
+       class VmAgentObserver implements EventListener {
+
+               public void onEvent(EventIterator events) {
+                       viewer.refresh();
+               }
+
+       }
+
+       class ViewLabelProvider extends DefaultNodeLabelProvider implements
                        ITableLabelProvider {
                public String getColumnText(Object obj, int index) {
-                       if (obj instanceof ExecutionModulesContentProvider.ExecutionModuleNode) {
-                               ExecutionModuleDescriptor emd = ((ExecutionModulesContentProvider.ExecutionModuleNode) obj)
-                                               .getDescriptor();
-                               if (emd.getLabel() != null) {
-                                       return emd.getLabel();
-                               } else {
-                                       return getText(emd);
-                               }
-                       } else
-                               return getText(obj);
+                       return getText(obj);
                }
 
                public Image getColumnImage(Object obj, int index) {
                        return getImage(obj);
                }
 
-               public Image getImage(Object obj) {
-                       if (obj instanceof ExecutionModulesContentProvider.AgentNode)
+               public Image getImage(Node node) throws RepositoryException {
+                       if (node.getParent().isNodeType(SlcTypes.SLC_AGENT_PROXY))
                                return ClientUiPlugin.getDefault().getImageRegistry()
                                                .get("agent");
-                       else if (obj instanceof ExecutionModulesContentProvider.ExecutionModuleNode)
+                       else if (node.isNodeType(SlcTypes.SLC_MODULE))
                                return ClientUiPlugin.getDefault().getImageRegistry()
                                                .get("executionModule");
-                       else if (obj instanceof ExecutionModulesContentProvider.FolderNode)
-                               return ClientUiPlugin.getDefault().getImageRegistry()
-                                               .get("folder");
-                       else if (obj instanceof ExecutionModulesContentProvider.FlowNode)
+                       else if (node.isNodeType(SlcTypes.SLC_EXECUTION_FLOW))
                                return ClientUiPlugin.getDefault().getImageRegistry()
                                                .get("flow");
                        else
-                               return PlatformUI.getWorkbench().getSharedImages()
-                                               .getImage(ISharedImages.IMG_OBJ_ELEMENT);
+                               return ClientUiPlugin.getDefault().getImageRegistry()
+                                               .get("folder");
                }
        }
 
@@ -200,26 +305,21 @@ public class JcrExecutionModulesView extends ViewPart {
                        realizedFlow.setExecutionSpec(fn.getExecutionFlowDescriptor()
                                        .getExecutionSpec());
 
-                       props.setProperty("RealizedFlowAsXml",
-                                       oxmBean.marshal(realizedFlow));
-                       System.out
-                                       .println(oxmBean.marshal(fn.getExecutionFlowDescriptor()));
+                       // props.setProperty("RealizedFlowAsXml",
+                       // oxmBean.marshal(realizedFlow));
+                       // System.out
+                       // .println(oxmBean.marshal(fn.getExecutionFlowDescriptor()));
 
                }
 
        }
 
-       // IoC
-       public void setContentProvider(IContentProvider contentProvider) {
-               this.contentProvider = contentProvider;
-       }
-
        public void setProcessController(ProcessController processController) {
                this.processController = processController;
        }
 
-       public void setOxmBean(OxmInterface oxmBean) {
-               this.oxmBean = oxmBean;
+       public void setSession(Session session) {
+               this.session = session;
        }
 
 }
\ No newline at end of file
index d1c6a7cc0454a1f768c25d05e4760c69ab3ccaba..c49eabdcc08dc81ca9af24d558743a03e59b531b 100644 (file)
@@ -9,6 +9,7 @@ Import-Package: javax.jcr;version="[2.0.0,3.0.0)",
  org.argeo.jcr,
  org.argeo.security,
  org.argeo.security.jackrabbit,
+ org.argeo.slc.jcr,
  org.argeo.slc.repo,
  org.postgresql;version="[8.3.0,9.0.0)",
  org.springframework.beans.factory.config;version="2.5.6.SEC01"
index 12f8265f00cca4184ffc9f8a6a91da315e024c22..dd9d6fd2a9a3e460b978f41319ea96fa64ffbe95 100644 (file)
                <property name="repository" ref="nodeRepository" />
                <property name="namespaces">
                        <map>
-                               <entry key="slc" value="http://www.argeo.org/slc" />
+                               <entry key="slc" value="http://www.argeo.org/ns/slc" />
                        </map>
                </property>
                <property name="cndFiles">
                        <list>
+                               <value>classpath:/org/argeo/slc/jcr/slc.cnd</value>
                                <value>classpath:/org/argeo/slc/repo/repo.cnd</value>
                        </list>
                </property>
index f682f931e173330d1ec3facdcef8f71f0335d044..a629e465ea2764536039022187e86d6b6ceb3754 100644 (file)
@@ -7,7 +7,7 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
 \r
        <!-- REFERENCES -->\r
-       <reference id="nodeRepository" interface="javax.jcr.Repository"\r
+       <reference id="repository" interface="javax.jcr.Repository"\r
                filter="(argeo.jcr.repository.alias=slc)" />\r
 \r
        <reference id="modulesManager"\r
index bd435bbd1466664aa30fa2537525bc79c0ed2ba6..ba5e1e16126dec4bdb38343b926e10453e202d0e 100644 (file)
@@ -25,7 +25,7 @@
        </bean>\r
 \r
        <bean id="session" class="org.argeo.security.jcr.SecureThreadBoundSession">\r
-               <property name="repository" ref="nodeRepository" />\r
+               <property name="repository" ref="repository" />\r
        </bean>\r
 \r
        <bean class="org.argeo.security.core.SystemExecutionBeanPostProcessor">\r
index 2cb35462a5be4f03c2a653ed8278b06484d599ee..ca2cf1cbe7c7063295284be24c06990b82f6c554 100644 (file)
@@ -1,4 +1,4 @@
-<slc = 'http://www.argeo.org/slc'>
+<slc = 'http://www.argeo.org/ns/slc'>
 
 // AETHER
 [slc:artifact] > nt:base, mix:shareable
index 6f8202052e283eff6f228dcfb7bb621e6223dc22..d0a45662c588389019c16c5bebfc7d3a3597ddf4 100644 (file)
@@ -3,7 +3,8 @@ package org.argeo.slc.jcr;
 /** JCR node types used by SLC */
 public interface SlcTypes {
 
-       public final static String SLC_AGENT = "slc:agent";
+       public final static String SLC_AGENT_PROXY = "slc:agentProxy";
+       //public final static String SLC_AGENT = "slc:agent";
        public final static String SLC_MODULE = "slc:module";
        public final static String SLC_EXECUTION_FLOW = "slc:executionFlow";
 
index 9327f8b6abd47f6a9650819d2b5419d65ac74627..d5b1be19b3312f5f20de1f595db7b2237f96ec1c 100644 (file)
@@ -11,6 +11,7 @@ import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.SlcException;
 import org.argeo.slc.core.runtime.DefaultAgent;
 import org.argeo.slc.jcr.SlcJcrConstants;
+import org.argeo.slc.jcr.SlcTypes;
 import org.argeo.slc.runtime.SlcAgent;
 import org.argeo.slc.runtime.SlcAgentFactory;
 
@@ -25,6 +26,7 @@ public class JcrAgent extends DefaultAgent implements SlcAgentFactory {
                try {
                        Node vmAgentFactoryNode = JcrUtils.mkdirs(session,
                                        SlcJcrConstants.VM_AGENT_FACTORY_PATH);
+                       vmAgentFactoryNode.addMixin(SlcTypes.SLC_AGENT_PROXY);
                        if (!vmAgentFactoryNode.hasNodes()) {
                                String uuid = UUID.randomUUID().toString();
                                vmAgentFactoryNode.addNode(uuid);
index 1dc79046cdd683f7b2cc7987f79fb17cfdcd7228..7a01e6746974d15ceed925990138db0f3d723e2b 100644 (file)
@@ -7,7 +7,6 @@ import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -18,6 +17,7 @@ import org.argeo.slc.execution.ExecutionFlowDescriptor;
 import org.argeo.slc.execution.ExecutionModulesListener;
 import org.argeo.slc.jcr.SlcJcrConstants;
 import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
 import org.argeo.slc.runtime.SlcAgent;
 
 /**
@@ -72,7 +72,11 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener {
                                        .getVersion()) ? moduleName.getNode(moduleDescriptor
                                        .getVersion()) : moduleName.addNode(moduleDescriptor
                                        .getVersion());
-                       moduleVersion.addMixin(NodeType.MIX_TITLE);
+                       moduleVersion.addMixin(SlcTypes.SLC_MODULE);
+                       moduleVersion.setProperty(SlcNames.SLC_NAME,
+                                       moduleDescriptor.getName());
+                       moduleVersion.setProperty(SlcNames.SLC_VERSION,
+                                       moduleDescriptor.getVersion());
                        moduleVersion.setProperty(Property.JCR_TITLE,
                                        moduleDescriptor.getTitle());
                        moduleVersion.setProperty(Property.JCR_DESCRIPTION,
@@ -105,7 +109,7 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener {
                        ExecutionFlowDescriptor executionFlow) {
                String path = getExecutionFlowPath(module, executionFlow);
                try {
-                       Node flowNode;
+                       Node flowNode = null;
                        if (!session.nodeExists(path)) {
                                Node base = session.getNode(getExecutionModulesPath());
                                Node moduleNode = base.getNode(module.getName() + '/'
@@ -125,10 +129,15 @@ public class JcrExecutionModulesListener implements ExecutionModulesListener {
                                                        flowNode = currNode.addNode(name);
                                        }
                                }
+                               flowNode.addMixin(SlcTypes.SLC_EXECUTION_FLOW);
+                               flowNode.setProperty(SlcNames.SLC_NAME, executionFlow.getName());
                                session.save();
                        } else {
                                flowNode = session.getNode(path);
                        }
+
+                       if (log.isTraceEnabled())
+                               log.trace("Flow " + executionFlow + " added to JCR");
                } catch (RepositoryException e) {
                        throw new SlcException("Cannot add flow " + executionFlow
                                        + " from module " + module, e);
diff --git a/runtime/org.argeo.slc.support.jcr/src/main/resources/org/argeo/slc/jcr/slc.cnd b/runtime/org.argeo.slc.support.jcr/src/main/resources/org/argeo/slc/jcr/slc.cnd
new file mode 100644 (file)
index 0000000..e82799f
--- /dev/null
@@ -0,0 +1,19 @@
+<slc = 'http://www.argeo.org/ns/slc'>
+
+[slc:nameVersion] > nt:base
+mixin
+- slc:name (STRING) m
+- slc:version (STRING) m
+
+[slc:agentProxy] > mix:title
+mixin
+
+[slc:module] > slc:nameVersion,mix:title
+mixin
+
+[slc:executionFlow] > mix:title
+mixin
+- slc:name (STRING) m
+
+
+
index ed4b7faea33bcb7d80e84d2211f241fb3c33e741..9a5ee35ae0d40eb9eab3a5b8bdb7c94ee2f8aa4d 100644 (file)
@@ -322,7 +322,7 @@ public class OsgiExecutionModulesManager extends
                        Set<ExecutionFlow> flows = executionFlows.get(osgiBundle);
                        flows.remove(executionFlow);
                        if (log.isTraceEnabled())
-                               log.debug("Removed " + executionFlow + " from " + osgiBundle);
+                               log.trace("Removed " + executionFlow + " from " + osgiBundle);
                        if (flows.size() == 0) {
                                executionFlows.remove(osgiBundle);
                                if (log.isTraceEnabled())