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

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 368
0989ad8c0860
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1997, 2012, 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.model;
    28 import com.sun.xml.internal.bind.api.Bridge;
    29 import com.sun.xml.internal.bind.api.TypeReference;
    30 import com.sun.xml.internal.ws.api.model.JavaMethod;
    31 import com.sun.xml.internal.ws.api.model.Parameter;
    32 import com.sun.xml.internal.ws.api.model.ParameterBinding;
    33 import com.sun.xml.internal.ws.spi.db.RepeatedElementBridge;
    34 import com.sun.xml.internal.ws.spi.db.WrapperComposite;
    35 import com.sun.xml.internal.ws.spi.db.XMLBridge;
    36 import com.sun.xml.internal.ws.spi.db.TypeInfo;
    38 import javax.jws.WebParam.Mode;
    39 import javax.xml.namespace.QName;
    40 import javax.xml.ws.Holder;
    41 import java.util.List;
    43 /**
    44  * runtime Parameter that abstracts the annotated java parameter
    45  *
    46  * <p>
    47  * A parameter may be bound to a header, a body, or an attachment.
    48  * Note that when it's bound to a body, it's bound to a body,
    49  * it binds to the whole payload.
    50  *
    51  * <p>
    52  * Sometimes multiple Java parameters are packed into the payload,
    53  * in which case the subclass {@link WrapperParameter} is used.
    54  *
    55  * @author Vivek Pandey
    56  */
    57 public class ParameterImpl implements Parameter {
    59     private ParameterBinding binding;
    60     private ParameterBinding outBinding;
    61     private String partName;
    62     private final int index;
    63     private final Mode mode;
    64     /** @deprecated */
    65     private TypeReference typeReference;
    66     private TypeInfo typeInfo;
    67     private QName name;
    68     private final JavaMethodImpl parent;
    70     WrapperParameter wrapper;
    71     TypeInfo itemTypeInfo;
    73     public ParameterImpl(JavaMethodImpl parent, TypeInfo type, Mode mode, int index) {
    74         assert type != null;
    76         this.typeInfo = type;
    77         this.name = type.tagName;
    78         this.mode = mode;
    79         this.index = index;
    80         this.parent = parent;
    81     }
    83     public AbstractSEIModelImpl getOwner() {
    84         return parent.owner;
    85     }
    87     public JavaMethod getParent() {
    88         return parent;
    89     }
    91     /**
    92      * @return Returns the name.
    93      */
    94     public QName getName() {
    95         return name;
    96     }
    98     public XMLBridge getXMLBridge() {
    99         return getOwner().getXMLBridge(typeInfo);
   100     }
   102     public XMLBridge getInlinedRepeatedElementBridge() {
   103         TypeInfo itemType = getItemType();
   104         if (itemType != null) {
   105             XMLBridge xb = getOwner().getXMLBridge(itemType);
   106             if (xb != null) return new RepeatedElementBridge(typeInfo, xb);
   107         }
   108         return null;
   109     }
   111     public TypeInfo getItemType() {
   112         if (itemTypeInfo != null) return itemTypeInfo;
   113         //RpcLit cannot inline repeated element in wrapper
   114         if (parent.getBinding().isRpcLit() || wrapper == null) return null;
   115         //InlinedRepeatedElementBridge is only used for dynamic wrapper (no wrapper class)
   116         if (!WrapperComposite.class.equals(wrapper.getTypeInfo().type)) return null;
   117         if (!getBinding().isBody()) return null;
   118         itemTypeInfo = typeInfo.getItemType();
   119         return  itemTypeInfo;
   120     }
   122     /**  @deprecated  */
   123     public Bridge getBridge() {
   124         return getOwner().getBridge(typeReference);
   125     }
   126     /**  @deprecated  */
   127     protected Bridge getBridge(TypeReference typeRef) {
   128         return getOwner().getBridge(typeRef);
   129     }
   131     /**
   132      * TODO: once the model gets JAXBContext, shouldn't {@link Bridge}s
   133      * be made available from model objects?
   134      * @deprecated use getTypeInfo
   135      * @return Returns the TypeReference associated with this Parameter
   136      */
   137     public TypeReference getTypeReference() {
   138         return typeReference;
   139     }
   140     public TypeInfo getTypeInfo() {
   141         return typeInfo;
   142     }
   144     /**
   145      * Sometimes we need to overwrite the typeReferenc, such as during patching for rpclit
   146      * @see AbstractSEIModelImpl#applyRpcLitParamBinding(JavaMethodImpl, WrapperParameter, WSDLBoundPortType, WebParam.Mode)
   147      * @deprecated
   148      */
   149     void setTypeReference(TypeReference type){
   150         typeReference = type;
   151         name = type.tagName;
   152     }
   155     public Mode getMode() {
   156         return mode;
   157     }
   159     public int getIndex() {
   160         return index;
   161     }
   163     /**
   164      * @return true if <tt>this instanceof {@link WrapperParameter}</tt>.
   165      */
   166     public boolean isWrapperStyle() {
   167         return false;
   168     }
   170     public boolean isReturnValue() {
   171         return index==-1;
   172     }
   174     /**
   175      * @return the Binding for this Parameter
   176      */
   177     public ParameterBinding getBinding() {
   178         if(binding == null)
   179             return ParameterBinding.BODY;
   180         return binding;
   181     }
   183     /**
   184      * @param binding
   185      */
   186     public void setBinding(ParameterBinding binding) {
   187         this.binding = binding;
   188     }
   190     public void setInBinding(ParameterBinding binding){
   191         this.binding = binding;
   192     }
   194     public void setOutBinding(ParameterBinding binding){
   195         this.outBinding = binding;
   196     }
   198     public ParameterBinding getInBinding(){
   199         return binding;
   200     }
   202     public ParameterBinding getOutBinding(){
   203         if(outBinding == null)
   204             return binding;
   205         return outBinding;
   206     }
   208     public boolean isIN() {
   209         return mode==Mode.IN;
   210     }
   212     public boolean isOUT() {
   213         return mode==Mode.OUT;
   214     }
   216     public boolean isINOUT() {
   217         return mode==Mode.INOUT;
   218     }
   220     /**
   221      * If true, this parameter maps to the return value of a method invocation.
   222      *
   223      * <p>
   224      * {@link JavaMethodImpl#getResponseParameters()} is guaranteed to have
   225      * at most one such {@link ParameterImpl}. Note that there coule be none,
   226      * in which case the method returns <tt>void</tt>.
   227      */
   228     public boolean isResponse() {
   229         return index == -1;
   230     }
   233     /**
   234      * Gets the holder value if applicable. To be called for inbound client side
   235      * message.
   236      *
   237      * @param obj
   238      * @return the holder value if applicable.
   239      */
   240     public Object getHolderValue(Object obj) {
   241         if (obj != null && obj instanceof Holder)
   242             return ((Holder) obj).value;
   243         return obj;
   244     }
   246     public String getPartName() {
   247         if(partName == null)
   248             return name.getLocalPart();
   249         return partName;
   250     }
   252     public void setPartName(String partName) {
   253         this.partName = partName;
   254     }
   256     void fillTypes(List<TypeInfo> types) {
   257         TypeInfo itemType = getItemType();
   258         types.add((itemType != null) ? itemType : getTypeInfo());
   259     }
   260 }

mercurial