/** Get the operation meta data for a given SOAP message
*/
public OperationMetaData getDispatchDestination(EndpointMetaData epMetaData, SOAPMessage soapMessage) throws SOAPException
{
OperationMetaData opMetaData = null;
// Dispatch based on wsa:Action
CommonMessageContext msgContext = MessageContextAssociation.peekMessageContext();
AddressingProperties inProps = (AddressingProperties)msgContext.get(JAXWSAConstants.SERVER_ADDRESSING_PROPERTIES_INBOUND);
if (inProps != null && inProps.getAction() != null)
{
String wsaAction = inProps.getAction().getURI().toASCIIString();
for (OperationMetaData opAux : epMetaData.getOperations())
{
if (wsaAction.equals(opAux.getSOAPAction()))
{
opMetaData = opAux;
log.debug("Use wsa:Action dispatch: " + wsaAction);
break;
}
}
}
// Dispatch to JAXWS Provider
if (opMetaData == null && epMetaData.getServiceMode() != null)
{
QName xmlName = new QName(epMetaData.getPortName().getNamespaceURI(), "invoke");
opMetaData = epMetaData.getOperation(xmlName);
}
// Dispatch based on SOAPBodyElement name
if (opMetaData == null)
{
SOAPBody soapBody = soapMessage.getSOAPBody();
SOAPBodyElement soapBodyElement = null;
Iterator bodyChildren = soapBody.getChildElements();
while (bodyChildren.hasNext() && soapBodyElement == null)
{
Object childNode = bodyChildren.next();
if (childNode instanceof SOAPBodyElement)
{
soapBodyElement = (SOAPBodyElement)childNode;
}
}
if (soapBodyElement == null)
{
if (epMetaData.getStyle() == Style.RPC)
throw new SOAPException("Empty SOAP body with no child element not supported for RPC");
// [JBWS-1125] Support empty soap body elements
for (OperationMetaData opAux : epMetaData.getOperations())
{
if (opAux.getParameters().size() == 0)
{
log.debug ("Dispatching empty SOAP body");
opMetaData = opAux;
break;
}
}
}
else
{
Name soapName = soapBodyElement.getElementName();
QName xmlElementName = new QName(soapName.getURI(), soapName.getLocalName());
opMetaData = epMetaData.getOperation(xmlElementName);
}
}
// Dispatch to a generic operation that takes an org.w3c.dom.Element
if (opMetaData == null)
{
for (OperationMetaData opAux : epMetaData.getOperations())
{
if (opAux.isMessageEndpoint())
{
log.debug("Use generic message style dispatch");
opMetaData = opAux;
break;
}
}
}
log.debug("getDispatchDestination: " + (opMetaData != null ? opMetaData.getQName() : null));
return opMetaData;
}