@Override public Headers add(String key, byte[] value) throws IllegalStateException { return add(new RecordHeader(key, value)); }
private void setReadOnly(Headers headers) { if (headers instanceof RecordHeaders) { ((RecordHeaders) headers).setReadOnly(); } }
@Override public Iterable<Header> headers(final String key) { checkKey(key); return () -> new FilterByKeyIterator(headers.iterator(), key); }
@Test public void testLastHeader() { Headers headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); headers.add(new RecordHeader("key", "value2".getBytes())); headers.add(new RecordHeader("key", "value3".getBytes())); assertHeader("key", "value3", headers.lastHeader("key")); assertEquals(3, getCount(headers)); }
@Test public void testNew() throws IOException { RecordHeaders headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); headers.setReadOnly(); RecordHeaders newHeaders = new RecordHeaders(headers); newHeaders.add(new RecordHeader("key", "value2".getBytes())); //Ensure existing headers are not modified assertHeader("key", "value", headers.lastHeader("key")); assertEquals(1, getCount(headers)); //Ensure new headers are modified assertHeader("key", "value2", newHeaders.lastHeader("key")); assertEquals(2, getCount(newHeaders)); }
@Test public void testReadOnly() throws IOException { RecordHeaders headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); Iterator<Header> headerIteratorBeforeClose = headers.iterator(); headers.setReadOnly(); try { headers.add(new RecordHeader("key", "value".getBytes())); fail("IllegalStateException expected as headers are closed"); } catch (IllegalStateException ise) { headers.remove("key"); fail("IllegalStateException expected as headers are closed"); } catch (IllegalStateException ise) { Iterator<Header> headerIterator = headers.iterator(); headerIterator.next(); headerIterator.remove();
@Test public void testHeaders() throws IOException { RecordHeaders headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); headers.add(new RecordHeader("key1", "key1value".getBytes())); headers.add(new RecordHeader("key", "value2".getBytes())); headers.add(new RecordHeader("key2", "key2value".getBytes())); Iterator<Header> keyHeaders = headers.headers("key").iterator(); assertHeader("key", "value", keyHeaders.next()); assertHeader("key", "value2", keyHeaders.next()); assertFalse(keyHeaders.hasNext()); keyHeaders = headers.headers("key1").iterator(); assertHeader("key1", "key1value", keyHeaders.next()); assertFalse(keyHeaders.hasNext()); keyHeaders = headers.headers("key2").iterator(); assertHeader("key2", "key2value", keyHeaders.next()); assertFalse(keyHeaders.hasNext()); }
@Test public void testRemove() { Headers headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); assertTrue(headers.iterator().hasNext()); headers.remove("key"); assertFalse(headers.iterator().hasNext()); }
/** * Creates a record with a specified timestamp to be sent to a specified topic and partition * * @param topic The topic the record will be appended to * @param partition The partition to which the record should be sent * @param timestamp The timestamp of the record, in milliseconds since epoch. If null, the producer will assign * the timestamp using System.currentTimeMillis(). * @param key The key that will be included in the record * @param value The record contents * @param headers the headers that will be included in the record */ public ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value, Iterable<Header> headers) { if (topic == null) throw new IllegalArgumentException("Topic cannot be null."); if (timestamp != null && timestamp < 0) throw new IllegalArgumentException( String.format("Invalid timestamp: %d. Timestamp should always be non-negative or null.", timestamp)); if (partition != null && partition < 0) throw new IllegalArgumentException( String.format("Invalid partition: %d. Partition number should always be non-negative or null.", partition)); this.topic = topic; this.partition = partition; this.key = key; this.value = value; this.timestamp = timestamp; this.headers = new RecordHeaders(headers); }
@Override public String toString() { return "RecordHeader(key = " + key + ", value = " + Arrays.toString(value()) + ")"; }
@Override public Headers add(Header header) throws IllegalStateException { canWrite(); headers.add(header); return this; }
@Override public Iterator<Header> iterator() { return closeAware(headers.iterator()); }
protected Header makeNext() { while (true) { if (original.hasNext()) { Header header = original.next(); if (!header.key().equals(key)) continue; return header; } return this.allDone(); } } }
@Override public Header lastHeader(String key) { checkKey(key); for (int i = headers.size() - 1; i >= 0; i--) { Header header = headers.get(i); if (header.key().equals(key)) { return header; } } return null; }
@Test public void testAdd() { Headers headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); Header header = headers.iterator().next(); assertHeader("key", "value", header); headers.add(new RecordHeader("key2", "value2".getBytes())); assertHeader("key2", "value2", headers.lastHeader("key2")); assertEquals(2, getCount(headers)); }
@Test @SuppressWarnings("deprecation") public void testNullChecksumInConstructor() { String key = "key"; String value = "value"; long timestamp = 242341324L; ConsumerRecord<String, String> record = new ConsumerRecord<>("topic", 0, 23L, timestamp, TimestampType.CREATE_TIME, null, key.length(), value.length(), key, value, new RecordHeaders()); assertEquals(DefaultRecord.computePartialChecksum(timestamp, key.length(), value.length()), record.checksum()); }
@Override public int hashCode() { int result = key != null ? key.hashCode() : 0; result = 31 * result + Arrays.hashCode(value()); return result; }
@Test public void testAddRemoveInterleaved() { Headers headers = new RecordHeaders(); headers.add(new RecordHeader("key", "value".getBytes())); headers.add(new RecordHeader("key2", "value2".getBytes())); assertEquals(1, getCount(headers)); headers.add(new RecordHeader("key3", "value3".getBytes())); assertHeader("key2", "value2", headers.lastHeader("key2")); assertHeader("key3", "value3", headers.lastHeader("key3")); assertEquals(2, getCount(headers)); assertHeader("key3", "value3", headers.lastHeader("key3")); assertEquals(1, getCount(headers)); headers.add(new RecordHeader("key3", "value4".getBytes())); assertHeader("key3", "value4", headers.lastHeader("key3")); assertEquals(2, getCount(headers)); headers.add(new RecordHeader("key", "valueNew".getBytes())); assertEquals(3, getCount(headers));