View Javadoc

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  public class RespondingValidationExceptionHandler extends
51          CollectingValidationExceptionHandler<Message> implements
52          ValidationExceptionHandlerFactory<Message> {
53  
54      private AcknowledgmentCode successAcknowledgementCode = AcknowledgmentCode.AA;
55      private AcknowledgmentCode errorAcknowledgementCode = AcknowledgmentCode.AE;
56  
57      /**
58       * @param context Hapi context
59       */
60      public RespondingValidationExceptionHandler(HapiContext context) {
61          super(context);
62      }
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          Object validationSubject = getValidationSubject();
75          if (validationSubject == null) {
76              throw new HL7Exception("Need non-null validation subject");
77          }
78          Message response = generateResponseMessage(validationSubject);
79          populateResponseMessage(response);
80          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          this.successAcknowledgementCode = successAcknowledgementCode;
90      }
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          this.errorAcknowledgementCode = errorAcknowledgementCode;
99      }
100 
101     /**
102      * @return the acknowledgement code if validation has succeeded. Default is AA.
103      */
104     public AcknowledgmentCode getSuccessAcknowledgementCode() {
105         return successAcknowledgementCode;
106     }
107 
108     /**
109      * @return the acknowledgement code if validation has failed. Default is AE.
110      */
111     public AcknowledgmentCode getErrorAcknowledgementCode() {
112         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             if (request instanceof String) {
128                 Segment s = getHapiContext().getGenericParser().getCriticalResponseData(
129                         (String)request);
130                 in = s.getMessage();
131                 DeepCopy.copy(s, (Segment) in.get("MSH"));
132             } else if (request instanceof Message) {
133                 in = (Message) request;
134             } else {
135                 throw new HL7Exception("Validated message must be either Message or String");
136             }
137             return in.generateACK(getSuccessAcknowledgementCode(), null);
138 
139         } catch (IOException e) {
140             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         if (response == null)
154             return;
155         List<ValidationException> exceptions = getExceptions();
156         for (int i = 0; i < exceptions.size(); i++) {
157             ValidationException ve = exceptions.get(i);
158             // TODO respect minimumSeverity here?
159             if (ve.getSeverity() == Severity.ERROR) {
160                ve.populateResponse(response, getErrorAcknowledgementCode(), i);
161             }
162         }
163     }
164 
165     public ValidationExceptionHandler<Message> getNewInstance(HapiContext context) {
166         return new RespondingValidationExceptionHandler(context);
167     }
168 
169 }