@Override public E getRelative(int index) { long availableElements = getAvailableElements(); if(index < 0 || index >= availableElements) { throw new IndexOutOfBoundsException("Invalid index " + index + "! Must be 0.." + (availableElements - 1) + "."); } int realIndex = (startIndex + index) % bufferSize; @SuppressWarnings({"unchecked"}) E result = (E) array[realIndex]; return result; }
@Override public E getRelative(int index) { long availableElements = getAvailableElements(); if(index < 0 || index >= availableElements) { throw new IndexOutOfBoundsException("Invalid index " + index + "! Must be 0.." + (availableElements - 1) + "."); } int realIndex = (startIndex + index) % bufferSize; @SuppressWarnings({"unchecked"}) E result = (E) array[realIndex]; return result; }
@Override public E setRelative(int index, E element) { long availableElements = getAvailableElements(); if(index < 0 || index >= availableElements) { throw new IndexOutOfBoundsException("Invalid index " + index + "! Must be 0.." + (availableElements - 1) + "."); } int realIndex = (startIndex + index) % bufferSize; @SuppressWarnings({"unchecked"}) E result = (E) array[realIndex]; array[realIndex] = element; return result; }
@Override public E setRelative(int index, E element) { long availableElements = getAvailableElements(); if(index < 0 || index >= availableElements) { throw new IndexOutOfBoundsException("Invalid index " + index + "! Must be 0.." + (availableElements - 1) + "."); } int realIndex = (startIndex + index) % bufferSize; @SuppressWarnings({"unchecked"}) E result = (E) array[realIndex]; array[realIndex] = element; return result; }
@Override public int getAvailableElements() { lock.lock(); try { return events.getAvailableElements(); } finally { lock.unlock(); } }
@Override public int getAvailableElements() { lock.lock(); try { return events.getAvailableElements(); } finally { lock.unlock(); } }
@Override public List<E> removeAll() { long availableElements = getAvailableElements(); List<E> result = new ArrayList<>((int) availableElements); for(int i = 0; i < availableElements; i++) { result.add(removeFirst()); } return result; }
@Override public List<E> removeAll() { long availableElements = getAvailableElements(); List<E> result = new ArrayList<>((int) availableElements); for(int i = 0; i < availableElements; i++) { result.add(removeFirst()); } return result; }
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { // Write out getBufferSize s.defaultWriteObject(); // Write out getAvailableElements long availableElements = getAvailableElements(); s.writeLong(availableElements); // Write out all elements for(int i = 0; i < availableElements; i++) { s.writeObject(getRelative(i)); } }
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { // Write out getBufferSize s.defaultWriteObject(); // Write out getAvailableElements long availableElements = getAvailableElements(); s.writeLong(availableElements); // Write out all elements for(int i = 0; i < availableElements; i++) { s.writeObject(getRelative(i)); } }
try if(logger.isWarnEnabled()) logger.warn("Congestion ({} events) detected, sleeping for {} millis.", events.getAvailableElements(), congestionDelay);
@Override public boolean equals(Object o) { if(this == o) return true; if(o == null) return false; if(!(o instanceof CircularBuffer)) return false; final CircularBuffer that = (CircularBuffer) o; long availableElements = getAvailableElements(); if(availableElements != that.getAvailableElements()) return false; for(int i = 0; i < availableElements; i++) { Object thisValue = getRelative(i); Object thatValue = that.getRelative(i); if(thisValue == null) { if(thatValue != null) { return false; } } else { if(!thisValue.equals(thatValue)) { return false; } } } return true; }
@Override public boolean equals(Object o) { if(this == o) return true; if(o == null) return false; if(!(o instanceof CircularBuffer)) return false; final CircularBuffer that = (CircularBuffer) o; long availableElements = getAvailableElements(); if(availableElements != that.getAvailableElements()) return false; for(int i = 0; i < availableElements; i++) { Object thisValue = getRelative(i); Object thatValue = that.getRelative(i); if(thisValue == null) { if(thatValue != null) { return false; } } else { if(!thisValue.equals(thatValue)) { return false; } } } return true; }
@Test public void addAllList() { List<Long> values = new ArrayList<>(); for(int i = 0; i < 4 * TEST_BUFFER_SIZE; i++) { values.add((long) i); } if(logger.isInfoEnabled()) logger.info("Adding values: {}", values); instance.addAll(values); if(logger.isInfoEnabled()) logger.info("Buffer after adding: {}", instance); assertFalse("Instance is empty!", instance.isEmpty()); assertTrue("Instance isn't full!", instance.isFull()); assertEquals("Size doesn't match!", TEST_BUFFER_SIZE, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); long overflowCounter = instance.getOverflowCounter(); assertEquals("overflowCounter doesn't match!", 3 * TEST_BUFFER_SIZE, overflowCounter); Iterator<Long> iterator = instance.iterator(); assertTrue("iterator doesn't have next!", iterator.hasNext()); for(int i = 0; i < TEST_BUFFER_SIZE; i++) { Long element = iterator.next(); Long getRelativeValue = instance.getRelative(i); Long getValue = instance.get(i + overflowCounter); if(logger.isInfoEnabled()) logger.info("Element #{}: iterValue={}, getRelativeValue={}", i, element, getRelativeValue); assertEquals("Unexpected value returned by iterator!", (Long) (long) (i + 3 * TEST_BUFFER_SIZE), element); assertEquals("Iterator and getRelative values differ!", element, getRelativeValue); assertEquals("Iterator and get values differ!", element, getValue); } }
@Test public void empty() { assertTrue("Instance is not empty!", instance.isEmpty()); assertFalse("Instance is full!", instance.isFull()); assertEquals("Size doesn't match!", 0, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); assertEquals("overflowCounter doesn't match!", 0, instance.getOverflowCounter()); Iterator<Long> iterator = instance.iterator(); assertFalse("iterator has next!", iterator.hasNext()); }
@Test public void one() { instance.add((long) 1); assertFalse("Instance is empty!", instance.isEmpty()); assertFalse("Instance is full!", instance.isFull()); assertEquals("Size doesn't match!", 1, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); assertEquals("overflowCounter doesn't match!", 0, instance.getOverflowCounter()); Iterator<Long> iterator = instance.iterator(); assertTrue("iterator doesn't have next!", iterator.hasNext()); Long element = iterator.next(); Long getRelativeValue = instance.getRelative(0); Long getValue = instance.get(0); if(logger.isInfoEnabled()) logger.info("Element #{}: iterValue={}, getRelativeValue={}, getValue={}", 0, element, getRelativeValue, getValue); assertEquals("Unexpected value returned by iterator!", (Long) (long) 1, element); assertEquals("Iterator and getRelative values differ!", element, getRelativeValue); assertEquals("Iterator and get values differ!", element, getValue); }
@Test public void overflowDouble() { for(int i = 0; i < TEST_BUFFER_SIZE * 2; i++) { instance.add((long) i); } assertFalse("Instance is empty!", instance.isEmpty()); assertTrue("Instance isn't full!", instance.isFull()); assertEquals("Size doesn't match!", TEST_BUFFER_SIZE, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); long overflowCounter = instance.getOverflowCounter(); assertEquals("overflowCounter doesn't match!", TEST_BUFFER_SIZE, overflowCounter); Iterator<Long> iterator = instance.iterator(); assertTrue("iterator doesn't have next!", iterator.hasNext()); for(int i = 0; i < TEST_BUFFER_SIZE; i++) { Long element = iterator.next(); Long getRelativeValue = instance.getRelative(i); Long getValue = instance.get(i + overflowCounter); if(logger.isInfoEnabled()) logger.info("Element #{}: iterValue={}, getRelativeValue={}", i, element, getRelativeValue); assertEquals("Unexpected value returned by iterator!", (Long) (long) (i + TEST_BUFFER_SIZE), element); assertEquals("Iterator and getRelative values differ!", element, getRelativeValue); assertEquals("Iterator and get values differ!", element, getValue); } }
@Test public void nearlyFull() { for(int i = 0; i < TEST_BUFFER_SIZE - 1; i++) { instance.add((long) i); } assertFalse("Instance is empty!", instance.isEmpty()); assertFalse("Instance is full!", instance.isFull()); assertEquals("Size doesn't match!", TEST_BUFFER_SIZE - 1, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); assertEquals("overflowCounter doesn't match!", 0, instance.getOverflowCounter()); Iterator<Long> iterator = instance.iterator(); assertTrue("iterator doesn't have next!", iterator.hasNext()); for(int i = 0; i < TEST_BUFFER_SIZE - 1; i++) { Long element = iterator.next(); Long getRelativeValue = instance.getRelative(i); Long getValue = instance.get(i); if(logger.isInfoEnabled()) logger.info("Element #{}: iterValue={}, getRelativeValue={}", i, element, getRelativeValue); assertEquals("Unexpected value returned by iterator!", (Long) (long) i, element); assertEquals("Iterator and getRelative values differ!", element, getRelativeValue); assertEquals("Iterator and get values differ!", element, getValue); } }
@Test public void full() { for(int i = 0; i < TEST_BUFFER_SIZE; i++) { instance.add((long) i); } assertFalse("Instance is empty!", instance.isEmpty()); assertTrue("Instance isn't full!", instance.isFull()); assertEquals("Size doesn't match!", TEST_BUFFER_SIZE, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); assertEquals("overflowCounter doesn't match!", 0, instance.getOverflowCounter()); Iterator<Long> iterator = instance.iterator(); assertTrue("iterator doesn't have next!", iterator.hasNext()); for(int i = 0; i < TEST_BUFFER_SIZE; i++) { Long element = iterator.next(); Long getRelativeValue = instance.getRelative(i); Long getValue = instance.get(i); if(logger.isInfoEnabled()) logger.info("Element #{}: iterValue={}, getRelativeValue={}", i, element, getRelativeValue); assertEquals("Unexpected value returned by iterator!", (Long) (long) i, element); assertEquals("Iterator and getRelative values differ!", element, getRelativeValue); assertEquals("Iterator and get values differ!", element, getValue); } }
@Test public void overflowOne() { for(int i = 0; i < TEST_BUFFER_SIZE; i++) { instance.add((long) i); } instance.add((long) TEST_BUFFER_SIZE); assertFalse("Instance is empty!", instance.isEmpty()); assertTrue("Instance isn't full!", instance.isFull()); assertEquals("Size doesn't match!", TEST_BUFFER_SIZE, instance.getAvailableElements()); assertEquals("getBufferSize doesn't match!", TEST_BUFFER_SIZE, instance.getBufferSize()); long overflowCounter = instance.getOverflowCounter(); assertEquals("overflowCounter doesn't match!", 1, overflowCounter); Iterator<Long> iterator = instance.iterator(); assertTrue("iterator doesn't have next!", iterator.hasNext()); for(int i = 0; i < TEST_BUFFER_SIZE; i++) { Long element = iterator.next(); Long getRelativeValue = instance.getRelative(i); Long getValue = instance.get(i + overflowCounter); if(logger.isInfoEnabled()) logger.info("Element #{}: iterValue={}, getRelativeValue={}", i, element, getRelativeValue); assertEquals("Unexpected value returned by iterator!", (Long) (long) (i + 1), element); assertEquals("Iterator and getRelative values differ!", element, getRelativeValue); assertEquals("Iterator and get values differ!", element, getValue); } }