package org.infinispan.interceptors.distribution; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Set; import org.infinispan.commons.marshall.AdvancedExternalizer; import org.infinispan.commons.marshall.Ids; import org.infinispan.commons.util.Util; import org.infinispan.container.versioning.EntryVersion; public class VersionedResults { public final Object[] values; public final EntryVersion[] versions; public VersionedResults(Object[] values, EntryVersion[] versions) { this.values = values; this.versions = versions; } @Override public String toString() { StringBuilder sb = new StringBuilder("VersionedResults{"); for (int i = 0; i < values.length; ++i) { sb.append(values[i]).append(" (").append(versions[i]).append(')'); if (i != values.length - 1) sb.append(", "); } sb.append('}'); return sb.toString(); } public static class Externalizer implements AdvancedExternalizer<VersionedResults> { @Override public Set<Class<? extends VersionedResults>> getTypeClasses() { return Util.asSet(VersionedResults.class); } @Override public Integer getId() { return Ids.VERSIONED_RESULTS; } @Override public void writeObject(ObjectOutput output, VersionedResults object) throws IOException { output.writeInt(object.values.length); // TODO: we could optimize this if all objects are of the same type for (Object value : object.values) output.writeObject(value); for (EntryVersion version : object.versions) output.writeObject(version); } @Override public VersionedResults readObject(ObjectInput input) throws IOException, ClassNotFoundException { int length = input.readInt(); Object[] values = new Object[length]; for (int i = 0; i < length; ++i) { values[i] = input.readObject(); } EntryVersion[] versions = new EntryVersion[length]; for (int i = 0; i < length; ++i) { versions[i] = (EntryVersion) input.readObject(); } return new VersionedResults(values, versions); } } }