/* * 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.synapse.endpoints.dispatch; import org.apache.axiom.om.OMElement; import org.apache.axiom.soap.SOAPHeader; import org.apache.axis2.addressing.AddressingConstants; import org.apache.synapse.MessageContext; import javax.xml.namespace.QName; public class SoapSessionDispatcher extends AbstractDispatcher { private static final QName QNAME_SERVICE_GROUP_ID = new QName("http://ws.apache.org/namespaces/axis2", "ServiceGroupId", "axis2"); /** * Gives the endpoint based on the service group context ID of the request message. * * @param synCtx Request MessageContext, possibly containing a service group context ID. * @return Endpoint associated with the soap session, if current message is a soap session * message and if current message is not the first message of the session. Returns null, * if an Endpoint could not be found for the session. */ public SessionInformation getSession(MessageContext synCtx) { return SALSessions.getInstance().getSession( extractSessionID(synCtx.getEnvelope().getHeader(), QNAME_SERVICE_GROUP_ID)); } /** * As this is a server initiated session, this method will only be called for response messages. * It extracts the service group context ID (if available) from the message and updates the * session (service group context ID) -> endpoint map. * * @param synCtx MessageContext of the response message. */ public void updateSession(MessageContext synCtx) { // get the service group context id // check if service group context id is a key of any entry // if not, add an entry <service group context id, endpoint> SOAPHeader header = synCtx.getEnvelope().getHeader(); if (header != null) { OMElement replyTo = header.getFirstChildWithName( AddressingConstants.Final.QNAME_WSA_REPLY_TO); if (replyTo != null) { OMElement referenceParameters = replyTo.getFirstChildWithName(new QName( "http://www.w3.org/2005/08/addressing", "ReferenceParameters", "wsa")); if (referenceParameters != null) { SALSessions.getInstance().updateSession(synCtx, extractSessionID(referenceParameters, QNAME_SERVICE_GROUP_ID)); } else if (log.isDebugEnabled()) { log.debug("Couldn't find the WSA ReferenceParameters in the Reply-To " + "header to retrieve the ServiceQroupId"); } } else if (log.isDebugEnabled()) { log.debug("Couldn't find the WSA Reply-To header to retrieve the ServiceQroupId"); } } } public void unbind(MessageContext synCtx) { SALSessions.getInstance().removeSession(extractSessionID(synCtx.getEnvelope().getHeader(), QNAME_SERVICE_GROUP_ID)); } /** * Soap session is initiated by the server. So this method always returns true. * * @return true */ public boolean isServerInitiatedSession() { return true; } public void removeSessionID(MessageContext syCtx) { removeSessionID(syCtx.getEnvelope().getHeader(), QNAME_SERVICE_GROUP_ID); } }