Coverage Report - ca.uhn.hl7v2.validation.RespondingValidationExceptionHandler
 
Classes in this File Line Coverage Branch Coverage Complexity
RespondingValidationExceptionHandler
69%
25/36
58%
7/12
2.333
 
 1  
 /**
 2  
 The contents of this file are subject to the Mozilla Public License Version 1.1 
 3  
 (the "License"); you may not use this file except in compliance with the License. 
 4  
 You may obtain a copy of the License at http://www.mozilla.org/MPL/ 
 5  
 Software distributed under the License is distributed on an "AS IS" basis, 
 6  
 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the 
 7  
 specific language governing rights and limitations under the License. 
 8  
 
 9  
 The Original Code is "RespondingValidationExceptionHandler.java".  Description: 
 10  
 "ValidationExceptionHandler that generates response messages" 
 11  
 
 12  
 The Initial Developer of the Original Code is University Health Network. Copyright (C) 
 13  
 2002.  All Rights Reserved. 
 14  
 
 15  
 Contributor(s): ______________________________________. 
 16  
 
 17  
 Alternatively, the contents of this file may be used under the terms of the 
 18  
 GNU General Public License (the "GPL"), in which case the provisions of the GPL are 
 19  
 applicable instead of those above.  If you wish to allow use of your version of this 
 20  
 file only under the terms of the GPL and not to allow others to use your version 
 21  
 of this file under the MPL, indicate your decision by deleting  the provisions above 
 22  
 and replace  them with the notice and other provisions required by the GPL License.  
 23  
 If you do not delete the provisions above, a recipient may use your version of 
 24  
 this file under either the MPL or the GPL. 
 25  
  */
 26  
 package ca.uhn.hl7v2.validation;
 27  
 
 28  
 import java.io.IOException;
 29  
 import java.util.List;
 30  
 
 31  
 import ca.uhn.hl7v2.AcknowledgmentCode;
 32  
 import ca.uhn.hl7v2.HL7Exception;
 33  
 import ca.uhn.hl7v2.HapiContext;
 34  
 import ca.uhn.hl7v2.Severity;
 35  
 import ca.uhn.hl7v2.model.Message;
 36  
 import ca.uhn.hl7v2.model.Segment;
 37  
 import ca.uhn.hl7v2.util.DeepCopy;
 38  
 
 39  
 /**
 40  
  * ValidationExceptionHandler that generates response messages as statically
 41  
  * configured and based on the outcome of a validation process. Aspects of
 42  
  * creating and populating the response message can be overwritten in
 43  
  * subclasses.
 44  
  * <p>
 45  
  * This handler (or a subclass thereof) can be used for validation if a
 46  
  * response message must be generated upon the validation result.
 47  
  * 
 48  
  * @author Christian Ohr
 49  
  */
 50  3
 public class RespondingValidationExceptionHandler extends
 51  
         CollectingValidationExceptionHandler<Message> implements
 52  
         ValidationExceptionHandlerFactory<Message> {
 53  
 
 54  5
     private AcknowledgmentCode successAcknowledgementCode = AcknowledgmentCode.AA;
 55  5
     private AcknowledgmentCode errorAcknowledgementCode = AcknowledgmentCode.AE;
 56  
 
 57  
     /**
 58  
      * @param context Hapi context
 59  
      */
 60  
     public RespondingValidationExceptionHandler(HapiContext context) {
 61  5
         super(context);
 62  5
     }
 63  
 
 64  
     /**
 65  
      * Returns the generated response message.
 66  
      * 
 67  
      * @return the generated response
 68  
      * @throws HL7Exception if no response could be generated
 69  
      * @see {@link #generateResponseMessage(Object)}
 70  
      * @see {@link #populateResponseMessage(ca.uhn.hl7v2.model.Message)}
 71  
      * 
 72  
      */
 73  
     public final Message result() throws HL7Exception {
 74  4
         Object validationSubject = getValidationSubject();
 75  4
         if (validationSubject == null) {
 76  0
             throw new HL7Exception("Need non-null validation subject");
 77  
         }
 78  4
         Message response = generateResponseMessage(validationSubject);
 79  4
         populateResponseMessage(response);
 80  4
         return response;
 81  
     }
 82  
 
 83  
     /**
 84  
      * Set acknowledgment code (AA,CA) in case validation passes.
 85  
      * 
 86  
      * @param successAcknowledgementCode (AA, CA)
 87  
      */
 88  
     public void setSuccessAcknowledgementCode(AcknowledgmentCode successAcknowledgementCode) {
 89  0
         this.successAcknowledgementCode = successAcknowledgementCode;
 90  0
     }
 91  
 
 92  
     /**
 93  
      * Set acknowledgment code (AR, AE ,CR, CE) in case validation passes.
 94  
      * 
 95  
      * @param errorAcknowledgementCode (AR, AE ,CR, CE)
 96  
      */
 97  
     public void setErrorAcknowledgementCode(AcknowledgmentCode errorAcknowledgementCode) {
 98  1
         this.errorAcknowledgementCode = errorAcknowledgementCode;
 99  1
     }
 100  
 
 101  
     /**
 102  
      * @return the acknowledgement code if validation has succeeded. Default is AA.
 103  
      */
 104  
     public AcknowledgmentCode getSuccessAcknowledgementCode() {
 105  4
         return successAcknowledgementCode;
 106  
     }
 107  
 
 108  
     /**
 109  
      * @return the acknowledgement code if validation has failed. Default is AE.
 110  
      */
 111  
     public AcknowledgmentCode getErrorAcknowledgementCode() {
 112  6
         return errorAcknowledgementCode;
 113  
     }
 114  
 
 115  
     /**
 116  
      * Generates an empty response message. This class generates an
 117  
      * ACKnowledgement using the code returned by {@link #getSuccessAcknowledgementCode()}.
 118  
      * 
 119  
      * @param request request message, either a {@link String} or a
 120  
      *            {@link Message}
 121  
      * @return acknowledgment to the request
 122  
      * @throws HL7Exception
 123  
      */
 124  
     protected Message generateResponseMessage(Object request) throws HL7Exception {
 125  
         try {
 126  
             Message in;
 127  4
             if (request instanceof String) {
 128  0
                 Segment s = getHapiContext().getGenericParser().getCriticalResponseData(
 129  
                         (String)request);
 130  0
                 in = s.getMessage();
 131  0
                 DeepCopy.copy(s, (Segment) in.get("MSH"));
 132  0
             } else if (request instanceof Message) {
 133  4
                 in = (Message) request;
 134  
             } else {
 135  0
                 throw new HL7Exception("Validated message must be either Message or String");
 136  
             }
 137  4
             return in.generateACK(getSuccessAcknowledgementCode(), null);
 138  
 
 139  0
         } catch (IOException e) {
 140  0
             throw new HL7Exception(e);
 141  
         }
 142  
     }
 143  
 
 144  
     /**
 145  
      * Populates the generated response based on the collected
 146  
      * {@link ValidationException}s. In case of exceptions, each exception will
 147  
      * cause an entry in one or more ERR segments.
 148  
      * 
 149  
      * @param response response message to be populated
 150  
      * @throws HL7Exception
 151  
      */
 152  
     protected void populateResponseMessage(Message response) throws HL7Exception {
 153  4
         if (response == null)
 154  0
             return;
 155  4
         List<ValidationException> exceptions = getExceptions();
 156  10
         for (int i = 0; i < exceptions.size(); i++) {
 157  6
             ValidationException ve = exceptions.get(i);
 158  
             // TODO respect minimumSeverity here?
 159  6
             if (ve.getSeverity() == Severity.ERROR) {
 160  6
                ve.populateResponse(response, getErrorAcknowledgementCode(), i);
 161  
             }
 162  
         }
 163  4
     }
 164  
 
 165  
     public ValidationExceptionHandler<Message> getNewInstance(HapiContext context) {
 166  2
         return new RespondingValidationExceptionHandler(context);
 167  
     }
 168  
 
 169  
 }