//Prevayler(TM) - The Free-Software Prevalence Layer.
//Copyright (C) 2004 Klaus Wuestefeld
//This is free software. It is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//See the license distributed along with this file for more details.
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;
}