src/share/jaxws_classes/com/sun/xml/internal/ws/addressing/WsaTubeHelper.java

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

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

merge

     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  */
    26 package com.sun.xml.internal.ws.addressing;
    28 import com.sun.xml.internal.ws.addressing.model.InvalidAddressingHeaderException;
    29 import com.sun.xml.internal.ws.addressing.model.MissingAddressingHeaderException;
    30 import com.sun.xml.internal.ws.api.SOAPVersion;
    31 import com.sun.xml.internal.ws.api.WSBinding;
    32 import com.sun.xml.internal.ws.api.addressing.AddressingVersion;
    33 import com.sun.xml.internal.ws.api.message.AddressingUtils;
    34 import com.sun.xml.internal.ws.api.message.Packet;
    35 import com.sun.xml.internal.ws.api.model.wsdl.WSDLBoundOperation;
    36 import com.sun.xml.internal.ws.api.model.wsdl.WSDLFault;
    37 import com.sun.xml.internal.ws.api.model.wsdl.WSDLOperation;
    38 import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
    39 import com.sun.xml.internal.ws.api.model.wsdl.WSDLPort;
    40 import com.sun.xml.internal.ws.api.model.SEIModel;
    41 import com.sun.xml.internal.ws.api.model.JavaMethod;
    42 import com.sun.xml.internal.ws.api.model.WSDLOperationMapping;
    43 import com.sun.xml.internal.ws.model.JavaMethodImpl;
    44 import com.sun.xml.internal.ws.model.CheckedExceptionImpl;
    45 import com.sun.istack.internal.Nullable;
    46 import org.w3c.dom.Element;
    48 import javax.xml.namespace.QName;
    49 import javax.xml.soap.Detail;
    50 import javax.xml.soap.SOAPConstants;
    51 import javax.xml.soap.SOAPException;
    52 import javax.xml.soap.SOAPFactory;
    53 import javax.xml.soap.SOAPFault;
    54 import javax.xml.soap.SOAPMessage;
    55 import javax.xml.ws.WebServiceException;
    57 /**
    58  * @author Rama Pulavarthi
    59  * @author Arun Gupta
    60  */
    61 public abstract class WsaTubeHelper {
    63     public WsaTubeHelper(WSBinding binding, SEIModel seiModel, WSDLPort wsdlPort) {
    64         this.binding = binding;
    65         this.wsdlPort = wsdlPort;
    66         this.seiModel = seiModel;
    67         this.soapVer = binding.getSOAPVersion();
    68         this.addVer = binding.getAddressingVersion();
    70     }
    72     public String getFaultAction(Packet requestPacket, Packet responsePacket) {
    73         String action = null;
    74         if(seiModel != null) {
    75             action = getFaultActionFromSEIModel(requestPacket,responsePacket);
    76         }
    77         if (action != null) {
    78             return action;
    79         } else {
    80             action = addVer.getDefaultFaultAction();
    81         }
    82         if (wsdlPort != null) {
    83             WSDLOperationMapping wsdlOp = requestPacket.getWSDLOperationMapping();
    84             if (wsdlOp != null) {
    85                 WSDLBoundOperation wbo = wsdlOp.getWSDLBoundOperation();
    86                 return getFaultAction(wbo, responsePacket);
    87             }
    88         }
    89         return action;
    90     }
    92     String getFaultActionFromSEIModel(Packet requestPacket, Packet responsePacket) {
    93         String action = null;
    94         if (seiModel == null || wsdlPort == null) {
    95             return action;
    96         }
    98         try {
    99             SOAPMessage sm = responsePacket.getMessage().copy().readAsSOAPMessage();
   100             if (sm == null) {
   101                 return action;
   102             }
   104             if (sm.getSOAPBody() == null) {
   105                 return action;
   106             }
   108             if (sm.getSOAPBody().getFault() == null) {
   109                 return action;
   110             }
   112             Detail detail = sm.getSOAPBody().getFault().getDetail();
   113             if (detail == null) {
   114                 return action;
   115             }
   117             String ns = detail.getFirstChild().getNamespaceURI();
   118             String name = detail.getFirstChild().getLocalName();
   120             WSDLOperationMapping wsdlOp = requestPacket.getWSDLOperationMapping();
   121             JavaMethodImpl jm = (wsdlOp != null) ? (JavaMethodImpl)wsdlOp.getJavaMethod() : null;
   122             if (jm != null) {
   123               for (CheckedExceptionImpl ce : jm.getCheckedExceptions()) {
   124                   if (ce.getDetailType().tagName.getLocalPart().equals(name) &&
   125                           ce.getDetailType().tagName.getNamespaceURI().equals(ns)) {
   126                       return ce.getFaultAction();
   127                   }
   128               }
   129             }
   130             return action;
   131         } catch (SOAPException e) {
   132             throw new WebServiceException(e);
   133         }
   134     }
   136     String getFaultAction(@Nullable WSDLBoundOperation wbo, Packet responsePacket) {
   137         String action = AddressingUtils.getAction(responsePacket.getMessage().getHeaders(), addVer, soapVer);
   138         if (action != null) {
   139             return action;
   140         }
   142         action = addVer.getDefaultFaultAction();
   143         if (wbo == null) {
   144             return action;
   145         }
   147         try {
   148             SOAPMessage sm = responsePacket.getMessage().copy().readAsSOAPMessage();
   149             if (sm == null) {
   150                 return action;
   151             }
   153             if (sm.getSOAPBody() == null) {
   154                 return action;
   155             }
   157             if (sm.getSOAPBody().getFault() == null) {
   158                 return action;
   159             }
   161             Detail detail = sm.getSOAPBody().getFault().getDetail();
   162             if (detail == null) {
   163                 return action;
   164             }
   166             String ns = detail.getFirstChild().getNamespaceURI();
   167             String name = detail.getFirstChild().getLocalName();
   169             WSDLOperation o = wbo.getOperation();
   171             WSDLFault fault = o.getFault(new QName(ns, name));
   172             if (fault == null) {
   173                 return action;
   174             }
   176             action = fault.getAction();
   178             return action;
   179         } catch (SOAPException e) {
   180             throw new WebServiceException(e);
   181         }
   182     }
   184     public String getInputAction(Packet packet) {
   185         String action = null;
   187         if (wsdlPort != null) {
   188             WSDLOperationMapping wsdlOp = packet.getWSDLOperationMapping();
   189             if (wsdlOp != null) {
   190                 WSDLBoundOperation wbo = wsdlOp.getWSDLBoundOperation();
   191                 WSDLOperation op = wbo.getOperation();
   192                 action = op.getInput().getAction();
   193             }
   194         }
   196         return action;
   197     }
   199     /**
   200      * This method gives the Input addressing Action for a message.
   201      * It gives the Action set in the wsdl operation for the corresponding payload.
   202      * If it is not explicitly set, it gives the soapAction
   203      * @param packet
   204      * @return input Action
   205      */
   206     public String getEffectiveInputAction(Packet packet) {
   207         //non-default SOAPAction beomes wsa:action
   208         if(packet.soapAction != null && !packet.soapAction.equals("")) {
   209             return packet.soapAction;
   210         }
   211         String action;
   213         if (wsdlPort != null) {
   214             WSDLOperationMapping wsdlOp = packet.getWSDLOperationMapping();
   215             if (wsdlOp != null) {
   216                 WSDLBoundOperation wbo = wsdlOp.getWSDLBoundOperation();
   217                 WSDLOperation op = wbo.getOperation();
   218                 action = op.getInput().getAction();
   219             } else {
   220                 action = packet.soapAction;
   221             }
   222         } else {
   223             action = packet.soapAction;
   224         }
   225         return action;
   226     }
   228     public boolean isInputActionDefault(Packet packet) {
   229         if (wsdlPort == null) {
   230             return false;
   231         }
   232         WSDLOperationMapping wsdlOp = packet.getWSDLOperationMapping();
   233         if(wsdlOp == null) {
   234             return false;
   235         }
   236         WSDLBoundOperation wbo = wsdlOp.getWSDLBoundOperation();
   237         WSDLOperation op = wbo.getOperation();
   238         return op.getInput().isDefaultAction();
   240     }
   242     public String getSOAPAction(Packet packet) {
   243         String action = "";
   245         if (packet == null || packet.getMessage() == null) {
   246             return action;
   247         }
   249         if (wsdlPort == null) {
   250             return action;
   251         }
   253         WSDLOperationMapping wsdlOp = packet.getWSDLOperationMapping();
   254         if (wsdlOp == null) {
   255             return action;
   256         }
   258         WSDLBoundOperation op = wsdlOp.getWSDLBoundOperation();
   259         action = op.getSOAPAction();
   260         return action;
   261     }
   263     public String getOutputAction(Packet packet) {
   264         //String action = AddressingVersion.UNSET_OUTPUT_ACTION;
   265         String action = null;
   266         WSDLOperationMapping wsdlOp = packet.getWSDLOperationMapping();
   267         if (wsdlOp != null) {
   268             JavaMethod javaMethod = wsdlOp.getJavaMethod();
   269             if (javaMethod != null) {
   270                 JavaMethodImpl jm = (JavaMethodImpl) javaMethod;
   271                 if (jm != null && jm.getOutputAction() != null && !jm.getOutputAction().equals("")) {
   272                     return jm.getOutputAction();
   273                 }
   274             }
   275             WSDLBoundOperation wbo = wsdlOp.getWSDLBoundOperation();
   276             if (wbo != null) return getOutputAction(wbo);
   277         }
   278         return action;
   279     }
   281     String getOutputAction(@Nullable WSDLBoundOperation wbo) {
   282         String action = AddressingVersion.UNSET_OUTPUT_ACTION;
   283         if (wbo != null) {
   284             WSDLOutput op = wbo.getOperation().getOutput();
   285             if (op != null) {
   286                 action = op.getAction();
   287             }
   288         }
   289         return action;
   290     }
   292     public SOAPFault createInvalidAddressingHeaderFault(InvalidAddressingHeaderException e, AddressingVersion av) {
   293         QName name = e.getProblemHeader();
   294         QName subsubcode = e.getSubsubcode();
   295         QName subcode = av.invalidMapTag;
   296         String faultstring = String.format(av.getInvalidMapText(), name, subsubcode);
   298         try {
   299             SOAPFactory factory;
   300             SOAPFault fault;
   301             if (soapVer == SOAPVersion.SOAP_12) {
   302                 factory = SOAPVersion.SOAP_12.getSOAPFactory();
   303                 fault = factory.createFault();
   304                 fault.setFaultCode(SOAPConstants.SOAP_SENDER_FAULT);
   305                 fault.appendFaultSubcode(subcode);
   306                 fault.appendFaultSubcode(subsubcode);
   307                 getInvalidMapDetail(name, fault.addDetail());
   308             } else {
   309                 factory = SOAPVersion.SOAP_11.getSOAPFactory();
   310                 fault = factory.createFault();
   311                 fault.setFaultCode(subsubcode);
   312             }
   314             fault.setFaultString(faultstring);
   316             return fault;
   317         } catch (SOAPException se) {
   318             throw new WebServiceException(se);
   319         }
   320     }
   322     public SOAPFault newMapRequiredFault(MissingAddressingHeaderException e) {
   323         QName subcode = addVer.mapRequiredTag;
   324         QName subsubcode = addVer.mapRequiredTag;
   325         String faultstring = addVer.getMapRequiredText();
   327         try {
   328             SOAPFactory factory;
   329             SOAPFault fault;
   330             if (soapVer == SOAPVersion.SOAP_12) {
   331                 factory = SOAPVersion.SOAP_12.getSOAPFactory();
   332                 fault = factory.createFault();
   333                 fault.setFaultCode(SOAPConstants.SOAP_SENDER_FAULT);
   334                 fault.appendFaultSubcode(subcode);
   335                 fault.appendFaultSubcode(subsubcode);
   336                 getMapRequiredDetail(e.getMissingHeaderQName(), fault.addDetail());
   337             } else {
   338                 factory = SOAPVersion.SOAP_11.getSOAPFactory();
   339                 fault = factory.createFault();
   340                 fault.setFaultCode(subsubcode);
   341             }
   343             fault.setFaultString(faultstring);
   345             return fault;
   346         } catch (SOAPException se) {
   347             throw new WebServiceException(se);
   348         }
   349     }
   351     public abstract void getProblemActionDetail(String action, Element element);
   352     public abstract void getInvalidMapDetail(QName name, Element element);
   353     public abstract void getMapRequiredDetail(QName name, Element element);
   355     protected SEIModel seiModel;
   356     protected WSDLPort wsdlPort;
   357     protected WSBinding binding;
   358     protected final SOAPVersion soapVer;
   359     protected final AddressingVersion addVer;
   360 }

mercurial