blob: b6a71bf98d190f4def212ee8d6dbb02a9dba7ec3 [file] [log] [blame]
/*
* 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 java.util.HashSet;
import java.util.Set;
/**
* An implementation of the <link>javax.xml.ws.soap.SOAPBinding</link>
* 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 static Log log = LogFactory.getLog(SOAPBinding.class);
private EndpointReference epr;
private String addressingNamespace;
public SOAPBinding(EndpointDescription endpointDesc) {
super(endpointDesc);
}
/*
* (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<String> 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<String> 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<String> addDefaultRoles(Set<String> set) {
Set<String> returnSet = set;
if (returnSet == null) {
returnSet = new HashSet<String>();
}
// 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;
}
}