1 package ca.uhn.hl7v2.testpanel.util.compare;
2
3 import java.util.ArrayList;
4 import java.util.HashSet;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Set;
8 import java.util.logging.Logger;
9
10 import ca.uhn.hl7v2.HL7Exception;
11 import ca.uhn.hl7v2.model.Message;
12 import ca.uhn.hl7v2.parser.PipeParser;
13 import ca.uhn.hl7v2.testpanel.api.IMessageTransformer;
14 import ca.uhn.hl7v2.testpanel.ex.UnexpectedTestFailureException;
15 import ca.uhn.hl7v2.util.Terser;
16
17 public class BulkHl7V2Comparison {
18
19 static final String ACTUAL_DESC = "Actual";
20 static final String EXPECTED_DESC = "Expected";
21
22 private static final Logger ourLog = Logger.getLogger(BulkHl7V2Comparison.class.getName());
23
24 private Iterator<Message> myActualMessages;
25 private List<IMessageTransformer<Message>> myActualMessageTransformers = new ArrayList<IMessageTransformer<Message>>();
26 private boolean myCancelled;
27 private Iterator<Message> myExpectedMessages;
28 private List<IMessageTransformer<Message>> myExpectedMessageTransformers = new ArrayList<IMessageTransformer<Message>>();
29 private Set<String> myFieldsToIgnore = new HashSet<String>();
30 private List<IComparisonListener> myListeners = new ArrayList<IComparisonListener>();
31 private PipeParser myParser;
32 private boolean myStopOnFirstFailure;
33 private int myTotalMessages = -1;
34 private String myExpectedDesc = EXPECTED_DESC;
35 private String myActualDesc = ACTUAL_DESC;
36 private boolean myHaveFailure;
37
38 public BulkHl7V2Comparison() {
39 myParser = PipeParser.getInstanceWithNoValidation();
40 }
41
42 public void addActualMessageTransformer(IMessageTransformer<Message> theTransformer) {
43 myActualMessageTransformers.add(theTransformer);
44 }
45
46 public void addExpectedMessageTransformer(IMessageTransformer<Message> theTransformer) {
47 myExpectedMessageTransformers.add(theTransformer);
48 }
49
50
51
52
53 public void addFieldToIgnore(String theFieldToIgnore) {
54 myFieldsToIgnore.add(theFieldToIgnore);
55 }
56
57
58
59
60 public void cancel() {
61 myCancelled = true;
62 }
63
64 public void compare() throws UnexpectedTestFailureException {
65 myHaveFailure = false;
66
67 int actualIndex = 0;
68 int expectedIndex = 0;
69
70 while (myActualMessages.hasNext() && myExpectedMessages.hasNext() && !myCancelled) {
71
72 Message actualMessage = myActualMessages.next();
73 Message expectedMessage = myExpectedMessages.next();
74
75 for (IMessageTransformer<Message> next : myExpectedMessageTransformers) {
76 expectedMessage = next.transform(expectedMessage);
77 }
78 for (IMessageTransformer<Message> next : myActualMessageTransformers) {
79 actualMessage = next.transform(actualMessage);
80 }
81
82 Terser aTerser = new Terser(actualMessage);
83 Terser eTerser = new Terser(expectedMessage);
84
85 StringBuilder msg = new StringBuilder();
86 msg.append("Comparing message " + (actualIndex + 1));
87 if (myTotalMessages != -1) {
88 msg.append((actualIndex + 1) + "/" + myTotalMessages);
89 }
90 try {
91 msg.append(" - MSH-10 " + myExpectedDesc + "[" + eTerser.get("/.MSH-10") + "] " + myActualDesc + "[" + aTerser.get("/.MSH-10") + "]");
92 } catch (HL7Exception e) {
93
94 }
95 String msgLine = msg.toString();
96 ourLog.info(msgLine);
97
98 for (IComparisonListener next : myListeners) {
99 next.progressLog(msgLine);
100 }
101
102 Hl7V2MessageCompare comparison = new Hl7V2MessageCompare(myParser);
103 comparison.setFieldsToIgnore(myFieldsToIgnore);
104 comparison.setExpectedAndActualDescription(myExpectedDesc, myActualDesc);
105 comparison.compare(expectedMessage, actualMessage);
106
107 notyfyListeners(comparison);
108
109 if (!comparison.isSame()) {
110 myHaveFailure = true;
111 if (myStopOnFirstFailure) {
112 break;
113 }
114 }
115
116 actualIndex++;
117 expectedIndex++;
118 }
119
120 }
121
122
123
124
125
126 public boolean isHaveFailure() {
127 return myHaveFailure;
128 }
129
130
131
132
133 public boolean isStopOnFirstFailure() {
134 return myStopOnFirstFailure;
135 }
136
137 private void notyfyListeners(Hl7V2MessageCompare theCompare) {
138 if (theCompare.isSame()) {
139 for (IComparisonListener next : myListeners) {
140 next.success(theCompare);
141 }
142 }else {
143 for (IComparisonListener next : myListeners) {
144 next.failure(theCompare);
145 }
146 }
147 }
148
149
150
151
152
153 public void setActualMessages(Iterator<Message> theActualMessages) {
154 myTotalMessages = -1;
155 myActualMessages = theActualMessages;
156 }
157
158
159
160
161
162 public void setActualMessages(List<Message> theActualMessages) {
163 myTotalMessages = theActualMessages.size();
164 myActualMessages = theActualMessages.iterator();
165 }
166
167
168
169
170
171 public void setExpectedMessages(Iterator<Message> theExpectedMessages) {
172 myExpectedMessages = theExpectedMessages;
173 }
174
175
176
177
178
179 public void setExpectedMessages(List<Message> theExpectedMessages) {
180 myExpectedMessages = theExpectedMessages.iterator();
181 }
182
183
184
185
186
187
188 public void setStopOnFirstFailure(boolean theStopOnFirstFailure) {
189 myStopOnFirstFailure = theStopOnFirstFailure;
190 }
191
192 public void addComparisonListener(IComparisonListener theListeners) {
193 myListeners.add(theListeners);
194 }
195
196 public void setActualAndExpectedDescription(String theString, String theString2) {
197
198
199 }
200
201
202
203
204
205 public void setExpectedAndActualDescription(String theExpectedDesc, String theActualDesc) {
206 myExpectedDesc = theExpectedDesc;
207 myActualDesc = theActualDesc;
208 }
209
210 }