package org.infinispan.server.memcached;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.infinispan.commons.marshall.AbstractExternalizer;
import org.infinispan.commons.util.Util;
import org.infinispan.container.versioning.EntryVersion;
import org.jboss.marshalling.util.IdentityIntMap;
/**
* @author wburns
* @since 9.0
*/
public class MemcachedMetadataExternalizer extends AbstractExternalizer<MemcachedMetadata> {
final static int Immortal = 0;
final static int Expirable = 1;
final static IdentityIntMap<Class> numbers = new IdentityIntMap<>(2);
static {
numbers.put(MemcachedMetadata.class, Immortal);
numbers.put(MemcachedExpirableMetadata.class, Expirable);
}
@Override
public Set<Class<? extends MemcachedMetadata>> getTypeClasses() {
return Util.asSet(MemcachedMetadata.class, MemcachedExpirableMetadata.class);
}
@Override
public void writeObject(ObjectOutput output, MemcachedMetadata object) throws IOException {
output.writeLong(object.flags);
output.writeObject(object.version);
int number = numbers.get(object.getClass(), -1);
output.write(number);
if (number == Expirable) {
output.writeLong(object.lifespan());
}
}
@Override
public MemcachedMetadata readObject(ObjectInput input) throws IOException, ClassNotFoundException {
long flags = input.readLong();
EntryVersion version = (EntryVersion) input.readObject();
int number = input.readUnsignedByte();
switch (number) {
case Immortal:
return new MemcachedMetadata(flags, version);
case Expirable:
long lifespan = input.readLong();
return new MemcachedExpirableMetadata(flags, version, lifespan, TimeUnit.MILLISECONDS);
default:
throw new IllegalArgumentException("Number " + number + " not supported!");
}
}
}