1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package dk.sosi.seal.modelbuilders;
30
31 import dk.sosi.seal.SOSIFactory;
32 import dk.sosi.seal.model.Reply;
33 import dk.sosi.seal.model.SignatureUtil;
34 import dk.sosi.seal.model.constants.*;
35 import dk.sosi.seal.xml.XmlUtil;
36 import org.w3c.dom.Document;
37 import org.w3c.dom.Element;
38
39
40
41
42
43
44
45
46 public class ReplyModelBuilder extends MessageModelBuilder {
47
48 public ReplyModelBuilder(SOSIFactory fac) {
49 super(fac);
50 }
51
52
53
54
55
56
57
58 public Reply buildModel(Document doc) throws ModelBuildException {
59
60 ModelPrefixResolver prefixResolver = new ModelPrefixResolver();
61
62
63 Element elmSoapHeader = XmlUtil.selectSingleElement(doc, "//" + NameSpaces.NS_SOAP + ":Envelope/" + NameSpaces.NS_SOAP + ":Header", prefixResolver);
64
65 Element elmCreated = XmlUtil.selectSingleElement(elmSoapHeader, NameSpaces.NS_WSSE + ":Security/" + NameSpaces.NS_WSU + ":Timestamp/" + NameSpaces.NS_WSU + ":Created", prefixResolver);
66
67 String xmlTimestamp = XmlUtil.getTextNodeValue(elmCreated);
68 String dgwsVersion = XmlUtil.isZuluTimeFormat(xmlTimestamp) ? DGWSConstants.VERSION_1_0_1 : DGWSConstants.VERSION_1_0;
69
70
71 Element elmMedcomHeader = XmlUtil.selectSingleElement(elmSoapHeader, MedComTags.HEADER_PREFIXED, prefixResolver);
72
73 Element elmLinking = XmlUtil.selectSingleElement(elmMedcomHeader, MedComTags.LINKING_PREFIXED, prefixResolver);
74
75
76 String inResponseToMessageID = null;
77 String flowID = null;
78
79 Element elmInResponseToMessageId = XmlUtil.selectSingleElement(elmLinking, MedComTags.IN_RESPONSE_TO_MESSAGE_ID_PREFIXED, prefixResolver);
80 if (elmInResponseToMessageId != null) {
81 inResponseToMessageID = XmlUtil.getTextNodeValue(elmInResponseToMessageId);
82 }
83 Element elmFlowID = XmlUtil.selectSingleElement(elmLinking, MedComTags.FLOW_ID_PREFIXED, prefixResolver);
84 if (elmFlowID != null) {
85 flowID = XmlUtil.getTextNodeValue(elmFlowID);
86 }
87
88
89 Element elmFlowStatus, elmMedcomFaultCode, elmFaultString, elmFaultCode;
90 Reply reply;
91
92 elmFlowStatus = XmlUtil.selectSingleElement(elmMedcomHeader, MedComTags.FLOW_STATUS_PREFIXED, prefixResolver);
93
94 if (elmFlowStatus == null) {
95
96 Element fault = XmlUtil.selectSingleElement(doc, "//" + SOAPTags.BODY_PREFIXED + '/' + SOAPTags.FAULT_PREFIXED, prefixResolver);
97 if (fault == null) {
98 throw new ModelBuildException("No " + MedComTags.FLOW_STATUS_PREFIXED + " present in document and no " + SOAPTags.FAULT_PREFIXED + " in "
99 + SOAPTags.BODY_PREFIXED + "!");
100 }
101
102 elmFaultCode = XmlUtil.selectSingleElement(fault,SOAPTags.FAULTCODE, prefixResolver);
103 elmMedcomFaultCode = XmlUtil.selectSingleElement(fault, SOAPTags.DETAIL + '/' + MedComTags.FAULT_CODE_PREFIXED, prefixResolver);
104 elmFaultString = XmlUtil.selectSingleElement(fault, SOAPTags.FAULTSTRING, prefixResolver);
105
106 if (elmFaultCode == null)
107 throw new ModelBuildException("No " + SOAPTags.FAULTCODE + " in " + SOAPTags.FAULT_PREFIXED);
108
109 if (elmMedcomFaultCode == null)
110 throw new ModelBuildException("No " + MedComTags.FAULT_CODE_PREFIXED + " in " + SOAPTags.FAULT_PREFIXED);
111
112 if (elmFaultString == null)
113 throw new ModelBuildException("No " + SOAPTags.FAULTSTRING + " in " + SOAPTags.FAULT_PREFIXED);
114
115 reply = factory.createNewErrorReply(dgwsVersion, inResponseToMessageID, flowID, XmlUtil.getTextNodeValue(elmMedcomFaultCode),
116 XmlUtil.getTextNodeValue(elmFaultString));
117 } else {
118 reply = factory.createNewReply(dgwsVersion, inResponseToMessageID, flowID, XmlUtil.getTextNodeValue(elmFlowStatus));
119 }
120
121
122 super.buildModel(reply, doc);
123
124
125 SignatureUtil.validateAllSignatures(reply, doc.getElementsByTagNameNS(NameSpaces.DSIG_SCHEMA, DSTags.SIGNATURE), factory.getFederation(), factory.getCredentialVault(),true);
126
127 return reply;
128 }
129 }