Java tutorial
/* * 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.ode.axis2.hooks; import org.apache.axiom.om.OMElement; import org.apache.axiom.soap.SOAPHeader; import org.apache.axis2.AxisFault; import org.apache.axis2.context.MessageContext; import org.apache.axis2.handlers.AbstractHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ode.axis2.ODEService; import org.apache.ode.utils.DOMUtils; import org.apache.ode.utils.Namespaces; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.namespace.QName; /** * An incoming handler adding session id information in the message * context. */ public class SessionInHandler extends AbstractHandler { private static final long serialVersionUID = -806564877582696569L; private static final Log __log = LogFactory.getLog(SessionInHandler.class); public InvocationResponse invoke(MessageContext messageContext) throws AxisFault { SOAPHeader header = messageContext.getEnvelope().getHeader(); if (header != null) { if (__log.isDebugEnabled()) __log.debug("Found a header in incoming message, checking if there are endpoints there."); // Checking if a session identifier has been provided for a stateful endpoint OMElement wsaToSession = header.getFirstChildWithName(new QName(Namespaces.ODE_SESSION_NS, "session")); if (wsaToSession == null) { wsaToSession = header.getFirstChildWithName(new QName(Namespaces.INTALIO_SESSION_NS, "session")); } if (wsaToSession != null) { // Building an endpoint supposed to target the right instance Document doc = DOMUtils.newDocument(); Element serviceEpr = doc.createElementNS(Namespaces.WS_ADDRESSING_NS, "EndpointReference"); Element intSessionId = doc.createElementNS(Namespaces.INTALIO_SESSION_NS, "session"); Element odeSessionId = doc.createElementNS(Namespaces.ODE_SESSION_NS, "session"); doc.appendChild(serviceEpr); serviceEpr.appendChild(intSessionId); serviceEpr.appendChild(odeSessionId); intSessionId.setTextContent(wsaToSession.getText()); odeSessionId.setTextContent(wsaToSession.getText()); if (__log.isDebugEnabled()) __log.debug( "A TO endpoint has been found in the header with session: " + wsaToSession.getText()); // Did the client provide an address too? OMElement wsaToAddress = header.getFirstChildWithName(new QName(Namespaces.WS_ADDRESSING_NS, "To")); if (wsaToAddress != null) { Element addressElmt = doc.createElementNS(Namespaces.WS_ADDRESSING_NS, "Address"); addressElmt.setTextContent(wsaToAddress.getText()); serviceEpr.appendChild(addressElmt); } if (__log.isDebugEnabled()) __log.debug("Constructed a TO endpoint: " + DOMUtils.domToString(serviceEpr)); messageContext.setProperty(ODEService.TARGET_SESSION_ENDPOINT, serviceEpr); } // Seeing if there's a callback, in case our client would be stateful as well OMElement callback = header.getFirstChildWithName(new QName(Namespaces.ODE_SESSION_NS, "callback")); if (callback == null) { callback = header.getFirstChildWithName(new QName(Namespaces.INTALIO_SESSION_NS, "callback")); } if (callback != null) { OMElement callbackSession = callback .getFirstChildWithName(new QName(Namespaces.ODE_SESSION_NS, "session")); if (callbackSession == null) { callbackSession = callback .getFirstChildWithName(new QName(Namespaces.INTALIO_SESSION_NS, "session")); } if (callbackSession != null) { // Building an endpoint that represents our client (we're supposed to call him later on) Document doc = DOMUtils.newDocument(); Element serviceEpr = doc.createElementNS(Namespaces.WS_ADDRESSING_NS, "EndpointReference"); Element intSessionId = doc.createElementNS(Namespaces.INTALIO_SESSION_NS, "session"); Element odeSessionId = doc.createElementNS(Namespaces.ODE_SESSION_NS, "session"); doc.appendChild(serviceEpr); serviceEpr.appendChild(intSessionId); serviceEpr.appendChild(odeSessionId); intSessionId.setTextContent(callbackSession.getText()); odeSessionId.setTextContent(callbackSession.getText()); if (__log.isDebugEnabled()) __log.debug("A CALLBACK endpoint has been found in the header with session: " + callbackSession.getText()); // Did the client give his address as well? OMElement wsaToAddress = callback .getFirstChildWithName(new QName(Namespaces.WS_ADDRESSING_NS, "Address")); if (wsaToAddress != null) { Element addressElmt = doc.createElementNS(Namespaces.WS_ADDRESSING_NS, "Address"); addressElmt.setTextContent(wsaToAddress.getText()); serviceEpr.appendChild(addressElmt); } if (__log.isDebugEnabled()) __log.debug("Constructed a CALLBACK endpoint: " + DOMUtils.domToString(serviceEpr)); messageContext.setProperty(ODEService.CALLBACK_SESSION_ENDPOINT, serviceEpr); } } } return InvocationResponse.CONTINUE; } }