@Override public List<byte[]> split(byte[] colFamKey) { ByteBuffer bb = ByteBuffer.wrap(colFamKey); List<byte[]> segmentList = new LinkedList<byte[]>(); int segStart = 0; bb.mark(); while (bb.remaining() >= delimiter.length) { // compare delimeter to current position boolean delimiterFound = true; for (byte b : delimiter) { if (bb.get() != b) { delimiterFound = false; break; } } if (delimiterFound) { int segSize = bb.position() - segStart-delimiter.length; segmentList.add(copyFromMark(bb, segStart, segSize)); bb.position(bb.position() + delimiter.length); segStart = bb.position(); bb.mark(); } } segmentList.add(copyFromMark(bb, segStart, bb.capacity()-segStart)); return segmentList; }
@Test public void testConcatAndSplitMultipleSegments() { List<byte[]> segList1 = new LinkedList<byte[]>(); segList1.add("foo".getBytes()); segList1.add("bar".getBytes()); segList1.add("forever".getBytes()); byte[] concat = keyCatStrat.concat(segList1); assertEquals( "foo".getBytes().length + keyCatStrat.getDelimiter().length + "bar".getBytes().length + keyCatStrat.getDelimiter().length + "forever".getBytes().length, concat.length); List<byte[]> segList2 = keyCatStrat.split(concat); assertEquals(segList1.size(), segList2.size()); for (int i = 0; i < segList1.size(); i++) { assertEquals("'" + new String(segList1.get(i)) + "' expected, but got '" + new String(segList2.get(i)) + "'", ByteBuffer.wrap(segList1.get(i)), ByteBuffer.wrap(segList2.get(i))); } }
@Test public void testConcatAndSplitOneSegments() { List<byte[]> segList1 = new LinkedList<byte[]>(); segList1.add("foo".getBytes()); byte[] concat = keyCatStrat.concat(segList1); assertEquals("foo".getBytes().length, concat.length); List<byte[]> segList2 = keyCatStrat.split(concat); assertEquals(segList1.size(), segList2.size()); for (int i = 0; i < segList1.size(); i++) { assertEquals("'" + new String(segList1.get(i)) + "' expected, but got '" + new String(segList2.get(i)) + "'", ByteBuffer.wrap(segList1.get(i)), ByteBuffer.wrap(segList2.get(i))); } }
@Test public void testConcatAndSplitWithEmptySegments() { List<byte[]> segList1 = new LinkedList<byte[]>(); segList1.add("foo".getBytes()); segList1.add("".getBytes()); segList1.add("".getBytes()); segList1.add("forever".getBytes()); segList1.add("".getBytes()); byte[] concat = keyCatStrat.concat(segList1); assertEquals( "foo".getBytes().length + keyCatStrat.getDelimiter().length + "".getBytes().length + keyCatStrat.getDelimiter().length + "".getBytes().length + keyCatStrat.getDelimiter().length + "forever".getBytes().length + keyCatStrat.getDelimiter().length + "".getBytes().length , concat.length) ; List<byte[]> segList2 = keyCatStrat.split(concat); assertEquals(segList1.size(), segList2.size()); for (int i = 0; i < segList1.size(); i++) { assertEquals("'" + new String(segList1.get(i)) + "' expected, but got '" + new String(segList2.get(i)) + "'", ByteBuffer.wrap(segList1.get(i)), ByteBuffer.wrap(segList2.get(i))); } }
@Test public void testConcatAndSplitOneSegmentContainingPartOfDelimeter() { List<byte[]> segList1 = new LinkedList<byte[]>(); segList1.add("f|o|o".getBytes()); byte[] concat = keyCatStrat.concat(segList1); assertEquals("f|o|o".getBytes().length, concat.length); List<byte[]> segList2 = keyCatStrat.split(concat); assertEquals(segList1.size(), segList2.size()); for (int i = 0; i < segList1.size(); i++) { assertEquals("'" + new String(segList1.get(i)) + "' expected, but got '" + new String(segList2.get(i)) + "'", ByteBuffer.wrap(segList1.get(i)), ByteBuffer.wrap(segList2.get(i))); } }