package org.greenstone.p2p;

import java.net.*;
import java.util.*;

public abstract class AbstractServerAction implements NameServerAction
{ NameServer host;

  public AbstractServerAction(NameServer host)
  { this.host = host;
  }

  public abstract String getActionName();
  
  public void propagateAction(URL forwarder, Map parameters)
  { Enumeration subServers = host.subServers();
  
    // poll all child servers
    while (subServers.hasMoreElements())
    { URL server = (URL) subServers.nextElement();
      
      if (!server.equals(forwarder))
      { // send server the action
        String response = this.propagateActionViaServer(server, parameters, forwarder);
      }
    }
    
    // poll upwards to parent
    if (host.getParent() != null &&
	!host.getParent().equals(forwarder))
    { this.propagateActionViaServer(host.getParent(), parameters, forwarder);
    }
  }

  public void doAction(URL forwarder, Map parameters)
  { // start propagating the action outwards
    this.propagateAction(forwarder, parameters);
  
    // now execute it on our children
    Enumeration servers = host.servers();
  
    while (servers.hasMoreElements())
    { URL server = (URL) servers.nextElement();
      
      if (!server.equals(forwarder))
      { // send server the action
        String response = this.doActionOnServer(server, parameters, forwarder);
      }
    }
  }
  
  String propagateActionViaServer(URL server, Map paramters, URL responseTo)
  { String actionName = this.getActionName();
  
    // send action to server, in a separate thread
    // get responses
    // forward those back
    return "";
  }
  
  String doActionOnServer(URL server, Map parameters, URL responseTo)
  { String actionName = this.getActionName();
  
    // send action to the destination server (as a URL)
    
    // get response (as HTML)
    
    // forward it back...
    return "";
  }
}