Tue, 06 Mar 2012 16:09:35 -0800
7150322: Stop using drop source bundles in jaxws
Reviewed-by: darcy, ohrstrom
1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
26 package com.sun.xml.internal.ws.policy.sourcemodel.attach;
28 import com.sun.xml.internal.ws.policy.Policy;
29 import com.sun.xml.internal.ws.policy.PolicyConstants;
30 import com.sun.xml.internal.ws.policy.PolicyException;
31 import com.sun.xml.internal.ws.policy.privateutil.LocalizationMessages;
32 import com.sun.xml.internal.ws.policy.privateutil.PolicyLogger;
33 import com.sun.xml.internal.ws.policy.sourcemodel.PolicyModelTranslator;
34 import com.sun.xml.internal.ws.policy.sourcemodel.PolicyModelUnmarshaller;
35 import com.sun.xml.internal.ws.policy.sourcemodel.PolicySourceModel;
37 import java.io.Reader;
38 import java.net.URI;
39 import java.net.URISyntaxException;
40 import java.util.Collections;
41 import java.util.HashMap;
42 import java.util.Map;
43 import javax.xml.namespace.QName;
44 import javax.xml.stream.Location;
45 import javax.xml.stream.XMLEventReader;
46 import javax.xml.stream.XMLInputFactory;
47 import javax.xml.stream.XMLStreamConstants;
48 import javax.xml.stream.XMLStreamException;
49 import javax.xml.stream.events.Characters;
50 import javax.xml.stream.events.EndElement;
51 import javax.xml.stream.events.StartElement;
52 import javax.xml.stream.events.XMLEvent;
54 /**
55 * Unmarshal external policy attachments.
56 *
57 * @author Fabian Ritzmann
58 */
59 public class ExternalAttachmentsUnmarshaller {
61 private static final PolicyLogger LOGGER = PolicyLogger.getLogger(ExternalAttachmentsUnmarshaller.class);
63 public static final URI BINDING_ID;
64 public static final URI BINDING_OPERATION_ID;
65 public static final URI BINDING_OPERATION_INPUT_ID;
66 public static final URI BINDING_OPERATION_OUTPUT_ID;
67 public static final URI BINDING_OPERATION_FAULT_ID;
69 static {
70 try {
71 BINDING_ID = new URI("urn:uuid:c9bef600-0d7a-11de-abc1-0002a5d5c51b");
72 BINDING_OPERATION_ID = new URI("urn:uuid:62e66b60-0d7b-11de-a1a2-0002a5d5c51b");
73 BINDING_OPERATION_INPUT_ID = new URI("urn:uuid:730d8d20-0d7b-11de-84e9-0002a5d5c51b");
74 BINDING_OPERATION_OUTPUT_ID = new URI("urn:uuid:85b0f980-0d7b-11de-8e9d-0002a5d5c51b");
75 BINDING_OPERATION_FAULT_ID = new URI("urn:uuid:917cb060-0d7b-11de-9e80-0002a5d5c51b");
76 } catch (URISyntaxException e) {
77 throw LOGGER.logSevereException(new IllegalArgumentException(LocalizationMessages.WSP_0094_INVALID_URN()), e);
78 }
79 }
81 private static final QName POLICY_ATTACHMENT = new QName("http://www.w3.org/ns/ws-policy", "PolicyAttachment");
82 private static final QName APPLIES_TO = new QName("http://www.w3.org/ns/ws-policy", "AppliesTo");
83 private static final QName POLICY = new QName("http://www.w3.org/ns/ws-policy", "Policy");
84 private static final QName URI = new QName("http://www.w3.org/ns/ws-policy", "URI");
85 private static final QName POLICIES = new QName(PolicyConstants.SUN_MANAGEMENT_NAMESPACE, "Policies");
86 private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory.newInstance();
87 private static final PolicyModelUnmarshaller POLICY_UNMARSHALLER = PolicyModelUnmarshaller.getXmlUnmarshaller();
89 private final Map<URI, Policy> map = new HashMap<URI, Policy>();
90 private URI currentUri = null;
91 private Policy currentPolicy = null;
93 public static Map<URI, Policy> unmarshal(final Reader source) throws PolicyException {
94 LOGGER.entering(source);
95 try {
96 XMLEventReader reader = XML_INPUT_FACTORY.createXMLEventReader(source);
97 ExternalAttachmentsUnmarshaller instance = new ExternalAttachmentsUnmarshaller();
98 final Map<URI, Policy> map = instance.unmarshal(reader, null);
99 LOGGER.exiting(map);
100 return Collections.unmodifiableMap(map);
101 } catch (XMLStreamException ex) {
102 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0086_FAILED_CREATE_READER(source)), ex);
103 }
104 }
106 private Map<URI, Policy> unmarshal(final XMLEventReader reader, final StartElement parentElement) throws PolicyException {
107 XMLEvent event = null;
108 while (reader.hasNext()) {
109 try {
110 event = reader.peek();
111 switch (event.getEventType()) {
112 case XMLStreamConstants.START_DOCUMENT:
113 case XMLStreamConstants.COMMENT:
114 reader.nextEvent();
115 break;
117 case XMLStreamConstants.CHARACTERS:
118 processCharacters(event.asCharacters(), parentElement, map);
119 reader.nextEvent();
120 break;
122 case XMLStreamConstants.END_ELEMENT:
123 processEndTag(event.asEndElement(), parentElement);
124 reader.nextEvent();
125 return map;
127 case XMLStreamConstants.START_ELEMENT:
128 final StartElement element = event.asStartElement();
129 processStartTag(element, parentElement, reader, map);
130 break;
132 case XMLStreamConstants.END_DOCUMENT:
133 return map;
135 default:
136 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0087_UNKNOWN_EVENT(event)));
137 }
138 } catch (XMLStreamException e) {
139 final Location location = event == null ? null : event.getLocation();
140 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0088_FAILED_PARSE(location)), e);
141 }
142 }
143 return map;
144 }
146 private void processStartTag(final StartElement element, final StartElement parent,
147 final XMLEventReader reader, final Map<URI, Policy> map)
148 throws PolicyException {
149 try {
150 final QName name = element.getName();
151 if (parent == null) {
152 if (!name.equals(POLICIES)) {
153 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0089_EXPECTED_ELEMENT("<Policies>", name, element.getLocation())));
154 }
155 } else {
156 final QName parentName = parent.getName();
157 if (parentName.equals(POLICIES)) {
158 if (!name.equals(POLICY_ATTACHMENT)) {
159 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0089_EXPECTED_ELEMENT("<PolicyAttachment>", name, element.getLocation())));
160 }
161 } else if (parentName.equals(POLICY_ATTACHMENT)) {
162 if (name.equals(POLICY)) {
163 readPolicy(reader);
164 return;
165 } else if (!name.equals(APPLIES_TO)) {
166 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0089_EXPECTED_ELEMENT("<AppliesTo> or <Policy>", name, element.getLocation())));
167 }
168 } else if (parentName.equals(APPLIES_TO)) {
169 if (!name.equals(URI)) {
170 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0089_EXPECTED_ELEMENT("<URI>", name, element.getLocation())));
171 }
172 } else {
173 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0090_UNEXPECTED_ELEMENT(name, element.getLocation())));
174 }
175 }
176 reader.nextEvent();
177 this.unmarshal(reader, element);
178 } catch (XMLStreamException e) {
179 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0088_FAILED_PARSE(element.getLocation()), e));
180 }
181 }
183 private void readPolicy(final XMLEventReader reader) throws PolicyException {
184 final PolicySourceModel policyModel = POLICY_UNMARSHALLER.unmarshalModel(reader);
185 final PolicyModelTranslator translator = PolicyModelTranslator.getTranslator();
186 final Policy policy = translator.translate(policyModel);
187 if (this.currentUri != null) {
188 map.put(this.currentUri, policy);
189 this.currentUri = null;
190 this.currentPolicy = null;
191 }
192 else {
193 this.currentPolicy = policy;
194 }
195 }
197 private void processEndTag(EndElement element, StartElement startElement) throws PolicyException {
198 checkEndTagName(startElement.getName(), element);
199 }
201 private void checkEndTagName(final QName expectedName, final EndElement element) throws PolicyException {
202 final QName actualName = element.getName();
203 if (!expectedName.equals(actualName)) {
204 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0091_END_ELEMENT_NO_MATCH(expectedName, element, element.getLocation())));
205 }
207 }
209 private void processCharacters(final Characters chars, final StartElement currentElement, final Map<URI, Policy> map)
210 throws PolicyException {
211 if (chars.isWhiteSpace()) {
212 return;
213 }
214 else {
215 final String data = chars.getData();
216 if ((currentElement != null) && URI.equals(currentElement.getName())) {
217 processUri(chars, map);
218 return;
219 } else {
220 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0092_CHARACTER_DATA_UNEXPECTED(currentElement, data, chars.getLocation())));
221 }
223 }
224 }
226 private void processUri(final Characters chars, final Map<URI, Policy> map) throws PolicyException {
227 final String data = chars.getData().trim();
228 try {
229 final URI uri = new URI(data);
230 if (this.currentPolicy != null) {
231 map.put(uri, this.currentPolicy);
232 this.currentUri = null;
233 this.currentPolicy = null;
234 } else {
235 this.currentUri = uri;
236 }
237 } catch (URISyntaxException e) {
238 throw LOGGER.logSevereException(new PolicyException(LocalizationMessages.WSP_0093_INVALID_URI(data, chars.getLocation())), e);
239 }
240 }
242 }