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 2014/08/25 08:48:53 UTC

[1/2] git commit: CAMEL-7403: hl7 improvements. Thanks to Christian Ohr for the patch.

Repository: camel
Updated Branches:
  refs/heads/master 4f8bf48e7 -> 6482bf78b


CAMEL-7403: hl7 improvements. Thanks to Christian Ohr for the patch.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/cf432211
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/cf432211
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/cf432211

Branch: refs/heads/master
Commit: cf432211608731e4d2b7d17f2426b084dbf4becc
Parents: 4f8bf48
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Aug 25 08:30:56 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Aug 25 08:30:56 2014 +0200

----------------------------------------------------------------------
 .../camel/component/hl7/HL7DataFormat.java      | 25 ++++++++++++++++++--
 .../hl7/ValidationContextPredicate.java         |  5 ++++
 2 files changed, 28 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/cf432211/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
index 949aaed..f3d16c7 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
@@ -21,6 +21,8 @@ import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Map;
 
+import ca.uhn.hl7v2.DefaultHapiContext;
+import ca.uhn.hl7v2.HapiContext;
 import ca.uhn.hl7v2.model.Message;
 import ca.uhn.hl7v2.parser.GenericParser;
 import ca.uhn.hl7v2.parser.Parser;
@@ -82,7 +84,8 @@ public class HL7DataFormat implements DataFormat {
 
     private static final Map<String, String> HEADER_MAP = new HashMap<String, String>();
 
-    private Parser parser = new GenericParser();
+    private HapiContext hapiContext = new DefaultHapiContext();
+    private Parser parser = hapiContext.getGenericParser();
     
     static {
         HEADER_MAP.put(HL7_SENDING_APPLICATION, "MSH-3");
@@ -117,20 +120,38 @@ public class HL7DataFormat implements DataFormat {
         return message;
     }
 
+    /**
+     * @deprecated configure validation by means of {@link ca.uhn.hl7v2.HapiContext}
+     */
     public boolean isValidate() {
-        return !(parser.getValidationContext() instanceof NoValidation);
+        return (parser.getValidationContext() != null && !(parser.getValidationContext() instanceof NoValidation));
     }
 
+    /**
+     * @deprecated configure validation by means of {@link ca.uhn.hl7v2.HapiContext}
+     */
     public void setValidate(boolean validate) {
         if (!validate) {
             parser.setValidationContext(new NoValidation());
         }
     }
 
+    public HapiContext getHapiContext() {
+        return hapiContext;
+    }
+
+    public void setHapiContext(HapiContext context) {
+        this.hapiContext = context;
+        this.parser = context.getGenericParser();
+    }
+
     public Parser getParser() {
         return parser;
     }
 
+    /**
+     * @deprecated configure the parser by means of {@link ca.uhn.hl7v2.HapiContext}
+     */
     public void setParser(Parser parser) {
         this.parser = parser;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/cf432211/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
index fb99497..6138377 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
@@ -17,6 +17,7 @@
 package org.apache.camel.component.hl7;
 
 import ca.uhn.hl7v2.HL7Exception;
+import ca.uhn.hl7v2.HapiContext;
 import ca.uhn.hl7v2.model.Message;
 import ca.uhn.hl7v2.validation.MessageValidator;
 import ca.uhn.hl7v2.validation.ValidationContext;
@@ -32,6 +33,10 @@ public class ValidationContextPredicate implements Predicate {
 
     private Expression validatorExpression;
 
+    public ValidationContextPredicate(HapiContext hapiContext) {
+        this(hapiContext.getValidationContext());
+    }
+
     public ValidationContextPredicate(ValidationContext validationContext) {
         this(ExpressionBuilder.constantExpression(validationContext));
     }


[2/2] git commit: CAMEL-7403: hl7 improvements. Thanks to Christian Ohr for the patch.

Posted by da...@apache.org.
CAMEL-7403: hl7 improvements. Thanks to Christian Ohr for the patch.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6482bf78
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6482bf78
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6482bf78

Branch: refs/heads/master
Commit: 6482bf78ba0f9d3cc7e51274d2fa12e474055c77
Parents: cf43221
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Aug 25 08:48:18 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Aug 25 08:48:18 2014 +0200

----------------------------------------------------------------------
 .gitignore                                      |   1 +
 .../org/apache/camel/component/hl7/AckCode.java |   3 +
 .../camel/component/hl7/AckExpression.java      |  36 +++++--
 .../org/apache/camel/component/hl7/HL7.java     |  22 +++-
 .../camel/component/hl7/HL7Constants.java       |   1 +
 .../camel/component/hl7/HL7Converter.java       |  18 ++--
 .../camel/component/hl7/HL7DataFormat.java      |  51 +++++----
 .../camel/component/hl7/HL7MLLPConfig.java      |  25 +++--
 .../hl7/ValidationContextPredicate.java         |  16 ++-
 .../camel/component/hl7/HL7DataFormatTest.java  |  11 +-
 .../component/hl7/MessageValidatorTest.java     | 108 +++++++++++--------
 11 files changed, 190 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index b74e107..2105a6b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,4 @@ target
 *.log
 test-salesforce-login.properties
 dependency-reduced-pom.xml
+id_file
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckCode.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckCode.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckCode.java
index b8e768f..493caf2 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckCode.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckCode.java
@@ -18,6 +18,9 @@ package org.apache.camel.component.hl7;
 
 import ca.uhn.hl7v2.AcknowledgmentCode;
 
+/**
+ * @deprecated use {@link ca.uhn.hl7v2.AcknowledgmentCode}
+ */
 public enum AckCode {
     AA(false), CA(false), AR(true), CR(true), AE(true), CE(true);
 

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckExpression.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckExpression.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckExpression.java
index 5a3ab37..25c1834 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckExpression.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/AckExpression.java
@@ -27,27 +27,43 @@ import org.apache.camel.util.ObjectHelper;
 
 public class AckExpression extends ExpressionAdapter {
 
-    private AckCode acknowledgementCode;
+    private AcknowledgmentCode acknowledgementCode;
     private String errorMessage;
     private ErrorCode errorCode;
 
     public AckExpression() {
-        this(null, null, ErrorCode.APPLICATION_INTERNAL_ERROR);
+        this((AcknowledgmentCode)null, null, ErrorCode.APPLICATION_INTERNAL_ERROR);
     }
 
+    /**
+     * @deprecated use {@link #AckExpression(ca.uhn.hl7v2.AcknowledgmentCode)}
+     */
+    @Deprecated
     public AckExpression(AckCode acknowledgementCode) {
-        this(acknowledgementCode, null, ErrorCode.APPLICATION_INTERNAL_ERROR);
+        this(acknowledgementCode.toAcknowledgmentCode());
     }
 
     /**
-     * @deprecated Use {@link #AckExpression(AckCode, String, ErrorCode)}
+     * @deprecated Use {@link #AckExpression(AcknowledgmentCode, String, ErrorCode)}
      */
     @Deprecated
     public AckExpression(AckCode acknowledgementCode, String errorMessage, int errorCode) {
         this(acknowledgementCode, errorMessage, ErrorCode.errorCodeFor(errorCode));
     }
 
+    /**
+     * @deprecated Use {@link #AckExpression(AcknowledgmentCode, String, ErrorCode)}
+     */
+    @Deprecated
     public AckExpression(AckCode acknowledgementCode, String errorMessage, ErrorCode errorCode) {
+        this(acknowledgementCode.toAcknowledgmentCode(), errorMessage, errorCode);
+    }
+
+    public AckExpression(AcknowledgmentCode acknowledgementCode) {
+        this(acknowledgementCode, null, ErrorCode.APPLICATION_INTERNAL_ERROR);
+    }
+
+    public AckExpression(AcknowledgmentCode acknowledgementCode, String errorMessage, ErrorCode errorCode) {
         this.acknowledgementCode = acknowledgementCode;
         this.errorMessage = errorMessage;
         this.errorCode = errorCode;
@@ -59,11 +75,11 @@ public class AckExpression extends ExpressionAdapter {
         Message msg = exchange.getIn().getBody(Message.class);
         try {
             HL7Exception hl7e = generateHL7Exception(t);
-            AckCode code = acknowledgementCode;
+            AcknowledgmentCode code = acknowledgementCode;
             if (t != null && code == null) {
-                code = AckCode.AE;
+                code = AcknowledgmentCode.AE;
             }
-            return msg.generateACK(code == null ? AcknowledgmentCode.AA : code.toAcknowledgmentCode(), hl7e);
+            return msg.generateACK(code == null ? AcknowledgmentCode.AA : code, hl7e);
         } catch (Exception e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         }
@@ -72,7 +88,7 @@ public class AckExpression extends ExpressionAdapter {
     private HL7Exception generateHL7Exception(Throwable t) {
         HL7Exception hl7Exception = null;
         if (t == null) {
-            if (acknowledgementCode != null && acknowledgementCode.isError()) {
+            if (acknowledgementCode != null && !isSuccess(acknowledgementCode)) {
                 hl7Exception = new HL7Exception(errorMessage, errorCode);
             }
         } else {
@@ -86,4 +102,8 @@ public class AckExpression extends ExpressionAdapter {
         return hl7Exception;
     }
 
+    private boolean isSuccess(AcknowledgmentCode code) {
+        return code.name().endsWith("A");
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7.java
index 4db1f40..c1a6ae2 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7.java
@@ -16,7 +16,9 @@
  */
 package org.apache.camel.component.hl7;
 
+import ca.uhn.hl7v2.AcknowledgmentCode;
 import ca.uhn.hl7v2.ErrorCode;
+import ca.uhn.hl7v2.HapiContext;
 import ca.uhn.hl7v2.validation.ValidationContext;
 
 import org.apache.camel.Exchange;
@@ -56,17 +58,33 @@ public final class HL7 {
     }
 
     /**
-     * @deprecated Use {@link #ack(AckCode, String, ErrorCode)}
+     * @deprecated Use {@link #ack(ca.uhn.hl7v2.AcknowledgmentCode, String, ErrorCode)}
      */
     @Deprecated
     public static Expression ack(AckCode code, String errorMessage, int errorCode) {
-        return ack(code, errorMessage, ErrorCode.errorCodeFor(errorCode));
+        return ack(code.toAcknowledgmentCode(), errorMessage, ErrorCode.errorCodeFor(errorCode));
     }
 
+    /**
+     * @deprecated Use {@link #ack(ca.uhn.hl7v2.AcknowledgmentCode, String, ErrorCode)}
+     */
+    @Deprecated
     public static Expression ack(AckCode code, String errorMessage, ErrorCode errorCode) {
+        return ack(code.toAcknowledgmentCode(), errorMessage, errorCode);
+    }
+
+    public static Expression ack(AcknowledgmentCode code, String errorMessage, ErrorCode errorCode) {
         return new AckExpression(code, errorMessage, errorCode);
     }
 
+    public static Predicate messageConforms() {
+        return new ValidationContextPredicate();
+    }
+
+    public static Predicate messageConformsTo(HapiContext hapiContext) {
+        return new ValidationContextPredicate(hapiContext);
+    }
+
     public static Predicate messageConformsTo(ValidationContext validationContext) {
         return new ValidationContextPredicate(validationContext);
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Constants.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Constants.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Constants.java
index cff8c6f..50b103d 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Constants.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Constants.java
@@ -32,6 +32,7 @@ public final class HL7Constants {
     public static final String HL7_MESSAGE_CONTROL = "CamelHL7MessageControl";
     public static final String HL7_PROCESSING_ID = "CamelHL7ProcessingId";
     public static final String HL7_VERSION_ID = "CamelHL7VersionId";
+    public static final String HL7_CONTEXT = "CamelHL7Context";
 
     private HL7Constants() {
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java
index 115cf03..8898647 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7Converter.java
@@ -16,12 +16,12 @@
  */
 package org.apache.camel.component.hl7;
 
+import ca.uhn.hl7v2.DefaultHapiContext;
 import ca.uhn.hl7v2.HL7Exception;
+import ca.uhn.hl7v2.HapiContext;
 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 ca.uhn.hl7v2.validation.impl.ValidationContextFactory;
 import org.apache.camel.Converter;
 
 /**
@@ -30,24 +30,20 @@ import org.apache.camel.Converter;
 @Converter
 public final class HL7Converter {
 
+    private static final HapiContext DEFAULT_CONTEXT = new DefaultHapiContext(ValidationContextFactory.noValidation());
+
     private HL7Converter() {
         // Helper class
     }
 
-    private static Parser getParser() {
-        PipeParser pipeParser = new PipeParser();
-        pipeParser.setValidationContext(new NoValidation());
-        return pipeParser;
-    }
-
     @Converter
     public static String toString(Message message) throws HL7Exception {
-        return encode(message, getParser());
+        return message.encode();
     }
 
     @Converter
     public static Message toMessage(String body) throws HL7Exception {
-        return parse(body, getParser());
+        return parse(body, DEFAULT_CONTEXT.getGenericParser());
     }
 
     static Message parse(String body, Parser parser) throws HL7Exception {

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
index f3d16c7..7acbee8 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7DataFormat.java
@@ -24,16 +24,16 @@ import java.util.Map;
 import ca.uhn.hl7v2.DefaultHapiContext;
 import ca.uhn.hl7v2.HapiContext;
 import ca.uhn.hl7v2.model.Message;
-import ca.uhn.hl7v2.parser.GenericParser;
 import ca.uhn.hl7v2.parser.Parser;
 import ca.uhn.hl7v2.util.Terser;
-import ca.uhn.hl7v2.validation.impl.NoValidation;
-
+import ca.uhn.hl7v2.validation.impl.ValidationContextFactory;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.DataFormat;
+import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.IOHelper;
 
+import static org.apache.camel.component.hl7.HL7Constants.HL7_CONTEXT;
 import static org.apache.camel.component.hl7.HL7Constants.HL7_MESSAGE_CONTROL;
 import static org.apache.camel.component.hl7.HL7Constants.HL7_MESSAGE_TYPE;
 import static org.apache.camel.component.hl7.HL7Constants.HL7_PROCESSING_ID;
@@ -80,12 +80,13 @@ import static org.apache.camel.component.hl7.HL7Constants.HL7_VERSION_ID;
  *
  * @see org.apache.camel.component.hl7.HL7MLLPCodec
  */
-public class HL7DataFormat implements DataFormat {
+public class HL7DataFormat extends ServiceSupport implements DataFormat {
 
     private static final Map<String, String> HEADER_MAP = new HashMap<String, String>();
 
-    private HapiContext hapiContext = new DefaultHapiContext();
-    private Parser parser = hapiContext.getGenericParser();
+    private HapiContext hapiContext;
+    private Parser parser;
+    private boolean validate = true;
     
     static {
         HEADER_MAP.put(HL7_SENDING_APPLICATION, "MSH-3");
@@ -117,23 +118,16 @@ public class HL7DataFormat implements DataFormat {
         for (Map.Entry<String, String> entry : HEADER_MAP.entrySet()) {
             exchange.getOut().setHeader(entry.getKey(), terser.get(entry.getValue()));
         }
+        exchange.getOut().setHeader(HL7_CONTEXT, hapiContext);
         return message;
     }
 
-    /**
-     * @deprecated configure validation by means of {@link ca.uhn.hl7v2.HapiContext}
-     */
     public boolean isValidate() {
-        return (parser.getValidationContext() != null && !(parser.getValidationContext() instanceof NoValidation));
+        return validate;
     }
 
-    /**
-     * @deprecated configure validation by means of {@link ca.uhn.hl7v2.HapiContext}
-     */
     public void setValidate(boolean validate) {
-        if (!validate) {
-            parser.setValidationContext(new NoValidation());
-        }
+        this.validate = validate;
     }
 
     public HapiContext getHapiContext() {
@@ -142,20 +136,33 @@ public class HL7DataFormat implements DataFormat {
 
     public void setHapiContext(HapiContext context) {
         this.hapiContext = context;
-        this.parser = context.getGenericParser();
     }
 
     public Parser getParser() {
         return parser;
     }
 
-    /**
-     * @deprecated configure the parser by means of {@link ca.uhn.hl7v2.HapiContext}
-     */
     public void setParser(Parser parser) {
         this.parser = parser;
     }
-    
-    
+
+
+    @Override
+    protected void doStart() throws Exception {
+        if (hapiContext == null) {
+            hapiContext = new DefaultHapiContext();
+        }
+        if (parser == null) {
+            parser = hapiContext.getGenericParser();
+        }
+        if (!validate) {
+            parser.setValidationContext(ValidationContextFactory.noValidation());
+        }
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        // noop
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java
index d9dd2cd..61e4e45 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/HL7MLLPConfig.java
@@ -18,9 +18,9 @@ package org.apache.camel.component.hl7;
 
 import java.nio.charset.Charset;
 
+import ca.uhn.hl7v2.DefaultHapiContext;
+import ca.uhn.hl7v2.HapiContext;
 import ca.uhn.hl7v2.parser.Parser;
-import ca.uhn.hl7v2.parser.PipeParser;
-import ca.uhn.hl7v2.validation.impl.NoValidation;
 
 class HL7MLLPConfig {
 
@@ -34,8 +34,10 @@ class HL7MLLPConfig {
     private char endByte1 = 0x1c; // 28 decimal
 
     private char endByte2 = 0x0d; // 13 decimal
-    
-    private Parser parser = new PipeParser();
+
+    private HapiContext hapiContext = new DefaultHapiContext();
+
+    private Parser parser = hapiContext.getGenericParser();
 
     public Charset getCharset() {
         return charset;
@@ -85,13 +87,20 @@ class HL7MLLPConfig {
         this.parser = parser;
     }
 
+    public HapiContext getHapiContext() {
+        return hapiContext;
+    }
+
+    public void setHapiContext(HapiContext hapiContext) {
+        this.hapiContext = hapiContext;
+        this.parser = hapiContext.getPipeParser();
+    }
+
     public boolean isValidate() {
-        return !(parser.getValidationContext() instanceof NoValidation);
+        return parser.getParserConfiguration().isValidating();
     }
 
     public void setValidate(boolean validate) {
-        if (!validate) {
-            parser.setValidationContext(new NoValidation());
-        }
+        parser.getParserConfiguration().setValidating(validate);
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
index 6138377..d10a017 100644
--- a/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
+++ b/components/camel-hl7/src/main/java/org/apache/camel/component/hl7/ValidationContextPredicate.java
@@ -33,6 +33,10 @@ public class ValidationContextPredicate implements Predicate {
 
     private Expression validatorExpression;
 
+    public ValidationContextPredicate() {
+        this((Expression)null);
+    }
+
     public ValidationContextPredicate(HapiContext hapiContext) {
         this(hapiContext.getValidationContext());
     }
@@ -48,12 +52,20 @@ public class ValidationContextPredicate implements Predicate {
     @Override
     public boolean matches(Exchange exchange) {
         try {
-            ValidationContext context = validatorExpression.evaluate(exchange, ValidationContext.class);
+            Message message = exchange.getIn().getBody(Message.class);
+            ValidationContext context = validatorExpression != null
+                    ? validatorExpression.evaluate(exchange, ValidationContext.class)
+                    : dynamicValidationContext(message, exchange.getIn().getHeader(HL7Constants.HL7_CONTEXT, HapiContext.class));
             MessageValidator validator = new MessageValidator(context, false);
-            return validator.validate(exchange.getIn().getBody(Message.class));
+            return validator.validate(message);
         } catch (HL7Exception e) {
             throw ObjectHelper.wrapRuntimeCamelException(e);
         }
     }
 
+    private ValidationContext dynamicValidationContext(Message message, HapiContext hapiContext) {
+        return hapiContext != null
+                ? hapiContext.getValidationContext()
+                : message.getParser().getHapiContext().getValidationContext();
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7DataFormatTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7DataFormatTest.java b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7DataFormatTest.java
index 97364ef..48a710c 100644
--- a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7DataFormatTest.java
+++ b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/HL7DataFormatTest.java
@@ -25,6 +25,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -33,7 +34,9 @@ import org.junit.Test;
 public class HL7DataFormatTest extends CamelTestSupport {
     private static final String NONE_ISO_8859_1 = 
         "\u221a\u00c4\u221a\u00e0\u221a\u00e5\u221a\u00ed\u221a\u00f4\u2248\u00ea";
-    
+
+    private HL7DataFormat hl7;
+
     @Test
     public void testMarshal() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:marshal");
@@ -91,6 +94,7 @@ public class HL7DataFormatTest extends CamelTestSupport {
         mock.expectedHeaderReceived(HL7Constants.HL7_MESSAGE_CONTROL, "1234");
         mock.expectedHeaderReceived(HL7Constants.HL7_PROCESSING_ID, "P");
         mock.expectedHeaderReceived(HL7Constants.HL7_VERSION_ID, "2.4");
+        mock.expectedHeaderReceived(HL7Constants.HL7_CONTEXT, hl7.getHapiContext());
 
         String body = createHL7AsString();
         template.sendBody("direct:unmarshal", body);
@@ -104,11 +108,12 @@ public class HL7DataFormatTest extends CamelTestSupport {
     }
 
     protected RouteBuilder createRouteBuilder() throws Exception {
+
         return new RouteBuilder() {
             public void configure() throws Exception {
+                hl7 = new HL7DataFormat();
                 from("direct:marshal").marshal().hl7().to("mock:marshal");
-
-                from("direct:unmarshal").unmarshal().hl7().to("mock:unmarshal");
+                from("direct:unmarshal").unmarshal(hl7).to("mock:unmarshal");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/6482bf78/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/MessageValidatorTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/MessageValidatorTest.java b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/MessageValidatorTest.java
index 0ae73e9..050e37d 100644
--- a/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/MessageValidatorTest.java
+++ b/components/camel-hl7/src/test/java/org/apache/camel/component/hl7/MessageValidatorTest.java
@@ -16,79 +16,71 @@
  */
 package org.apache.camel.component.hl7;
 
+import ca.uhn.hl7v2.DefaultHapiContext;
+import ca.uhn.hl7v2.HapiContext;
+import ca.uhn.hl7v2.Version;
 import ca.uhn.hl7v2.model.Message;
 import ca.uhn.hl7v2.model.v24.message.ADT_A01;
 import ca.uhn.hl7v2.model.v24.segment.PID;
-import ca.uhn.hl7v2.validation.MessageRule;
 import ca.uhn.hl7v2.validation.ValidationContext;
-import ca.uhn.hl7v2.validation.ValidationException;
-import ca.uhn.hl7v2.validation.impl.DefaultValidation;
-import ca.uhn.hl7v2.validation.impl.MessageRuleBinding;
-import ca.uhn.hl7v2.validation.impl.ValidationContextImpl;
-
+import ca.uhn.hl7v2.validation.builder.ValidationRuleBuilder;
+import ca.uhn.hl7v2.validation.impl.ValidationContextFactory;
 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.Ignore;
 import org.junit.Test;
 
+import static org.apache.camel.component.hl7.HL7.messageConforms;
 import static org.apache.camel.component.hl7.HL7.messageConformsTo;
 
 public class MessageValidatorTest extends CamelTestSupport {
 
-    private static final ValidationException[] VALIDATION_OK = new ValidationException[0];
-    private ValidationContext defaultContext;
-    private ValidationContextImpl customContext;
+    private ValidationContext defaultValidationContext;
+    private ValidationContext customValidationContext;
+    private HapiContext defaultContext;
+    private HapiContext customContext;
 
     @Override
     protected void doPreSetup() throws Exception {
-        defaultContext = new DefaultValidation();
-        customContext = new DefaultValidation();
-        MessageRule rule = new MessageRule() {
-
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public String getDescription() {
-                return null;
-            }
-
-            @Override
-            public String getSectionReference() {
-                return null;
-            }
+        defaultValidationContext = ValidationContextFactory.defaultValidation();
+        defaultContext = new DefaultHapiContext(defaultValidationContext);
 
+        ValidationRuleBuilder builder = new ValidationRuleBuilder() {
             @Override
-            public ValidationException[] test(Message msg) {
-                ADT_A01 a01 = (ADT_A01)msg;
-                if (a01.getPID().getAdministrativeSex().getValue() == null) {
-                    ValidationException[] e = new ValidationException[1];
-                    e[0] = new ValidationException("No gender provided!");
-                    return e;
-                }
-                return VALIDATION_OK;
+            protected void configure() {
+                forVersion(Version.V24)
+                        .message("ADT", "A01")
+                        .terser("PID-8", not(empty()));
             }
-
-            @Override
-            public ValidationException[] apply(Message msg) {
-                return test(msg);
-            }
-
         };
-        MessageRuleBinding binding = new MessageRuleBinding("2.4", "ADT", "A01", rule);
-        customContext.getMessageRuleBindings().add(binding);
+        customValidationContext = ValidationContextFactory.fromBuilder(builder);
+        customContext = new DefaultHapiContext(customValidationContext);
     }
 
     @Test
-    public void testDefaultValidationContext() throws Exception {
-        MockEndpoint mock = getMockEndpoint("mock:test1");
+    public void testDefaultHapiContext() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:test4");
         mock.expectedMessageCount(1);
         Message msg = createADT01Message();
-        template.sendBody("direct:test1", msg);
+        template.sendBody("direct:test4", msg);
         assertMockEndpointsSatisfied();
     }
 
     @Test(expected = CamelExecutionException.class)
+    @Ignore
+    public void testCustomHapiContext() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:test5");
+        mock.expectedMessageCount(0);
+        Message msg = createADT01Message();
+        template.sendBody("direct:test5", msg);
+        assertMockEndpointsSatisfied();
+    }
+
+
+    @Test(expected = CamelExecutionException.class)
+    @Ignore
     public void testCustomValidationContext() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:test2");
         mock.expectedMessageCount(0);
@@ -102,7 +94,28 @@ public class MessageValidatorTest extends CamelTestSupport {
         MockEndpoint mock = getMockEndpoint("mock:test3");
         mock.expectedMessageCount(1);
         Message msg = createADT01Message();
-        template.sendBodyAndHeader("direct:test3", msg, "validator", defaultContext);
+        template.sendBodyAndHeader("direct:test3", msg, "validator", defaultValidationContext);
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testDynamicDefaultHapiContext() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:test6");
+        mock.expectedMessageCount(1);
+        Message msg = createADT01Message();
+        msg.setParser(defaultContext.getPipeParser());
+        template.sendBody("direct:test6", msg);
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test(expected = CamelExecutionException.class)
+    @Ignore
+    public void testDynamicCustomHapiContext() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:test6");
+        mock.expectedMessageCount(1);
+        Message msg = createADT01Message();
+        msg.setParser(customContext.getPipeParser());
+        template.sendBody("direct:test6", msg);
         assertMockEndpointsSatisfied();
     }
 
@@ -110,9 +123,12 @@ public class MessageValidatorTest extends CamelTestSupport {
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                from("direct:test1").validate(messageConformsTo(defaultContext)).to("mock:test1");
-                from("direct:test2").validate(messageConformsTo(customContext)).to("mock:test2");
+                from("direct:test1").validate(messageConformsTo(defaultValidationContext)).to("mock:test1");
+                from("direct:test2").validate(messageConformsTo(customValidationContext)).to("mock:test2");
                 from("direct:test3").validate(messageConformsTo(header("validator"))).to("mock:test3");
+                from("direct:test4").validate(messageConformsTo(defaultContext)).to("mock:test4");
+                from("direct:test5").validate(messageConformsTo(customContext)).to("mock:test5");
+                from("direct:test6").validate(messageConforms()).to("mock:test6");
             }
         };
     }