CommonsHTTPSender is easier to subclass and modify. I pass you a simple
subclass that could do the trick :-)
HTH,
Rodrigo
package org.rodrisoft;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import org.apache.axis.MessageContext;
import org.apache.axis.transport.http.CommonsHTTPSender;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
/**
* Sender implementation that uses Jakarta Commons HTTP for
transmission, and
* implements a routing map table to select a local address depending
on the
* remote address to connect to.
* <p>
* This sender can be configured in the client-config.wsdd file like this:
* <pre>
* <transport name="http"
* pivot="java:org.rodrisoft.RoutedCommonsHTTPSender">
* <parameter name="map-file" value="path/to/map/file.properties"/>
* <parameter name="map:remote-addr" value="10.33.5.67"/>
* </transport>
* </pre>
* <p>
* The first parameter specifies a .properties file containing pairs in
* the form:
*
* <pre>
* remote-addr=remote-addr
* </pre>
*
* The second parameter is an example of how to specify a single route
* table entry directly in the .wsdd file.
* <p>
* The first parameter allows to share the route table among several
* protocols.
* <p>
* The local binding address can also be specified through the message
* context. This allows services and handlers set the local address, and
* provide smarter routing algorithms.
* <p>
* Original work from Davanum Srinivas.
*
* @author Davanum Srinivas ([EMAIL PROTECTED])
* @author Rodrigo Ruiz ([EMAIL PROTECTED])
* @version 1.0
*/
public class RoutedCommonsHTTPSender extends CommonsHTTPSender {
/**
* <code>serialVersionUID</code> attribute.
*/
private static final long serialVersionUID = -8610352356067978620L;
/**
* MessageContext Property name for setting the local bind address.
*/
public static final String LOCAL_BIND_ADDRESS = "local.bind.address";
/**
* Local Bind Address Route Map.
*/
private final Map routeTable = new HashMap();
/**
* Flag that controls bindMap synchronization.
*/
private boolean dirty = true;
public synchronized void setOption(String name, Object value) {
this.dirty = true;
super.setOption(name, value);
}
public synchronized boolean setOptionDefault(String name,
Object value) {
this.dirty = true;
return super.setOptionDefault(name, value);
}
public synchronized void setOptions(Hashtable options) {
this.dirty = true;
super.setOptions(options);
}
protected HostConfiguration getHostConfiguration(HttpClient client,
MessageContext context, URL targetURL) {
HostConfiguration config = super.getHostConfiguration(client,
context,
targetURL);
if (targetURL != null) {
String remoteHost = targetURL.getHost();
InetAddress localAddr = getRouteFor(context, remoteHost);
if (localAddr != null) {
config.setLocalAddress(localAddr);
}
}
return config;
}
/**
* This utility method allows to force the route table to be rebuilt.
* It can be useful if the route table file is modified, and we can
* manage to get the instance of this handler.
*/
public void rebuildTable() {
this.dirty = true;
}
/**
* Gets a route for the specified remote address, allowing it to be
* specified through a Message Context parameter.
*
* @param ctx The message context
* @param host The remote host to map
* @return The mapped address, or null if none found
*/
protected InetAddress getRouteFor(MessageContext ctx, String host) {
Object value = ctx.getProperty(LOCAL_BIND_ADDRESS);
if (value instanceof InetAddress) {
return (InetAddress)value;
}
if (value != null) {
String hostName = value.toString();
try {
return InetAddress.getByName(hostName);
} catch (Exception e) {
log.error("Could not resolve local bind address " + hostName);
}
}
// No value defined in the MessageContext. Use route map.
value = getRouteTable().get(host);
if (value instanceof InetAddress) {
return (InetAddress)value;
}
if (value != null) {
String hostName = value.toString();
try {
return InetAddress.getByName(hostName);
} catch (Exception e) {
log.error("Could not resolve local bind address " + hostName);
}
}
return null;
}
/**
* Gets the route mapping table.
*
* @return The route mapping table
*/
protected synchronized Map getRouteTable() {
if (dirty) {
routeTable.clear();
Hashtable options = getOptions();
String mapFile = (String)options.get("map-file");
if (mapFile != null) {
InputStream is = null;
try {
is = new FileInputStream(mapFile);
Properties props = new Properties();
props.load(is);
options.putAll(props);
} catch (Exception e) {
log.error("Could not load route mapping table at " + mapFile);
}
}
for (Iterator it = options.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry)it.next();
Object key = entry.getKey();
if (key instanceof String) {
String skey = (String)key;
if (skey.startsWith("map:")) {
String remoteHost = skey.substring(4).trim();
String localHost = ((String)entry.getValue()).trim();
try {
InetAddress localAddr = InetAddress.getByName(localHost);
routeTable.put(remoteHost, localAddr);
} catch (Exception e) {
log.warn("Could not resolve local bind address "
+ localHost, e);
routeTable.put(remoteHost, localHost);
}
}
}
}
dirty = false;
}
return routeTable;
}
}
--
-------------------------------------------------------------------
GRIDSYSTEMS Rodrigo Ruiz Aguayo
Parc Bit - Son Espanyol
07120 Palma de Mallorca mailto:[EMAIL PROTECTED]
Baleares - EspaƱa Tel:+34-971435085 Fax:+34-971435082
http://www.gridsystems.com
-------------------------------------------------------------------
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.392 / Virus Database: 268.5.6/339 - Release Date: 14/05/2006