blob: b0d21e17bf5c796411321c84b48cab7d76c34254 [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.server.endpoint;
import org.apache.axis2.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.binding.BindingUtils;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.core.util.MessageContextUtils;
import org.apache.axis2.jaxws.description.EndpointDescription;
import org.apache.axis2.jaxws.description.EndpointInterfaceDescription;
import org.apache.axis2.jaxws.description.OperationDescription;
import org.apache.axis2.jaxws.description.ServiceDescription;
import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.jaxws.message.Message;
import org.apache.axis2.jaxws.message.Protocol;
import org.apache.axis2.jaxws.message.XMLFault;
import org.apache.axis2.jaxws.message.XMLFaultCode;
import org.apache.axis2.jaxws.message.XMLFaultReason;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.ws.http.HTTPBinding;
import java.util.Collection;
import java.util.Iterator;
public class Utils {
public static final Log log = LogFactory.getLog(Utils.class);
@Deprecated
/**
* Compares the version of the message in the MessageContext to what's expected
* given the ServiceDescription. The behavior is described in the SOAP 1.2
* specification under Appendix 'A'.
*
* @param mc
* @param serviceDesc
* @return
*/
public static boolean bindingTypesMatch(MessageContext mc, ServiceDescription serviceDesc) {
Collection<EndpointDescription> eds = serviceDesc.getEndpointDescriptions_AsCollection();
// Dispatch endpoints do not have SEIs, so watch out for null or empty array
if ((eds != null) && (eds.size() > 0)) {
Iterator<EndpointDescription> i = eds.iterator();
if (i.hasNext()) {
EndpointDescription ed = eds.iterator().next();
Protocol protocol = mc.getMessage().getProtocol();
String bindingType = ed.getBindingType();
if (log.isDebugEnabled()) {
log.debug("Checking for matching binding types.");
log.debug(" message protocol: " + protocol);
log.debug(" binding type: " + bindingType);
}
if (protocol.equals(Protocol.soap11)) {
return (BindingUtils.isSOAP11Binding(bindingType));
} else if (protocol.equals(Protocol.soap12)) {
return (BindingUtils.isSOAP12Binding(bindingType));
} else if (protocol.equals(Protocol.rest)) {
return HTTPBinding.HTTP_BINDING.equalsIgnoreCase(bindingType);
}
}
else {
if (log.isDebugEnabled()) {
log.debug("There were no endpoint descriptions found, thus the binding match failed.");
}
return false;
}
}
return true;
}
/**
* Compares the version of the message in the MessageContext to what's expected
* given the ServiceDescription. The behavior is described in the SOAP 1.2
* specification under Appendix 'A'.
*
* @param mc
* @param serviceDesc
* @return
*/
public static boolean bindingTypesMatch(MessageContext mc, EndpointDescription ed) {
Protocol protocol = mc.getMessage().getProtocol();
String bindingType = ed.getBindingType();
if (log.isDebugEnabled()) {
log.debug("Checking for matching binding types.");
log.debug(" message protocol: " + protocol);
log.debug(" binding type: " + bindingType);
}
if (protocol.equals(Protocol.soap11)) {
return (BindingUtils.isSOAP11Binding(bindingType));
} else if (protocol.equals(Protocol.soap12)) {
return (BindingUtils.isSOAP12Binding(bindingType));
} else if (protocol.equals(Protocol.rest)) {
return HTTPBinding.HTTP_BINDING.equalsIgnoreCase(bindingType);
}
return true;
}
/**
* Creates a fault message that reflects a version mismatch for the configured message protocol.
* The returned message will always be a SOAP 1.1 message per the specification.
*
* @param mc
* @param msg
* @return
*/
public static MessageContext createVersionMismatchMessage(MessageContext mc, Protocol protocol) {
// Only if protocol is soap12 and MISmatches the endpoint do we halt processing
if (protocol.equals(Protocol.soap12)) {
String msg = "Incoming SOAP message protocol is version 1.2, but endpoint is configured for SOAP 1.1";
return Utils.createFaultMessage(mc, msg);
} else if (protocol.equals(Protocol.soap11)) {
// SOAP 1.1 message and SOAP 1.2 binding
// The canSupport flag indicates that we can support this scenario.
// Possible Examples of canSupport: JAXB impl binding, JAXB Provider
// Possible Example of !canSupport: Application handler usage, non-JAXB Provider
// Initially I vote to hard code this as false.
boolean canSupport = false;
if (canSupport) {
// TODO: Okay, but we need to scrub the Message create code to make sure that the response message
// is always built from the receiver protocol...not the binding protocol
return null;
} else {
String msg = "Incoming SOAP message protocol is version 1.1, but endpoint is configured for SOAP 1.2. This is not supported.";
return Utils.createFaultMessage(mc, msg);
}
} else {
String msg = "Incoming message protocol does not match endpoint protocol.";
return Utils.createFaultMessage(mc, msg);
}
}
public static MessageContext createFaultMessage(MessageContext mc, String msg) {
try {
XMLFault xmlfault =
new XMLFault(XMLFaultCode.VERSIONMISMATCH, new XMLFaultReason(msg));
MessageFactory mf = (MessageFactory) FactoryRegistry.getFactory(MessageFactory.class);
Message message = mf.create(Protocol.soap11);
message.setXMLFault(xmlfault);
MessageContext responseMsgCtx = MessageContextUtils.createFaultMessageContext(mc);
responseMsgCtx.setMessage(message);
return responseMsgCtx;
} catch (XMLStreamException e) {
// Need to fix this ! At least provide logging
// TODO for now, throw it. We probably should try to make an XMLFault object and set it on the message
throw ExceptionFactory.makeWebServiceException(e);
}
}
/*
* Gets the OperationDescription associated with the request that is currently
* being processed.
*
* Note that this is not done in the EndpointController since operations are only relevant
* to Endpoint-based implementation (i.e. not to Proxy-based ones)s
*/
public static OperationDescription getOperationDescription(MessageContext mc) {
OperationDescription op = null;
op = mc.getOperationDescription();
if (op == null) {
if (log.isDebugEnabled()) {
log.debug("No OperationDescription found on MessageContext, searching existing operations");
}
EndpointDescription ed = mc.getEndpointDescription();
EndpointInterfaceDescription eid = ed.getEndpointInterfaceDescription();
OperationDescription[] ops = eid.getDispatchableOperation(mc.getOperationName());
// TODO: Implement signature matching. Currently only matching on the wsdl:OperationName is supported.
// That means that overloading of wsdl operations is not supported (although that's not supported in
// WSDL 1.1 anyway).
if (ops == null || ops.length == 0) {
throw ExceptionFactory.makeWebServiceException(
Messages.getMessage("oprDescrErr",mc.getOperationName().toString()));
}
if (ops.length > 1) {
throw ExceptionFactory.makeWebServiceException(
Messages.getMessage("oprDescrErr1",mc.getOperationName().toString()));
}
op = ops[0];
if (log.isDebugEnabled()) {
log.debug("wsdl operation: " + op.getName());
log.debug(" java method: " + op.getJavaMethodName());
}
}
else {
if (log.isDebugEnabled()) {
log.debug("An existing OperationDescription was found on the MessageContext.");
}
}
return op;
}
}