1 package org.codehaus.xfire.addressing;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.codehaus.yom.Attribute;
7 import org.codehaus.yom.Element;
8 import org.codehaus.yom.Elements;
9
10 /***
11 * A WS-Addressing endpoint reference.
12 *
13 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
14 */
15 public class AddressingHeadersFactory200502
16 extends AbstactAddressingHeadersFactory
17 implements WSAConstants, AddressingHeadersFactory
18 {
19 public AddressingHeaders createHeaders(Element root)
20 {
21 AddressingHeaders headers = new AddressingHeaders();
22
23 Element from = root.getFirstChildElement(WSA_FROM, WSA_NAMESPACE_200502);
24 if (from != null)
25 {
26 headers.setFrom(createEPR(from));
27 }
28
29 Element replyTo = root.getFirstChildElement(WSA_REPLY_TO, WSA_NAMESPACE_200502);
30 if (replyTo != null)
31 {
32 headers.setReplyTo(createEPR(replyTo));
33 }
34
35 Element faultTo = root.getFirstChildElement(WSA_FAULT_TO, WSA_NAMESPACE_200502);
36 if (faultTo != null)
37 {
38 headers.setFaultTo(createEPR(faultTo));
39 }
40
41 Element messageId = root.getFirstChildElement(WSA_MESSAGE_ID, WSA_NAMESPACE_200502);
42 if (messageId != null)
43 {
44 headers.setMessageID(messageId.getValue());
45 }
46
47 Element to = root.getFirstChildElement(WSA_TO, WSA_NAMESPACE_200502);
48 if (to != null)
49 {
50 headers.setTo(to.getValue());
51 }
52
53 Element action = root.getFirstChildElement(WSA_ACTION, WSA_NAMESPACE_200502);
54 if (action != null)
55 {
56 headers.setAction(action.getValue());
57 }
58
59 return headers;
60 }
61
62 public EndpointReference createEPR(Element eprElement)
63 {
64 EndpointReference epr = new EndpointReference();
65
66 List anyContent = null;
67
68 Elements elements = eprElement.getChildElements();
69 String version = eprElement.getNamespaceURI();
70
71 for (int i = 0; i < elements.size(); i++)
72 {
73 Element e = elements.get(i);
74 if (e.getNamespaceURI().equals(version))
75 {
76 if (e.getLocalName().equals(WSA_ADDRESS))
77 {
78 epr.setAddress(e.getValue());
79 }
80 else if (e.getLocalName().equals(WSA_SERVICE_NAME))
81 {
82 epr.setServiceName(elementToQName(e));
83 epr.setEndpointName(e.getAttributeValue(WSA_ENDPOINT_NAME, version));
84 }
85 else if (e.getLocalName().equals(WSA_INTERFACE_NAME))
86 {
87 epr.setInterfaceName(elementToQName(e));
88 }
89 else if (e.getLocalName().equals(WSA_POLICIES))
90 {
91 List policies = new ArrayList();
92
93 Elements polEls = e.getChildElements();
94 for (int j = 0; j < polEls.size(); j++)
95 {
96 policies.add(polEls.get(j));
97 }
98 epr.setPolicies(policies);
99 }
100 else
101 {
102 if (anyContent == null)
103 anyContent = new ArrayList();
104
105 anyContent.add(e);
106 }
107 }
108
109 }
110
111 if (anyContent != null)
112 {
113 epr.setAny(anyContent);
114 }
115
116 return epr;
117 }
118
119 public boolean hasHeaders(Element root)
120 {
121 return root.getFirstChildElement(WSA_ACTION, WSA_NAMESPACE_200502) != null;
122 }
123
124 public void writeHeaders(Element root, AddressingHeaders headers)
125 {
126 final String ns = WSA_NAMESPACE_200502;
127 root.addNamespaceDeclaration(WSA_PREFIX, WSA_NAMESPACE_200502);
128
129 if (headers.getTo() != null)
130 {
131 Element to = new Element(WSA_TO_QNAME, ns);
132 to.appendChild(headers.getTo());
133 root.appendChild(to);
134 }
135
136 if (headers.getAction() != null)
137 {
138 Element action = new Element(WSA_ACTION_QNAME, ns);
139 action.appendChild(headers.getAction());
140 root.appendChild(action);
141 }
142
143 if (headers.getFaultTo() != null)
144 {
145 Element faultTo = new Element(WSA_FAULT_TO_QNAME, ns);
146 root.appendChild(faultTo);
147
148 writeEPR(faultTo, headers.getFaultTo());
149 }
150
151 if (headers.getFrom() != null)
152 {
153 Element from = new Element(WSA_FROM_QNAME, ns);
154 root.appendChild(from);
155
156 writeEPR(from, headers.getFrom());
157 }
158
159 if (headers.getMessageID() != null)
160 {
161 Element messageId = new Element(WSA_MESSAGE_ID_QNAME, ns);
162 messageId.appendChild(headers.getMessageID());
163 root.appendChild(messageId);
164 }
165
166 if (headers.getRelatesTo() != null)
167 {
168 Element relatesTo = new Element(WSA_RELATES_TO_QNAME, ns);
169 relatesTo.appendChild(headers.getRelatesTo());
170 root.appendChild(relatesTo);
171
172 if (headers.getRelationshipType() != null)
173 {
174 String value = qnameToString(root, headers.getRelationshipType());
175 relatesTo.addAttribute(new Attribute(WSA_RELATIONSHIP_TYPE, value));
176 }
177 }
178
179 if (headers.getReplyTo() != null)
180 {
181 Element replyTo = new Element(WSA_REPLY_TO_QNAME, ns);
182 root.appendChild(replyTo);
183
184 writeEPR(replyTo, headers.getReplyTo());
185 }
186 }
187
188 public void writeEPR(Element root, EndpointReference epr)
189 {
190 final String ns = WSA_NAMESPACE_200502;
191
192 Element address = new Element(WSA_ADDRESS_QNAME, ns);
193 address.appendChild(epr.getAddress());
194 root.appendChild(address);
195
196 if (epr.getServiceName() != null)
197 {
198 Element serviceName = new Element(WSA_SERVICE_NAME_QNAME, ns);
199 serviceName.appendChild(qnameToString((Element) root.getParent(), epr.getServiceName()));
200 root.appendChild(serviceName);
201
202 if (epr.getInterfaceName() != null)
203 {
204 String value = qnameToString((Element) root.getParent(), epr.getInterfaceName());
205 serviceName.addAttribute(new Attribute(WSA_INTERFACE_NAME_QNAME, value));
206 }
207 }
208 }
209
210 public String getAnonymousUri()
211 {
212 return "http://www.w3.org/2005/02/addressing/role/anonymous";
213 }
214 }