package org.prevayler.foundation.network;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* Useful class comments should go here
*/
public abstract class BaseNetworkImpl implements Network, NetworkReceiverFactory {
private final Map _servicesInUse;
public BaseNetworkImpl(){
_servicesInUse=Collections.synchronizedMap(new HashMap());
}
public void startService( Service service, int port) throws IOException {
checkPortNotUsed(port);
NetworkServerObjectReceiver sessionServices=createService(service,port);
markPortAsUsed(port,sessionServices);
}
public void stopService( int port) throws IOException {
try {
NetworkServerObjectReceiver stubbornService=locateService(port);
terminateService(stubbornService);
}
finally {
releasePortForReuse(port);
}
}
public ObjectReceiver findServer( String ipAddress, int port, ObjectReceiver client) throws IOException {
return newReceiver(ipAddress,port,client);
}
private void markPortAsUsed( int port, NetworkServerObjectReceiver sessionService){
_servicesInUse.put(new Integer(port),sessionService);
}
private void checkPortNotUsed( int port) throws IOException {
if (_servicesInUse.get(new Integer(port)) != null) {
throw new IOException("Port In Service");
}
}
private void releasePortForReuse( int port){
_servicesInUse.remove(new Integer(port));
}
protected NetworkServerObjectReceiver createService( Service service, int port) throws IOException {
return new NetworkServerObjectReceiverImpl(this,service,port);
}
private void terminateService( NetworkServerObjectReceiver stubbornService){
stubbornService.shutdown();
}
private NetworkServerObjectReceiver locateService( int port) throws IOException {
NetworkServerObjectReceiver service=(NetworkServerObjectReceiver)_servicesInUse.get(new Integer(port));
if (service == null) {
throw new IOException("Port Not in Service");
}
return service;
}
public abstract ObjectReceiver newReceiver( Service service, ObjectSocket socket) throws IOException ;
public abstract ObjectReceiver newReceiver( String ipAddress, int port, ObjectReceiver client) throws IOException ;
}