diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactory.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactory.java new file mode 100644 index 000000000..4286f9e8a --- /dev/null +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactory.java @@ -0,0 +1,18 @@ +package com.navercorp.pinpoint.rpc.buffer; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @Author Taejin Koo + */ +public interface ByteBufferFactory { + + public static final ByteOrder DEFAULT_BYTE_ORDER = ByteOrder.BIG_ENDIAN; + public static final ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder(); + + ByteBuffer getBuffer(int capacity); + + ByteBuffer getBuffer(ByteOrder endianness, int capacity); + +} diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactoryLocator.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactoryLocator.java new file mode 100644 index 000000000..9b9f6a3a3 --- /dev/null +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactoryLocator.java @@ -0,0 +1,29 @@ +package com.navercorp.pinpoint.rpc.buffer; + +import java.util.EnumMap; +import java.util.Map; + +/** + * @Author Taejin Koo + */ +public final class ByteBufferFactoryLocator { + + private static final Map FACTORY_REPOSITORY = new EnumMap(ByteBufferType.class); + static { + FACTORY_REPOSITORY.put(ByteBufferType.DIRECT, new DirectByteBufferFactory()); + FACTORY_REPOSITORY.put(ByteBufferType.HEAP, new HeapByteBufferFactory()); + } + + public static ByteBufferFactory getFactory(String name) { + ByteBufferType byteBufferType = ByteBufferType.getValue(name); + if (byteBufferType == null) { + throw new IllegalArgumentException("Unknown ByteBufferType:" + name); + } + return getFactory(byteBufferType); + } + + public static ByteBufferFactory getFactory(ByteBufferType byteBufferType) { + return FACTORY_REPOSITORY.get(byteBufferType); + } + +} diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferType.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferType.java new file mode 100644 index 000000000..431b5f68b --- /dev/null +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferType.java @@ -0,0 +1,25 @@ +package com.navercorp.pinpoint.rpc.buffer; + +/** + * @Author Taejin Koo + */ +public enum ByteBufferType { + + HEAP, + DIRECT; + + public static ByteBufferType getValue(String name) { + if (name == null) { + throw new NullPointerException("name"); + } + + for (ByteBufferType byteBufferType : ByteBufferType.values()) { + if (name.equalsIgnoreCase(byteBufferType.name())) { + return byteBufferType; + } + } + + return null; + } + +} diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/DirectByteBufferFactory.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/DirectByteBufferFactory.java new file mode 100644 index 000000000..6ec6a4e19 --- /dev/null +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/DirectByteBufferFactory.java @@ -0,0 +1,21 @@ +package com.navercorp.pinpoint.rpc.buffer; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @Author Taejin Koo + */ +public class DirectByteBufferFactory implements ByteBufferFactory { + + @Override + public ByteBuffer getBuffer(int capacity) { + return getBuffer(DEFAULT_BYTE_ORDER, capacity); + } + + @Override + public ByteBuffer getBuffer(ByteOrder endianness, int capacity) { + return ByteBuffer.allocateDirect(capacity).order(endianness); + } + +} diff --git a/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/HeapByteBufferFactory.java b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/HeapByteBufferFactory.java new file mode 100644 index 000000000..07d5f7aef --- /dev/null +++ b/rpc/src/main/java/com/navercorp/pinpoint/rpc/buffer/HeapByteBufferFactory.java @@ -0,0 +1,21 @@ +package com.navercorp.pinpoint.rpc.buffer; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @Author Taejin Koo + */ +public class HeapByteBufferFactory implements ByteBufferFactory { + + @Override + public ByteBuffer getBuffer(int capacity) { + return getBuffer(DEFAULT_BYTE_ORDER, capacity); + } + + @Override + public ByteBuffer getBuffer(ByteOrder endianness, int capacity) { + return ByteBuffer.allocate(capacity).order(endianness); + } + +} diff --git a/rpc/src/test/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactoryTest.java b/rpc/src/test/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactoryTest.java new file mode 100644 index 000000000..397c20f5a --- /dev/null +++ b/rpc/src/test/java/com/navercorp/pinpoint/rpc/buffer/ByteBufferFactoryTest.java @@ -0,0 +1,49 @@ +package com.navercorp.pinpoint.rpc.buffer; + +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +/** + * @Author Taejin Koo + */ +public class ByteBufferFactoryTest { + + @Test + public void directByteBufferFactoryTest() throws Exception { + ByteBufferFactory byteBufferFactory = ByteBufferFactoryLocator.getFactory("direct"); + ByteBuffer buffer = byteBufferFactory.getBuffer(20); + + assertBufferOrder(buffer, ByteBufferFactory.DEFAULT_BYTE_ORDER); + assertBufferType(buffer, true); + } + + @Test + public void heapByteBufferFactoryTest() throws Exception { + ByteBufferFactory byteBufferFactory = ByteBufferFactoryLocator.getFactory("heap"); + ByteBuffer buffer = byteBufferFactory.getBuffer(20); + + assertBufferOrder(buffer, ByteBufferFactory.DEFAULT_BYTE_ORDER); + assertBufferType(buffer, false); + } + + @Test(expected = IllegalArgumentException.class) + public void unknownByteBufferFactoryTest() throws Exception { + ByteBufferFactory byteBufferFactory = ByteBufferFactoryLocator.getFactory("unknown"); + + } + + private void assertBufferOrder(ByteBuffer byteBuffer, ByteOrder order) { + if (byteBuffer.order() != order) { + throw new IllegalArgumentException(""); + } + } + + private void assertBufferType(ByteBuffer byteBuffer, boolean isDirect) { + if (byteBuffer.isDirect() != isDirect) { + throw new IllegalArgumentException(""); + } + } + +}