/*
* RmiAidaTreeServer.java
*
* Created on October 15, 2003, 1:07 AM
*/
package hep.aida.ref.remote.rmi.client;
import hep.aida.ref.remote.RemoteConnectionException;
import hep.aida.ref.remote.interfaces.AidaTreeClient;
import hep.aida.ref.remote.interfaces.AidaTreeServant;
import hep.aida.ref.remote.interfaces.AidaTreeServer;
import hep.aida.ref.remote.rmi.interfaces.RmiServant;
import hep.aida.ref.remote.rmi.interfaces.RmiServer;
import java.rmi.RemoteException;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
/**
* This is a wraper class that allows separation of RMi
* transport layer and internal hep.aide.ref.remote interfaces.
* Not a very elegant solution, but needed for now since transport
* interfaces may be different for different protocol type.
* @author serbo
*/
public class RmiRemoteServer implements AidaTreeServer {
private RmiServer server;
private Map hash;
/** Creates a new instance of RmiAidaTreeServer */
public RmiRemoteServer(RmiServer server) {
this.server = server;
this.hash = new Hashtable();
}
// Service methods
void disconnect() {
//System.out.println("RmiRemoteServer.disconnect");
synchronized ( hash ) {
if (!hash.isEmpty()) {
Iterator it = hash.keySet().iterator();
while (it.hasNext()) {
Object clientRef = it.next();
unRegisterClient(clientRef);
}
hash.clear();
}
}
hash = null;
}
private boolean checkClient(java.lang.Object key) {
boolean ok = false;
if (hash.containsKey(key)) { ok = true; }
return ok;
}
private void registerClient(java.lang.Object key, RmiClientImpl rmiClient) {
hash.put(key, rmiClient);
}
private boolean unRegisterClient(java.lang.Object key) {
RmiClientImpl rmiClient = (RmiClientImpl) hash.remove(key);
if (rmiClient == null) return false;
rmiClient.disconnect();
return true;
}
// AidaTreeServant methods
public AidaTreeServant connectDuplex(AidaTreeClient aidaClient) {
if (checkClient(aidaClient)) {
String clientRef = aidaClient.toString();
throw new RemoteConnectionException("This client is already connected. Please disconnect first.\nClient: "+clientRef);
}
boolean duplex = true;
RmiClientImpl aidaServant = null;
RmiServant rmiServant = null;
try {
aidaServant = new RmiClientImpl(aidaClient, duplex);
rmiServant = server.connectDuplex(aidaServant);
} catch (RemoteConnectionException re) {
throw re;
} catch (Exception re) {
throw new RemoteConnectionException(re.getMessage(), re);
}
aidaServant.setRmiServant(rmiServant);
registerClient(aidaClient, aidaServant);
return aidaServant;
}
public AidaTreeServant connectNonDuplex(String clientID) {
if (checkClient(clientID)) {
throw new RemoteConnectionException("This client is already connected. Please disconnect first.\nClient: "+clientID);
}
boolean duplex = false;
RmiServant rmiServant = null;
RmiClientImpl aidaServant = null;
try {
rmiServant = server.connectNonDuplex(clientID);
aidaServant = new RmiClientImpl(rmiServant, duplex);
} catch (Exception e) {
throw new RemoteConnectionException(e.getMessage(), e);
}
registerClient(clientID, aidaServant);
return aidaServant;
}
public boolean disconnectDuplex(AidaTreeClient aidaClient) {
if (!checkClient(aidaClient)) {
String clientRef = aidaClient.toString();
throw new RemoteConnectionException("This client is not connected.\nClient: "+clientRef);
}
RmiClientImpl rmiClient = (RmiClientImpl) hash.get(aidaClient);
boolean ok = false;
try {
ok = server.disconnectDuplex(rmiClient);
} catch (RemoteException re) {
throw new RemoteConnectionException(re.getMessage(), re);
}
return unRegisterClient(aidaClient) && ok;
}
public boolean disconnectNonDuplex(String clientID) {
if (!checkClient(clientID)) {
throw new RemoteConnectionException("This client is not connected.\nClient: "+clientID);
}
RmiClientImpl rmiClient = (RmiClientImpl) hash.get(clientID);
boolean ok = false;
try {
ok = server.disconnectNonDuplex(clientID);
} catch (RemoteException re) {
throw new RemoteConnectionException(re.getMessage(), re);
}
return unRegisterClient(clientID) && ok;
}
public boolean supportDuplexMode() {
boolean result = false;
try {
result = server.supportDuplexMode();
} catch (RemoteException re) {
throw new RemoteConnectionException(re.getMessage(), re);
}
return result;
}
public String treeName() {
String result = null;
try {
result = server.treeName();
} catch (RemoteException re) {
throw new RemoteConnectionException(re.getMessage(), re);
}
return result;
}
}