diff options
author | Ivan Topolnjak <ivantopo@gmail.com> | 2017-08-21 09:23:07 +0200 |
---|---|---|
committer | Ivan Topolnjak <ivantopo@gmail.com> | 2017-08-21 10:37:08 +0200 |
commit | a152a3098b564ed43766a857b32b7c7d7445f9ce (patch) | |
tree | 7651f61e598f316ee9dca415c5a5c67ce530bad5 /kamon-core/src/main/java | |
parent | 3cb974e5dfd381b9b28ffef9977047cf35242121 (diff) | |
download | Kamon-a152a3098b564ed43766a857b32b7c7d7445f9ce.tar.gz Kamon-a152a3098b564ed43766a857b32b7c7d7445f9ce.tar.bz2 Kamon-a152a3098b564ed43766a857b32b7c7d7445f9ce.zip |
binary encoding of context and entries
Diffstat (limited to 'kamon-core/src/main/java')
-rw-r--r-- | kamon-core/src/main/java/kamon/context/generated/binary/context/Context.java (renamed from kamon-core/src/main/java/kamon/context/encoding/Context.java) | 18 | ||||
-rw-r--r-- | kamon-core/src/main/java/kamon/context/generated/binary/context/Entry.java (renamed from kamon-core/src/main/java/kamon/context/encoding/Entry.java) | 28 | ||||
-rw-r--r-- | kamon-core/src/main/java/kamon/context/generated/binary/span/Span.java | 524 |
3 files changed, 547 insertions, 23 deletions
diff --git a/kamon-core/src/main/java/kamon/context/encoding/Context.java b/kamon-core/src/main/java/kamon/context/generated/binary/context/Context.java index db6ed7a9..a9917e99 100644 --- a/kamon-core/src/main/java/kamon/context/encoding/Context.java +++ b/kamon-core/src/main/java/kamon/context/generated/binary/context/Context.java @@ -1,4 +1,4 @@ -package kamon.context.encoding; +package kamon.context.generated.binary.context; // Code generated by colf(1); DO NOT EDIT. @@ -23,7 +23,7 @@ import java.nio.BufferUnderflowException; * @author generated by colf(1) * @see <a href="https://github.com/pascaldekloe/colfer">Colfer's home</a> */ -@javax.annotation.Generated(value="colf(1)", comments="Colfer from schema file context.colf") +@javax.annotation.Generated(value="colf(1)", comments="Colfer from schema file Context.colf") public class Context implements Serializable { /** The upper limit for serial byte sizes. */ @@ -188,7 +188,7 @@ public class Context implements Serializable { int x = a.length; if (x > Context.colferListMax) - throw new IllegalStateException(format("colfer: kamon/context/kamon.Context.entries length %d exceeds %d elements", x, Context.colferListMax)); + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/context.Context.entries length %d exceeds %d elements", x, Context.colferListMax)); while (x > 0x7f) { buf[i++] = (byte) (x | 0x80); x >>>= 7; @@ -209,7 +209,7 @@ public class Context implements Serializable { return i; } catch (ArrayIndexOutOfBoundsException e) { if (i - offset > Context.colferSizeMax) - throw new IllegalStateException(format("colfer: kamon/context/kamon.Context exceeds %d bytes", Context.colferSizeMax)); + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/context.Context exceeds %d bytes", Context.colferSizeMax)); if (i > buf.length) throw new BufferOverflowException(); throw e; } @@ -253,7 +253,7 @@ public class Context implements Serializable { if (shift == 28 || b >= 0) break; } if (length < 0 || length > Context.colferListMax) - throw new SecurityException(format("colfer: kamon/context/kamon.Context.entries length %d exceeds %d elements", length, Context.colferListMax)); + throw new SecurityException(format("colfer: kamon/context/generated/binary/context.Context.entries length %d exceeds %d elements", length, Context.colferListMax)); Entry[] a = new Entry[length]; for (int ai = 0; ai < length; ai++) { @@ -270,7 +270,7 @@ public class Context implements Serializable { } finally { if (i > end && end - offset < Context.colferSizeMax) throw new BufferUnderflowException(); if (i < 0 || i - offset > Context.colferSizeMax) - throw new SecurityException(format("colfer: kamon/context/kamon.Context exceeds %d bytes", Context.colferSizeMax)); + throw new SecurityException(format("colfer: kamon/context/generated/binary/context.Context exceeds %d bytes", Context.colferSizeMax)); if (i > end) throw new BufferUnderflowException(); } @@ -312,7 +312,7 @@ public class Context implements Serializable { } /** - * Gets kamon/context/kamon.Context.entries. + * Gets kamon/context/generated/binary/context.Context.entries. * @return the value. */ public Entry[] getEntries() { @@ -320,7 +320,7 @@ public class Context implements Serializable { } /** - * Sets kamon/context/kamon.Context.entries. + * Sets kamon/context/generated/binary/context.Context.entries. * @param value the replacement. */ public void setEntries(Entry[] value) { @@ -328,7 +328,7 @@ public class Context implements Serializable { } /** - * Sets kamon/context/kamon.Context.entries. + * Sets kamon/context/generated/binary/context.Context.entries. * @param value the replacement. * @return {link this}. */ diff --git a/kamon-core/src/main/java/kamon/context/encoding/Entry.java b/kamon-core/src/main/java/kamon/context/generated/binary/context/Entry.java index d7734c13..dc75b10d 100644 --- a/kamon-core/src/main/java/kamon/context/encoding/Entry.java +++ b/kamon-core/src/main/java/kamon/context/generated/binary/context/Entry.java @@ -1,4 +1,4 @@ -package kamon.context.encoding; +package kamon.context.generated.binary.context; // Code generated by colf(1); DO NOT EDIT. @@ -24,7 +24,7 @@ import java.nio.BufferUnderflowException; * @author generated by colf(1) * @see <a href="https://github.com/pascaldekloe/colfer">Colfer's home</a> */ -@javax.annotation.Generated(value="colf(1)", comments="Colfer from schema file context.colf") +@javax.annotation.Generated(value="colf(1)", comments="Colfer from schema file Context.colf") public class Entry implements Serializable { /** The upper limit for serial byte sizes. */ @@ -211,7 +211,7 @@ public class Entry implements Serializable { } int size = i - start; if (size > Entry.colferSizeMax) - throw new IllegalStateException(format("colfer: kamon/context/kamon.Entry.name size %d exceeds %d UTF-8 bytes", size, Entry.colferSizeMax)); + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/context.Entry.name size %d exceeds %d UTF-8 bytes", size, Entry.colferSizeMax)); int ii = start - 1; if (size > 0x7f) { @@ -232,7 +232,7 @@ public class Entry implements Serializable { int size = this.content.length; if (size > Entry.colferSizeMax) - throw new IllegalStateException(format("colfer: kamon/context/kamon.Entry.content size %d exceeds %d bytes", size, Entry.colferSizeMax)); + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/context.Entry.content size %d exceeds %d bytes", size, Entry.colferSizeMax)); int x = size; while (x > 0x7f) { @@ -250,7 +250,7 @@ public class Entry implements Serializable { return i; } catch (ArrayIndexOutOfBoundsException e) { if (i - offset > Entry.colferSizeMax) - throw new IllegalStateException(format("colfer: kamon/context/kamon.Entry exceeds %d bytes", Entry.colferSizeMax)); + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/context.Entry exceeds %d bytes", Entry.colferSizeMax)); if (i > buf.length) throw new BufferOverflowException(); throw e; } @@ -294,7 +294,7 @@ public class Entry implements Serializable { if (shift == 28 || b >= 0) break; } if (size < 0 || size > Entry.colferSizeMax) - throw new SecurityException(format("colfer: kamon/context/kamon.Entry.name size %d exceeds %d UTF-8 bytes", size, Entry.colferSizeMax)); + throw new SecurityException(format("colfer: kamon/context/generated/binary/context.Entry.name size %d exceeds %d UTF-8 bytes", size, Entry.colferSizeMax)); int start = i; i += size; @@ -310,7 +310,7 @@ public class Entry implements Serializable { if (shift == 28 || b >= 0) break; } if (size < 0 || size > Entry.colferSizeMax) - throw new SecurityException(format("colfer: kamon/context/kamon.Entry.content size %d exceeds %d bytes", size, Entry.colferSizeMax)); + throw new SecurityException(format("colfer: kamon/context/generated/binary/context.Entry.content size %d exceeds %d bytes", size, Entry.colferSizeMax)); this.content = new byte[size]; int start = i; @@ -325,7 +325,7 @@ public class Entry implements Serializable { } finally { if (i > end && end - offset < Entry.colferSizeMax) throw new BufferUnderflowException(); if (i < 0 || i - offset > Entry.colferSizeMax) - throw new SecurityException(format("colfer: kamon/context/kamon.Entry exceeds %d bytes", Entry.colferSizeMax)); + throw new SecurityException(format("colfer: kamon/context/generated/binary/context.Entry exceeds %d bytes", Entry.colferSizeMax)); if (i > end) throw new BufferUnderflowException(); } @@ -367,7 +367,7 @@ public class Entry implements Serializable { } /** - * Gets kamon/context/kamon.Entry.name. + * Gets kamon/context/generated/binary/context.Entry.name. * @return the value. */ public String getName() { @@ -375,7 +375,7 @@ public class Entry implements Serializable { } /** - * Sets kamon/context/kamon.Entry.name. + * Sets kamon/context/generated/binary/context.Entry.name. * @param value the replacement. */ public void setName(String value) { @@ -383,7 +383,7 @@ public class Entry implements Serializable { } /** - * Sets kamon/context/kamon.Entry.name. + * Sets kamon/context/generated/binary/context.Entry.name. * @param value the replacement. * @return {link this}. */ @@ -393,7 +393,7 @@ public class Entry implements Serializable { } /** - * Gets kamon/context/kamon.Entry.content. + * Gets kamon/context/generated/binary/context.Entry.content. * @return the value. */ public byte[] getContent() { @@ -401,7 +401,7 @@ public class Entry implements Serializable { } /** - * Sets kamon/context/kamon.Entry.content. + * Sets kamon/context/generated/binary/context.Entry.content. * @param value the replacement. */ public void setContent(byte[] value) { @@ -409,7 +409,7 @@ public class Entry implements Serializable { } /** - * Sets kamon/context/kamon.Entry.content. + * Sets kamon/context/generated/binary/context.Entry.content. * @param value the replacement. * @return {link this}. */ diff --git a/kamon-core/src/main/java/kamon/context/generated/binary/span/Span.java b/kamon-core/src/main/java/kamon/context/generated/binary/span/Span.java new file mode 100644 index 00000000..ea7a6fe8 --- /dev/null +++ b/kamon-core/src/main/java/kamon/context/generated/binary/span/Span.java @@ -0,0 +1,524 @@ +package kamon.context.generated.binary.span; + + +// Code generated by colf(1); DO NOT EDIT. + + +import static java.lang.String.format; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; +import java.io.OutputStream; +import java.io.Serializable; +import java.util.InputMismatchException; +import java.nio.BufferOverflowException; +import java.nio.BufferUnderflowException; + + +/** + * Data bean with built-in serialization support. + + * @author generated by colf(1) + * @see <a href="https://github.com/pascaldekloe/colfer">Colfer's home</a> + */ +@javax.annotation.Generated(value="colf(1)", comments="Colfer from schema file Span.colf") +public class Span implements Serializable { + + /** The upper limit for serial byte sizes. */ + public static int colferSizeMax = 16 * 1024 * 1024; + + + + + public byte[] traceID; + + public byte[] spanID; + + public byte[] parentID; + + public byte samplingDecision; + + + /** Default constructor */ + public Span() { + init(); + } + + private static final byte[] _zeroBytes = new byte[0]; + + /** Colfer zero values. */ + private void init() { + traceID = _zeroBytes; + spanID = _zeroBytes; + parentID = _zeroBytes; + } + + /** + * {@link #reset(InputStream) Reusable} deserialization of Colfer streams. + */ + public static class Unmarshaller { + + /** The data source. */ + protected InputStream in; + + /** The read buffer. */ + public byte[] buf; + + /** The {@link #buf buffer}'s data start index, inclusive. */ + protected int offset; + + /** The {@link #buf buffer}'s data end index, exclusive. */ + protected int i; + + + /** + * @param in the data source or {@code null}. + * @param buf the initial buffer or {@code null}. + */ + public Unmarshaller(InputStream in, byte[] buf) { + // TODO: better size estimation + if (buf == null || buf.length == 0) + buf = new byte[Math.min(Span.colferSizeMax, 2048)]; + this.buf = buf; + reset(in); + } + + /** + * Reuses the marshaller. + * @param in the data source or {@code null}. + * @throws IllegalStateException on pending data. + */ + public void reset(InputStream in) { + if (this.i != this.offset) throw new IllegalStateException("colfer: pending data"); + this.in = in; + this.offset = 0; + this.i = 0; + } + + /** + * Deserializes the following object. + * @return the result or {@code null} when EOF. + * @throws IOException from the input stream. + * @throws SecurityException on an upper limit breach defined by {@link #colferSizeMax}. + * @throws InputMismatchException when the data does not match this object's schema. + */ + public Span next() throws IOException { + if (in == null) return null; + + while (true) { + if (this.i > this.offset) { + try { + Span o = new Span(); + this.offset = o.unmarshal(this.buf, this.offset, this.i); + return o; + } catch (BufferUnderflowException e) { + } + } + // not enough data + + if (this.i <= this.offset) { + this.offset = 0; + this.i = 0; + } else if (i == buf.length) { + byte[] src = this.buf; + // TODO: better size estimation + if (offset == 0) this.buf = new byte[Math.min(Span.colferSizeMax, this.buf.length * 4)]; + System.arraycopy(src, this.offset, this.buf, 0, this.i - this.offset); + this.i -= this.offset; + this.offset = 0; + } + assert this.i < this.buf.length; + + int n = in.read(buf, i, buf.length - i); + if (n < 0) { + if (this.i > this.offset) + throw new InputMismatchException("colfer: pending data with EOF"); + return null; + } + assert n > 0; + i += n; + } + } + + } + + + /** + * Serializes the object. + * @param out the data destination. + * @param buf the initial buffer or {@code null}. + * @return the final buffer. When the serial fits into {@code buf} then the return is {@code buf}. + * Otherwise the return is a new buffer, large enough to hold the whole serial. + * @throws IOException from {@code out}. + * @throws IllegalStateException on an upper limit breach defined by {@link #colferSizeMax}. + */ + public byte[] marshal(OutputStream out, byte[] buf) throws IOException { + // TODO: better size estimation + if (buf == null || buf.length == 0) + buf = new byte[Math.min(Span.colferSizeMax, 2048)]; + + while (true) { + int i; + try { + i = marshal(buf, 0); + } catch (BufferOverflowException e) { + buf = new byte[Math.min(Span.colferSizeMax, buf.length * 4)]; + continue; + } + + out.write(buf, 0, i); + return buf; + } + } + + /** + * Serializes the object. + * @param buf the data destination. + * @param offset the initial index for {@code buf}, inclusive. + * @return the final index for {@code buf}, exclusive. + * @throws BufferOverflowException when {@code buf} is too small. + * @throws IllegalStateException on an upper limit breach defined by {@link #colferSizeMax}. + */ + public int marshal(byte[] buf, int offset) { + int i = offset; + + try { + if (this.traceID.length != 0) { + buf[i++] = (byte) 0; + + int size = this.traceID.length; + if (size > Span.colferSizeMax) + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/span.Span.traceID size %d exceeds %d bytes", size, Span.colferSizeMax)); + + int x = size; + while (x > 0x7f) { + buf[i++] = (byte) (x | 0x80); + x >>>= 7; + } + buf[i++] = (byte) x; + + int start = i; + i += size; + System.arraycopy(this.traceID, 0, buf, start, size); + } + + if (this.spanID.length != 0) { + buf[i++] = (byte) 1; + + int size = this.spanID.length; + if (size > Span.colferSizeMax) + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/span.Span.spanID size %d exceeds %d bytes", size, Span.colferSizeMax)); + + int x = size; + while (x > 0x7f) { + buf[i++] = (byte) (x | 0x80); + x >>>= 7; + } + buf[i++] = (byte) x; + + int start = i; + i += size; + System.arraycopy(this.spanID, 0, buf, start, size); + } + + if (this.parentID.length != 0) { + buf[i++] = (byte) 2; + + int size = this.parentID.length; + if (size > Span.colferSizeMax) + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/span.Span.parentID size %d exceeds %d bytes", size, Span.colferSizeMax)); + + int x = size; + while (x > 0x7f) { + buf[i++] = (byte) (x | 0x80); + x >>>= 7; + } + buf[i++] = (byte) x; + + int start = i; + i += size; + System.arraycopy(this.parentID, 0, buf, start, size); + } + + if (this.samplingDecision != 0) { + buf[i++] = (byte) 3; + buf[i++] = this.samplingDecision; + } + + buf[i++] = (byte) 0x7f; + return i; + } catch (ArrayIndexOutOfBoundsException e) { + if (i - offset > Span.colferSizeMax) + throw new IllegalStateException(format("colfer: kamon/context/generated/binary/span.Span exceeds %d bytes", Span.colferSizeMax)); + if (i > buf.length) throw new BufferOverflowException(); + throw e; + } + } + + /** + * Deserializes the object. + * @param buf the data source. + * @param offset the initial index for {@code buf}, inclusive. + * @return the final index for {@code buf}, exclusive. + * @throws BufferUnderflowException when {@code buf} is incomplete. (EOF) + * @throws SecurityException on an upper limit breach defined by {@link #colferSizeMax}. + * @throws InputMismatchException when the data does not match this object's schema. + */ + public int unmarshal(byte[] buf, int offset) { + return unmarshal(buf, offset, buf.length); + } + + /** + * Deserializes the object. + * @param buf the data source. + * @param offset the initial index for {@code buf}, inclusive. + * @param end the index limit for {@code buf}, exclusive. + * @return the final index for {@code buf}, exclusive. + * @throws BufferUnderflowException when {@code buf} is incomplete. (EOF) + * @throws SecurityException on an upper limit breach defined by {@link #colferSizeMax}. + * @throws InputMismatchException when the data does not match this object's schema. + */ + public int unmarshal(byte[] buf, int offset, int end) { + if (end > buf.length) end = buf.length; + int i = offset; + + try { + byte header = buf[i++]; + + if (header == (byte) 0) { + int size = 0; + for (int shift = 0; true; shift += 7) { + byte b = buf[i++]; + size |= (b & 0x7f) << shift; + if (shift == 28 || b >= 0) break; + } + if (size < 0 || size > Span.colferSizeMax) + throw new SecurityException(format("colfer: kamon/context/generated/binary/span.Span.traceID size %d exceeds %d bytes", size, Span.colferSizeMax)); + + this.traceID = new byte[size]; + int start = i; + i += size; + System.arraycopy(buf, start, this.traceID, 0, size); + + header = buf[i++]; + } + + if (header == (byte) 1) { + int size = 0; + for (int shift = 0; true; shift += 7) { + byte b = buf[i++]; + size |= (b & 0x7f) << shift; + if (shift == 28 || b >= 0) break; + } + if (size < 0 || size > Span.colferSizeMax) + throw new SecurityException(format("colfer: kamon/context/generated/binary/span.Span.spanID size %d exceeds %d bytes", size, Span.colferSizeMax)); + + this.spanID = new byte[size]; + int start = i; + i += size; + System.arraycopy(buf, start, this.spanID, 0, size); + + header = buf[i++]; + } + + if (header == (byte) 2) { + int size = 0; + for (int shift = 0; true; shift += 7) { + byte b = buf[i++]; + size |= (b & 0x7f) << shift; + if (shift == 28 || b >= 0) break; + } + if (size < 0 || size > Span.colferSizeMax) + throw new SecurityException(format("colfer: kamon/context/generated/binary/span.Span.parentID size %d exceeds %d bytes", size, Span.colferSizeMax)); + + this.parentID = new byte[size]; + int start = i; + i += size; + System.arraycopy(buf, start, this.parentID, 0, size); + + header = buf[i++]; + } + + if (header == (byte) 3) { + this.samplingDecision = buf[i++]; + header = buf[i++]; + } + + if (header != (byte) 0x7f) + throw new InputMismatchException(format("colfer: unknown header at byte %d", i - 1)); + } finally { + if (i > end && end - offset < Span.colferSizeMax) throw new BufferUnderflowException(); + if (i < 0 || i - offset > Span.colferSizeMax) + throw new SecurityException(format("colfer: kamon/context/generated/binary/span.Span exceeds %d bytes", Span.colferSizeMax)); + if (i > end) throw new BufferUnderflowException(); + } + + return i; + } + + // {@link Serializable} version number. + private static final long serialVersionUID = 4L; + + // {@link Serializable} Colfer extension. + private void writeObject(ObjectOutputStream out) throws IOException { + // TODO: better size estimation + byte[] buf = new byte[1024]; + int n; + while (true) try { + n = marshal(buf, 0); + break; + } catch (BufferUnderflowException e) { + buf = new byte[4 * buf.length]; + } + + out.writeInt(n); + out.write(buf, 0, n); + } + + // {@link Serializable} Colfer extension. + private void readObject(ObjectInputStream in) throws ClassNotFoundException, IOException { + init(); + + int n = in.readInt(); + byte[] buf = new byte[n]; + in.readFully(buf); + unmarshal(buf, 0); + } + + // {@link Serializable} Colfer extension. + private void readObjectNoData() throws ObjectStreamException { + init(); + } + + /** + * Gets kamon/context/generated/binary/span.Span.traceID. + * @return the value. + */ + public byte[] getTraceID() { + return this.traceID; + } + + /** + * Sets kamon/context/generated/binary/span.Span.traceID. + * @param value the replacement. + */ + public void setTraceID(byte[] value) { + this.traceID = value; + } + + /** + * Sets kamon/context/generated/binary/span.Span.traceID. + * @param value the replacement. + * @return {link this}. + */ + public Span withTraceID(byte[] value) { + this.traceID = value; + return this; + } + + /** + * Gets kamon/context/generated/binary/span.Span.spanID. + * @return the value. + */ + public byte[] getSpanID() { + return this.spanID; + } + + /** + * Sets kamon/context/generated/binary/span.Span.spanID. + * @param value the replacement. + */ + public void setSpanID(byte[] value) { + this.spanID = value; + } + + /** + * Sets kamon/context/generated/binary/span.Span.spanID. + * @param value the replacement. + * @return {link this}. + */ + public Span withSpanID(byte[] value) { + this.spanID = value; + return this; + } + + /** + * Gets kamon/context/generated/binary/span.Span.parentID. + * @return the value. + */ + public byte[] getParentID() { + return this.parentID; + } + + /** + * Sets kamon/context/generated/binary/span.Span.parentID. + * @param value the replacement. + */ + public void setParentID(byte[] value) { + this.parentID = value; + } + + /** + * Sets kamon/context/generated/binary/span.Span.parentID. + * @param value the replacement. + * @return {link this}. + */ + public Span withParentID(byte[] value) { + this.parentID = value; + return this; + } + + /** + * Gets kamon/context/generated/binary/span.Span.samplingDecision. + * @return the value. + */ + public byte getSamplingDecision() { + return this.samplingDecision; + } + + /** + * Sets kamon/context/generated/binary/span.Span.samplingDecision. + * @param value the replacement. + */ + public void setSamplingDecision(byte value) { + this.samplingDecision = value; + } + + /** + * Sets kamon/context/generated/binary/span.Span.samplingDecision. + * @param value the replacement. + * @return {link this}. + */ + public Span withSamplingDecision(byte value) { + this.samplingDecision = value; + return this; + } + + @Override + public final int hashCode() { + int h = 1; + for (byte b : this.traceID) h = 31 * h + b; + for (byte b : this.spanID) h = 31 * h + b; + for (byte b : this.parentID) h = 31 * h + b; + h = 31 * h + (this.samplingDecision & 0xff); + return h; + } + + @Override + public final boolean equals(Object o) { + return o instanceof Span && equals((Span) o); + } + + public final boolean equals(Span o) { + if (o == null) return false; + if (o == this) return true; + return o.getClass() == Span.class + && java.util.Arrays.equals(this.traceID, o.traceID) + && java.util.Arrays.equals(this.spanID, o.spanID) + && java.util.Arrays.equals(this.parentID, o.parentID) + && this.samplingDecision == o.samplingDecision; + } + +} |