| AddressingHandler.java |
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the docs/licenses/apache-1.1.txt file.
*/
package org.jboss.net.axis.message.addressing.handler;
import org.apache.axis.EngineConfiguration;
import org.apache.axis.MessageContext;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.addressing.Action;
import org.apache.axis.message.addressing.AddressingHeaders;
import org.apache.ws.axis.security.WSDoAllConstants;
import org.jboss.net.axis.server.JMXEngineConfigurationFactory;
import java.util.StringTokenizer;
import java.util.Vector;
/**
* <dl>
* <dt><b>Title: </b><dd>WS-Addressing Handler</dd>
* <p/>
* <dt><b>Description: </b><dd>This Subclass of the org.apache.axis.message.addressing.handler.AddressingHandler will
* properly use the wsa:Action header to direct the incoming messages to the proper services. It also
* correctly fetches the client config when sending a response via the ReplyTo header. wss4j properties are also
* moved into the new request (server response) so encryption / signing can happen after addressing.<p>
* <p/>
* This handler can be placed in the global (or transport) request and response chains to handle messages with ws-addressing
* headers. For added security, have the ws-security (wss4j) handlers sign any ws-addressing headers that contain addresses
* (To, From, ReplyTo, FaultTo). This means that wss4j will have to process incoming messages BEFORE addressing, and it will
* have to process outgoing messages AFTER addressing.
* <p/>
* The parameters transportPackages, and transports can be configured in the DD to allow the response objects to
* understand any special transports that may be in use. @see #initializeCall()
* </dd>
* <p/>
* <dt><b>Copyright: </b><dd>Copyright (c) 2004</dd>
* <dt><b>Company: </b><dd>Green River Computing Services</dd>
* </dl>
*
* @author <a href="mailto:jasone@greenrivercomputing.com">Jason Essington</a>
* @version $Revision: 1.1.6.3 $
*/
public class AddressingHandler extends org.apache.axis.message.addressing.handler.AddressingHandler
{
/* (non-Javadoc)
* @see org.apache.axis.Handler#init()
*/
public void init()
{
super.init();
initializeCall();
}
/**
* Invokes the static addTransportPackage, and setTransportForProtocol methods on Call
* so that our transport will be recognised.<p>
* Add transportPackages with the option addTransportPackages, and a comma separated list of packages<br>
* <parameter name="transportPackages" value="com.some.transport,com.some.other.transport"/><p>
* <p/>
* Add transports with a comma separated list of transportName:transportClassName<br>
* <parameter name="transports" value="http:com.my.transport.http.HTTPTransport,mail:com.my.transport.mail.MailTransport"/>
*/
private void initializeCall()
{
String transportPackages = null; //(String) getOption("transportPackages");
if (transportPackages != null)
{
StringTokenizer t = new StringTokenizer(transportPackages, ",");
while (t.hasMoreTokens())
{
Call.addTransportPackage(t.nextToken().trim());
}
}
String transports = null; //(String) getOption("transports");
if (transports != null)
{
StringTokenizer t = new StringTokenizer(transports, ",");
while (t.hasMoreTokens())
{
String tToken = t.nextToken().trim();
String[] transport = new String[2];
if (tToken.indexOf(':') < 0 || tToken.indexOf(':') != tToken.lastIndexOf(':'))
{
log.warn(tToken + " is not in the proper form of [transport]:[class]");
continue;
}
else
{
transport[0] = tToken.substring(0, tToken.indexOf(':'));
transport[1] = tToken.substring(tToken.indexOf(':') + 1);
}
String tName = transport[0];
String tClassName = transport[1];
Class tClass = null;
try
{
tClass = Class.forName(tClassName);
}
catch (ClassNotFoundException e)
{
log.warn("Unable to locate the class " + tClassName + " for the transport " + tName);
continue;
}
Call.setTransportForProtocol(tName, tClass);
}
}
}
/* (non-Javadoc)
* @see org.apache.axis.message.addressing.handler.AddressingHandler#configureCall(org.apache.axis.client.Call, org.apache.axis.MessageContext)
*/
protected void configureCall(Call call, MessageContext msgContext)
{
// TODO Auto-generated method stub
//super.configureCall(call, msgContext);
// WSS4J expects to find the results of processing the incoming message when processing the response.
if (msgContext != null)
{
Vector wssResults = null;
wssResults = (Vector)msgContext.getProperty(WSDoAllConstants.RECV_RESULTS);
call.setProperty(WSDoAllConstants.RECV_RESULTS, wssResults);
}
}
/* (non-Javadoc)
* @see org.apache.axis.message.addressing.handler.AddressingHandler#getService(org.apache.axis.MessageContext)
*/
protected Service getService(MessageContext msgContext)
{
String engineName = null; //(String)getOption("engineName");
EngineConfiguration config = JMXEngineConfigurationFactory.newJMXFactory(engineName)
.getClientEngineConfig();
return new Service(config);
}
/**
* We set the target service based upon the Action header since email addresses don't have
* path attributes.
*/
protected void setTargetService(MessageContext msgCtx, AddressingHeaders headers) throws Exception
{
if (log.isDebugEnabled())
log.debug("Entering: invoke(MessageContext)");
Action action = headers.getAction();
if (action != null)
{
String actionURI = null; //action.toString();
msgCtx.setUseSOAPAction(true);
msgCtx.setSOAPActionURI(actionURI);
msgCtx.setTargetService(actionURI);
}
else
{
// fault ?
}
}
}| AddressingHandler.java |