package org.infinispan.lucene.impl; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.infinispan.atomic.Delta; import org.infinispan.atomic.DeltaAware; import org.infinispan.commons.io.UnsignedNumeric; import org.infinispan.commons.marshall.AbstractExternalizer; /** * {@link org.infinispan.atomic.Delta} implementation for {@link org.infinispan.lucene.impl.FileListCacheValue} * * @author gustavonalle * @since 7.0 */ public class FileListCacheValueDelta implements Delta { private final List<Operation> ops; FileListCacheValueDelta(List<Operation> ops) { this.ops = ops; } FileListCacheValueDelta() { this.ops = new ArrayList<>(); } @Override public DeltaAware merge(DeltaAware deltaAware) { FileListCacheValue other; if (deltaAware instanceof FileListCacheValue) { other = (FileListCacheValue) deltaAware; } else { other = new FileListCacheValue(); } other.apply(ops); return other; } List<Operation> getOps() { return ops; } void addOperation(String element) { ops.add(new AddOperation(element)); } void removeOperation(String element) { AddOperation addOp = new AddOperation(element); if (ops.contains(addOp)) { ops.remove(addOp); } else { ops.add(new DeleteOperation(element)); } } void discardOps() { ops.clear(); } public static final class Externalizer extends AbstractExternalizer<FileListCacheValueDelta> { @Override public Set<Class<? extends FileListCacheValueDelta>> getTypeClasses() { Set<Class<? extends FileListCacheValueDelta>> classes = new HashSet<>(); classes.add(FileListCacheValueDelta.class); return classes; } @Override public void writeObject(ObjectOutput output, FileListCacheValueDelta object) throws IOException { int size = object.ops.size(); UnsignedNumeric.writeUnsignedInt(output, size); for (int i = 0; i < size; i++) { output.writeObject(object.ops.get(i)); } } @Override public FileListCacheValueDelta readObject(ObjectInput input) throws IOException, ClassNotFoundException { int size = UnsignedNumeric.readUnsignedInt(input); ArrayList<Operation> operations = new ArrayList<>(size); for (int i = 0; i < size; i++) { operations.add((Operation) input.readObject()); } return new FileListCacheValueDelta(operations); } } }