/* * JBoss, Home of Professional Open Source * Copyright 2010 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.util; import org.infinispan.marshall.AbstractExternalizer; import org.infinispan.marshall.Ids; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.Serializable; import java.util.Arrays; import java.util.Set; /** * Wrapper class for byte[] keys. * * The class can be marshalled either via its externalizer or via the JVM * serialization. The reason for supporting both methods is to enable * third-party libraries to be able to marshall/unmarshall them using standard * JVM serialization rules. The Infinispan marshalling layer will always * chose the most performant one, aka the externalizer method. * * @author Galder ZamarreƱo * @since 4.1 */ public final class ByteArrayKey implements Serializable { private static final long serialVersionUID = 7305972805432411725L; private final byte[] data; private final int hashCode; public ByteArrayKey(byte[] data) { this.data = data; this.hashCode = 41 + Arrays.hashCode(data); } public byte[] getData() { return data; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || ByteArrayKey.class != obj.getClass()) return false; ByteArrayKey key = (ByteArrayKey) obj; return Arrays.equals(key.data, this.data); } @Override public int hashCode() { return hashCode; } @Override public String toString() { return new StringBuilder().append("ByteArrayKey").append("{") .append("data=").append(Util.printArray(data, true)) .append("}").toString(); } public static class Externalizer extends AbstractExternalizer<ByteArrayKey> { @Override public void writeObject(ObjectOutput output, ByteArrayKey key) throws IOException { output.writeInt(key.data.length); output.write(key.data); } @Override public ByteArrayKey readObject(ObjectInput input) throws IOException, ClassNotFoundException { byte[] data = new byte[input.readInt()]; input.readFully(data); return new ByteArrayKey(data); } @Override public Integer getId() { return Ids.BYTE_ARRAY_KEY; } @Override public Set<Class<? extends ByteArrayKey>> getTypeClasses() { return Util.<Class<? extends ByteArrayKey>>asSet(ByteArrayKey.class); } } }