Author: davsclaus
Date: Thu Sep 30 09:48:52 2010
New Revision: 1002979
URL: http://svn.apache.org/viewvc?rev=1002979&view=rev
Log:
CAMEL-1350: Applied 2.1 patch. Polished pom.xml. Fixed CS.
Added:
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java
(with props)
Modified:
camel/trunk/components/camel-quickfix/pom.xml
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEngine.java
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEventListener.java
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/QuickfixjConsumerTest.java
camel/trunk/parent/pom.xml
Modified: camel/trunk/components/camel-quickfix/pom.xml
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/pom.xml?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
--- camel/trunk/components/camel-quickfix/pom.xml (original)
+++ camel/trunk/components/camel-quickfix/pom.xml Thu Sep 30 09:48:52 2010
@@ -1,17 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more
contributor
- license agreements. See the NOTICE file distributed with this work for
additional
- information regarding copyright ownership. The ASF licenses this file
to
- You 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. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
<modelVersion>4.0.0</modelVersion>
+
<parent>
<groupId>org.apache.camel</groupId>
<artifactId>camel-parent</artifactId>
@@ -50,7 +57,7 @@
<dependency>
<groupId>org.quickfixj</groupId>
<artifactId>quickfixj-all</artifactId>
- <version>1.5.0</version>
+ <version>${quickfix-version}</version>
</dependency>
<dependency>
<groupId>org.apache.mina</groupId>
Modified:
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
---
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java
(original)
+++
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjConsumer.java
Thu Sep 30 09:48:52 2010
@@ -19,21 +19,16 @@ package org.apache.camel.component.quick
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
-import org.apache.camel.component.quickfixj.converter.QuickfixjConverters;
import org.apache.camel.impl.DefaultConsumer;
-import quickfix.Message;
-import quickfix.SessionID;
-
public class QuickfixjConsumer extends DefaultConsumer {
public QuickfixjConsumer(Endpoint endpoint, Processor processor) {
super(endpoint, processor);
}
- public void onEvent(QuickfixjEventCategory eventCategory, SessionID
sessionID, Message message) {
+ public void onExchange(Exchange exchange) throws Exception {
if (isStarted()) {
- Exchange exchange = QuickfixjConverters.toExchange(getEndpoint(),
sessionID, message, eventCategory);
try {
getProcessor().process(exchange);
} catch (Exception e) {
Modified:
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
---
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java
(original)
+++
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEndpoint.java
Thu Sep 30 09:48:52 2010
@@ -21,9 +21,11 @@ import java.util.concurrent.CopyOnWriteA
import org.apache.camel.CamelContext;
import org.apache.camel.Consumer;
+import org.apache.camel.Exchange;
import org.apache.camel.MultipleConsumersSupport;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
+import org.apache.camel.component.quickfixj.converter.QuickfixjConverters;
import org.apache.camel.impl.DefaultEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,7 +59,7 @@ public class QuickfixjEndpoint extends D
public Consumer createConsumer(Processor processor) throws Exception {
LOG.info("Creating QuickFIX/J consumer: " + (sessionID != null ?
sessionID : "No Session"));
QuickfixjConsumer consumer = new QuickfixjConsumer(this, processor);
- // TODO It's not clear how the consumer lifecycle is managed
+ // TODO The lifecycle mgmt requirements aren't clear to me
consumer.start();
consumers.add(consumer);
return consumer;
@@ -73,10 +75,14 @@ public class QuickfixjEndpoint extends D
return true;
}
- public void onEvent(QuickfixjEventCategory eventCategory, SessionID
sessionID, Message message) {
+ public void onEvent(QuickfixjEventCategory eventCategory, SessionID
sessionID, Message message) throws Exception {
if (this.sessionID == null || this.sessionID.equals(sessionID)) {
for (QuickfixjConsumer consumer : consumers) {
- consumer.onEvent(eventCategory, sessionID, message);
+ Exchange exchange = QuickfixjConverters.toExchange(this,
sessionID, message, eventCategory);
+ consumer.onExchange(exchange);
+ if (exchange.getException() != null) {
+ throw exchange.getException();
+ }
}
}
}
Modified:
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEngine.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEngine.java?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
---
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEngine.java
(original)
+++
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEngine.java
Thu Sep 30 09:48:52 2010
@@ -336,44 +336,92 @@ public class QuickfixjEngine {
private class Dispatcher implements Application {
public void fromAdmin(Message message, SessionID sessionID) throws
FieldNotFound, IncorrectDataFormat, IncorrectTagValue, RejectLogon {
- dispatch(QuickfixjEventCategory.AdminMessageReceived, sessionID,
message);
+ try {
+ dispatch(QuickfixjEventCategory.AdminMessageReceived,
sessionID, message);
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ rethrowIfType(e, FieldNotFound.class);
+ rethrowIfType(e, IncorrectDataFormat.class);
+ rethrowIfType(e, IncorrectTagValue.class);
+ rethrowIfType(e, RejectLogon.class);
+ throw new DispatcherException(e);
+ }
}
-
+
public void fromApp(Message message, SessionID sessionID) throws
FieldNotFound, IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
- dispatch(QuickfixjEventCategory.AppMessageReceived, sessionID,
message);
+ try {
+ dispatch(QuickfixjEventCategory.AppMessageReceived, sessionID,
message);
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ rethrowIfType(e, FieldNotFound.class);
+ rethrowIfType(e, IncorrectDataFormat.class);
+ rethrowIfType(e, IncorrectTagValue.class);
+ rethrowIfType(e, UnsupportedMessageType.class);
+ throw new DispatcherException(e);
+ }
}
public void onCreate(SessionID sessionID) {
- dispatch(QuickfixjEventCategory.SessionCreated, sessionID, null);
+ try {
+ dispatch(QuickfixjEventCategory.SessionCreated, sessionID,
null);
+ } catch (Exception e) {
+ throw new DispatcherException(e);
+ }
}
public void onLogon(SessionID sessionID) {
- dispatch(QuickfixjEventCategory.SessionLogon, sessionID, null);
+ try {
+ dispatch(QuickfixjEventCategory.SessionLogon, sessionID, null);
+ } catch (Exception e) {
+ throw new DispatcherException(e);
+ }
}
public void onLogout(SessionID sessionID) {
- dispatch(QuickfixjEventCategory.SessionLogoff, sessionID, null);
+ try {
+ dispatch(QuickfixjEventCategory.SessionLogoff, sessionID,
null);
+ } catch (Exception e) {
+ throw new DispatcherException(e);
+ }
}
public void toAdmin(Message message, SessionID sessionID) {
- dispatch(QuickfixjEventCategory.AdminMessageSent, sessionID,
message);
+ try {
+ dispatch(QuickfixjEventCategory.AdminMessageSent, sessionID,
message);
+ } catch (Exception e) {
+ throw new DispatcherException(e);
+ }
}
public void toApp(Message message, SessionID sessionID) throws
DoNotSend {
- dispatch(QuickfixjEventCategory.AppMessageSent, sessionID,
message);
+ try {
+ dispatch(QuickfixjEventCategory.AppMessageSent, sessionID,
message);
+ } catch (Exception e) {
+ throw new DispatcherException(e);
+ }
}
- private void dispatch(QuickfixjEventCategory quickfixjEventCategory,
SessionID sessionID, Message message) {
- // TODO Find a way to propagate exception to the QFJ engine
(RejectLogon, DoNotSend, etc.)
+ @SuppressWarnings("unchecked")
+ private <T extends Exception> void rethrowIfType(Exception e, Class<T>
exceptionClass) throws T {
+ throw (T) e;
+ }
+
+ private void dispatch(QuickfixjEventCategory quickfixjEventCategory,
SessionID sessionID, Message message) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("FIX event dispatched: " + quickfixjEventCategory +
" " + (message != null ? message : ""));
}
for (QuickfixjEventListener listener : eventListeners) {
- try {
- listener.onEvent(quickfixjEventCategory, sessionID,
message);
- } catch (Exception e) {
- LOG.error("Error during event dispatching", e);
- }
+ // Exceptions propagate back to the FIX engine so sequence
numbers can be adjusted
+ listener.onEvent(quickfixjEventCategory, sessionID, message);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class DispatcherException extends RuntimeException {
+ public DispatcherException(Throwable cause) {
+ super(cause);
}
}
}
Modified:
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEventListener.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEventListener.java?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
---
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEventListener.java
(original)
+++
camel/trunk/components/camel-quickfix/src/main/java/org/apache/camel/component/quickfixj/QuickfixjEventListener.java
Thu Sep 30 09:48:52 2010
@@ -25,6 +25,6 @@ import quickfix.SessionID;
*/
public interface QuickfixjEventListener {
- void onEvent(QuickfixjEventCategory eventCategory, SessionID sessionID,
Message message);
+ void onEvent(QuickfixjEventCategory eventCategory, SessionID sessionID,
Message message) throws Exception;
}
Modified:
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/QuickfixjConsumerTest.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/QuickfixjConsumerTest.java?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
---
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/QuickfixjConsumerTest.java
(original)
+++
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/QuickfixjConsumerTest.java
Thu Sep 30 09:48:52 2010
@@ -24,14 +24,11 @@ import org.apache.camel.impl.ServiceSupp
import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
-import quickfix.FixVersions;
-import quickfix.Message;
-import quickfix.SessionID;
-
public class QuickfixjConsumerTest {
private Exchange mockExchange;
private Processor mockProcessor;
@@ -56,9 +53,7 @@ public class QuickfixjConsumerTest {
Assert.assertThat("Consumer should not be automatically started",
((ServiceSupport)consumer).isStarted(), CoreMatchers.is(false));
- // Simulate a message from the FIX engine
- SessionID sessionID = new SessionID(FixVersions.BEGINSTRING_FIX44,
"SENDER", "TARGET");
- consumer.onEvent(QuickfixjEventCategory.AppMessageReceived, sessionID,
new Message());
+ consumer.onExchange(mockExchange);
// No expected interaction with processor since component is not
started
Mockito.verifyZeroInteractions(mockProcessor);
@@ -66,8 +61,7 @@ public class QuickfixjConsumerTest {
consumer.start();
Assert.assertThat(((ServiceSupport)consumer).isStarted(),
CoreMatchers.is(true));
- // Simulate a message from the FIX engine
- consumer.onEvent(QuickfixjEventCategory.AppMessageReceived, sessionID,
new Message());
+ consumer.onExchange(mockExchange);
// Second message should be processed
Mockito.verify(mockProcessor).process(Matchers.isA(Exchange.class));
@@ -83,9 +77,26 @@ public class QuickfixjConsumerTest {
Mockito.doThrow(exception).when(mockProcessor).process(mockExchange);
// Simulate a message from the FIX engine
- SessionID sessionID = new SessionID(FixVersions.BEGINSTRING_FIX44,
"SENDER", "TARGET");
- consumer.onEvent(QuickfixjEventCategory.AppMessageReceived, sessionID,
new Message());
+ consumer.onExchange(mockExchange);
Mockito.verify(mockExchange).setException(exception);
}
+
+ @Test
+ @Ignore("Modified behavior")
+ public void propagateException() throws Exception {
+ QuickfixjConsumer consumer = new QuickfixjConsumer(mockEndpoint,
mockProcessor);
+ consumer.start();
+
+ Throwable exception = new Exception("Throwable for test");
+ Mockito.doThrow(exception).when(mockProcessor).process(mockExchange);
+
+ try {
+ consumer.onExchange(mockExchange);
+ Assert.fail("Exception was not thrown");
+ } catch (Exception e) {
+ Assert.assertThat(e.getMessage(), CoreMatchers.is("Throwable for
test"));
+ }
+ }
+
}
Added:
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java
URL:
http://svn.apache.org/viewvc/camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java?rev=1002979&view=auto
==============================================================================
---
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java
(added)
+++
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java
Thu Sep 30 09:48:52 2010
@@ -0,0 +1,124 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.quickfixj.examples;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.builder.PredicateBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.quickfixj.QuickfixjComponent;
+import org.apache.camel.component.quickfixj.QuickfixjEndpoint;
+import org.apache.camel.component.quickfixj.QuickfixjEventCategory;
+import
org.apache.camel.component.quickfixj.examples.util.CountDownLatchDecrementer;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.util.ExchangeHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import quickfix.FieldNotFound;
+import quickfix.Message;
+import quickfix.RejectLogon;
+import quickfix.field.MsgType;
+import quickfix.field.RawData;
+import quickfix.field.RawDataLength;
+
+/**
+ * This example demonstrates several features of the QuickFIX/J component. It
uses
+ * QFJ session events to synchronize application behavior (e.g., Session
logon).
+ *
+ */
+public class AuthenticationExample {
+ private static final Logger LOG =
LoggerFactory.getLogger(QuickfixjComponent.class);
+
+ public static void main(String[] args) throws Exception {
+ new AuthenticationExample().run();
+ }
+
+ public void run() throws Exception {
+ DefaultCamelContext context = new DefaultCamelContext();
+
+ final CountDownLatch logoutLatch = new CountDownLatch(1);
+
+ RouteBuilder routes = new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ // Modify the outgoing logon message to add a password
+ // The modified message will be sent from the FIX engine when
the message exchange completes
+
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET").
+ filter(PredicateBuilder.and(
+
header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AdminMessageSent),
+
header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.LOGON))).
+ bean(new CredentialInjector("PASSWORD"));
+
+ // Release latch when the trader received a logout message
+
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:TRADER->MARKET").
+
filter(header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.SessionLogoff)).
+ bean(new CountDownLatchDecrementer("logout", logoutLatch));
+
+ // Reject all logons on market side
+ // Demonstrates how to validate logons
+
from("quickfix:examples/inprocess.cfg?sessionID=FIX.4.2:MARKET->TRADER").
+ filter(PredicateBuilder.and(
+
header(QuickfixjEndpoint.EVENT_CATEGORY_KEY).isEqualTo(QuickfixjEventCategory.AdminMessageReceived),
+
header(QuickfixjEndpoint.MESSAGE_TYPE_KEY).isEqualTo(MsgType.LOGON))).
+ bean(new LogonAuthenticator());
+ }
+ };
+
+ context.addRoutes(routes);
+
+ LOG.info("Starting Camel context");
+ context.start();
+
+ if (!logoutLatch.await(5L, TimeUnit.SECONDS)) {
+ throw new IllegalStateException("Logout was not received");
+ }
+
+ context.stop();
+
+ LOG.info("Example complete");
+ }
+
+ public static class LogonAuthenticator {
+ public void authenticate(Exchange exchange) throws RejectLogon,
InvalidPayloadException, FieldNotFound {
+ LOG.info("Acceptor is rejecting logon for " +
exchange.getIn().getHeader(QuickfixjEndpoint.SESSION_ID_KEY));
+ Message message = ExchangeHelper.getMandatoryInBody(exchange,
Message.class);
+ if (message.isSetField(RawData.FIELD)) {
+ LOG.info("Invalid password: " +
message.getString(RawData.FIELD));
+ }
+ throw new RejectLogon("Rejecting logon for test purposes");
+ }
+ }
+
+ public static class CredentialInjector {
+ private final String password;
+
+ public CredentialInjector(String password) {
+ this.password = password;
+ }
+
+ public void inject(Exchange exchange) throws InvalidPayloadException {
+ LOG.info("Injecting password into outgoing logon message");
+ Message message = ExchangeHelper.getMandatoryInBody(exchange,
Message.class);
+ message.setString(RawData.FIELD, password);
+ message.setInt(RawDataLength.FIELD, password.length());
+ }
+ }
+}
Propchange:
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
camel/trunk/components/camel-quickfix/src/test/java/org/apache/camel/component/quickfixj/examples/AuthenticationExample.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: camel/trunk/parent/pom.xml
URL:
http://svn.apache.org/viewvc/camel/trunk/parent/pom.xml?rev=1002979&r1=1002978&r2=1002979&view=diff
==============================================================================
--- camel/trunk/parent/pom.xml (original)
+++ camel/trunk/parent/pom.xml Thu Sep 30 09:48:52 2010
@@ -112,6 +112,7 @@
<protobuf-version>2.3.0</protobuf-version>
<qpid-version>0.5.0</qpid-version>
<quartz-version>1.8.3</quartz-version>
+ <quickfix-version>1.5.0</quickfix-version>
<restlet-version>1.1.10</restlet-version>
<rome-version>1.0</rome-version>
<saxon-version>9.1.0.8</saxon-version>