package org.radargun.stages.cache.generators; import java.io.Serializable; import java.util.Arrays; import java.util.Random; import org.radargun.config.DefinitionElement; /** * @author Radim Vansa <rvansa@redhat.com> */ @DefinitionElement(name = "wrapped-array", doc = "Generates random byte array wrapped in object that correctly implements equals() and hashCode().") public class WrappedArrayValueGenerator implements ValueGenerator { @Override public Object generateValue(Object key, int size, Random r) { return new ByteArrayWrapper(ByteArrayValueGenerator.generateArray(size, r)); } @Override public int sizeOf(Object value) { return ((ByteArrayWrapper) value).array.length; } @Override public boolean checkValue(Object value, Object key, int expectedSize) { if (!(value instanceof ByteArrayWrapper)) return false; ByteArrayWrapper wrapper = (ByteArrayWrapper) value; return wrapper.array != null && (expectedSize <= 0 || wrapper.array.length == expectedSize); } /* Because byte[].equals compares only pointers */ private static class ByteArrayWrapper implements Serializable { private byte[] array; private transient int hashCode = 0; public ByteArrayWrapper(byte[] array) { this.array = array; } @Override public int hashCode() { if (hashCode == 0) { hashCode = 42 + Arrays.hashCode(array); if (hashCode == 0) hashCode = 42; } return hashCode; } @Override public String toString() { return String.format("ByteArray[%d](%db)", hashCode(), array.length); } @Override public boolean equals(Object obj) { if (obj instanceof ByteArrayWrapper) { return Arrays.equals(array, ((ByteArrayWrapper) obj).array); } return false; } } }