src/share/jaxws_classes/com/sun/xml/internal/ws/model/wsdl/WSDLBoundOperationImpl.java

Fri, 04 Oct 2013 16:21:34 +0100

author
mkos
date
Fri, 04 Oct 2013 16:21:34 +0100
changeset 408
b0610cd08440
parent 384
8f2986ff0235
child 637
9c07ef4934dd
permissions
-rw-r--r--

8025054: Update JAX-WS RI integration to 2.2.9-b130926.1035
Reviewed-by: chegar

ohair@286 1 /*
mkos@384 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
ohair@286 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ohair@286 4 *
ohair@286 5 * This code is free software; you can redistribute it and/or modify it
ohair@286 6 * under the terms of the GNU General Public License version 2 only, as
ohair@286 7 * published by the Free Software Foundation. Oracle designates this
ohair@286 8 * particular file as subject to the "Classpath" exception as provided
ohair@286 9 * by Oracle in the LICENSE file that accompanied this code.
ohair@286 10 *
ohair@286 11 * This code is distributed in the hope that it will be useful, but WITHOUT
ohair@286 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ohair@286 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ohair@286 14 * version 2 for more details (a copy is included in the LICENSE file that
ohair@286 15 * accompanied this code).
ohair@286 16 *
ohair@286 17 * You should have received a copy of the GNU General Public License version
ohair@286 18 * 2 along with this work; if not, write to the Free Software Foundation,
ohair@286 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ohair@286 20 *
ohair@286 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@286 22 * or visit www.oracle.com if you need additional information or have any
ohair@286 23 * questions.
ohair@286 24 */
ohair@286 25
ohair@286 26 package com.sun.xml.internal.ws.model.wsdl;
ohair@286 27
ohair@286 28 import com.sun.istack.internal.Nullable;
ohair@286 29 import com.sun.istack.internal.NotNull;
ohair@286 30 import com.sun.xml.internal.ws.api.model.ParameterBinding;
ohair@286 31 import com.sun.xml.internal.ws.api.model.wsdl.*;
mkos@408 32 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLBoundFault;
mkos@408 33 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLBoundOperation;
mkos@408 34 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLBoundPortType;
mkos@408 35 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLMessage;
mkos@408 36 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLModel;
mkos@408 37 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLOperation;
mkos@408 38 import com.sun.xml.internal.ws.api.model.wsdl.editable.EditableWSDLPart;
alanb@368 39 import com.sun.xml.internal.ws.model.RuntimeModeler;
ohair@286 40
ohair@286 41 import javax.jws.WebParam.Mode;
ohair@286 42 import javax.jws.soap.SOAPBinding.Style;
ohair@286 43 import javax.xml.namespace.QName;
ohair@286 44 import javax.xml.stream.XMLStreamReader;
mkos@408 45
ohair@286 46 import java.util.*;
ohair@286 47
ohair@286 48 /**
ohair@286 49 * Implementation of {@link WSDLBoundOperation}
ohair@286 50 *
ohair@286 51 * @author Vivek Pandey
ohair@286 52 */
mkos@408 53 public final class WSDLBoundOperationImpl extends AbstractExtensibleImpl implements EditableWSDLBoundOperation {
ohair@286 54 private final QName name;
ohair@286 55
ohair@286 56 // map of wsdl:part to the binding
ohair@286 57 private final Map<String, ParameterBinding> inputParts;
ohair@286 58 private final Map<String, ParameterBinding> outputParts;
ohair@286 59 private final Map<String, ParameterBinding> faultParts;
ohair@286 60 private final Map<String, String> inputMimeTypes;
ohair@286 61 private final Map<String, String> outputMimeTypes;
ohair@286 62 private final Map<String, String> faultMimeTypes;
ohair@286 63
ohair@286 64 private boolean explicitInputSOAPBodyParts = false;
ohair@286 65 private boolean explicitOutputSOAPBodyParts = false;
ohair@286 66 private boolean explicitFaultSOAPBodyParts = false;
ohair@286 67
ohair@286 68 private Boolean emptyInputBody;
ohair@286 69 private Boolean emptyOutputBody;
ohair@286 70 private Boolean emptyFaultBody;
ohair@286 71
mkos@408 72 private final Map<String, EditableWSDLPart> inParts;
mkos@408 73 private final Map<String, EditableWSDLPart> outParts;
mkos@408 74 private final List<EditableWSDLBoundFault> wsdlBoundFaults;
mkos@408 75 private EditableWSDLOperation operation;
ohair@286 76 private String soapAction;
ohair@286 77 private ANONYMOUS anonymous;
ohair@286 78
mkos@408 79 private final EditableWSDLBoundPortType owner;
ohair@286 80
ohair@286 81 /**
ohair@286 82 *
ohair@286 83 * @param name wsdl:operation name qualified value
ohair@286 84 */
mkos@408 85 public WSDLBoundOperationImpl(XMLStreamReader xsr, EditableWSDLBoundPortType owner, QName name) {
ohair@286 86 super(xsr);
ohair@286 87 this.name = name;
ohair@286 88 inputParts = new HashMap<String, ParameterBinding>();
ohair@286 89 outputParts = new HashMap<String, ParameterBinding>();
ohair@286 90 faultParts = new HashMap<String, ParameterBinding>();
ohair@286 91 inputMimeTypes = new HashMap<String, String>();
ohair@286 92 outputMimeTypes = new HashMap<String, String>();
ohair@286 93 faultMimeTypes = new HashMap<String, String>();
mkos@408 94 inParts = new HashMap<String, EditableWSDLPart>();
mkos@408 95 outParts = new HashMap<String, EditableWSDLPart>();
mkos@408 96 wsdlBoundFaults = new ArrayList<EditableWSDLBoundFault>();
ohair@286 97 this.owner = owner;
ohair@286 98 }
ohair@286 99
mkos@384 100 @Override
ohair@286 101 public QName getName(){
ohair@286 102 return name;
ohair@286 103 }
ohair@286 104
mkos@384 105 @Override
ohair@286 106 public String getSOAPAction() {
ohair@286 107 return soapAction;
ohair@286 108 }
ohair@286 109
ohair@286 110 public void setSoapAction(String soapAction) {
ohair@286 111 this.soapAction = soapAction!=null?soapAction:"";
ohair@286 112 }
ohair@286 113
mkos@384 114 @Override
mkos@408 115 public EditableWSDLPart getPart(String partName, Mode mode) {
ohair@286 116 if(mode==Mode.IN){
ohair@286 117 return inParts.get(partName);
ohair@286 118 }else if(mode==Mode.OUT){
ohair@286 119 return outParts.get(partName);
ohair@286 120 }
ohair@286 121 return null;
ohair@286 122 }
ohair@286 123
mkos@408 124 public void addPart(EditableWSDLPart part, Mode mode){
ohair@286 125 if(mode==Mode.IN)
ohair@286 126 inParts.put(part.getName(), part);
ohair@286 127 else if(mode==Mode.OUT)
ohair@286 128 outParts.put(part.getName(), part);
ohair@286 129 }
ohair@286 130
ohair@286 131 /**
ohair@286 132 * Map of wsdl:input part name and the binding as {@link ParameterBinding}
ohair@286 133 *
ohair@286 134 * @return empty Map if there is no parts
ohair@286 135 */
ohair@286 136 public Map<String, ParameterBinding> getInputParts() {
ohair@286 137 return inputParts;
ohair@286 138 }
ohair@286 139
ohair@286 140 /**
ohair@286 141 * Map of wsdl:output part name and the binding as {@link ParameterBinding}
ohair@286 142 *
ohair@286 143 * @return empty Map if there is no parts
ohair@286 144 */
ohair@286 145 public Map<String, ParameterBinding> getOutputParts() {
ohair@286 146 return outputParts;
ohair@286 147 }
ohair@286 148
ohair@286 149 /**
ohair@286 150 * Map of wsdl:fault part name and the binding as {@link ParameterBinding}
ohair@286 151 *
ohair@286 152 * @return empty Map if there is no parts
ohair@286 153 */
ohair@286 154 public Map<String, ParameterBinding> getFaultParts() {
ohair@286 155 return faultParts;
ohair@286 156 }
ohair@286 157
ohair@286 158 // TODO: what's the difference between this and inputParts/outputParts?
mkos@384 159 @Override
mkos@408 160 public Map<String, ? extends EditableWSDLPart> getInParts() {
mkos@408 161 return Collections.<String, EditableWSDLPart>unmodifiableMap(inParts);
ohair@286 162 }
ohair@286 163
mkos@384 164 @Override
mkos@408 165 public Map<String, ? extends EditableWSDLPart> getOutParts() {
mkos@408 166 return Collections.<String, EditableWSDLPart>unmodifiableMap(outParts);
ohair@286 167 }
ohair@286 168
ohair@286 169 @NotNull
mkos@384 170 @Override
mkos@408 171 public List<? extends EditableWSDLBoundFault> getFaults() {
ohair@286 172 return wsdlBoundFaults;
ohair@286 173 }
ohair@286 174
mkos@408 175 public void addFault(@NotNull EditableWSDLBoundFault fault){
ohair@286 176 wsdlBoundFaults.add(fault);
ohair@286 177 }
ohair@286 178
ohair@286 179
ohair@286 180 /**
ohair@286 181 * Gets {@link ParameterBinding} for a given wsdl part in wsdl:input
ohair@286 182 *
ohair@286 183 * @param part Name of wsdl:part, must be non-null
ohair@286 184 * @return null if the part is not found.
ohair@286 185 */
ohair@286 186 public ParameterBinding getInputBinding(String part){
ohair@286 187 if(emptyInputBody == null){
ohair@286 188 if(inputParts.get(" ") != null)
ohair@286 189 emptyInputBody = true;
ohair@286 190 else
ohair@286 191 emptyInputBody = false;
ohair@286 192 }
ohair@286 193 ParameterBinding block = inputParts.get(part);
ohair@286 194 if(block == null){
ohair@286 195 if(explicitInputSOAPBodyParts || emptyInputBody)
ohair@286 196 return ParameterBinding.UNBOUND;
ohair@286 197 return ParameterBinding.BODY;
ohair@286 198 }
ohair@286 199
ohair@286 200 return block;
ohair@286 201 }
ohair@286 202
ohair@286 203 /**
ohair@286 204 * Gets {@link ParameterBinding} for a given wsdl part in wsdl:output
ohair@286 205 *
ohair@286 206 * @param part Name of wsdl:part, must be non-null
ohair@286 207 * @return null if the part is not found.
ohair@286 208 */
ohair@286 209 public ParameterBinding getOutputBinding(String part){
ohair@286 210 if(emptyOutputBody == null){
ohair@286 211 if(outputParts.get(" ") != null)
ohair@286 212 emptyOutputBody = true;
ohair@286 213 else
ohair@286 214 emptyOutputBody = false;
ohair@286 215 }
ohair@286 216 ParameterBinding block = outputParts.get(part);
ohair@286 217 if(block == null){
ohair@286 218 if(explicitOutputSOAPBodyParts || emptyOutputBody)
ohair@286 219 return ParameterBinding.UNBOUND;
ohair@286 220 return ParameterBinding.BODY;
ohair@286 221 }
ohair@286 222
ohair@286 223 return block;
ohair@286 224 }
ohair@286 225
ohair@286 226 /**
ohair@286 227 * Gets {@link ParameterBinding} for a given wsdl part in wsdl:fault
ohair@286 228 *
ohair@286 229 * @param part Name of wsdl:part, must be non-null
ohair@286 230 * @return null if the part is not found.
ohair@286 231 */
ohair@286 232 public ParameterBinding getFaultBinding(String part){
ohair@286 233 if(emptyFaultBody == null){
ohair@286 234 if(faultParts.get(" ") != null)
ohair@286 235 emptyFaultBody = true;
ohair@286 236 else
ohair@286 237 emptyFaultBody = false;
ohair@286 238 }
ohair@286 239 ParameterBinding block = faultParts.get(part);
ohair@286 240 if(block == null){
ohair@286 241 if(explicitFaultSOAPBodyParts || emptyFaultBody)
ohair@286 242 return ParameterBinding.UNBOUND;
ohair@286 243 return ParameterBinding.BODY;
ohair@286 244 }
ohair@286 245
ohair@286 246 return block;
ohair@286 247 }
ohair@286 248
ohair@286 249 /**
ohair@286 250 * Gets the MIME type for a given wsdl part in wsdl:input
ohair@286 251 *
ohair@286 252 * @param part Name of wsdl:part, must be non-null
ohair@286 253 * @return null if the part is not found.
ohair@286 254 */
ohair@286 255 public String getMimeTypeForInputPart(String part){
ohair@286 256 return inputMimeTypes.get(part);
ohair@286 257 }
ohair@286 258
ohair@286 259 /**
ohair@286 260 * Gets the MIME type for a given wsdl part in wsdl:output
ohair@286 261 *
ohair@286 262 * @param part Name of wsdl:part, must be non-null
ohair@286 263 * @return null if the part is not found.
ohair@286 264 */
ohair@286 265 public String getMimeTypeForOutputPart(String part){
ohair@286 266 return outputMimeTypes.get(part);
ohair@286 267 }
ohair@286 268
ohair@286 269 /**
ohair@286 270 * Gets the MIME type for a given wsdl part in wsdl:fault
ohair@286 271 *
ohair@286 272 * @param part Name of wsdl:part, must be non-null
ohair@286 273 * @return null if the part is not found.
ohair@286 274 */
ohair@286 275 public String getMimeTypeForFaultPart(String part){
ohair@286 276 return faultMimeTypes.get(part);
ohair@286 277 }
ohair@286 278
mkos@384 279 @Override
mkos@408 280 public EditableWSDLOperation getOperation() {
ohair@286 281 return operation;
ohair@286 282 }
ohair@286 283
ohair@286 284
mkos@384 285 @Override
mkos@408 286 public EditableWSDLBoundPortType getBoundPortType() {
ohair@286 287 return owner;
ohair@286 288 }
ohair@286 289
ohair@286 290 public void setInputExplicitBodyParts(boolean b) {
ohair@286 291 explicitInputSOAPBodyParts = b;
ohair@286 292 }
ohair@286 293
ohair@286 294 public void setOutputExplicitBodyParts(boolean b) {
ohair@286 295 explicitOutputSOAPBodyParts = b;
ohair@286 296 }
ohair@286 297
ohair@286 298 public void setFaultExplicitBodyParts(boolean b) {
ohair@286 299 explicitFaultSOAPBodyParts = b;
ohair@286 300 }
ohair@286 301
ohair@286 302 private Style style = Style.DOCUMENT;
ohair@286 303 public void setStyle(Style style){
ohair@286 304 this.style = style;
ohair@286 305 }
ohair@286 306
mkos@384 307 @Override
mkos@408 308 public @Nullable QName getRequestPayloadName() {
ohair@286 309 if (emptyRequestPayload)
ohair@286 310 return null;
ohair@286 311
ohair@286 312 if (requestPayloadName != null)
ohair@286 313 return requestPayloadName;
ohair@286 314
ohair@286 315 if(style.equals(Style.RPC)){
ohair@286 316 String ns = getRequestNamespace() != null ? getRequestNamespace() : name.getNamespaceURI();
ohair@286 317 requestPayloadName = new QName(ns, name.getLocalPart());
ohair@286 318 return requestPayloadName;
ohair@286 319 }else{
ohair@286 320 QName inMsgName = operation.getInput().getMessage().getName();
mkos@408 321 EditableWSDLMessage message = messages.get(inMsgName);
mkos@408 322 for(EditableWSDLPart part:message.parts()){
ohair@286 323 ParameterBinding binding = getInputBinding(part.getName());
ohair@286 324 if(binding.isBody()){
ohair@286 325 requestPayloadName = part.getDescriptor().name();
ohair@286 326 return requestPayloadName;
ohair@286 327 }
ohair@286 328 }
ohair@286 329
ohair@286 330 //Its empty payload
ohair@286 331 emptyRequestPayload = true;
ohair@286 332 }
ohair@286 333 //empty body
ohair@286 334 return null;
ohair@286 335 }
ohair@286 336
mkos@384 337 @Override
mkos@408 338 public @Nullable QName getResponsePayloadName() {
ohair@286 339 if (emptyResponsePayload)
ohair@286 340 return null;
ohair@286 341
ohair@286 342 if (responsePayloadName != null)
ohair@286 343 return responsePayloadName;
ohair@286 344
ohair@286 345 if(style.equals(Style.RPC)){
ohair@286 346 String ns = getResponseNamespace() != null ? getResponseNamespace() : name.getNamespaceURI();
ohair@286 347 responsePayloadName = new QName(ns, name.getLocalPart()+"Response");
ohair@286 348 return responsePayloadName;
ohair@286 349 }else{
ohair@286 350 QName outMsgName = operation.getOutput().getMessage().getName();
mkos@408 351 EditableWSDLMessage message = messages.get(outMsgName);
mkos@408 352 for(EditableWSDLPart part:message.parts()){
ohair@286 353 ParameterBinding binding = getOutputBinding(part.getName());
ohair@286 354 if(binding.isBody()){
ohair@286 355 responsePayloadName = part.getDescriptor().name();
ohair@286 356 return responsePayloadName;
ohair@286 357 }
ohair@286 358 }
ohair@286 359
ohair@286 360 //Its empty payload
ohair@286 361 emptyResponsePayload = true;
ohair@286 362 }
ohair@286 363 //empty body
ohair@286 364 return null;
ohair@286 365 }
ohair@286 366
ohair@286 367
ohair@286 368 private String reqNamespace;
ohair@286 369 private String respNamespace;
ohair@286 370
ohair@286 371 /**
ohair@286 372 * For rpclit gives namespace value on soapbinding:body@namespace
ohair@286 373 *
ohair@286 374 * @return non-null for rpclit and null for doclit
alanb@368 375 * @see RuntimeModeler#processRpcMethod(JavaMethodImpl, String, String, Method)
ohair@286 376 */
mkos@384 377 @Override
ohair@286 378 public String getRequestNamespace(){
ohair@286 379 return (reqNamespace != null)?reqNamespace:name.getNamespaceURI();
ohair@286 380 }
ohair@286 381
ohair@286 382 public void setRequestNamespace(String ns){
ohair@286 383 reqNamespace = ns;
ohair@286 384 }
ohair@286 385
ohair@286 386 /**
ohair@286 387 * For rpclit gives namespace value on soapbinding:body@namespace
ohair@286 388 *
ohair@286 389 * @return non-null for rpclit and null for doclit
alanb@368 390 * @see RuntimeModeler#processRpcMethod(JavaMethodImpl, String, String, Method)
ohair@286 391 */
mkos@384 392 @Override
ohair@286 393 public String getResponseNamespace(){
ohair@286 394 return (respNamespace!=null)?respNamespace:name.getNamespaceURI();
ohair@286 395 }
ohair@286 396
ohair@286 397 public void setResponseNamespace(String ns){
ohair@286 398 respNamespace = ns;
ohair@286 399 }
ohair@286 400
mkos@408 401 EditableWSDLBoundPortType getOwner(){
ohair@286 402 return owner;
ohair@286 403 }
ohair@286 404
ohair@286 405 private QName requestPayloadName;
ohair@286 406 private QName responsePayloadName;
ohair@286 407 private boolean emptyRequestPayload;
ohair@286 408 private boolean emptyResponsePayload;
mkos@408 409 private Map<QName, ? extends EditableWSDLMessage> messages;
ohair@286 410
mkos@408 411 public void freeze(EditableWSDLModel parent) {
ohair@286 412 messages = parent.getMessages();
ohair@286 413 operation = owner.getPortType().get(name.getLocalPart());
mkos@408 414 for(EditableWSDLBoundFault bf : wsdlBoundFaults){
ohair@286 415 bf.freeze(this);
ohair@286 416 }
ohair@286 417 }
ohair@286 418
ohair@286 419 public void setAnonymous(ANONYMOUS anonymous) {
ohair@286 420 this.anonymous = anonymous;
ohair@286 421 }
ohair@286 422
ohair@286 423 /**
ohair@286 424 * @inheritDoc
ohair@286 425 */
mkos@384 426 @Override
ohair@286 427 public ANONYMOUS getAnonymous() {
ohair@286 428 return anonymous;
ohair@286 429 }
ohair@286 430 }

mercurial