1/* 2 * Copyright (c) 1997, 2013, 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 */ 25 26package com.sun.xml.internal.ws.wsdl.parser; 27 28import com.sun.xml.internal.ws.api.wsdl.parser.WSDLParserExtension; 29import com.sun.xml.internal.ws.api.wsdl.parser.WSDLParserExtensionContext; 30import com.sun.xml.internal.ws.api.model.wsdl.editable.*; 31import com.sun.xml.internal.ws.streaming.XMLStreamReaderUtil; 32 33import javax.xml.stream.XMLStreamReader; 34import javax.xml.stream.Location; 35 36import org.xml.sax.Locator; 37import org.xml.sax.helpers.LocatorImpl; 38 39/** 40 * {@link WSDLParserExtension} that delegates to 41 * multiple {@link WSDLParserExtension}s. 42 * 43 * <p> 44 * This simplifies {@link RuntimeWSDLParser} since it now 45 * only needs to work with one {@link WSDLParserExtension}. 46 * 47 * <p> 48 * This class is guaranteed to return true from 49 * all the extension callback methods. 50 * 51 * @author Kohsuke Kawaguchi 52 */ 53final class WSDLParserExtensionFacade extends WSDLParserExtension { 54 private final WSDLParserExtension[] extensions; 55 56 WSDLParserExtensionFacade(WSDLParserExtension... extensions) { 57 assert extensions!=null; 58 this.extensions = extensions; 59 } 60 61 public void start(WSDLParserExtensionContext context) { 62 for (WSDLParserExtension e : extensions) { 63 e.start(context); 64 } 65 } 66 67 public boolean serviceElements(EditableWSDLService service, XMLStreamReader reader) { 68 for (WSDLParserExtension e : extensions) { 69 if(e.serviceElements(service,reader)) 70 return true; 71 } 72 XMLStreamReaderUtil.skipElement(reader); 73 return true; 74 } 75 76 public void serviceAttributes(EditableWSDLService service, XMLStreamReader reader) { 77 for (WSDLParserExtension e : extensions) 78 e.serviceAttributes(service,reader); 79 } 80 81 public boolean portElements(EditableWSDLPort port, XMLStreamReader reader) { 82 for (WSDLParserExtension e : extensions) { 83 if(e.portElements(port,reader)) 84 return true; 85 } 86 //extension is not understood by any WSDlParserExtension 87 //Check if it must be understood. 88 if(isRequiredExtension(reader)) { 89 port.addNotUnderstoodExtension(reader.getName(),getLocator(reader)); 90 } 91 XMLStreamReaderUtil.skipElement(reader); 92 return true; 93 } 94 95 public boolean portTypeOperationInput(EditableWSDLOperation op, XMLStreamReader reader) { 96 for (WSDLParserExtension e : extensions) 97 e.portTypeOperationInput(op,reader); 98 99 return false; 100 } 101 102 public boolean portTypeOperationOutput(EditableWSDLOperation op, XMLStreamReader reader) { 103 for (WSDLParserExtension e : extensions) 104 e.portTypeOperationOutput(op,reader); 105 106 return false; 107 } 108 109 public boolean portTypeOperationFault(EditableWSDLOperation op, XMLStreamReader reader) { 110 for (WSDLParserExtension e : extensions) 111 e.portTypeOperationFault(op,reader); 112 113 return false; 114 } 115 116 public void portAttributes(EditableWSDLPort port, XMLStreamReader reader) { 117 for (WSDLParserExtension e : extensions) 118 e.portAttributes(port,reader); 119 } 120 121 public boolean definitionsElements(XMLStreamReader reader){ 122 for (WSDLParserExtension e : extensions) { 123 if (e.definitionsElements(reader)) { 124 return true; 125 } 126 } 127 XMLStreamReaderUtil.skipElement(reader); 128 return true; 129 } 130 131 public boolean bindingElements(EditableWSDLBoundPortType binding, XMLStreamReader reader){ 132 for (WSDLParserExtension e : extensions) { 133 if (e.bindingElements(binding, reader)) { 134 return true; 135 } 136 } 137 //extension is not understood by any WSDlParserExtension 138 //Check if it must be understood. 139 if (isRequiredExtension(reader)) { 140 binding.addNotUnderstoodExtension( 141 reader.getName(), getLocator(reader)); 142 } 143 XMLStreamReaderUtil.skipElement(reader); 144 return true; 145 } 146 147 public void bindingAttributes(EditableWSDLBoundPortType binding, XMLStreamReader reader){ 148 for (WSDLParserExtension e : extensions) { 149 e.bindingAttributes(binding, reader); 150 } 151 } 152 153 public boolean portTypeElements(EditableWSDLPortType portType, XMLStreamReader reader) { 154 for (WSDLParserExtension e : extensions) { 155 if (e.portTypeElements(portType, reader)) { 156 return true; 157 } 158 } 159 XMLStreamReaderUtil.skipElement(reader); 160 return true; 161 } 162 163 public void portTypeAttributes(EditableWSDLPortType portType, XMLStreamReader reader) { 164 for (WSDLParserExtension e : extensions) { 165 e.portTypeAttributes(portType, reader); 166 } 167 } 168 169 public boolean portTypeOperationElements(EditableWSDLOperation operation, XMLStreamReader reader) { 170 for (WSDLParserExtension e : extensions) { 171 if (e.portTypeOperationElements(operation, reader)) { 172 return true; 173 } 174 } 175 XMLStreamReaderUtil.skipElement(reader); 176 return true; 177 } 178 179 public void portTypeOperationAttributes(EditableWSDLOperation operation, XMLStreamReader reader) { 180 for (WSDLParserExtension e : extensions) { 181 e.portTypeOperationAttributes(operation, reader); 182 } 183 } 184 185 public boolean bindingOperationElements(EditableWSDLBoundOperation operation, XMLStreamReader reader) { 186 for (WSDLParserExtension e : extensions) { 187 if (e.bindingOperationElements(operation, reader)) { 188 return true; 189 } 190 } 191 XMLStreamReaderUtil.skipElement(reader); 192 return true; 193 } 194 195 public void bindingOperationAttributes(EditableWSDLBoundOperation operation, XMLStreamReader reader) { 196 for (WSDLParserExtension e : extensions) { 197 e.bindingOperationAttributes(operation, reader); 198 } 199 } 200 201 public boolean messageElements(EditableWSDLMessage msg, XMLStreamReader reader) { 202 for (WSDLParserExtension e : extensions) { 203 if (e.messageElements(msg, reader)) { 204 return true; 205 } 206 } 207 XMLStreamReaderUtil.skipElement(reader); 208 return true; 209 } 210 211 public void messageAttributes(EditableWSDLMessage msg, XMLStreamReader reader) { 212 for (WSDLParserExtension e : extensions) { 213 e.messageAttributes(msg, reader); 214 } 215 } 216 217 public boolean portTypeOperationInputElements(EditableWSDLInput input, XMLStreamReader reader) { 218 for (WSDLParserExtension e : extensions) { 219 if (e.portTypeOperationInputElements(input, reader)) { 220 return true; 221 } 222 } 223 XMLStreamReaderUtil.skipElement(reader); 224 return true; 225 } 226 227 public void portTypeOperationInputAttributes(EditableWSDLInput input, XMLStreamReader reader) { 228 for (WSDLParserExtension e : extensions) { 229 e.portTypeOperationInputAttributes(input, reader); 230 } 231 } 232 233 public boolean portTypeOperationOutputElements(EditableWSDLOutput output, XMLStreamReader reader) { 234 for (WSDLParserExtension e : extensions) { 235 if (e.portTypeOperationOutputElements(output, reader)) { 236 return true; 237 } 238 } 239 XMLStreamReaderUtil.skipElement(reader); 240 return true; 241 } 242 243 public void portTypeOperationOutputAttributes(EditableWSDLOutput output, XMLStreamReader reader) { 244 for (WSDLParserExtension e : extensions) { 245 e.portTypeOperationOutputAttributes(output, reader); 246 } 247 } 248 249 public boolean portTypeOperationFaultElements(EditableWSDLFault fault, XMLStreamReader reader) { 250 for (WSDLParserExtension e : extensions) { 251 if (e.portTypeOperationFaultElements(fault, reader)) { 252 return true; 253 } 254 } 255 XMLStreamReaderUtil.skipElement(reader); 256 return true; 257 } 258 259 public void portTypeOperationFaultAttributes(EditableWSDLFault fault, XMLStreamReader reader) { 260 for (WSDLParserExtension e : extensions) { 261 e.portTypeOperationFaultAttributes(fault, reader); 262 } 263 } 264 265 public boolean bindingOperationInputElements(EditableWSDLBoundOperation operation, XMLStreamReader reader) { 266 for (WSDLParserExtension e : extensions) { 267 if (e.bindingOperationInputElements(operation, reader)) { 268 return true; 269 } 270 } 271 XMLStreamReaderUtil.skipElement(reader); 272 return true; 273 } 274 275 public void bindingOperationInputAttributes(EditableWSDLBoundOperation operation, XMLStreamReader reader) { 276 for (WSDLParserExtension e : extensions) { 277 e.bindingOperationInputAttributes(operation, reader); 278 } 279 } 280 281 public boolean bindingOperationOutputElements(EditableWSDLBoundOperation operation, XMLStreamReader reader) { 282 for (WSDLParserExtension e : extensions) { 283 if (e.bindingOperationOutputElements(operation, reader)) { 284 return true; 285 } 286 } 287 XMLStreamReaderUtil.skipElement(reader); 288 return true; 289 } 290 291 public void bindingOperationOutputAttributes(EditableWSDLBoundOperation operation, XMLStreamReader reader) { 292 for (WSDLParserExtension e : extensions) { 293 e.bindingOperationOutputAttributes(operation, reader); 294 } 295 } 296 297 public boolean bindingOperationFaultElements(EditableWSDLBoundFault fault, XMLStreamReader reader) { 298 for (WSDLParserExtension e : extensions) { 299 if (e.bindingOperationFaultElements(fault, reader)) { 300 return true; 301 } 302 } 303 XMLStreamReaderUtil.skipElement(reader); 304 return true; 305 } 306 307 public void bindingOperationFaultAttributes(EditableWSDLBoundFault fault, XMLStreamReader reader) { 308 for (WSDLParserExtension e : extensions) { 309 e.bindingOperationFaultAttributes(fault, reader); 310 } 311 } 312 313 public void finished(WSDLParserExtensionContext context) { 314 for (WSDLParserExtension e : extensions) { 315 e.finished(context); 316 } 317 } 318 319 public void postFinished(WSDLParserExtensionContext context) { 320 for (WSDLParserExtension e : extensions) { 321 e.postFinished(context); 322 } 323 } 324 /** 325 * 326 * @param reader 327 * @return If the element has wsdl:required attribute set to true 328 */ 329 330 private boolean isRequiredExtension(XMLStreamReader reader) { 331 String required = reader.getAttributeValue(WSDLConstants.NS_WSDL, "required"); 332 if(required != null) 333 return Boolean.parseBoolean(required); 334 return false; 335 } 336 337 private Locator getLocator(XMLStreamReader reader) { 338 Location location = reader.getLocation(); 339 LocatorImpl loc = new LocatorImpl(); 340 loc.setSystemId(location.getSystemId()); 341 loc.setLineNumber(location.getLineNumber()); 342 return loc; 343 } 344 345} 346