ohair@286: /* alanb@368: * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ohair@286: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ohair@286: * ohair@286: * This code is free software; you can redistribute it and/or modify it ohair@286: * under the terms of the GNU General Public License version 2 only, as ohair@286: * published by the Free Software Foundation. Oracle designates this ohair@286: * particular file as subject to the "Classpath" exception as provided ohair@286: * by Oracle in the LICENSE file that accompanied this code. ohair@286: * ohair@286: * This code is distributed in the hope that it will be useful, but WITHOUT ohair@286: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ohair@286: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ohair@286: * version 2 for more details (a copy is included in the LICENSE file that ohair@286: * accompanied this code). ohair@286: * ohair@286: * You should have received a copy of the GNU General Public License version ohair@286: * 2 along with this work; if not, write to the Free Software Foundation, ohair@286: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ohair@286: * ohair@286: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ohair@286: * or visit www.oracle.com if you need additional information or have any ohair@286: * questions. ohair@286: */ ohair@286: ohair@286: package com.sun.xml.internal.ws.api; ohair@286: ohair@286: import com.sun.xml.internal.bind.util.Which; ohair@286: import com.sun.xml.internal.ws.api.message.saaj.SAAJFactory; ohair@286: import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants; ohair@286: ohair@286: import javax.xml.namespace.QName; ohair@286: import javax.xml.soap.MessageFactory; ohair@286: import javax.xml.soap.SOAPConstants; ohair@286: import javax.xml.soap.SOAPException; ohair@286: import javax.xml.soap.SOAPFactory; ohair@286: import javax.xml.ws.soap.SOAPBinding; ohair@286: alanb@368: import com.oracle.webservices.internal.api.EnvelopeStyle; alanb@368: import com.oracle.webservices.internal.api.EnvelopeStyleFeature; ohair@286: ohair@286: import java.util.Arrays; ohair@286: import java.util.Collections; ohair@286: import java.util.HashSet; ohair@286: import java.util.Set; ohair@286: ohair@286: /** ohair@286: * Version of SOAP (1.1 and 1.2). ohair@286: * ohair@286: *

ohair@286: * This class defines various constants for SOAP 1.1 and SOAP 1.2, ohair@286: * and also defines convenience methods to simplify the processing ohair@286: * of multiple SOAP versions. ohair@286: * ohair@286: *

ohair@286: * This constant alows you to do: ohair@286: * ohair@286: *

ohair@286:  * SOAPVersion version = ...;
ohair@286:  * version.someOp(...);
ohair@286:  * 
ohair@286: * ohair@286: * As opposed to: ohair@286: * ohair@286: *
ohair@286:  * if(binding is SOAP11) {
ohair@286:  *   doSomeOp11(...);
ohair@286:  * } else {
ohair@286:  *   doSomeOp12(...);
ohair@286:  * }
ohair@286:  * 
ohair@286: * ohair@286: * @author Kohsuke Kawaguchi ohair@286: */ ohair@286: public enum SOAPVersion { ohair@286: SOAP_11(SOAPBinding.SOAP11HTTP_BINDING, ohair@286: com.sun.xml.internal.ws.encoding.soap.SOAPConstants.URI_ENVELOPE, ohair@286: "text/xml", ohair@286: SOAPConstants.URI_SOAP_ACTOR_NEXT, "actor", ohair@286: javax.xml.soap.SOAPConstants.SOAP_1_1_PROTOCOL, ohair@286: new QName(com.sun.xml.internal.ws.encoding.soap.SOAPConstants.URI_ENVELOPE, "MustUnderstand"), ohair@286: "Client", ohair@286: "Server", ohair@286: Collections.singleton(SOAPConstants.URI_SOAP_ACTOR_NEXT)), ohair@286: ohair@286: SOAP_12(SOAPBinding.SOAP12HTTP_BINDING, ohair@286: SOAP12Constants.URI_ENVELOPE, ohair@286: "application/soap+xml", ohair@286: SOAPConstants.URI_SOAP_1_2_ROLE_ULTIMATE_RECEIVER, "role", ohair@286: javax.xml.soap.SOAPConstants.SOAP_1_2_PROTOCOL, ohair@286: new QName(com.sun.xml.internal.ws.encoding.soap.SOAP12Constants.URI_ENVELOPE, "MustUnderstand"), ohair@286: "Sender", ohair@286: "Receiver", ohair@286: new HashSet(Arrays.asList(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT,SOAPConstants.URI_SOAP_1_2_ROLE_ULTIMATE_RECEIVER))); ohair@286: ohair@286: /** ohair@286: * Binding ID for SOAP/HTTP binding of this SOAP version. ohair@286: * ohair@286: *

ohair@286: * Either {@link SOAPBinding#SOAP11HTTP_BINDING} or ohair@286: * {@link SOAPBinding#SOAP12HTTP_BINDING} ohair@286: */ ohair@286: public final String httpBindingId; ohair@286: ohair@286: /** ohair@286: * SOAP envelope namespace URI. ohair@286: */ ohair@286: public final String nsUri; ohair@286: ohair@286: /** ohair@286: * Content-type. Either "text/xml" or "application/soap+xml". ohair@286: */ ohair@286: public final String contentType; ohair@286: ohair@286: /** ohair@286: * SOAP MustUnderstand FaultCode for this SOAP version ohair@286: */ ohair@286: public final QName faultCodeMustUnderstand; ohair@286: ohair@286: /** ohair@286: * SAAJ {@link MessageFactory} for this SOAP version. ohair@286: * @deprecated ohair@286: */ ohair@286: public final MessageFactory saajMessageFactory; ohair@286: ohair@286: /** ohair@286: * SAAJ {@link SOAPFactory} for this SOAP version. ohair@286: * @deprecated ohair@286: */ ohair@286: public final SOAPFactory saajSoapFactory; ohair@286: ohair@286: private final String saajFactoryString; ohair@286: ohair@286: /** ohair@286: * If the actor/role attribute is absent, this SOAP version assumes this value. ohair@286: */ ohair@286: public final String implicitRole; ohair@286: ohair@286: /** ohair@286: * Singleton set that contains {@link #implicitRole}. ohair@286: */ ohair@286: public final Set implicitRoleSet; ohair@286: ohair@286: /** ohair@286: * This represents the roles required to be assumed by SOAP binding implementation. ohair@286: */ ohair@286: public final Set requiredRoles; ohair@286: ohair@286: /** ohair@286: * "role" (SOAP 1.2) or "actor" (SOAP 1.1) ohair@286: */ ohair@286: public final String roleAttributeName; ohair@286: ohair@286: /** ohair@286: * "{nsUri}Client" or "{nsUri}Sender" ohair@286: */ ohair@286: public final QName faultCodeClient; ohair@286: ohair@286: /** ohair@286: * "{nsUri}Server" or "{nsUri}Receiver" ohair@286: */ ohair@286: public final QName faultCodeServer; ohair@286: ohair@286: private SOAPVersion(String httpBindingId, String nsUri, String contentType, String implicitRole, String roleAttributeName, ohair@286: String saajFactoryString, QName faultCodeMustUnderstand, String faultCodeClientLocalName, ohair@286: String faultCodeServerLocalName,Set requiredRoles) { ohair@286: this.httpBindingId = httpBindingId; ohair@286: this.nsUri = nsUri; ohair@286: this.contentType = contentType; ohair@286: this.implicitRole = implicitRole; ohair@286: this.implicitRoleSet = Collections.singleton(implicitRole); ohair@286: this.roleAttributeName = roleAttributeName; ohair@286: this.saajFactoryString = saajFactoryString; ohair@286: try { ohair@286: saajMessageFactory = MessageFactory.newInstance(saajFactoryString); ohair@286: saajSoapFactory = SOAPFactory.newInstance(saajFactoryString); ohair@286: } catch (SOAPException e) { ohair@286: throw new Error(e); ohair@286: } catch (NoSuchMethodError e) { ohair@286: // SAAJ 1.3 is not in the classpath ohair@286: LinkageError x = new LinkageError("You are loading old SAAJ from "+ Which.which(MessageFactory.class)); ohair@286: x.initCause(e); ohair@286: throw x; ohair@286: } ohair@286: this.faultCodeMustUnderstand = faultCodeMustUnderstand; ohair@286: this.requiredRoles = requiredRoles; ohair@286: this.faultCodeClient = new QName(nsUri,faultCodeClientLocalName); ohair@286: this.faultCodeServer = new QName(nsUri,faultCodeServerLocalName); ohair@286: } ohair@286: ohair@286: public SOAPFactory getSOAPFactory() { ohair@286: try { ohair@286: return SAAJFactory.getSOAPFactory(saajFactoryString); ohair@286: } catch (SOAPException e) { ohair@286: throw new Error(e); ohair@286: } catch (NoSuchMethodError e) { ohair@286: // SAAJ 1.3 is not in the classpath ohair@286: LinkageError x = new LinkageError("You are loading old SAAJ from "+ Which.which(MessageFactory.class)); ohair@286: x.initCause(e); ohair@286: throw x; ohair@286: } ohair@286: } ohair@286: ohair@286: public MessageFactory getMessageFactory() { ohair@286: try { ohair@286: return SAAJFactory.getMessageFactory(saajFactoryString); ohair@286: } catch (SOAPException e) { ohair@286: throw new Error(e); ohair@286: } catch (NoSuchMethodError e) { ohair@286: // SAAJ 1.3 is not in the classpath ohair@286: LinkageError x = new LinkageError("You are loading old SAAJ from "+ Which.which(MessageFactory.class)); ohair@286: x.initCause(e); ohair@286: throw x; ohair@286: } ohair@286: } ohair@286: ohair@286: public String toString() { ohair@286: return httpBindingId; ohair@286: } ohair@286: ohair@286: /** ohair@286: * Returns {@link SOAPVersion} whose {@link #httpBindingId} equals to ohair@286: * the given string. ohair@286: * ohair@286: * This method does not perform input string validation. ohair@286: * ohair@286: * @param binding ohair@286: * for historical reason, we treat null as {@link #SOAP_11}, ohair@286: * but you really shouldn't be passing null. ohair@286: * @return always non-null. ohair@286: */ ohair@286: public static SOAPVersion fromHttpBinding(String binding) { ohair@286: if(binding==null) ohair@286: return SOAP_11; ohair@286: ohair@286: if(binding.equals(SOAP_12.httpBindingId)) ohair@286: return SOAP_12; ohair@286: else ohair@286: return SOAP_11; ohair@286: } ohair@286: ohair@286: /** ohair@286: * Returns {@link SOAPVersion} whose {@link #nsUri} equals to ohair@286: * the given string. ohair@286: * ohair@286: * This method does not perform input string validation. ohair@286: * ohair@286: * @param nsUri ohair@286: * must not be null. ohair@286: * @return always non-null. ohair@286: */ ohair@286: public static SOAPVersion fromNsUri(String nsUri) { ohair@286: if(nsUri.equals(SOAP_12.nsUri)) ohair@286: return SOAP_12; ohair@286: else ohair@286: return SOAP_11; ohair@286: } ohair@286: ohair@286: public static SOAPVersion from(EnvelopeStyleFeature f) { ohair@286: EnvelopeStyle.Style[] style = f.getStyles(); ohair@286: if (style.length != 1) throw new IllegalArgumentException ("The EnvelopingFeature must has exactly one Enveloping.Style"); ohair@286: return from(style[0]); ohair@286: } ohair@286: ohair@286: public static SOAPVersion from(EnvelopeStyle.Style style) { ohair@286: switch (style) { ohair@286: case SOAP11: return SOAP_11; ohair@286: case SOAP12: return SOAP_12; ohair@286: case XML: //ERROR?? ohair@286: default: return SOAP_11; ohair@286: } ohair@286: } ohair@286: ohair@286: public EnvelopeStyleFeature toFeature() { ohair@286: return SOAP_11.equals(this) ? ohair@286: new EnvelopeStyleFeature(new EnvelopeStyle.Style[]{EnvelopeStyle.Style.SOAP11}) : ohair@286: new EnvelopeStyleFeature(new EnvelopeStyle.Style[]{EnvelopeStyle.Style.SOAP12}); ohair@286: } ohair@286: }