package org.playorm.nio.api.testutil; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.util.logging.Logger; import org.playorm.nio.api.channels.Channel; import org.playorm.nio.api.channels.DatagramChannel; import org.playorm.nio.api.deprecated.ChannelServiceFactory; import org.playorm.nio.api.handlers.DataChunk; import org.playorm.nio.api.libs.BufferHelper; import biz.xsoftware.mock.CloningBehavior; public class CloneByteBuffer implements CloningBehavior { private static final Logger log = Logger.getLogger(CloneByteBuffer.class.getName()); private static BufferHelper helper = ChannelServiceFactory.bufferHelper(null); public Object[] incomingDataCloner(DatagramChannel channel, InetSocketAddress addr, ByteBuffer b) { return new Object[] { channel, addr, clone(b) }; } public void incomingData(DatagramChannel channel, InetSocketAddress addr, ByteBuffer b) { } public Object[] writeCloner(ByteBuffer b) { return new Object[] { cloneWithoutModify(b) }; } public int write(ByteBuffer b) { int remain = b.remaining(); //make it look like the buffer was read completely like the channel would really do... b.position(b.limit()); return remain; } public void packetEncrypted(ByteBuffer b, Object o) { } public Object[] packetEncryptedCloner(ByteBuffer b, Object o) { return new Object[] { clone(b), o }; } public void packetUnencrypted(ByteBuffer out) { } public Object[] packetUnencryptedCloner(ByteBuffer out) { return new Object[] { clone(out) }; } public void incomingPacket(ByteBuffer b, Object obj) { } public Object[] incomingPacketCloner(ByteBuffer b, Object obj) { return new Object[] { clone(b), obj}; } public void incomingData(Channel channel, DataChunk chunk) { //log.info("b.rem="+b.remaining()); chunk.setProcessed("CloneByteBuffer"); } public Object[] incomingDataCloner(Channel channel, DataChunk chunk) { ByteBuffer b = chunk.getData(); return new Object[] { channel, clone(b) }; } // private static final Logger log = Logger.getLogger(CloneByteBuffer.class.getName()); public static Object clone(ByteBuffer b) { ByteBuffer newOne = ByteBuffer.allocate(b.remaining()); newOne.put(b); helper.doneFillingBuffer(newOne); return newOne; } public static Object cloneWithoutModify(ByteBuffer b) { ByteBuffer newOne = ByteBuffer.allocate(b.remaining()); byte[] backing = b.array(); newOne.put(backing, b.position(), b.remaining()); helper.doneFillingBuffer(newOne); return newOne; } }