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.IDCard;
33 import dk.sosi.seal.model.Message;
34 import dk.sosi.seal.model.Request;
35 import dk.sosi.seal.model.constants.DGWSConstants;
36 import dk.sosi.seal.model.constants.MedComTags;
37 import dk.sosi.seal.model.constants.NameSpaces;
38 import dk.sosi.seal.xml.XmlUtil;
39 import org.w3c.dom.Document;
40 import org.w3c.dom.Element;
41 import org.w3c.dom.Node;
42 import org.w3c.dom.NodeList;
43
44 import java.text.ParseException;
45 import java.util.Date;
46
47
48
49
50
51
52
53
54 public abstract class MessageModelBuilder {
55
56 protected SOSIFactory factory;
57
58 public MessageModelBuilder(SOSIFactory fac) {
59 super();
60 factory = fac;
61 }
62
63
64
65
66
67
68
69
70
71 protected void buildModel(Message msg, Document doc) throws ModelBuildException {
72
73 ModelPrefixResolver prefixResolver = new ModelPrefixResolver();
74
75
76 Element elmSoapHeader = XmlUtil.selectSingleElement(doc, "//" + NameSpaces.NS_SOAP + ":Envelope/" + NameSpaces.NS_SOAP + ":Header", prefixResolver);
77
78
79 Element elmCreated = XmlUtil.selectSingleElement(elmSoapHeader, NameSpaces.NS_WSSE + ":Security/" + NameSpaces.NS_WSU + ":Timestamp/" + NameSpaces.NS_WSU + ":Created", prefixResolver);
80
81 String xmlTimestamp = XmlUtil.getTextNodeValue(elmCreated);
82 Date created;
83 try {
84 created = XmlUtil.fromXMLTimeStamp(xmlTimestamp);
85 } catch (ParseException e) {
86 throw new ModelBuildException("Unable to parse timestamp from <wsu:Created>", e);
87 }
88 msg.setCreationDate(created);
89
90
91 String dgwsVersion = XmlUtil.isZuluTimeFormat(xmlTimestamp) ? DGWSConstants.VERSION_1_0_1 : DGWSConstants.VERSION_1_0;
92 msg.setDGWSVersion(dgwsVersion);
93
94
95 IDCard idCard = new IDCardModelBuilder().buildModel(doc);
96 if ((idCard == null) && (msg instanceof Request))
97 throw new ModelBuildException("No IDCard present in Request");
98
99 if (idCard != null) msg.setIDCard(idCard);
100
101
102 if (doc.getElementsByTagNameNS(NameSpaces.MEDCOM_SCHEMA, MedComTags.MESSAGE_ID).getLength() > 0) {
103 String msgID = doc.getElementsByTagNameNS(NameSpaces.MEDCOM_SCHEMA, MedComTags.MESSAGE_ID).item(0).getChildNodes().item(0).getNodeValue();
104 msg.setMessageID(msgID);
105 } else {
106
107 String msgID = ((Element) doc.getElementsByTagNameNS(NameSpaces.WSSE_SCHEMA,"Security").item(0)).getAttribute("id");
108 msg.setMessageID(msgID);
109 }
110
111
112 if (doc.getElementsByTagNameNS(NameSpaces.MEDCOM_SCHEMA, MedComTags.FLOW_ID).getLength() > 0) {
113 NodeList flowIDs = doc.getElementsByTagNameNS(NameSpaces.MEDCOM_SCHEMA, MedComTags.FLOW_ID);
114 String flowID = flowIDs.item(0).getChildNodes().item(0).getNodeValue();
115 msg.setFlowID(flowID);
116 }
117
118
119 NodeList headerList = doc.getElementsByTagNameNS(NameSpaces.SOAP_SCHEMA,"Header");
120 if (headerList.getLength() > 0) {
121
122 for (int i = 0; i < headerList.item(0).getChildNodes().getLength(); i++) {
123 Node n = headerList.item(0).getChildNodes().item(i);
124 if(n.getNodeType() == Node.ELEMENT_NODE) {
125 Element e = (Element) n;
126 if(!("Security".equals(e.getLocalName()) && NameSpaces.WSSE_SCHEMA.equals(e.getNamespaceURI())) &&
127 !(MedComTags.HEADER.equals(e.getLocalName()) && NameSpaces.MEDCOM_SCHEMA.equals(e.getNamespaceURI()))) {
128 msg.addNonSOSIHeader(e);
129 }
130 }
131 }
132 }
133
134
135 NodeList bodyList = doc.getElementsByTagNameNS(NameSpaces.SOAP_SCHEMA,"Body");
136 if (bodyList.getLength() > 0) {
137
138 for (int i = 0; i < bodyList.item(0).getChildNodes().getLength(); i++) {
139 if(bodyList.item(0).getChildNodes().item(i).getNodeType() == Node.ELEMENT_NODE) {
140 msg.setBody((Element)bodyList.item(0).getChildNodes().item(i));
141 break;
142 }
143 }
144 }
145 }
146 }