You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2009/07/29 15:35:59 UTC
svn commit: r798902 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/builder/
camel-core/src/main/java/org/apache/camel/model/dataformat/
components/camel-hl7/src/main/java/org/apache/camel/component/hl7/
components/camel-hl7/src/test/java/...
Author: davsclaus
Date: Wed Jul 29 13:35:59 2009
New Revision: 798902
URL: http://svn.apache.org/viewvc?rev=798902&view=rev
Log:
CAMEL-1863: added validate option to camel-hl7 so you can disable HAPI parser validator.
Added:
camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java (with props)
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java
camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java
camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPCodec.java
camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java
camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPDecoder.java
camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPEncoder.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DataFormatClause.java Wed Jul 29 13:35:59 2009
@@ -131,6 +131,15 @@
}
/**
+ * Uses the HL7 data format
+ */
+ public T hl7(boolean validate) {
+ HL7DataFormat hl7 = new HL7DataFormat();
+ hl7.setValidate(validate);
+ return dataFormat(hl7);
+ }
+
+ /**
* Uses the JAXB data format
*/
public T jaxb() {
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/HL7DataFormat.java Wed Jul 29 13:35:59 2009
@@ -18,9 +18,11 @@
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.camel.model.DataFormatDefinition;
+import org.apache.camel.spi.DataFormat;
/**
* Represents a <a href="http://camel.apache.org/hl7.html">HL7</a> {@link org.apache.camel.spi.DataFormat}.
@@ -31,8 +33,28 @@
@XmlAccessorType(XmlAccessType.FIELD)
public class HL7DataFormat extends DataFormatDefinition {
+ @XmlAttribute(required = false)
+ private Boolean validate = Boolean.TRUE;
+
public HL7DataFormat() {
super("org.apache.camel.component.hl7.HL7DataFormat");
}
+ public Boolean isValidate() {
+ return validate;
+ }
+
+ public void setValidate(Boolean validate) {
+ this.validate = validate;
+ }
+
+ @Override
+ protected void configureDataFormat(DataFormat dataFormat) {
+ if (validate != null) {
+ setProperty(dataFormat, "validate", validate);
+ }
+ }
+
+
+
}
\ No newline at end of file
Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java (original)
+++ camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java Wed Jul 29 13:35:59 2009
@@ -20,6 +20,7 @@
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.parser.Parser;
import ca.uhn.hl7v2.parser.PipeParser;
+import ca.uhn.hl7v2.validation.impl.NoValidation;
import org.apache.camel.Converter;
/**
@@ -34,19 +35,31 @@
@Converter
public static String toString(Message message) throws HL7Exception {
- Parser parser = new PipeParser();
- String encoded = parser.encode(message);
- return encoded;
+ return encode(message, true);
}
@Converter
public static Message toMessage(String body) throws HL7Exception {
+ return parse(body, true);
+ }
+
+ static Message parse(String body, boolean validate) throws HL7Exception {
// replace \n with \r as HL7 uses 0x0d = \r as segment terminators and HAPI only parses with \r
body = body.replace('\n', '\r');
Parser parser = new PipeParser();
- Message message = parser.parse(body);
- return message;
+ if (!validate) {
+ parser.setValidationContext(new NoValidation());
+ }
+ return parser.parse(body);
+ }
+
+ static String encode(Message message, boolean validate) throws HL7Exception {
+ Parser parser = new PipeParser();
+ if (!validate) {
+ parser.setValidationContext(new NoValidation());
+ }
+ return parser.encode(message);
}
}
Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java (original)
+++ camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java Wed Jul 29 13:35:59 2009
@@ -25,8 +25,6 @@
import org.apache.camel.spi.DataFormat;
import org.apache.camel.util.ExchangeHelper;
-
-
/**
* HL7 DataFormat (supports v2.x of the HL7 protocol).
* <p/>
@@ -64,15 +62,17 @@
*/
public class HL7DataFormat implements DataFormat {
+ private boolean validate = true;
+
public void marshal(Exchange exchange, Object body, OutputStream outputStream) throws Exception {
Message message = ExchangeHelper.convertToMandatoryType(exchange, Message.class, body);
- String encoded = HL7Converter.toString(message);
+ String encoded = HL7Converter.encode(message, validate);
outputStream.write(encoded.getBytes());
}
public Object unmarshal(Exchange exchange, InputStream inputStream) throws Exception {
String body = ExchangeHelper.convertToMandatoryType(exchange, String.class, inputStream);
- Message message = HL7Converter.toMessage(body);
+ Message message = HL7Converter.parse(body, validate);
// add MSH fields as message out headers
Terser terser = new Terser(message);
@@ -90,5 +90,12 @@
return message;
}
+ public boolean isValidate() {
+ return validate;
+ }
+
+ public void setValidate(boolean validate) {
+ this.validate = validate;
+ }
}
Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPCodec.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPCodec.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPCodec.java (original)
+++ camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPCodec.java Wed Jul 29 13:35:59 2009
@@ -101,4 +101,12 @@
config.setEndByte2(endByte2);
}
+ public boolean isValidate() {
+ return config.isValidate();
+ }
+
+ public void setValidate(boolean validate) {
+ config.setValidate(validate);
+ }
+
}
Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java (original)
+++ camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java Wed Jul 29 13:35:59 2009
@@ -31,6 +31,8 @@
private char endByte2 = 0x0d; // 13 decimal
+ private boolean validate = true;
+
public Charset getCharset() {
return charset;
}
@@ -71,4 +73,11 @@
this.endByte2 = endByte2;
}
+ public boolean isValidate() {
+ return validate;
+ }
+
+ public void setValidate(boolean validate) {
+ this.validate = validate;
+ }
}
Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPDecoder.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPDecoder.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPDecoder.java (original)
+++ camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPDecoder.java Wed Jul 29 13:35:59 2009
@@ -60,14 +60,6 @@
return foundEnd;
}
- /**
- * @param session
- * @param in
- * @param out
- * @param state
- * @return
- * @throws RuntimeException
- */
private void writeString(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) {
DecoderState state = decoderState(session);
if (state.posStart == 0) {
@@ -89,10 +81,6 @@
}
}
- /**
- * @param session
- * @return the charset decoder for this IoSession
- */
private CharsetDecoder charsetDecoder(IoSession session) {
// convert to string using the charset decoder
CharsetDecoder decoder = (CharsetDecoder)session.getAttribute(CHARSET_DECODER);
@@ -107,8 +95,6 @@
* Scans the buffer for start and end bytes and stores its position in the
* session state object.
*
- * @param session
- * @param in
* @return <code>true</code> if the end bytes were found, <code>false</code>
* otherwise
*/
@@ -126,7 +112,9 @@
LOG.warn("Ignoring message start at position " + in.position() + " before previous message has ended.");
} else {
state.posStart = in.position();
- LOG.debug("Message starts at position " + state.posStart);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Message starts at position " + state.posStart);
+ }
}
}
// Check end bytes
@@ -135,7 +123,9 @@
if (next == config.getEndByte2()) {
state.posEnd = in.position() - 2; // use -2 to skip these
// last 2 end markers
- LOG.debug("Message ends at position " + state.posEnd);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Message ends at position " + state.posEnd);
+ }
break;
} else {
// we expected the 2nd end marker
@@ -149,10 +139,6 @@
return state.posEnd > 0;
}
- /**
- * @param session
- * @return the state of the current decoding process
- */
private DecoderState decoderState(IoSession session) {
DecoderState decoderState = (DecoderState)session.getAttribute(DECODER_STATE);
if (decoderState == null) {
@@ -185,4 +171,5 @@
posEnd = 0;
}
}
+
}
Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPEncoder.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPEncoder.java?rev=798902&r1=798901&r2=798902&view=diff
==============================================================================
--- camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPEncoder.java (original)
+++ camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPEncoder.java Wed Jul 29 13:35:59 2009
@@ -19,8 +19,6 @@
import java.nio.charset.CharsetEncoder;
import ca.uhn.hl7v2.model.Message;
-import ca.uhn.hl7v2.parser.Parser;
-import ca.uhn.hl7v2.parser.PipeParser;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -29,8 +27,9 @@
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
-
-
+/**
+ * HL7 MLLP encoder
+ */
class HL7MLLPEncoder implements ProtocolEncoder {
private static final transient Log LOG = LogFactory.getLog(HL7MLLPEncoder.class);
@@ -65,8 +64,7 @@
// convert to string
String body;
if (message instanceof Message) {
- Parser parser = new PipeParser();
- body = parser.encode((Message)message);
+ body = HL7Converter.encode((Message)message, config.isValidate());
} else if (message instanceof String) {
body = (String)message;
} else if (message instanceof byte[]) {
Added: camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java?rev=798902&view=auto
==============================================================================
--- camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java (added)
+++ camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java Wed Jul 29 13:35:59 2009
@@ -0,0 +1,80 @@
+/**
+ * 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.hl7;
+
+import ca.uhn.hl7v2.HL7Exception;
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+/**
+ * @version $Revision$
+ */
+public class HL7ValidateTest extends CamelTestSupport {
+
+// TODO: Need HL7 that can fail HL7 validator
+// @Test
+// public void testUnmarshalFailed() throws Exception {
+// MockEndpoint mock = getMockEndpoint("mock:unmarshal");
+// mock.expectedMessageCount(0);
+//
+// String body = createHL7AsString();
+// try {
+// template.sendBody("direct:unmarshalFailed", body);
+// fail("Should have thrown exception");
+// } catch (CamelExecutionException e) {
+// assertIsInstanceOf(HL7Exception.class, e.getCause());
+// }
+//
+// assertMockEndpointsSatisfied();
+// }
+
+ @Test
+ public void testUnmarshalOk() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:unmarshal");
+ mock.expectedMessageCount(1);
+
+ String body = createHL7AsString();
+ template.sendBody("direct:unmarshalOk", body);
+
+ assertMockEndpointsSatisfied();
+ }
+
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from("direct:unmarshalFailed").unmarshal().hl7().to("mock:unmarshal");
+
+ from("direct:unmarshalOk").unmarshal().hl7(false).to("mock:unmarshal");
+ }
+ };
+ }
+
+ private static String createHL7AsString() {
+ String line1 = "MSH|^~\\&|MYSENDER|MYSENDERAPP|MYCLIENT|MYCLIENTAPP|200612211200||QRY^A19|1234|P|2.4";
+ String line2 = "QRD|200612211200|R|I|GetPatient|||1^RD|0101701234|DEM||";
+
+ StringBuffer body = new StringBuffer();
+ body.append(line1);
+ body.append("\n");
+ body.append(line2);
+ return body.toString();
+ }
+
+}
Propchange: camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7ValidateTest.java
------------------------------------------------------------------------------
svn:keywords = Rev Date