//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.
//Contributions: anon.
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);
}
/* (non-Javadoc)
* @see org.prevayler.foundation.network.ObjectReceiver#close()
*/
public void close() throws IOException {
_closing = true;
_provider.close();
}
}