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.ContinuousQueryResult; import org.infinispan.query.remote.impl.ExternalizerIds; /** * A 'remote' ContinuousQueryResult 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 ContinuousQueryResultExternalizer extends AbstractExternalizer<ContinuousQueryResult> { @Override public void writeObject(ObjectOutput output, ContinuousQueryResult continuousQueryResult) throws IOException { output.writeInt(continuousQueryResult.getResultType().ordinal()); output.writeInt(continuousQueryResult.getKey().length); output.write(continuousQueryResult.getKey()); if (continuousQueryResult.getResultType() != ContinuousQueryResult.ResultType.LEAVING) { Object[] projection = continuousQueryResult.getProjection(); if (projection == null) { output.writeInt(continuousQueryResult.getValue().length); output.writeObject(continuousQueryResult.getValue()); } else { // skip serializing the instance if there is a projection output.writeInt(-1); int projLen = projection.length; output.writeInt(projLen); for (Object prj : projection) { output.writeObject(prj); } } } } @Override public ContinuousQueryResult readObject(ObjectInput input) throws IOException, ClassNotFoundException { ContinuousQueryResult.ResultType resultType = ContinuousQueryResult.ResultType.values()[input.readInt()]; int keyLen = input.readInt(); byte[] key = new byte[keyLen]; input.readFully(key); byte[] value = null; Object[] projection = null; if (resultType != ContinuousQueryResult.ResultType.LEAVING) { int valueLen = input.readInt(); if (valueLen == -1) { int projLen = input.readInt(); projection = new Object[projLen]; for (int i = 0; i < projLen; i++) { projection[i] = input.readObject(); } } else { value = new byte[valueLen]; input.readFully(value); } } return new ContinuousQueryResult(resultType, key, value, projection); } @Override public Integer getId() { return ExternalizerIds.ICKLE_CONTINUOUS_QUERY_RESULT; } @Override public Set<Class<? extends ContinuousQueryResult>> getTypeClasses() { return Collections.singleton(ContinuousQueryResult.class); } }