INT-1069: Add namespace support for persistent queues

This commit is contained in:
David Syer
2010-06-19 06:33:53 +00:00
parent 923e5b0a20
commit 6e79334d6d
11 changed files with 346 additions and 430 deletions

View File

@@ -37,10 +37,8 @@ public class PointToPointChannelParser extends AbstractChannelParser {
private static final String DISPATCHER_PACKAGE = IntegrationNamespaceUtils.BASE_PACKAGE + ".dispatcher";
private final Log logger = LogFactory.getLog(this.getClass());
@Override
protected BeanDefinitionBuilder buildBeanDefinition(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = null;
@@ -49,11 +47,20 @@ public class PointToPointChannelParser extends AbstractChannelParser {
// configure a queue-based channel if any queue sub-element is defined
if ((queueElement = DomUtils.getChildElementByTagName(element, "queue")) != null) {
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".QueueChannel");
boolean hasCapacity = this.parseQueueCapacity(builder, queueElement);
boolean hasStoreRef = this.parseStoreRef(builder, queueElement, element.getAttribute(ID_ATTRIBUTE));
boolean hasQueueRef = this.parseQueueRef(builder, queueElement);
if (hasCapacity && hasQueueRef) {
parserContext.getReaderContext().error("The 'capacity' attribute is not allowed" +
" when providing a 'ref' to a custom queue.", element);
if (!hasStoreRef) {
boolean hasCapacity = this.parseQueueCapacity(builder, queueElement);
if (hasCapacity && hasQueueRef) {
parserContext.getReaderContext().error(
"The 'capacity' attribute is not allowed" + " when providing a 'ref' to a custom queue.",
element);
}
}
if (hasStoreRef && hasQueueRef) {
parserContext.getReaderContext().error(
"The 'message-store' attribute is not allowed" + " when providing a 'ref' to a custom queue.",
element);
}
}
else if ((queueElement = DomUtils.getChildElementByTagName(element, "priority-queue")) != null) {
@@ -74,14 +81,15 @@ public class PointToPointChannelParser extends AbstractChannelParser {
String dispatcherAttribute = element.getAttribute("dispatcher");
boolean hasDispatcherAttribute = StringUtils.hasText(dispatcherAttribute);
if (hasDispatcherAttribute && logger.isWarnEnabled()) {
logger.warn("The 'dispatcher' attribute on the 'channel' element is deprecated. " +
"Please use the 'dispatcher' sub-element instead.");
logger.warn("The 'dispatcher' attribute on the 'channel' element is deprecated. "
+ "Please use the 'dispatcher' sub-element instead.");
}
// verify that a dispatcher is not provided if a queue sub-element exists
if (queueElement != null && (dispatcherElement != null || hasDispatcherAttribute)) {
parserContext.getReaderContext().error("The 'dispatcher' attribute or sub-element " +
"and any queue sub-element are mutually exclusive.", element);
parserContext.getReaderContext().error(
"The 'dispatcher' attribute or sub-element " + "and any queue sub-element are mutually exclusive.",
element);
return null;
}
@@ -90,9 +98,10 @@ public class PointToPointChannelParser extends AbstractChannelParser {
}
if (dispatcherElement != null && hasDispatcherAttribute) {
parserContext.getReaderContext().error("The 'dispatcher' attribute and 'dispatcher' " +
"sub-element are mutually exclusive. NOTE: the attribute is DEPRECATED. " +
"Please use the dispatcher sub-element instead.", element);
parserContext.getReaderContext().error(
"The 'dispatcher' attribute and 'dispatcher' "
+ "sub-element are mutually exclusive. NOTE: the attribute is DEPRECATED. "
+ "Please use the dispatcher sub-element instead.", element);
return null;
}
@@ -102,15 +111,15 @@ public class PointToPointChannelParser extends AbstractChannelParser {
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".DirectChannel");
if (!"failover".equals(dispatcherAttribute)) {
// round-robin dispatcher is used by default, the "failover" value simply disables it
builder.addConstructorArgValue(new RootBeanDefinition(
DISPATCHER_PACKAGE + ".RoundRobinLoadBalancingStrategy", null, null));
builder.addConstructorArgValue(new RootBeanDefinition(DISPATCHER_PACKAGE
+ ".RoundRobinLoadBalancingStrategy", null, null));
}
}
else if (dispatcherElement == null) {
// configure the default DirectChannel with a RoundRobinLoadBalancingStrategy
builder = BeanDefinitionBuilder.genericBeanDefinition(CHANNEL_PACKAGE + ".DirectChannel");
builder.addConstructorArgValue(new RootBeanDefinition(
DISPATCHER_PACKAGE + ".RoundRobinLoadBalancingStrategy", null, null));
builder.addConstructorArgValue(new RootBeanDefinition(DISPATCHER_PACKAGE
+ ".RoundRobinLoadBalancingStrategy", null, null));
}
else {
// configure either an ExecutorChannel or DirectChannel based on existence of 'task-executor'
@@ -126,8 +135,8 @@ public class PointToPointChannelParser extends AbstractChannelParser {
// configure the default RoundRobinLoadBalancingStrategy
String loadBalancer = dispatcherElement.getAttribute("load-balancer");
if (!"none".equals(loadBalancer)) {
builder.addConstructorArgValue(new RootBeanDefinition(
DISPATCHER_PACKAGE + ".RoundRobinLoadBalancingStrategy", null, null));
builder.addConstructorArgValue(new RootBeanDefinition(DISPATCHER_PACKAGE
+ ".RoundRobinLoadBalancingStrategy", null, null));
}
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, dispatcherElement, "failover");
}
@@ -145,11 +154,25 @@ public class PointToPointChannelParser extends AbstractChannelParser {
private boolean parseQueueRef(BeanDefinitionBuilder builder, Element queueElement) {
String queueRef = queueElement.getAttribute("ref");
if (StringUtils.hasText(queueRef)){
if (StringUtils.hasText(queueRef)) {
builder.addConstructorArgReference(queueRef);
return true;
}
return false;
}
private boolean parseStoreRef(BeanDefinitionBuilder builder, Element queueElement, String channel) {
String storeRef = queueElement.getAttribute("message-store");
if (StringUtils.hasText(storeRef)) {
BeanDefinitionBuilder queueBuilder = BeanDefinitionBuilder
.genericBeanDefinition(IntegrationNamespaceUtils.BASE_PACKAGE + ".store.MessageGroupQueue");
queueBuilder.addConstructorArgReference(storeRef);
queueBuilder.addConstructorArgValue(channel);
parseQueueCapacity(queueBuilder, queueElement);
builder.addConstructorArgValue(queueBuilder.getBeanDefinition());
return true;
}
return false;
}
}

View File

@@ -139,12 +139,15 @@ public class MessageGroupQueue extends AbstractQueue<Message<?>> implements Bloc
}
public boolean offer(Message<?> e, long timeout, TimeUnit unit) throws InterruptedException {
if (!offer(e)) {
long threshold = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(timeout, unit);
boolean result = offer(e);
while (!result && System.currentTimeMillis() < threshold) {
synchronized (writeLock) {
writeLock.wait(TimeUnit.MILLISECONDS.convert(timeout, unit));
writeLock.wait(threshold - System.currentTimeMillis());
}
result = offer(e);
}
return offer(e);
return result;
}
public Message<?> poll(long timeout, TimeUnit unit) throws InterruptedException {

View File

@@ -164,9 +164,7 @@ public class SimpleMessageGroup implements MessageGroup {
public void markAll() {
synchronized (lock) {
marked.addAll(unmarked);
unmarked.clear();
// unmarked.drainTo(marked);
unmarked.drainTo(marked);
}
}

View File

@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd">
<channel id="output">
<queue capacity="5" message-store="messageStore" />
</channel>
<channel id="input" />
<service-activator id="activator" ref="bean" input-channel="input" output-channel="output"/>
<beans:bean id="messageStore" class="org.springframework.integration.store.SimpleMessageStore" />
<beans:bean id="bean" class="org.springframework.integration.config.TestHandler">
<beans:property name="replyMessageText" value="hello"/>
</beans:bean>
</beans:beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd">
<channel id="output">
<queue capacity="5" message-store="messageStore" />
</channel>
<channel id="input" />
<service-activator id="activator" ref="bean" input-channel="input" output-channel="output"/>
<beans:bean id="messageStore" class="org.springframework.integration.store.SimpleMessageStore" />
<beans:bean id="bean" class="org.springframework.integration.config.TestHandler">
<beans:property name="replyMessageText" value="hello"/>
</beans:bean>
</beans:beans>

View File

@@ -56,16 +56,17 @@ public class ChannelWithMessageStoreParserTests {
@Test
@DirtiesContext
public void testAggregation() throws Exception {
public void testActivatorSendsToPersistentQueue() throws Exception {
input.send(createMessage("123", "id1", 3, 1, null));
assertEquals(1, messageGroupStore.getMessageGroup("id1").size());
handler.getLatch().await(100, TimeUnit.MILLISECONDS);
assertEquals("The message payload is not correct", "123", handler.getMessageString());
assertEquals(0, messageGroupStore.getMessageGroup("id1").size());
// The group id for buffered messages is the channel name
assertEquals(1, messageGroupStore.getMessageGroup("output").size());
Message<?> result = output.receive(100);
assertEquals("hello", result.getPayload());
assertEquals(0, messageGroupStore.getMessageGroup("output").size());
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd">
<channel id="output">
<queue message-store="messageStore" ref="queue" />
</channel>
<beans:bean id="messageStore" class="org.springframework.integration.store.SimpleMessageStore" />
</beans:beans>

View File

@@ -0,0 +1,41 @@
/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.config;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Matchers;
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Dave Syer
*/
public class InvalidChannelWithMessageStoreParserTests {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testRefAndStoreIllegal() throws Exception {
exception.expect(BeanDefinitionParsingException.class);
exception.expectMessage(Matchers.contains("'message-store' attribute is not allowed"));
new ClassPathXmlApplicationContext(getClass().getSimpleName() + "-context.xml", getClass());
}
}

View File

@@ -50,7 +50,7 @@ public class TestHandler {
public String handle(Message<?> message) {
this.messageString = message.getPayload().toString();
this.latch.countDown();
return (this.replyMessageText != null) ? this.replyMessageText : null;
return this.replyMessageText;
}
public String getMessageString() {

View File

@@ -10,6 +10,7 @@
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.test.failure.ignore>true</maven.test.failure.ignore>
<!-- versions for commonly-used dependencies -->
<cglib.version>2.2</cglib.version>
<commons-logging.version>1.1.1</commons-logging.version>

View File

@@ -4,186 +4,6 @@
<property name="context-root" value="loanshark"/>
<wb-resource deploy-path="/" source-path="src/main/webapp"/>
<property name="java-output-path" value="/target/classes"/>
<dependent-module archiveName="com.springsource.antlr-2.7.6.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/antlr/com.springsource.antlr/2.7.6/com.springsource.antlr-2.7.6.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.edu.emory.mathcs.backport-3.1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/edu/emory/mathcs/backport/com.springsource.edu.emory.mathcs.backport/3.1.0/com.springsource.edu.emory.mathcs.backport-3.1.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.edu.oswego.cs.dl.util.concurrent-1.3.4.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/edu/oswego/cs/concurrent/com.springsource.edu.oswego.cs.dl.util.concurrent/1.3.4/com.springsource.edu.oswego.cs.dl.util.concurrent-1.3.4.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.javassist-3.3.0.ga.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/jboss/javassist/com.springsource.javassist/3.3.0.ga/com.springsource.javassist-3.3.0.ga.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.javax.persistence-1.0.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/javax/persistence/com.springsource.javax.persistence/1.0.0/com.springsource.javax.persistence-1.0.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.javax.servlet.jsp.jstl-1.2.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/javax/servlet/com.springsource.javax.servlet.jsp.jstl/1.2.0/com.springsource.javax.servlet.jsp.jstl-1.2.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.javax.transaction-1.1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/javax/transaction/com.springsource.javax.transaction/1.1.0/com.springsource.javax.transaction-1.1.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.javax.validation-1.0.0.GA.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/javax/validation/com.springsource.javax.validation/1.0.0.GA/com.springsource.javax.validation-1.0.0.GA.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.net.sf.cglib-2.1.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/net/sourceforge/cglib/com.springsource.net.sf.cglib/2.1.3/com.springsource.net.sf.cglib-2.1.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.net.sf.ehcache-1.4.1.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/net/sourceforge/ehcache/com.springsource.net.sf.ehcache/1.4.1/com.springsource.net.sf.ehcache-1.4.1.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.net.sf.jsr107cache-1.0.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/net/sourceforge/jsr107cache/com.springsource.net.sf.jsr107cache/1.0.0/com.springsource.net.sf.jsr107cache-1.0.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.aopalliance-1.0.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/aopalliance/com.springsource.org.aopalliance/1.0.0/com.springsource.org.aopalliance-1.0.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.beanutils-1.8.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.beanutils/1.8.0/com.springsource.org.apache.commons.beanutils-1.8.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.collections-3.2.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.collections/3.2.0/com.springsource.org.apache.commons.collections-3.2.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.dbcp/1.2.2.osgi/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.digester-1.8.1.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.digester/1.8.1/com.springsource.org.apache.commons.digester-1.8.1.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.fileupload-1.2.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.fileupload/1.2.0/com.springsource.org.apache.commons.fileupload-1.2.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.io-1.4.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.io/1.4.0/com.springsource.org.apache.commons.io-1.4.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.logging-1.1.1.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-1.1.1.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.commons.pool-1.3.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/commons/com.springsource.org.apache.commons.pool/1.3.0/com.springsource.org.apache.commons.pool-1.3.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.el-6.0.20.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/el/com.springsource.org.apache.el/6.0.20/com.springsource.org.apache.el-6.0.20.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.log4j-1.2.15.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/log4j/com.springsource.org.apache.log4j/1.2.15/com.springsource.org.apache.log4j-1.2.15.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.taglibs.standard-1.1.2.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/taglibs/com.springsource.org.apache.taglibs.standard/1.1.2/com.springsource.org.apache.taglibs.standard-1.1.2.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.tiles-2.1.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/tiles/com.springsource.org.apache.tiles/2.1.3/com.springsource.org.apache.tiles-2.1.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.tiles.core-2.1.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/tiles/com.springsource.org.apache.tiles.core/2.1.3/com.springsource.org.apache.tiles.core-2.1.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.tiles.jsp-2.1.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/tiles/com.springsource.org.apache.tiles.jsp/2.1.3/com.springsource.org.apache.tiles.jsp-2.1.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.apache.tiles.servlet-2.1.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/apache/tiles/com.springsource.org.apache.tiles.servlet/2.1.3/com.springsource.org.apache.tiles.servlet-2.1.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.aspectj.runtime-1.6.6.RELEASE.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/aspectj/com.springsource.org.aspectj.runtime/1.6.6.RELEASE/com.springsource.org.aspectj.runtime-1.6.6.RELEASE.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.codehaus.jackson-1.4.2.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/codehaus/jackson/com.springsource.org.codehaus.jackson/1.4.2/com.springsource.org.codehaus.jackson-1.4.2.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.codehaus.jackson.mapper-1.4.2.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/codehaus/jackson/com.springsource.org.codehaus.jackson.mapper/1.4.2/com.springsource.org.codehaus.jackson.mapper-1.4.2.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.dom4j-1.6.1.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/dom4j/com.springsource.org.dom4j/1.6.1/com.springsource.org.dom4j-1.6.1.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.hibernate-3.2.6.ga.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/hibernate/com.springsource.org.hibernate/3.2.6.ga/com.springsource.org.hibernate-3.2.6.ga.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.hibernate.annotations-3.3.1.ga.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/hibernate/com.springsource.org.hibernate.annotations/3.3.1.ga/com.springsource.org.hibernate.annotations-3.3.1.ga.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.hibernate.annotations.common-3.3.0.ga.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/hibernate/com.springsource.org.hibernate.annotations.common/3.3.0.ga/com.springsource.org.hibernate.annotations.common-3.3.0.ga.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.hibernate.ejb-3.3.2.GA.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/hibernate/com.springsource.org.hibernate.ejb/3.3.2.GA/com.springsource.org.hibernate.ejb-3.3.2.GA.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.hibernate.validator-4.0.0.GA.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/hibernate/com.springsource.org.hibernate.validator/4.0.0.GA/com.springsource.org.hibernate.validator-4.0.0.GA.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.hsqldb-1.8.0.9.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/hsqldb/com.springsource.org.hsqldb/1.8.0.9/com.springsource.org.hsqldb-1.8.0.9.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.jboss.util-2.0.4.GA.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/jboss/util/com.springsource.org.jboss.util/2.0.4.GA/com.springsource.org.jboss.util-2.0.4.GA.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.joda.time-1.6.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/joda/com.springsource.org.joda.time/1.6.0/com.springsource.org.joda.time-1.6.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.objectweb.asm-1.5.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/objectweb/asm/com.springsource.org.objectweb.asm/1.5.3/com.springsource.org.objectweb.asm-1.5.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.objectweb.asm.attrs-1.5.3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/objectweb/asm/com.springsource.org.objectweb.asm.attrs/1.5.3/com.springsource.org.objectweb.asm.attrs-1.5.3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.org.tuckey.web.filters.urlrewrite-3.1.0.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/tuckey/com.springsource.org.tuckey.web.filters.urlrewrite/3.1.0/com.springsource.org.tuckey.web.filters.urlrewrite-3.1.0.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.slf4j.api-1.5.6.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/slf4j/com.springsource.slf4j.api/1.5.6/com.springsource.slf4j.api-1.5.6.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="com.springsource.slf4j.log4j-1.5.6.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/slf4j/com.springsource.slf4j.log4j/1.5.6/com.springsource.slf4j.log4j-1.5.6.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.aop-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.aop/3.0.1.RELEASE-A/org.springframework.aop-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.asm-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.asm/3.0.1.RELEASE-A/org.springframework.asm-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.aspects-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.aspects/3.0.1.RELEASE-A/org.springframework.aspects-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.beans-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.beans/3.0.1.RELEASE-A/org.springframework.beans-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.context-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.context/3.0.1.RELEASE-A/org.springframework.context-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.core-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.core/3.0.1.RELEASE-A/org.springframework.core-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.expression-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.expression/3.0.1.RELEASE-A/org.springframework.expression-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.integration-2.0.0.M3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/integration/org.springframework.integration/2.0.0.M3/org.springframework.integration-2.0.0.M3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.integration.adapter-2.0.0.M3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/integration/org.springframework.integration.adapter/2.0.0.M3/org.springframework.integration.adapter-2.0.0.M3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.integration.ip-2.0.0.M3.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/integration/org.springframework.integration.ip/2.0.0.M3/org.springframework.integration.ip-2.0.0.M3.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.jdbc-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.jdbc/3.0.1.RELEASE-A/org.springframework.jdbc-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.js-2.0.8.RELEASE.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/webflow/org.springframework.js/2.0.8.RELEASE/org.springframework.js-2.0.8.RELEASE.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.orm-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.orm/3.0.1.RELEASE-A/org.springframework.orm-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.transaction-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.transaction/3.0.1.RELEASE-A/org.springframework.transaction-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.web-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.web/3.0.1.RELEASE-A/org.springframework.web-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="org.springframework.web.servlet-3.0.1.RELEASE-A.jar" deploy-path="/WEB-INF/lib" handle="module:/classpath/var/M2_REPO/org/springframework/org.springframework.web.servlet/3.0.1.RELEASE-A/org.springframework.web.servlet-3.0.1.RELEASE-A.jar">
<dependency-type>uses</dependency-type>
</dependent-module>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="src/main/resources"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>