org.apache.axis2.jaxws.binding.SOAPBinding Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of axis2-jaxws Show documentation
Show all versions of axis2-jaxws Show documentation
Axis2 JAXWS Implementation
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.jaxws.binding;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.description.EndpointDescription;
import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.utility.SAAJFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.soap.AddressingFeature.Responses;
import java.util.HashSet;
import java.util.Set;
/**
* An implementation of the javax.xml.ws.soap.SOAPBinding
* interface. This is the default binding for JAX-WS, and will exist for all
* Dispatch and Dynamic Proxy instances unless the XML/HTTP Binding is
* explicitly specificied.
*/
public class SOAPBinding extends BindingImpl implements javax.xml.ws.soap.SOAPBinding {
private boolean mtomEnabled = false;
private int mtomThreshold = 0;
private boolean respectBindingEnabled = false;
private boolean addressingConfigured = false;
private boolean addressingEnabled = false;
private boolean addressingRequired = false;
private Responses addressingResponses = Responses.ALL;
private static Log log = LogFactory.getLog(SOAPBinding.class);
private EndpointReference epr;
private String addressingNamespace;
public SOAPBinding(EndpointDescription endpointDesc) {
super(endpointDesc);
}
public int getMTOMThreshold() {
return mtomThreshold;
}
public void setMTOMThreshold(int threshold) {
mtomThreshold = threshold;
}
public boolean isRespectBindingEnabled() {
return respectBindingEnabled;
}
public void setRespectBindingEnabled(boolean enabled) {
respectBindingEnabled = enabled;
}
/**
* Indicates if Addressing was configured explicitly via metadata, such as through a deployment descriptor.
* If an AddressingAnnot was specified in the DBC, then this will answer true. The related addressing methods
* will return a default value if this method returns false.
* @see #isAddressingEnabled()
* @see #isAddressingRequired()
* @see #getAddressingResponses()
* @return true if addressing was explicitly configured via an AddressingAnnot in the DBC; false otherwise.
*/
public boolean isAddressingConfigured() {
return addressingConfigured;
}
/**
* Set whether Addressing was explicitly configured via metadata. The default is false.
* @param configured boolean indicating of addressing was configured via metadata.
*/
public void setAddressingConfigured(boolean configured) {
addressingConfigured = configured;
}
/**
* Indicates if addressing is enabled or disabled.
* Note that if addressing was not explicitly configured via metadata, this will return a default value.
* @see #isAddressingConfigured()
* @return true if addressing is enabled, false (default) otherwise.
*/
public boolean isAddressingEnabled() {
return addressingEnabled;
}
public void setAddressingEnabled(boolean enabled) {
addressingEnabled = enabled;
}
/**
* Indicates if addressing is required or not.
* Note that if addressing was not explicitly configured via metadata, this will return a default value.
* @see #isAddressingConfigured()
* @return true if addressing is required, false (default) otherwise.
*/
public boolean isAddressingRequired() {
return addressingRequired;
}
public void setAddressingRequired(boolean required) {
addressingRequired = required;
}
/**
* Return the type of responses required by Addressing.
* Note that if addressing was not explicitly configured via metadata, this will return a default value.
* @see #isAddressingConfigured()
* @return AddressingFeature.Responses ENUM value indicating what type of addressing responses are required.
*/
public Responses getAddressingResponses() {
return addressingResponses;
}
public void setAddressingResponses(Responses responses) {
addressingResponses = responses;
}
/*
* (non-Javadoc)
*
* @see javax.xml.ws.soap.SOAPBinding#getMessageFactory()
*/
public MessageFactory getMessageFactory() {
String bindingNamespace = null;
try {
/*
* SAAJFactory.createMessageFactory takes a namespace String as a
* param: "http://schemas.xmlsoap.org/soap/envelope/" (SOAP1.1)
* "http://www.w3.org/2003/05/soap-envelope" (SOAP1.2)
*
* The bindingId will be in one of the following forms:
* "http://schemas.xmlsoap.org/wsdl/soap/http" (SOAP1.1)
* "http://www.w3.org/2003/05/soap/bindings/HTTP/" (SOAP1.2)
*/
if (BindingUtils.isSOAP12Binding(bindingId)){
bindingNamespace = SOAP12_ENV_NS;
} else {
// TODO currently defaults to SOAP11. Should we be more stricct
// about checking?
bindingNamespace = SOAP11_ENV_NS;
}
return SAAJFactory.createMessageFactory(bindingNamespace);
} catch (WebServiceException e) {
// TODO log it and then what?
if (log.isDebugEnabled()) {
log.debug("WebServiceException calling SAAJFactory.createMessageFactory(\""
+ bindingNamespace + "\")");
}
} catch (SOAPException e) {
// TODO log it and then what?
if (log.isDebugEnabled()) {
log.debug("SOAPException calling SAAJFactory.createMessageFactory(\""
+ bindingNamespace + "\")");
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see javax.xml.ws.soap.SOAPBinding#getRoles()
*/
public Set getRoles() {
// do not allow null roles, per the JAX-WS CTS
if (roles == null)
roles = addDefaultRoles(null);
return roles;
}
/*
* (non-Javadoc)
*
* @see javax.xml.ws.soap.SOAPBinding#getSOAPFactory()
*/
public SOAPFactory getSOAPFactory() {
String bindingNamespace = null;
try {
/*
* SAAJFactory.createMessageFactory takes a namespace String as a
* param: "http://schemas.xmlsoap.org/soap/envelope/" (SOAP1.1)
* "http://www.w3.org/2003/05/soap-envelope" (SOAP1.2)
*
* The bindingId will be in one of the following forms:
* "http://schemas.xmlsoap.org/wsdl/soap/http" (SOAP1.1)
* "http://www.w3.org/2003/05/soap/bindings/HTTP/" (SOAP1.2)
*/
if (bindingId.equalsIgnoreCase(SOAPBinding.SOAP12HTTP_BINDING)
|| bindingId.equalsIgnoreCase(SOAPBinding.SOAP12HTTP_MTOM_BINDING)) {
bindingNamespace = SOAP12_ENV_NS;
} else {
// TODO currently defaults to SOAP11. Should we be more stricct
// about checking?
bindingNamespace = SOAP11_ENV_NS;
}
return SAAJFactory.createSOAPFactory(bindingNamespace);
} catch (WebServiceException e) {
// TODO log it and then what?
if (log.isDebugEnabled()) {
log.debug("WebServiceException calling SAAJFactory.createSOAPFactory(\""
+ bindingNamespace + "\")");
}
} catch (SOAPException e) {
// TODO log it and then what?
if (log.isDebugEnabled()) {
log.debug("SOAPException calling SAAJFactory.createSOAPFactory(\""
+ bindingNamespace + "\")");
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see javax.xml.ws.soap.SOAPBinding#isMTOMEnabled()
*/
public boolean isMTOMEnabled() {
return mtomEnabled;
}
/*
* (non-Javadoc)
*
* @see javax.xml.ws.soap.SOAPBinding#setMTOMEnabled(boolean)
*/
public void setMTOMEnabled(boolean flag) {
mtomEnabled = flag;
}
/*
* (non-Javadoc)
*
* @see javax.xml.ws.soap.SOAPBinding#setRoles(java.util.Set)
*/
public void setRoles(Set set) {
// Validate the values in the set
if (set != null && !set.isEmpty()) {
// Throw an exception for setting a role of "none"
// Per JAXWS 2.0 Sec 10.1.1.1 SOAP Roles, page 116:
if (set.contains(SOAPConstants.URI_SOAP_1_2_ROLE_NONE)) {
throw ExceptionFactory.makeWebServiceException(Messages.getMessage("roleValidatioErr"));
}
}
roles = addDefaultRoles(set);
}
private Set addDefaultRoles(Set set) {
Set returnSet = set;
if (returnSet == null) {
returnSet = new HashSet();
}
// Make sure the defaults for the binding type are in the set
// and add them if not. Note that for both SOAP11 and SOAP12, the role of ultimate
// reciever can be indicated by the omission of the role attribute.
// REVIEW: This is WRONG because the bindingID from the WSDL is not the same value as
// SOAPBinding annotation constants. There are other places in the code that have
// this same issue I am sure.
if (SOAPBinding.SOAP12HTTP_BINDING.equals(bindingId)
|| SOAPBinding.SOAP12HTTP_MTOM_BINDING.equals(bindingId)) {
if (returnSet.isEmpty() || !returnSet.contains(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT)) {
returnSet.add(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);
}
} else {
if (returnSet.isEmpty() || !returnSet.contains(SOAPConstants.URI_SOAP_ACTOR_NEXT)) {
returnSet.add(SOAPConstants.URI_SOAP_ACTOR_NEXT);
}
}
return returnSet;
}
@Override
public String getAddressingNamespace() {
return addressingNamespace;
}
@Override
public EndpointReference getAxis2EndpointReference() {
return epr;
}
@Override
public void setAddressingNamespace(String addressingNamespace) {
this.addressingNamespace = addressingNamespace;
}
@Override
public void setAxis2EndpointReference(EndpointReference epr) {
this.epr = epr;
}
}