package org.prevayler.foundation.network;
import java.io.IOException;
public class NetworkClientObjectReceiverImpl implements ObjectReceiver {
/**
* our connection to the network
*/
private ObjectSocket _provider;
/**
* the upper layer who we give what we receive to
*/
private ObjectReceiver _client;
private volatile boolean _closing;
public NetworkClientObjectReceiverImpl( String ipAddress, int port, ObjectReceiver client) throws IOException {
this(new ObjectSocketImpl(ipAddress,port),client);
}
public NetworkClientObjectReceiverImpl( ObjectSocket objectSocket, Service service) throws IOException {
_provider=objectSocket;
_client=service.serverFor(this);
startReading();
}
public NetworkClientObjectReceiverImpl( ObjectSocket objectSocket, ObjectReceiver client){
_provider=objectSocket;
_client=client;
startReading();
}
/**
* Create a reader thread
*/
private void startReading(){
Thread reader=new Thread(){
public void run(){
while (!_closing) receiveFromNetwork();
}
}
;
reader.setName("Prevayler Network Client Receiver");
reader.setDaemon(true);
reader.start();
}
/**
* When something is read give it to our client, also give it the exception
*/
private void receiveFromNetwork(){
try {
Object object=_provider.readObject();
passToClient(object);
}
catch ( Exception ex) {
closeDown();
if (_closing) {
return;
}
passToClient(ex);
}
}
private void closeDown(){
try {
close();
}
catch ( IOException ignorable) {
}
try {
_client.close();
}
catch ( IOException neverThrown) {
}
}
private void passToClient( Object object){
try {
_client.receive(object);
}
catch ( IOException unExpected) {
unExpected.printStackTrace();
}
}
/**
* Receive an object from prevayler client to be sent to the network
*/
public void receive( Object object) throws IOException {
_provider.writeObject(object);
}
public void close() throws IOException {
_closing=true;
_provider.close();
}
}