blob: a0104c10ccfb87dce39f833080b65700ce012377 [file] [log] [blame]
/*
* Portions Copyright 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.xml.internal.ws.binding.http.HTTPBindingImpl;
import com.sun.xml.internal.ws.binding.soap.SOAPBindingImpl;
import com.sun.xml.internal.ws.handler.HandlerChainCaller;
import com.sun.xml.internal.ws.modeler.RuntimeModeler;
import com.sun.xml.internal.ws.spi.runtime.SystemHandlerDelegate;
import javax.xml.ws.Binding;
import javax.xml.ws.handler.Handler;
import java.util.ArrayList;
import java.util.List;
import javax.xml.ws.http.HTTPBinding;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
/**
* Instances are created by the service, which then
* sets the handler chain on the binding impl. The handler
* caller class actually creates and manages the handlers.
*
* <p>Also used on the server side, where non-api calls such as
* getHandlerChainCaller cannot be used. So the binding impl
* now stores the handler list rather than deferring to the
* handler chain caller.
*
* <p>This class is made abstract as we dont see a situation when a BindingImpl has much meaning without binding id.
* IOw, for a specific binding there will be a class extending BindingImpl, for example SOAPBindingImpl.
*
* <p>The spi Binding interface extends Binding.
*
* @author WS Development Team
*/
public abstract class BindingImpl implements
com.sun.xml.internal.ws.spi.runtime.Binding {
// caller ignored on server side
protected HandlerChainCaller chainCaller;
private SystemHandlerDelegate systemHandlerDelegate;
private List<Handler> handlers;
private String bindingId;
protected QName serviceName;
// called by DispatchImpl
public BindingImpl(String bindingId, QName serviceName) {
this.bindingId = bindingId;
this.serviceName = serviceName;
}
public BindingImpl(List<Handler> handlerChain, String bindingId, QName serviceName) {
handlers = handlerChain;
this.bindingId = bindingId;
this.serviceName = serviceName;
}
/**
* Return a copy of the list. If there is a handler chain caller,
* this is the proper list. Otherwise, return a copy of 'handlers'
* or null if list is null. The RuntimeEndpointInfo.init() method
* relies on this list being null if there were no handlers
* in the deployment descriptor file.
*
* @return The list of handlers. This can be null if there are
* no handlers. The list may have a different order depending on
* whether or not the handlers have been called yet, since the
* logical and protocol handlers will be sorted before calling them.
*
* @see com.sun.xml.internal.ws.server.RuntimeEndpointInfo#init
*/
public List<Handler> getHandlerChain() {
if (chainCaller != null) {
return new ArrayList(chainCaller.getHandlerChain());
}
if (handlers == null) {
return null;
}
return new ArrayList(handlers);
}
public boolean hasHandlers() {
if (handlers == null || handlers.size() == 0) {
return false;
}
return true;
}
/**
* Sets the handlers on the binding. If the handler chain
* caller already exists, then the handlers will be set on
* the caller and the handler chain held by the binding will
* be the sorted list.
*/
public void setHandlerChain(List<Handler> chain) {
if (chainCaller != null) {
chainCaller = new HandlerChainCaller(chain);
handlers = chainCaller.getHandlerChain();
} else {
handlers = chain;
}
}
/**
* Creates the handler chain caller if needed and returns
* it. Once the handler chain caller exists, this class
* defers getHandlers() calls to it to get the new sorted
* list of handlers.
*/
public HandlerChainCaller getHandlerChainCaller() {
if (chainCaller == null) {
chainCaller = new HandlerChainCaller(handlers);
}
return chainCaller;
}
public String getBindingId(){
return bindingId;
}
public String getActualBindingId() {
return bindingId;
}
public void setServiceName(QName serviceName){
this.serviceName = serviceName;
}
public SystemHandlerDelegate getSystemHandlerDelegate() {
return systemHandlerDelegate;
}
public void setSystemHandlerDelegate(SystemHandlerDelegate delegate) {
systemHandlerDelegate = delegate;
}
public static com.sun.xml.internal.ws.spi.runtime.Binding getBinding(String bindingId,
Class implementorClass, QName serviceName, boolean tokensOK) {
if (bindingId == null) {
// Gets bindingId from @BindingType annotation
bindingId = RuntimeModeler.getBindingId(implementorClass);
if (bindingId == null) { // Default one
bindingId = SOAPBinding.SOAP11HTTP_BINDING;
}
}
if (tokensOK) {
if (bindingId.equals("##SOAP11_HTTP")) {
bindingId = SOAPBinding.SOAP11HTTP_BINDING;
} else if (bindingId.equals("##SOAP11_HTTP_MTOM")) {
bindingId = SOAPBinding.SOAP11HTTP_MTOM_BINDING;
} else if (bindingId.equals("##SOAP12_HTTP")) {
bindingId = SOAPBinding.SOAP12HTTP_BINDING;
} else if (bindingId.equals("##SOAP12_HTTP_MTOM")) {
bindingId = SOAPBinding.SOAP12HTTP_MTOM_BINDING;
} else if (bindingId.equals("##XML_HTTP")) {
bindingId = HTTPBinding.HTTP_BINDING;
}
}
if (bindingId.equals(SOAPBinding.SOAP11HTTP_BINDING)
|| bindingId.equals(SOAPBinding.SOAP11HTTP_MTOM_BINDING)
|| bindingId.equals(SOAPBinding.SOAP12HTTP_BINDING)
|| bindingId.equals(SOAPBinding.SOAP12HTTP_MTOM_BINDING)
|| bindingId.equals(SOAPBindingImpl.X_SOAP12HTTP_BINDING)) {
return new SOAPBindingImpl(bindingId, serviceName);
} else if (bindingId.equals(HTTPBinding.HTTP_BINDING)) {
return new HTTPBindingImpl();
} else {
throw new IllegalArgumentException("Wrong bindingId "+bindingId);
}
}
public static Binding getDefaultBinding() {
return new SOAPBindingImpl(SOAPBinding.SOAP11HTTP_BINDING);
}
public static Binding getDefaultBinding(QName serviceName) {
return new SOAPBindingImpl(SOAPBinding.SOAP11HTTP_BINDING, serviceName);
}
}