I created a handler, based on the SimpleSession handler in the Axis code base 
(basically a simpler version) and configured it for my service.   The handler only 
gets called before the pivot and therefore no session is returned.
If I ignore the pivot and just set the session soap header it is not returne dto the 
client.   How exactly should a 
server side handler be configured for a service so that it is invoked properly?

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"; 
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java";>
 <globalConfiguration>
  <parameter name="adminPassword" value="admin"/>
  <parameter name="attachments.Directory" 
value="C:\java\tomcat-4.0.4\webapps\axis\WEB-INF\attachments"/>
  <parameter name="sendMultiRefs" value="true"/>
  <parameter name="sendXsiTypes" value="true"/>
  <parameter name="attachments.implementation" 
value="org.apache.axis.attachments.AttachmentsImpl"/>
  <parameter name="sendXMLDeclaration" value="true"/>
  <parameter name="axis.sendMinimizedElements" value="true"/>
  <requestFlow>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
   </handler>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
   </handler>
  </requestFlow>
 </globalConfiguration>
 <handler name="CountSession" type="java:com.xxx.ws.CountSessionHandler"/>
 <handler name="LocalResponder" 
type="java:org.apache.axis.transport.local.LocalResponder"/>
 <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
 <handler name="Authenticate" 
type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 <service name="AdminService" provider="java:MSG">
  <parameter name="allowedMethods" value="AdminService"/>
  <parameter name="enableRemoteAdmin" value="false"/>
  <parameter name="className" value="org.apache.axis.utils.Admin"/>
  <namespace>http://xml.apache.org/axis/wsdd/</namespace>
 </service>
 <service name="Version" provider="java:RPC">
  <parameter name="allowedMethods" value="getVersion"/>
  <parameter name="className" value="org.apache.axis.Version"/>
 </service>
  <service name="Count" provider="java:RPC">
  <operation name="add" qname="ns3:add" xmlns:ns3="urn:com.avaya.Count">
   <parameter name="in0" type="xsd:int" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
  </operation>
  <requestFlow>
   <handler type="CountSession"/>
  </requestFlow>
  <parameter name="allowedMethods" value="add"/>
  <parameter name="wsdlPortType" value="Count"/>
  <parameter name="scope" value="Session"/>
  <parameter name="className" value="com.xxx.ws.CountSoapBindingImpl"/>
  <parameter name="wsdlServicePort" value="Count"/>
  <parameter name="wsdlTargetNamespace" value="urn:com.avaya.Count"/>
  <parameter name="wsdlServiceElement" value="CountService"/>
 </service>
 <transport name="http">
  <requestFlow>
   <handler type="URLMapper"/>
   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  </requestFlow>
 </transport>
 <transport name="local">
  <responseFlow>
   <handler type="LocalResponder"/>
  </responseFlow>
 </transport>
</deployment>

----------------------------
package com.xxx.ws;

import java.util.Hashtable;

import javax.xml.namespace.QName;

import org.apache.axis.AxisFault;
import org.apache.axis.Constants;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.message.SOAPHeaderElement;
import org.apache.axis.utils.Messages;

public class CountSessionHandler extends BasicHandler {
        public static final String SESSION_ID = "AvayaSession.id";
        public static final String SESSION_NS = "com.avaya.ws";
        public static final String SESSION_LOCALPART = "sessionID";
        public static final QName sessionHeaderName = new QName(SESSION_NS, 
SESSION_LOCALPART);

        private Hashtable activeSessions = new Hashtable();
        private static long sessionId = 12345;

        public void invoke(MessageContext context) throws AxisFault {
                if (context.isClient() == true) {
                        doClient(context);
                } else {
                        doServer(context);
                }
        }

        public void doClient(MessageContext context) throws AxisFault {
                System.out.println( "client");
                return;
        }

        public void doServer(MessageContext context) throws AxisFault {
                System.out.println( "Server");
                if (context.getPastPivot() == true) {
                        System.out.println( "server response");
                        // This is a response.  Add the session header if we have an
                        // ID.
                        Long id = (Long) context.getProperty(SESSION_ID);
                        if (id == null)
                                return;
                        Message msg = context.getResponseMessage();
                        if (msg == null)
                                return;
                        SOAPEnvelope env = msg.getSOAPEnvelope();
                        SOAPHeaderElement header = new SOAPHeaderElement(SESSION_NS, 
SESSION_LOCALPART, id);
                        env.addHeader(header);
                } else {
                        System.out.println( "server request ");
                        // Request.  Set up the session if we find the header.
                        Message msg = context.getRequestMessage();
                        if (msg == null)
                                throw new 
AxisFault(Messages.getMessage("noRequest00"));

                        SOAPEnvelope env = msg.getSOAPEnvelope();
                        SOAPHeaderElement header = env.getHeaderByName(SESSION_NS, 
SESSION_LOCALPART);
                        Long id;

                        if (header != null) {
                                // Got one!
                                try {
                                        id = (Long) 
header.getValueAsType(Constants.XSD_LONG);
                                } catch (Exception e) {
                                        throw AxisFault.makeFault(e);
                                }
                        } else {
                                id = getNewSession();
                        }
                        context.setProperty(SESSION_ID, id);
                }
        }

        private synchronized Long getNewSession() {
                sessionId++;
                return (new Long(sessionId));
        }
}

Reply via email to