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.vault.renewal.model.dombuilders;
30
31 import dk.sosi.seal.model.constants.NameSpaces;
32 import dk.sosi.seal.model.constants.SOAPTags;
33 import dk.sosi.seal.model.dombuilders.DOMBuilderException;
34 import dk.sosi.seal.vault.renewal.model.Argument;
35 import dk.sosi.seal.xml.XmlUtil;
36 import org.w3c.dom.Document;
37 import org.w3c.dom.Element;
38 import org.w3c.dom.NodeList;
39
40
41
42
43
44
45
46
47
48 public abstract class MessageDOMBuilder {
49 protected Document document;
50 protected Element body;
51
52 protected void addNameSpaceAttribute(String name, String value) {
53 Element documentElement = document.getDocumentElement();
54 addNameSpaceAttributeToElement(name, value, documentElement);
55 }
56
57 protected void addNameSpaceAttributeToElement(String name, String value, Element documentElement) {
58 if(documentElement.getAttributeNS(NameSpaces.XMLNS_SCHEMA,name)==null || documentElement.getAttributeNS(NameSpaces.XMLNS_SCHEMA,name).equals("")) {
59 documentElement.setAttributeNS(NameSpaces.XMLNS_SCHEMA, NameSpaces.NS_XMLNS+":"+name, value);
60 }
61 }
62
63
64
65
66
67 protected void initializeSOAP(boolean setupHeader) {
68 Element root = document.getDocumentElement();
69 if (root == null) {
70 root = document.createElementNS(NameSpaces.SOAP_SCHEMA, SOAPTags.ENVELOPE_PREFIXED);
71 document.appendChild(root);
72 }
73
74 addNameSpaceAttribute(NameSpaces.NS_SOAP, NameSpaces.SOAP_SCHEMA);
75 addNameSpaceAttribute(NameSpaces.NS_XSI, NameSpaces.XMLSCHEMAINSTANCE_SCHEMA);
76 addNameSpaceAttribute(NameSpaces.NS_XSD, NameSpaces.XSD_SCHEMA);
77
78
79 NodeList nodes;
80
81 if (setupHeader) {
82 nodes = root.getElementsByTagNameNS(NameSpaces.SOAP_SCHEMA, SOAPTags.HEADER_UNPREFIXED);
83 if (nodes.getLength() == 0) {
84 Element header = document.createElementNS(NameSpaces.SOAP_SCHEMA, SOAPTags.HEADER_PREFIXED);
85 root.appendChild(header);
86 } else if(nodes.getLength() == 1) {
87
88 } else {
89 throw new DOMBuilderException("Too many soap:Header elements in document!", null);
90 }
91
92 }
93
94 nodes = root.getElementsByTagNameNS(NameSpaces.SOAP_SCHEMA, SOAPTags.BODY_UNPREFIXED);
95 if (nodes.getLength() == 0) {
96 body = document.createElementNS(NameSpaces.SOAP_SCHEMA, SOAPTags.BODY_PREFIXED);
97 root.appendChild(body);
98 } else if(nodes.getLength() == 1) {
99 body = (Element)nodes.item(0);
100 } else {
101 throw new DOMBuilderException("Too many soap:Body elements in document!", null);
102 }
103 }
104
105
106
107
108
109
110 protected void addMethodArgument(Element method, Argument argument) {
111 Element argumentElement = document.createElement(argument.getName());
112
113 if(argument.getType().equals(String.class)) {
114 argumentElement.setAttribute(Constants.XSI_TYPE, Constants.XSD_STRING);
115 argumentElement.appendChild(document.createTextNode((String) argument.getValue()));
116 } else if(argument.getType().equals(byte[].class)) {
117 argumentElement.setAttribute(Constants.XSI_TYPE, Constants.XSD_BASE64BINARY);
118 argumentElement.appendChild(document.createTextNode(XmlUtil.toBase64((byte[]) argument.getValue())));
119 } else if(argument.getType().equals(Integer.class) || argument.getType().equals(Integer.TYPE)) {
120 argumentElement.setAttribute(Constants.XSI_TYPE, Constants.XSD_INT);
121 argumentElement.appendChild(document.createTextNode(argument.getValue().toString()));
122 } else {
123 throw new DOMBuilderException("Unsupported argument type: " + argument.getType().getName(), null);
124 }
125
126 method.appendChild(argumentElement);
127
128 }
129
130
131
132 }