package org.infinispan.query.remote.impl.filter; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Collections; import java.util.Set; import org.infinispan.commons.marshall.AbstractExternalizer; import org.infinispan.query.remote.client.FilterResult; import org.infinispan.query.remote.impl.ExternalizerIds; /** * A 'remote' FilterResult needs jboss-marshalling serializability between nodes when running in compat mode. * It will only be marshalled using protobuf before passing it to the remote client. * * @author anistor@redhat.com * @since 9.0 */ public final class FilterResultExternalizer extends AbstractExternalizer<FilterResult> { @Override public void writeObject(ObjectOutput output, FilterResult filterResult) throws IOException { Object[] projection = filterResult.getProjection(); if (projection == null) { // skip marshalling the instance if there is a projection output.writeInt(-1); output.writeObject(filterResult.getInstance()); } else { output.writeInt(projection.length); for (Object prj : projection) { output.writeObject(prj); } } Comparable[] sortProjection = filterResult.getSortProjection(); if (sortProjection == null) { output.writeInt(-1); } else { output.writeInt(sortProjection.length); for (Object prj : sortProjection) { output.writeObject(prj); } } } @Override public FilterResult readObject(ObjectInput input) throws IOException, ClassNotFoundException { Object instance; Object[] projection; Comparable[] sortProjection; int projLen = input.readInt(); if (projLen == -1) { instance = input.readObject(); projection = null; } else { instance = null; projection = new Object[projLen]; for (int i = 0; i < projLen; i++) { projection[i] = input.readObject(); } } int sortProjLen = input.readInt(); if (sortProjLen == -1) { sortProjection = null; } else { sortProjection = new Comparable[sortProjLen]; for (int i = 0; i < sortProjLen; i++) { sortProjection[i] = (Comparable) input.readObject(); } } return new FilterResult(instance, projection, sortProjection); } @Override public Integer getId() { return ExternalizerIds.ICKLE_FILTER_RESULT; } @Override public Set<Class<? extends FilterResult>> getTypeClasses() { return Collections.singleton(FilterResult.class); } }