package org.infinispan.tools.jdbc.migrator.marshaller.externalizers;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.infinispan.commons.marshall.AbstractExternalizer;
import org.infinispan.commons.marshall.MarshallUtil;
import org.infinispan.commons.util.Util;
import org.infinispan.marshall.core.Ids;
import org.jboss.marshalling.util.IdentityIntMap;
import net.jcip.annotations.Immutable;
/**
* List externalizer dealing with ArrayList and LinkedList implementations.
*
* @author Galder ZamarreƱo
* @since 4.0
*/
@Immutable
public class ListExternalizer extends AbstractExternalizer<List> {
private static final int ARRAY_LIST = 0;
private static final int LINKED_LIST = 1;
private final IdentityIntMap<Class<?>> numbers = new IdentityIntMap<>(2);
public ListExternalizer() {
numbers.put(ArrayList.class, ARRAY_LIST);
numbers.put(getPrivateArrayListClass(), ARRAY_LIST);
numbers.put(LinkedList.class, LINKED_LIST);
}
@Override
public void writeObject(ObjectOutput output, List list) throws IOException {
int number = numbers.get(list.getClass(), -1);
output.writeByte(number);
MarshallUtil.marshallCollection(list, output);
}
@Override
public List readObject(ObjectInput input) throws IOException, ClassNotFoundException {
int magicNumber = input.readUnsignedByte();
switch (magicNumber) {
case ARRAY_LIST:
return MarshallUtil.unmarshallCollection(input, ArrayList::new);
case LINKED_LIST:
return MarshallUtil.unmarshallCollection(input, s -> new LinkedList<>());
default:
throw new IllegalStateException("Unknown List type: " + magicNumber);
}
}
@Override
public Integer getId() {
return LegacyIds.ARRAY_LIST;
}
@Override
public Set<Class<? extends List>> getTypeClasses() {
return Util.asSet(ArrayList.class, LinkedList.class,
getPrivateArrayListClass());
}
private Class<List> getPrivateArrayListClass() {
return Util.<List>loadClass("java.util.Arrays$ArrayList", List.class.getClassLoader());
}
}