package org.mortbay.jetty.servlet.wadi;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import org.apache.catalina.tribes.Member;
import org.codehaus.wadi.core.reflect.base.DeclaredMemberFilter;
import org.codehaus.wadi.core.reflect.jdk.JDKClassIndexerRegistry;
import org.codehaus.wadi.group.Dispatcher;
import org.codehaus.wadi.group.DispatcherRegistry;
import org.codehaus.wadi.group.StaticDispatcherRegistry;
import org.codehaus.wadi.servicespace.admin.AdminServiceSpace;
import org.codehaus.wadi.tribes.TribesDispatcher;
import org.codehaus.wadi.web.impl.URIEndPoint;
import org.mortbay.component.AbstractLifeCycle;
public class WadiCluster extends AbstractLifeCycle
{
private final String _clusterName;
private final String _nodeName;
private final URI _endPointURI;
private final Collection<Member> _staticMembers;
private Dispatcher _dispatcher;
/**
* Constructs a cluster having the specified details.
*
* @param clusterName name of the cluster.
* @param nodeName name of the node this cluster instance is running on
* @param endPointURI base URL to use from other nodes to reach this node. This value is actually not used and you
* pretty much do not need to define a meaningful value; however, it must be a valid URI.
*
* @throws Exception
*/
public WadiCluster(String clusterName, String nodeName, String endPointURI) throws Exception {
if (null == clusterName) {
throw new IllegalArgumentException("clusterName is required");
} else if (null == nodeName) {
throw new IllegalArgumentException("nodeName is required");
}
_clusterName = clusterName;
_nodeName = nodeName;
_endPointURI = new URI(endPointURI);
_staticMembers = new ArrayList<Member>();
}
public void addStaticMember(Member member)
{
_staticMembers.add(member);
}
public Dispatcher getDispatcher()
{
return _dispatcher;
}
public String getNodeName()
{
return _nodeName;
}
@Override
protected void doStart() throws Exception {
_dispatcher = newDispatcher();
DispatcherRegistry dispatcherRegistry = new StaticDispatcherRegistry();
dispatcherRegistry.register(_dispatcher);
_dispatcher.start();
AdminServiceSpace adminServiceSpace = new AdminServiceSpace(_dispatcher,
new JDKClassIndexerRegistry(new DeclaredMemberFilter()));
adminServiceSpace.start();
}
@Override
protected void doStop() throws Exception {
_dispatcher.stop();
}
protected Dispatcher newDispatcher()
{
return new TribesDispatcher(_clusterName, _nodeName, new URIEndPoint(_endPointURI), _staticMembers);
}
}