blob: 2b6e7db1407517db79ee215f6308be9cac08529f [file] [log] [blame]
/*
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.xml.internal.ws.binding;
import com.sun.istack.internal.NotNull;
import com.sun.xml.internal.ws.api.BindingID;
import com.sun.xml.internal.ws.api.SOAPVersion;
import com.sun.xml.internal.ws.client.HandlerConfiguration;
import com.sun.xml.internal.ws.encoding.soap.streaming.SOAP12NamespaceConstants;
import com.sun.xml.internal.ws.handler.HandlerException;
import com.sun.xml.internal.ws.resources.ClientMessages;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPFactory;
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.LogicalHandler;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.soap.MTOMFeature;
import javax.xml.ws.soap.SOAPBinding;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author WS Development Team
*/
public final class SOAPBindingImpl extends BindingImpl implements SOAPBinding {
public static final String X_SOAP12HTTP_BINDING =
"http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/";
private static final String ROLE_NONE = SOAP12NamespaceConstants.ROLE_NONE;
private Set<String> roles;
//protected boolean enableMtom;
protected final SOAPVersion soapVersion;
private Set<QName> portKnownHeaders = Collections.emptySet();
/**
* Use {@link BindingImpl#create(BindingID)} to create this.
*/
SOAPBindingImpl(BindingID bindingId) {
this(bindingId,EMPTY_FEATURES);
}
/**
* Use {@link BindingImpl#create(BindingID)} to create this.
*
* @param features
* These features have a precedence over
* {@link BindingID#createBuiltinFeatureList() the implicit features}
* associated with the {@link BindingID}.
*/
SOAPBindingImpl(BindingID bindingId, WebServiceFeature... features) {
super(bindingId);
this.soapVersion = bindingId.getSOAPVersion();
roles = new HashSet<String>();
addRequiredRoles();
//Is this still required? comment out for now
//setupSystemHandlerDelegate(serviceName);
setFeatures(features);
this.features.addAll(bindingId.createBuiltinFeatureList());
}
/**
* This method should be called if the binding has SOAPSEIModel
* The Headers understood by the Port are set, so that they can be used for MU
* processing.
*
* @param headers
*/
public void setPortKnownHeaders(@NotNull Set<QName> headers) {
this.portKnownHeaders = headers;
// apply this change to HandlerConfiguration
setHandlerConfig(createHandlerConfig(getHandlerChain()));
}
/**
* This method separates the logical and protocol handlers.
* Also parses Headers understood by SOAPHandlers and
* sets the HandlerConfiguration.
*/
protected HandlerConfiguration createHandlerConfig(List<Handler> handlerChain) {
List<LogicalHandler> logicalHandlers = new ArrayList<LogicalHandler>();
List<SOAPHandler> soapHandlers = new ArrayList<SOAPHandler>();
Set<QName> handlerKnownHeaders = new HashSet<QName>();
for (Handler handler : handlerChain) {
if (handler instanceof LogicalHandler) {
logicalHandlers.add((LogicalHandler) handler);
} else if (handler instanceof SOAPHandler) {
soapHandlers.add((SOAPHandler) handler);
Set<QName> headers = ((SOAPHandler<?>) handler).getHeaders();
if (headers != null) {
handlerKnownHeaders.addAll(headers);
}
} else {
throw new HandlerException("handler.not.valid.type",
handler.getClass());
}
}
return new HandlerConfiguration(roles,portKnownHeaders,handlerChain,
logicalHandlers,soapHandlers,handlerKnownHeaders);
}
protected void addRequiredRoles() {
roles.addAll(soapVersion.requiredRoles);
}
public Set<String> getRoles() {
return roles;
}
/**
* Adds the next and other roles in case this has
* been called by a user without them.
* Creates a new HandlerConfiguration object and sets it on the BindingImpl.
*/
public void setRoles(Set<String> roles) {
if (roles == null) {
roles = new HashSet<String>();
}
if (roles.contains(ROLE_NONE)) {
throw new WebServiceException(ClientMessages.INVALID_SOAP_ROLE_NONE());
}
this.roles = roles;
addRequiredRoles();
HandlerConfiguration oldConfig = getHandlerConfig();
setHandlerConfig(new HandlerConfiguration(this.roles, portKnownHeaders, oldConfig.getHandlerChain(),
oldConfig.getLogicalHandlers(),oldConfig.getSoapHandlers(),
oldConfig.getHandlerKnownHeaders()));
}
/**
* Used typically by the runtime to enable/disable Mtom optimization
*/
public boolean isMTOMEnabled() {
return isFeatureEnabled(MTOMFeature.class);
}
/**
* Client application can override if the MTOM optimization should be enabled
*/
public void setMTOMEnabled(boolean b) {
setFeatures(new MTOMFeature(b));
}
public SOAPFactory getSOAPFactory() {
return soapVersion.saajSoapFactory;
}
public MessageFactory getMessageFactory() {
return soapVersion.saajMessageFactory;
}
private static final WebServiceFeature[] EMPTY_FEATURES = new WebServiceFeature[0];
}