/* * BasicTreeServer.java * * Created on May 12, 2003, 10:46 AM */ package hep.aida.ref.remote.basic; import hep.aida.ITree; import hep.aida.ref.remote.basic.interfaces.AidaTreeClient; import hep.aida.ref.remote.basic.interfaces.AidaTreeServant; import hep.aida.ref.remote.basic.interfaces.AidaTreeServer; import java.util.Hashtable; import java.util.Iterator; /** * Basic implementation of the AidaTreeServer, no remote stuff. * @author serbo */ public class BasicTreeServer implements AidaTreeServer { protected ITree tree; protected String treeName; protected Hashtable hash; /** Creates a new instance of BasicTreeServer */ public BasicTreeServer(ITree tree) { this(tree, tree.storeName()); } public BasicTreeServer(ITree tree, String treeName) { System.out.print("\nStarting TreeServer with Tree Name: "+treeName+" ... "); this.tree = tree; this.treeName = treeName; init(); System.out.print(" Done.\n"); } // Service methods protected void init() { hash = new Hashtable(); } protected boolean disconnectClient(Object client) { System.out.print("\n\tBasicTreeServer.disconnectClient disconnecting Client: "+client.toString()); BasicTreeServant servant = null; synchronized ( hash ) { if (hash.containsKey(client)) { servant = (BasicTreeServant) hash.get(client); hash.remove(client); } else { System.out.print("\n\t*** Warning: Can not find AidaTreeServant for this Client!"); return false; } } servant.close(); System.out.print(" Done.\n"); return true; } public void close() { System.out.print("Shutting down BasicTreeServer ... "); synchronized ( this ) { if (!hash.isEmpty()) { Iterator it = hash.values().iterator(); while (it.hasNext()) { BasicTreeServant servant = (BasicTreeServant) it.next(); servant.close(); } hash.clear(); } hash = null; tree = null; treeName = null; } System.out.print(" Done!\n"); } // AidaTreeServer methods public AidaTreeServant connectDuplex(AidaTreeClient client) { BasicTreeServant servant = null; if (hash.containsKey(client)) { System.out.println("Warning: this Client is already connected, returning its servant"); servant = (BasicTreeServant) hash.get(client); } else { servant = new BasicTreeServant(tree, client); hash.put(client, servant); } return servant; } public AidaTreeServant connectNonDuplex(String clientID) { BasicTreeServant servant = null; System.out.print("\nBasicTreeServer.connect: clientID="+clientID+" ... "); if (hash.containsKey(clientID)) { System.out.println("Warning: this Client is already connected, returning its servant"); servant = (BasicTreeServant) hash.get(clientID); } else { servant = new BasicTreeServant(tree, clientID); hash.put(clientID, servant); } System.out.print(" Done.\n"); return servant; } public boolean disconnectDuplex(AidaTreeClient client) { return disconnectClient(client); } public boolean disconnectNonDuplex(String clientID) { return disconnectClient(clientID); } public boolean supportDuplexMode() { return true; } public String treeName() { return treeName; } }