Author: krasserm Date: Fri Feb 5 09:14:14 2010 New Revision: 906862 URL: http://svn.apache.org/viewvc?rev=906862&view=rev Log: fix for CAMEL-2451: HL7MLLPDecoder fails if message length is exactly 1022
Added: camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPCodecBoundaryTest.java (with props) camel/trunk/components/camel-hl7/src/test/resources/mdm_t02-1022.txt (with props) Modified: camel/trunk/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPDecoder.java 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=906862&r1=906861&r2=906862&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 Fri Feb 5 09:14:14 2010 @@ -103,34 +103,37 @@ // Start scanning where we left in.position(state.current); LOG.debug("Start scanning buffer at position " + in.position()); - while (in.hasRemaining()) { byte b = in.get(); // Check start byte if (b == config.getStartByte()) { - if (state.posStart > 0) { + if (state.posStart > 0 || state.waitingForEndByte2) { LOG.warn("Ignoring message start at position " + in.position() + " before previous message has ended."); } else { state.posStart = in.position(); + state.waitingForEndByte2 = false; if (LOG.isDebugEnabled()) { LOG.debug("Message starts at position " + state.posStart); } } } - // Check end bytes + // Check end byte1 if (b == config.getEndByte1()) { - byte next = in.get(); - if (next == config.getEndByte2()) { - state.posEnd = in.position() - 2; // use -2 to skip these - // last 2 end markers - if (LOG.isDebugEnabled()) { - LOG.debug("Message ends at position " + state.posEnd); - } - break; + if (!state.waitingForEndByte2 && state.posStart > 0) { + state.waitingForEndByte2 = true; } else { - // we expected the 2nd end marker - LOG.warn("The 2nd end byte " + config.getEndByte2() + " was not found, but was " + b); + LOG.warn("Ignoring unexpected 1st end byte " + b + ". Expected 2nd endpoint " + config.getEndByte2()); + } + } + // Check end byte2 + if (b == config.getEndByte2() && state.waitingForEndByte2) { + state.posEnd = in.position() - 2; // use -2 to skip these + // last 2 end markers + state.waitingForEndByte2 = false; + if (LOG.isDebugEnabled()) { + LOG.debug("Message ends at position " + state.posEnd); } + break; } } // Remember where we are @@ -161,6 +164,7 @@ int posStart; int posEnd; int current; + boolean waitingForEndByte2; int length() { return posEnd - posStart; @@ -169,6 +173,7 @@ void reset() { posStart = 0; posEnd = 0; + waitingForEndByte2 = false; } } Added: camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPCodecBoundaryTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPCodecBoundaryTest.java?rev=906862&view=auto ============================================================================== --- camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPCodecBoundaryTest.java (added) +++ camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPCodecBoundaryTest.java Fri Feb 5 09:14:14 2010 @@ -0,0 +1,77 @@ +/** + * 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 java.io.BufferedReader; +import java.io.InputStreamReader; + +import ca.uhn.hl7v2.model.v25.message.MDM_T02; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; + +/** + * Test for situation where the two end bytes are split across different byte + * buffers. + */ +public class HL7MLLPCodecBoundaryTest extends CamelTestSupport { + + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + HL7MLLPCodec codec = new HL7MLLPCodec(); + codec.setCharset("iso-8859-1"); + jndi.bind("hl7codec", codec); + return jndi; + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("mina:tcp://127.0.0.1:8888?sync=true&codec=#hl7codec").process(new Processor() { + public void process(Exchange exchange) throws Exception { + // check presence of correct message type + exchange.getIn().getBody(MDM_T02.class); + } + }).to("mock:result"); + } + }; + } + + @Test + public void testSendHL7Message() throws Exception { + BufferedReader in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/mdm_t02-1022.txt"))); + String line = ""; + String message = ""; + while (line != null) { + if ((line = in.readLine()) != null) { + message += line + "\r"; + } + } + message = message.substring(0, message.length() - 1); + assertEquals(1022, message.length()); + MockEndpoint mockEndpoint = getMockEndpoint("mock:result"); + mockEndpoint.expectedMessageCount(1); + template.requestBody("mina:tcp://127.0.0.1:8888?sync=true&codec=#hl7codec", message); + mockEndpoint.assertIsSatisfied(); + } + +} Propchange: camel/trunk/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7MLLPCodecBoundaryTest.java ------------------------------------------------------------------------------ svn:eol-style = native Added: camel/trunk/components/camel-hl7/src/test/resources/mdm_t02-1022.txt URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-hl7/src/test/resources/mdm_t02-1022.txt?rev=906862&view=auto ============================================================================== --- camel/trunk/components/camel-hl7/src/test/resources/mdm_t02-1022.txt (added) +++ camel/trunk/components/camel-hl7/src/test/resources/mdm_t02-1022.txt Fri Feb 5 09:14:14 2010 @@ -0,0 +1,6 @@ +MSH|^~\&|System|Facility|||20071129144629||MDM^T02|1238659179|T|2.5|||AL +EVN|T02|20071129144629|||||IC +PID|1||1000013||Fischer^Michael^^||19430826|M|||Marbachstr. 14^^Muenchen^BY^81373^DE^H||089/748752|||W|||||||Salzburg||| +PV1|||||||||||||||||||2350013||||||||||||||||||||||||| +TXA||mriReport|text/html|||20061224101900|||4711^Mustermann^Max^^^Dr.^^^^^^^^HZL|||2350013501^^37459732765491768364593264738293^SHA-1||||test.txt|PA|U|UN|||^Schwille^Juergen^^^Prof.^^^^^^^^HZL^20061224101900 +OBX|1|ED|^Document Content|1|^^text/html^Base64^1234ABCDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=||||||F Propchange: camel/trunk/components/camel-hl7/src/test/resources/mdm_t02-1022.txt ------------------------------------------------------------------------------ svn:eol-style = native