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,
<property name="modulesManager" ref="modulesManager" />
</bean>
+ <!-- TreeTestResult Listener -->
+ <bean id="resultListener" class="org.argeo.slc.jms.JmsTreeTestResultListener">
+ <property name="createDestination" ref="slcJms.destination.test.create" />
+ <property name="addResultPartDestination" ref="slcJms.destination.test.addResultPart" />
+ <property name="closeDestination" ref="slcJms.destination.test.close" />
+ <property name="jmsTemplate">
+ <bean class="org.springframework.jms.core.JmsTemplate">
+ <property name="messageConverter" ref="slcDefault.jms.castorMessageConverter" />
+ <property name="connectionFactory" ref="jmsConnectionFactory" />
+ </bean>
+ </property>
+ </bean>
</beans>
\ No newline at end of file
http://www.springframework.org/schema/beans \r
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">\r
\r
+ <service ref="resultListener" interface="org.argeo.slc.test.TestResultListener" />\r
+\r
<reference id="modulesManager"\r
interface="org.argeo.slc.execution.ExecutionModulesManager" />\r
-\r
<reference id="jmsConnectionFactory" interface="javax.jms.ConnectionFactory" />\r
\r
</beans:beans>
\ No newline at end of file
<aop:scoped-proxy />\r
</bean>\r
<bean parent="testRun">\r
+ <property name="path" value="/test/basic" />\r
<property name="testDefinition" ref="testDef" />\r
<property name="testData">\r
<bean parent="basic.ref">\r
<bean id="testDef" class="org.argeo.slc.core.test.BasicTestDefinition"
scope="prototype" />
- <bean id="testResult" parent="slcDefault.test.basicSimpleTestResult" />
+ <bean id="testResult" parent="slcDefault.test.basicTreeTestResult">
+ <property name="listeners" ref="resultListeners" />
+ </bean>
<bean id="testRun" class="org.argeo.slc.core.test.SimpleTestRun"
abstract="true">
\r
<service interface="org.argeo.slc.execution.ExecutionModule"\r
ref="executionModule" />\r
+\r
+ <list id="resultListeners" interface="org.argeo.slc.test.TestResultListener" />\r
</beans:beans>
\ No newline at end of file
<properties>
<bundlesToStart>
org.springframework.osgi.extender,
- org.argeo.slc.demo.basic
+ org.argeo.slc.demo.basic,
+ org.argeo.slc.demo.manager,
+ org.argeo.slc.support.equinox
</bundlesToStart>
</properties>
<build>
-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
cardinality="0..N" />\r
\r
<service ref="modulesManager" interface="org.argeo.slc.execution.ExecutionModulesManager" />\r
+\r
+ <service interface="org.argeo.slc.test.TestResultListener">\r
+ <beans:bean class="org.argeo.slc.core.test.tree.TreeTestResultLogger" />\r
+ </service>\r
+\r
</beans:beans>
\ No newline at end of file
\r
import org.apache.commons.logging.Log;\r
import org.apache.commons.logging.LogFactory;\r
+import org.argeo.slc.core.test.tree.TreeTestResult;\r
import org.argeo.slc.core.test.tree.TreeTestResultCollection;\r
import org.argeo.slc.dao.process.SlcExecutionDao;\r
import org.argeo.slc.dao.test.TestRunDescriptorDao;\r
import org.argeo.slc.dao.test.tree.TreeTestResultCollectionDao;\r
import org.argeo.slc.dao.test.tree.TreeTestResultDao;\r
+import org.argeo.slc.msg.test.tree.CloseTreeTestResultRequest;\r
+import org.argeo.slc.msg.test.tree.CreateTreeTestResultRequest;\r
+import org.argeo.slc.msg.test.tree.ResultPartRequest;\r
import org.argeo.slc.process.SlcExecution;\r
import org.argeo.slc.services.test.TestManagerService;\r
import org.argeo.slc.test.TestRunDescriptor;\r
\r
public void registerTestRunDescriptor(TestRunDescriptor testRunDescriptor) {\r
if (testRunDescriptor != null) {\r
+ if (log.isTraceEnabled())\r
+ log.trace("Registering test run descriptor #"\r
+ + testRunDescriptor.getTestRunUuid());\r
testRunDescriptorDao.saveOrUpdate(testRunDescriptor);\r
\r
// Update tree test result collection\r
addResultToCollection(collectionId, testRunDescriptor\r
.getTestResultUuid());\r
}\r
+ } else {\r
+// log\r
+// .trace("ResultUUID="\r
+// + testRunDescriptor.getTestResultUuid());\r
+// addResultToCollection("default", testRunDescriptor\r
+// .getTestResultUuid());\r
}\r
}\r
}\r
}\r
}\r
\r
+ public void createTreeTestResult(CreateTreeTestResultRequest msg) {\r
+ TreeTestResult treeTestResult = msg.getTreeTestResult();\r
+\r
+ if (log.isTraceEnabled())\r
+ log.trace("Creating result #" + treeTestResult.getUuid());\r
+ treeTestResultDao.create(treeTestResult);\r
+\r
+ registerTestRunDescriptor(msg.getTestRunDescriptor());\r
+ }\r
+\r
+ public void addResultPart(ResultPartRequest msg) {\r
+ registerTestRunDescriptor(msg.getTestRunDescriptor());\r
+\r
+ if (log.isTraceEnabled())\r
+ log.trace("Adding result part to test result #"\r
+ + msg.getResultUuid());\r
+\r
+ treeTestResultDao.addResultPart(msg.getResultUuid(), msg.getPath(), msg\r
+ .getResultPart(), msg.getRelatedElements());\r
+ // treeTestResultDao.updateAttributes(msg.getResultUuid(), msg\r
+ // .getAttributes());\r
+ }\r
+\r
+ public void closeTreeTestResult(CloseTreeTestResultRequest msg) {\r
+ if (log.isTraceEnabled())\r
+ log.trace("Closing result #" + msg.getResultUuid() + " at date "\r
+ + msg.getCloseDate());\r
+\r
+ treeTestResultDao.close(msg.getResultUuid(), msg.getCloseDate());\r
+ }\r
+\r
}\r
package org.argeo.slc.services.test;\r
\r
+import org.argeo.slc.msg.test.tree.CloseTreeTestResultRequest;\r
+import org.argeo.slc.msg.test.tree.CreateTreeTestResultRequest;\r
+import org.argeo.slc.msg.test.tree.ResultPartRequest;\r
import org.argeo.slc.test.TestRunDescriptor;\r
\r
/** Performs complex business operations. */\r
/** Removes a result from a collection based on their ids. */\r
public void removeResultFromCollection(String collectionId,\r
String resultUuid);\r
+\r
+ public void createTreeTestResult(CreateTreeTestResultRequest msg);\r
+\r
+ public void addResultPart(ResultPartRequest msg);\r
+\r
+ public void closeTreeTestResult(CloseTreeTestResultRequest msg);\r
}\r
--- /dev/null
+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<TreeTestResult> {
+ 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;
+ }
+
+}
<bean id="slcJms.destination.agent.newExecution" p:physicalName="agent.newExecution"
parent="slcJms.amTopic" />
+ <bean id="slcJms.destination.test.create" p:physicalName="test.create"
+ parent="slcJms.amTopic" />
+ <bean id="slcJms.destination.test.addResultPart" p:physicalName="test.addResultPart"
+ parent="slcJms.amTopic" />
+ <bean id="slcJms.destination.test.close" p:physicalName="test.close"
+ parent="slcJms.amTopic" />
+
<!-- Templates -->
<bean id="slcJms.amQueue" class="org.apache.activemq.command.ActiveMQQueue"
abstract="true" />
treeTestResult.getResultParts().put(path, lst);\r
}\r
lst.getParts().add(resultPart);\r
- treeTestResult.getElements().putAll(relatedElements);\r
+ if (relatedElements != null)\r
+ treeTestResult.getElements().putAll(relatedElements);\r
\r
session.update(treeTestResult);\r
return treeTestResult;\r
\r
import java.util.UUID;\r
\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+import org.argeo.slc.core.structure.tree.TreeSRegistry;\r
import org.argeo.slc.deploy.DeployedSystem;\r
import org.argeo.slc.process.SlcExecution;\r
import org.argeo.slc.process.SlcExecutionRelated;\r
import org.argeo.slc.process.SlcExecutionStep;\r
+import org.argeo.slc.structure.StructureAware;\r
+import org.argeo.slc.structure.StructureRegistry;\r
import org.argeo.slc.test.ExecutableTestRun;\r
import org.argeo.slc.test.TestData;\r
import org.argeo.slc.test.TestDefinition;\r
* A basic bean implementation of a <code>WritableTestRun</code>, holding\r
* references to the various parts of a test run.\r
*/\r
-public class SimpleTestRun implements WritableTestRun, ExecutableTestRun, SlcExecutionRelated {\r
+public class SimpleTestRun implements WritableTestRun, ExecutableTestRun,\r
+ SlcExecutionRelated {\r
private String uuid;\r
\r
private String slcExecutionUuid;\r
private String slcExecutionStepUuid;\r
\r
+ private String path;\r
+\r
private DeployedSystem deployedSystem;\r
private TestData testData;\r
private TestDefinition testDefinition;\r
\r
/** Executes the underlying test definition. */\r
public void execute() {\r
+ TreeSPath basePath = null;\r
+ StructureRegistry<TreeSPath> registry = null;\r
+ if (path != null) {\r
+ // TODO: generalize\r
+ basePath = new TreeSPath(path);\r
+ registry = new TreeSRegistry();\r
+ }\r
+\r
uuid = UUID.randomUUID().toString();\r
if (testResult != null)\r
testResult.notifyTestRun(this);\r
+\r
+ // Structure\r
+ if (testResult != null && basePath != null\r
+ && testResult instanceof StructureAware)\r
+ ((StructureAware<TreeSPath>) testResult).notifyCurrentPath(\r
+ registry, basePath);\r
+\r
+ if (basePath != null && testDefinition instanceof StructureAware)\r
+ ((StructureAware<TreeSPath>) testDefinition).notifyCurrentPath(\r
+ registry, basePath);\r
+\r
testDefinition.execute(this);\r
}\r
\r
}\r
}\r
\r
+ public void setPath(String path) {\r
+ this.path = path;\r
+ }\r
+\r
}\r
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
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,
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<reference id="agentService" interface="org.argeo.slc.services.runtime.AgentService" />
+ <reference id="testManagerService"
+ interface="org.argeo.slc.services.test.TestManagerService" />
<reference id="jmsConnectionFactory" interface="javax.jms.ConnectionFactory" />
<property name="defaultListenerMethod" value="register" />
</bean>
</property>
- <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="agentService.jmsContainer.unregister" parent="listenerContainer">
</property>
</bean>
+ <!-- Test Manager Service -->
+ <bean parent="listenerContainer">
+ <property name="destination" ref="slcJms.destination.test.create" />
+ <property name="messageListener">
+ <bean parent="listenerAdapterCastor">
+ <constructor-arg ref="testManagerService" />
+ <property name="defaultListenerMethod" value="createTreeTestResult" />
+ </bean>
+ </property>
+ </bean>
+
+ <bean parent="listenerContainer">
+ <property name="destination" ref="slcJms.destination.test.addResultPart" />
+ <property name="messageListener">
+ <bean parent="listenerAdapterCastor">
+ <constructor-arg ref="testManagerService" />
+ <property name="defaultListenerMethod" value="addResultPart" />
+ </bean>
+ </property>
+ </bean>
+
+ <bean parent="listenerContainer">
+ <property name="destination" ref="slcJms.destination.test.close" />
+ <property name="messageListener">
+ <bean parent="listenerAdapterCastor">
+ <constructor-arg ref="testManagerService" />
+ <property name="defaultListenerMethod" value="closeTreeTestResult" />
+ </bean>
+ </property>
+ </bean>
+
+
<!-- Templates -->
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
Bundle-Name: SLC Server Services
Bundle-SymbolicName: org.argeo.slc.server.services
Bundle-Version: 1.0.0
-Import-Package: org.hibernate.jdbc
+Import-Package: org.hibernate.jdbc,
+ org.springframework.transaction,
+ org.springframework.aop,
+ org.springframework.aop.framework,
+ org.aopalliance.aop
Require-Bundle: org.argeo.slc.server,
org.argeo.slc.specs,
org.argeo.slc.support.simple
<reference interface="org.argeo.slc.dao.runtime.SlcAgentDescriptorDao"\r
id="slcAgentDescriptorDao" />\r
\r
+ <reference id="transactionManager"\r
+ interface="org.springframework.transaction.PlatformTransactionManager" />\r
+\r
</beans:beans>
\ No newline at end of file
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">
-
+
<!-- Services -->
<bean id="testManagerService" class="org.argeo.slc.services.impl.test.TestManagerServiceImpl">
<constructor-arg ref="testResultDao" />
<bean id="agentService" class="org.argeo.slc.services.impl.runtime.AgentServiceImpl">
<constructor-arg ref="slcAgentDescriptorDao" />
</bean>
+
+ <!-- Services transactions -->
+ <aop:config>
+ <aop:pointcut id="serviceMethods"
+ expression="execution(* org.argeo.slc.services.test.TestManagerService.*(..))" />
+ <aop:advisor advice-ref="serviceAdvice" pointcut-ref="serviceMethods" />
+ </aop:config>
+
+ <tx:advice id="serviceAdvice" transaction-manager="transactionManager">
+ <tx:attributes>
+ <tx:method name="*" propagation="REQUIRED" />
+ </tx:attributes>
+ </tx:advice>
+
</beans>
\ No newline at end of file