package org.codehaus.xfire.transport;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.xfire.transport.dead.DeadLetterTransport;
import org.codehaus.xfire.transport.http.HttpTransport;
import org.codehaus.xfire.transport.http.SoapHttpTransport;
import org.codehaus.xfire.transport.local.LocalTransport;
/**
* The default TransportManager implementation.
*
* @author Dan Diephouse
*/
public class ConfigurableTransportManager
implements TransportManager
{
private static final Log log = LogFactory.getLog(ConfigurableTransportManager.class);
private Set transports = new LinkedHashSet();
private Map binding2Transport = new HashMap();
private List additionalTransports = null;
public ConfigurableTransportManager()
{
}
/**
* Initializes transports for each service. This also registers a LocalTransport and
* DeadLetterTransport.
*/
public void initialize()
{
System.out.println("Initializing ConfigurableTransportManager");
register(new LocalTransport());
register(new DeadLetterTransport());
register(new SoapHttpTransport());
register(new HttpTransport());
if( additionalTransports != null ){
Iterator it = additionalTransports.iterator();
while( it.hasNext() ){
register((Transport) it.next());
}
}
}
/**
* Disposes and unregisters each transport.
*/
public void dispose()
{
for (Iterator itr = transports.iterator(); itr.hasNext();)
{
Transport t = (Transport) itr.next();
t.dispose();
itr.remove();
}
}
public void register(Transport transport)
{
transports.add(transport);
String[] bindingIds = transport.getSupportedBindings();
for (int i = 0; i < bindingIds.length; i++)
{
binding2Transport.put(bindingIds[i], transport);
}
log.debug("Registered transport " + transport);
}
public void unregister(Transport transport)
{
transports.remove(transport);
String[] bindingIds = transport.getSupportedBindings();
for (int i = 0; i < bindingIds.length; i++)
{
if (binding2Transport.get(bindingIds[i]) == transport)
binding2Transport.remove(bindingIds[i]);
}
}
public Collection getTransports()
{
return transports;
}
public Transport getTransportForUri(String uri)
{
for (Iterator itr = transports.iterator(); itr.hasNext();)
{
Transport t = (Transport) itr.next();
if (t.isUriSupported(uri))
{
return t;
}
}
return null;
}
public Collection getTransportsForUri(String uri)
{
Set uritrans = new HashSet();
for (Iterator itr = transports.iterator(); itr.hasNext();)
{
Transport t = (Transport) itr.next();
if (t.isUriSupported(uri))
{
uritrans.add(t);
}
}
return uritrans;
}
public Transport getTransport(String id)
{
return (Transport) binding2Transport.get(id);
}
public void setAdditionalTransports(List additionalTransports) {
System.out.println("Adding additional transport to ConfigurableTransportManager");
this.additionalTransports = additionalTransports;
}
}