package org.infinispan.commons.marshall.exts;
import org.infinispan.commons.equivalence.AnyEquivalence;
import org.infinispan.commons.equivalence.AnyServerEquivalence;
import org.infinispan.commons.equivalence.ByteArrayEquivalence;
import org.infinispan.commons.equivalence.Equivalence;
import org.infinispan.commons.marshall.AbstractExternalizer;
import org.infinispan.commons.marshall.Ids;
import org.infinispan.commons.util.Util;
import org.jboss.marshalling.util.IdentityIntMap;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Set;
public final class EquivalenceExternalizer extends AbstractExternalizer<Equivalence> {
private static final int BYTE_ARRAY_EQ = 0x00;
private static final int ANY_EQ = 0x01;
private static final int ANY_SERVER_EQ = 0x02;
private final IdentityIntMap<Class<?>> subIds = new IdentityIntMap<>(4);
public EquivalenceExternalizer() {
subIds.put(ByteArrayEquivalence.class, BYTE_ARRAY_EQ);
subIds.put(AnyEquivalence.class, ANY_EQ);
subIds.put(AnyServerEquivalence.class, ANY_SERVER_EQ);
}
@Override
public Set<Class<? extends Equivalence>> getTypeClasses() {
return Util.asSet(ByteArrayEquivalence.class, AnyEquivalence.class,
AnyServerEquivalence.class);
}
@Override
public Integer getId() {
return Ids.EQUIVALENCE;
}
@Override
public void writeObject(ObjectOutput out, Equivalence obj) throws IOException {
int subId = subIds.get(obj.getClass(), -1);
out.writeByte(subId);
}
@Override
public Equivalence readObject(ObjectInput input) throws IOException, ClassNotFoundException {
int subId = input.readUnsignedByte();
switch (subId) {
case BYTE_ARRAY_EQ:
return ByteArrayEquivalence.INSTANCE;
case ANY_EQ:
return AnyEquivalence.getInstance();
case ANY_SERVER_EQ:
return AnyServerEquivalence.INSTANCE;
default:
throw new IllegalStateException("Unknown equivalence type: " + Integer.toHexString(subId));
}
}
}