From 289c85bbe2b06073b69fb661380ef742328b77dd Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 15 Mar 2009 11:50:22 +0000 Subject: [PATCH] Introduce JMS based notifications git-svn-id: https://svn.argeo.org/slc/trunk@2272 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/MANIFEST.MF | 3 +- .../META-INF/spring/jms.xml | 12 ++ .../META-INF/spring/osgi.xml | 3 +- .../org.argeo.slc.demo.basic/conf/basic.xml | 1 + .../org.argeo.slc.demo.basic/conf/common.xml | 4 +- .../org.argeo.slc.demo.basic/conf/osgi.xml | 2 + demo/site/org.argeo.slc.demo.deploy/pom.xml | 4 +- .../META-INF/MANIFEST.MF | 13 +-- .../conf/manager-osgi.xml | 5 + .../impl/test/TestManagerServiceImpl.java | 44 ++++++++ .../slc/services/test/TestManagerService.java | 9 ++ .../slc/jms/JmsTreeTestResultListener.java | 105 ++++++++++++++++++ .../org/argeo/slc/activemq/destinations.xml | 7 ++ .../test/tree/TreeTestResultDaoHibernate.java | 3 +- .../argeo/slc/core/test/SimpleTestRun.java | 32 +++++- .../bundles/logging/log4j.properties | 1 + .../META-INF/MANIFEST.MF | 3 +- .../META-INF/spring/jms-osgi.xml | 2 + .../META-INF/spring/jms.xml | 33 +++++- .../META-INF/MANIFEST.MF | 6 +- .../META-INF/spring/services-osgi.xml | 3 + .../META-INF/spring/services.xml | 16 ++- 22 files changed, 291 insertions(+), 20 deletions(-) create mode 100644 runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTreeTestResultListener.java diff --git a/demo/site/org.argeo.slc.demo.agent/META-INF/MANIFEST.MF b/demo/site/org.argeo.slc.demo.agent/META-INF/MANIFEST.MF index b166dcc16..0a964fd25 100644 --- a/demo/site/org.argeo.slc.demo.agent/META-INF/MANIFEST.MF +++ b/demo/site/org.argeo.slc.demo.agent/META-INF/MANIFEST.MF @@ -5,7 +5,8 @@ Import-Package: javax.jms, org.apache.activemq.command, org.springframework.jms.listener, - org.springframework.oxm.castor + org.springframework.oxm.castor, + org.springframework.jms.core Require-Bundle: org.argeo.slc.support.activemq, org.argeo.slc.specs, diff --git a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml index 448ac8ebb..f0214ef48 100644 --- a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml +++ b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/jms.xml @@ -33,4 +33,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml index 450b60f4a..b6b025c2d 100644 --- a/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml +++ b/demo/site/org.argeo.slc.demo.agent/META-INF/spring/osgi.xml @@ -6,9 +6,10 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + + - \ No newline at end of file diff --git a/demo/site/org.argeo.slc.demo.basic/conf/basic.xml b/demo/site/org.argeo.slc.demo.basic/conf/basic.xml index 2ef168634..975b93f0b 100644 --- a/demo/site/org.argeo.slc.demo.basic/conf/basic.xml +++ b/demo/site/org.argeo.slc.demo.basic/conf/basic.xml @@ -39,6 +39,7 @@ + diff --git a/demo/site/org.argeo.slc.demo.basic/conf/common.xml b/demo/site/org.argeo.slc.demo.basic/conf/common.xml index 75f40055c..f2d252b3c 100644 --- a/demo/site/org.argeo.slc.demo.basic/conf/common.xml +++ b/demo/site/org.argeo.slc.demo.basic/conf/common.xml @@ -7,7 +7,9 @@ - + + + diff --git a/demo/site/org.argeo.slc.demo.basic/conf/osgi.xml b/demo/site/org.argeo.slc.demo.basic/conf/osgi.xml index ebc3364ba..050e4c771 100644 --- a/demo/site/org.argeo.slc.demo.basic/conf/osgi.xml +++ b/demo/site/org.argeo.slc.demo.basic/conf/osgi.xml @@ -8,4 +8,6 @@ + + \ No newline at end of file diff --git a/demo/site/org.argeo.slc.demo.deploy/pom.xml b/demo/site/org.argeo.slc.demo.deploy/pom.xml index e6a30ccf0..9e73311eb 100644 --- a/demo/site/org.argeo.slc.demo.deploy/pom.xml +++ b/demo/site/org.argeo.slc.demo.deploy/pom.xml @@ -14,7 +14,9 @@ org.springframework.osgi.extender, - org.argeo.slc.demo.basic + org.argeo.slc.demo.basic, + org.argeo.slc.demo.manager, + org.argeo.slc.support.equinox diff --git a/demo/site/org.argeo.slc.demo.manager/META-INF/MANIFEST.MF b/demo/site/org.argeo.slc.demo.manager/META-INF/MANIFEST.MF index 3ee9f68e9..b972bfb26 100644 --- a/demo/site/org.argeo.slc.demo.manager/META-INF/MANIFEST.MF +++ b/demo/site/org.argeo.slc.demo.manager/META-INF/MANIFEST.MF @@ -1,14 +1,7 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 Bundle-Name: Manager Plug-in Bundle-SymbolicName: org.argeo.slc.demo.manager Bundle-Version: 1.0.0 Spring-Context: conf/* -Created-By: 1.6.0_0 (Sun Microsystems Inc.) -Import-Package: org.apache.commons.logging;version="1.1", - org.argeo.slc.core.execution;version="0.11.3.SNAPSHOT", - org.argeo.slc.execution;version="0.11.3.SNAPSHOT", - org.springframework.beans.factory.config;version="2.5.6.A" -Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt -Bundle-DocURL: http://www.argeo.org -Tool: Bnd-0.0.255 +Require-Bundle: + org.argeo.slc.specs, + org.argeo.slc.support.simple diff --git a/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml b/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml index 36419b408..16d57c127 100644 --- a/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml +++ b/demo/site/org.argeo.slc.demo.manager/conf/manager-osgi.xml @@ -10,4 +10,9 @@ cardinality="0..N" /> + + + + + \ No newline at end of file diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/test/TestManagerServiceImpl.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/test/TestManagerServiceImpl.java index 0b2b5655d..2489dd468 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/test/TestManagerServiceImpl.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/test/TestManagerServiceImpl.java @@ -2,11 +2,15 @@ package org.argeo.slc.services.impl.test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.slc.core.test.tree.TreeTestResult; import org.argeo.slc.core.test.tree.TreeTestResultCollection; import org.argeo.slc.dao.process.SlcExecutionDao; import org.argeo.slc.dao.test.TestRunDescriptorDao; import org.argeo.slc.dao.test.tree.TreeTestResultCollectionDao; import org.argeo.slc.dao.test.tree.TreeTestResultDao; +import org.argeo.slc.msg.test.tree.CloseTreeTestResultRequest; +import org.argeo.slc.msg.test.tree.CreateTreeTestResultRequest; +import org.argeo.slc.msg.test.tree.ResultPartRequest; import org.argeo.slc.process.SlcExecution; import org.argeo.slc.services.test.TestManagerService; import org.argeo.slc.test.TestRunDescriptor; @@ -32,6 +36,9 @@ public class TestManagerServiceImpl implements TestManagerService { public void registerTestRunDescriptor(TestRunDescriptor testRunDescriptor) { if (testRunDescriptor != null) { + if (log.isTraceEnabled()) + log.trace("Registering test run descriptor #" + + testRunDescriptor.getTestRunUuid()); testRunDescriptorDao.saveOrUpdate(testRunDescriptor); // Update tree test result collection @@ -48,6 +55,12 @@ public class TestManagerServiceImpl implements TestManagerService { addResultToCollection(collectionId, testRunDescriptor .getTestResultUuid()); } + } else { +// log +// .trace("ResultUUID=" +// + testRunDescriptor.getTestResultUuid()); +// addResultToCollection("default", testRunDescriptor +// .getTestResultUuid()); } } } @@ -78,4 +91,35 @@ public class TestManagerServiceImpl implements TestManagerService { } } + public void createTreeTestResult(CreateTreeTestResultRequest msg) { + TreeTestResult treeTestResult = msg.getTreeTestResult(); + + if (log.isTraceEnabled()) + log.trace("Creating result #" + treeTestResult.getUuid()); + treeTestResultDao.create(treeTestResult); + + registerTestRunDescriptor(msg.getTestRunDescriptor()); + } + + public void addResultPart(ResultPartRequest msg) { + registerTestRunDescriptor(msg.getTestRunDescriptor()); + + if (log.isTraceEnabled()) + log.trace("Adding result part to test result #" + + msg.getResultUuid()); + + treeTestResultDao.addResultPart(msg.getResultUuid(), msg.getPath(), msg + .getResultPart(), msg.getRelatedElements()); + // treeTestResultDao.updateAttributes(msg.getResultUuid(), msg + // .getAttributes()); + } + + public void closeTreeTestResult(CloseTreeTestResultRequest msg) { + if (log.isTraceEnabled()) + log.trace("Closing result #" + msg.getResultUuid() + " at date " + + msg.getCloseDate()); + + treeTestResultDao.close(msg.getResultUuid(), msg.getCloseDate()); + } + } diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/test/TestManagerService.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/test/TestManagerService.java index 19cde15cf..1a54884e2 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/test/TestManagerService.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/test/TestManagerService.java @@ -1,5 +1,8 @@ package org.argeo.slc.services.test; +import org.argeo.slc.msg.test.tree.CloseTreeTestResultRequest; +import org.argeo.slc.msg.test.tree.CreateTreeTestResultRequest; +import org.argeo.slc.msg.test.tree.ResultPartRequest; import org.argeo.slc.test.TestRunDescriptor; /** Performs complex business operations. */ @@ -13,4 +16,10 @@ public interface TestManagerService { /** Removes a result from a collection based on their ids. */ public void removeResultFromCollection(String collectionId, String resultUuid); + + public void createTreeTestResult(CreateTreeTestResultRequest msg); + + public void addResultPart(ResultPartRequest msg); + + public void closeTreeTestResult(CloseTreeTestResultRequest msg); } diff --git a/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTreeTestResultListener.java b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTreeTestResultListener.java new file mode 100644 index 000000000..b315c0143 --- /dev/null +++ b/runtime/org.argeo.slc.support.activemq/src/main/java/org/argeo/slc/jms/JmsTreeTestResultListener.java @@ -0,0 +1,105 @@ +package org.argeo.slc.jms; + +import javax.jms.Destination; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.SlcException; +import org.argeo.slc.core.test.tree.TreeTestResult; +import org.argeo.slc.msg.test.tree.CloseTreeTestResultRequest; +import org.argeo.slc.msg.test.tree.CreateTreeTestResultRequest; +import org.argeo.slc.msg.test.tree.ResultPartRequest; +import org.argeo.slc.test.TestResultListener; +import org.argeo.slc.test.TestResultPart; +import org.springframework.jms.core.JmsTemplate; + +public class JmsTreeTestResultListener implements + TestResultListener { + private final Log log = LogFactory.getLog(getClass()); + + private Boolean onlyOnClose = false; + private JmsTemplate jmsTemplate; + + private Destination createDestination; + private Destination addResultPartDestination; + private Destination closeDestination; + + public void resultPartAdded(TreeTestResult testResult, + TestResultPart testResultPart) { + if (onlyOnClose) + return; + + try { + if (testResult.getResultParts().size() == 1 + && testResult.getResultParts().values().iterator().next() + .getParts().size() == 1) { + CreateTreeTestResultRequest req = new CreateTreeTestResultRequest( + testResult); + + if (log.isDebugEnabled()) + log.debug("Send create result request for result " + + testResult.getUuid()); + + jmsTemplate.convertAndSend(createDestination, req); + } else { + ResultPartRequest req = new ResultPartRequest(testResult); + + if (log.isDebugEnabled()) + log.debug("Send result parts for result " + + testResult.getUuid()); + + jmsTemplate.convertAndSend(addResultPartDestination, req); + } + } catch (Exception e) { + throw new SlcException("Could not notify to JMS", e); + } + } + + public void close(TreeTestResult testResult) { + try { + if (onlyOnClose) { + CreateTreeTestResultRequest req = new CreateTreeTestResultRequest( + testResult); + + if (log.isDebugEnabled()) + log.debug("Send create result request for result " + + testResult.getUuid()); + + jmsTemplate.convertAndSend(createDestination, req); + } else { + CloseTreeTestResultRequest req = new CloseTreeTestResultRequest( + testResult); + + if (log.isDebugEnabled()) + log.debug("Send close result request for result " + + testResult.getUuid()); + + jmsTemplate.convertAndSend(closeDestination, req); + + } + } catch (Exception e) { + throw new SlcException("Could not notify to JMS", e); + } + } + + public void setOnlyOnClose(Boolean onlyOnClose) { + this.onlyOnClose = onlyOnClose; + } + + public void setJmsTemplate(JmsTemplate jmsTemplate) { + this.jmsTemplate = jmsTemplate; + } + + public void setCreateDestination(Destination createDestination) { + this.createDestination = createDestination; + } + + public void setAddResultPartDestination(Destination addResultPartDestination) { + this.addResultPartDestination = addResultPartDestination; + } + + public void setCloseDestination(Destination closeDestination) { + this.closeDestination = closeDestination; + } + +} diff --git a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml index 764711cb6..8b27dfbd6 100644 --- a/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml +++ b/runtime/org.argeo.slc.support.activemq/src/main/resources/org/argeo/slc/activemq/destinations.xml @@ -12,6 +12,13 @@ + + + + diff --git a/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernate.java b/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernate.java index c0290965f..fefa76de8 100644 --- a/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernate.java +++ b/runtime/org.argeo.slc.support.hibernate/src/main/java/org/argeo/slc/hibernate/test/tree/TreeTestResultDaoHibernate.java @@ -88,7 +88,8 @@ public class TreeTestResultDaoHibernate extends HibernateDaoSupport implements treeTestResult.getResultParts().put(path, lst); } lst.getParts().add(resultPart); - treeTestResult.getElements().putAll(relatedElements); + if (relatedElements != null) + treeTestResult.getElements().putAll(relatedElements); session.update(treeTestResult); return treeTestResult; diff --git a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/test/SimpleTestRun.java b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/test/SimpleTestRun.java index a81c109d3..bab085990 100644 --- a/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/test/SimpleTestRun.java +++ b/runtime/org.argeo.slc.support.simple/src/main/java/org/argeo/slc/core/test/SimpleTestRun.java @@ -2,10 +2,14 @@ package org.argeo.slc.core.test; import java.util.UUID; +import org.argeo.slc.core.structure.tree.TreeSPath; +import org.argeo.slc.core.structure.tree.TreeSRegistry; import org.argeo.slc.deploy.DeployedSystem; import org.argeo.slc.process.SlcExecution; import org.argeo.slc.process.SlcExecutionRelated; import org.argeo.slc.process.SlcExecutionStep; +import org.argeo.slc.structure.StructureAware; +import org.argeo.slc.structure.StructureRegistry; import org.argeo.slc.test.ExecutableTestRun; import org.argeo.slc.test.TestData; import org.argeo.slc.test.TestDefinition; @@ -16,12 +20,15 @@ import org.argeo.slc.test.WritableTestRun; * A basic bean implementation of a WritableTestRun, holding * references to the various parts of a test run. */ -public class SimpleTestRun implements WritableTestRun, ExecutableTestRun, SlcExecutionRelated { +public class SimpleTestRun implements WritableTestRun, ExecutableTestRun, + SlcExecutionRelated { private String uuid; private String slcExecutionUuid; private String slcExecutionStepUuid; + private String path; + private DeployedSystem deployedSystem; private TestData testData; private TestDefinition testDefinition; @@ -29,9 +36,28 @@ public class SimpleTestRun implements WritableTestRun, ExecutableTestRun, SlcExe /** Executes the underlying test definition. */ public void execute() { + TreeSPath basePath = null; + StructureRegistry registry = null; + if (path != null) { + // TODO: generalize + basePath = new TreeSPath(path); + registry = new TreeSRegistry(); + } + uuid = UUID.randomUUID().toString(); if (testResult != null) testResult.notifyTestRun(this); + + // Structure + if (testResult != null && basePath != null + && testResult instanceof StructureAware) + ((StructureAware) testResult).notifyCurrentPath( + registry, basePath); + + if (basePath != null && testDefinition instanceof StructureAware) + ((StructureAware) testDefinition).notifyCurrentPath( + registry, basePath); + testDefinition.execute(this); } @@ -101,4 +127,8 @@ public class SimpleTestRun implements WritableTestRun, ExecutableTestRun, SlcExe } } + public void setPath(String path) { + this.path = path; + } + } diff --git a/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties b/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties index 3ee850471..0d4757ef4 100644 --- a/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties +++ b/server/org.argeo.slc.siteserver/bundles/logging/log4j.properties @@ -5,6 +5,7 @@ log4j.logger.org.argeo=DEBUG log4j.logger.org.argeo.slc.execution.ExecutionParameterPostProcessor=TRACE log4j.logger.org.argeo.slc.execution.ExecutionContext=DEBUG log4j.logger.org.argeo.slc.execution.SimpleExecutionSpec=DEBUG +log4j.logger.org.argeo.slc.services.impl=DEBUG log4j.logger.org.springframework=WARN diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF index ef8372511..c58913c14 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/MANIFEST.MF @@ -3,7 +3,8 @@ Bundle-Version: 0.1.0 Import-Package: javax.jms, javax.management.j2ee.statistics, org.apache.commons.logging -Require-Bundle: org.argeo.slc.server, +Require-Bundle: + org.argeo.slc.server, org.argeo.slc.support.activemq, org.springframework.core, org.springframework.context, diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml index f3a61d1d5..70390b6c4 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms-osgi.xml @@ -7,6 +7,8 @@ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> + diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml index 9d9af2262..607bd0c08 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.jms/META-INF/spring/jms.xml @@ -15,7 +15,6 @@ - @@ -28,6 +27,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml index e96f1e0df..fe2aa9173 100644 --- a/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml +++ b/server/org.argeo.slc.siteserver/bundles/org.argeo.slc.server.services/META-INF/spring/services.xml @@ -6,7 +6,7 @@ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> - + @@ -18,4 +18,18 @@ + + + + + + + + + + + + + \ No newline at end of file -- 2.39.2