package org.playorm.nio.test;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.playorm.nio.api.channels.Channel;
import org.playorm.nio.api.channels.TCPChannel;
import org.playorm.nio.api.deprecated.ChannelServiceFactory;
import org.playorm.nio.api.handlers.DataChunk;
import org.playorm.nio.api.handlers.DataListener;
import org.playorm.nio.api.libs.BufferFactory;
import org.playorm.nio.api.libs.BufferHelper;
import org.playorm.nio.api.libs.FactoryCreator;
public class Delayer implements DataListener {
private static final Logger log = Logger.getLogger(Delayer.class.getName());
private static final BufferHelper HELPER = ChannelServiceFactory.bufferHelper(null);
private BufferFactory bufFactory;
private static Timer timer = new Timer();
private TCPChannel to;
public Delayer(TCPChannel to) {
this.to = to;
if(bufFactory == null) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(FactoryCreator.KEY_IS_DIRECT, false);
FactoryCreator creator = FactoryCreator.createFactory(null);
bufFactory = creator.createBufferFactory(map);
}
}
public void incomingData(Channel channel, DataChunk chunk) throws IOException {
ByteBuffer b = chunk.getData();
final ByteBuffer newBuffer = bufFactory.createBuffer(channel, b.remaining());
newBuffer.put(b);
TimerTask t = new TimerTask() {
@Override
public void run() {
try {
HELPER.doneFillingBuffer(newBuffer);
to.oldWrite(newBuffer);
} catch (Exception e) {
log.log(Level.WARNING, "exception", e);
}
}
};
timer.schedule(t, 1000);
chunk.setProcessed("Delayer");
}
public void farEndClosed(Channel channel) {
TimerTask t = new TimerTask() {
@Override
public void run() {
try {
to.oldClose();
} catch (Exception e) {
log.log(Level.WARNING, "exception", e);
}
}
};
timer.schedule(t, 1000);
}
public void failure(Channel channel, ByteBuffer data, Exception e) {
log.warning(channel+"Data not received");
}
}