package org.infinispan.tools.jdbc.migrator.marshaller; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.OutputStream; import java.util.Map; import org.infinispan.commons.io.ByteBuffer; import org.infinispan.commons.marshall.AbstractMarshaller; import org.infinispan.commons.marshall.AdvancedExternalizer; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.util.logging.Log; import org.infinispan.util.logging.LogFactory; /** * LegacyVersionAwareMarshaller that is used to read bytes marshalled using Infinispan 8.x. This is useful for providing * a migration path between 8.x and 9.x stores. */ public class LegacyVersionAwareMarshaller extends AbstractMarshaller implements StreamingMarshaller { private static final Log log = LogFactory.getLog(LegacyVersionAwareMarshaller.class); private final LegacyJBossMarshaller defaultMarshaller; public LegacyVersionAwareMarshaller(Map<Integer, ? extends AdvancedExternalizer<?>> externalizerMap) { this.defaultMarshaller = new LegacyJBossMarshaller(this, externalizerMap); } @Override public void stop() { } @Override public void start() { } @Override protected ByteBuffer objectToBuffer(Object obj, int estimatedSize) throws IOException, InterruptedException { throw new UnsupportedOperationException(); } @Override public Object objectFromByteBuffer(byte[] bytes, int offset, int len) throws IOException, ClassNotFoundException { ByteArrayInputStream is = new ByteArrayInputStream(bytes, offset, len); ObjectInput in = startObjectInput(is, false); Object o = null; try { o = defaultMarshaller.objectFromObjectStream(in); } finally { finishObjectInput(in); } return o; } @Override public ObjectInput startObjectInput(InputStream is, boolean isReentrant) throws IOException { ObjectInput in = defaultMarshaller.startObjectInput(is, isReentrant); try { in.readShort(); } catch (Exception e) { finishObjectInput(in); log.unableToReadVersionId(); throw new IOException("Unable to read version id from first two bytes of stream: " + e.getMessage()); } return in; } @Override public void finishObjectInput(ObjectInput oi) { defaultMarshaller.finishObjectInput(oi); } @Override public boolean isMarshallable(Object o) throws Exception { return defaultMarshaller.isMarshallable(o); } @Override public Object objectFromObjectStream(ObjectInput in) throws IOException, ClassNotFoundException, InterruptedException { throw new UnsupportedOperationException(); } @Override public ObjectOutput startObjectOutput(OutputStream os, boolean isReentrant, final int estimatedSize) throws IOException { throw new UnsupportedOperationException(); } @Override public void finishObjectOutput(ObjectOutput oo) { throw new UnsupportedOperationException(); } @Override public void objectToObjectStream(Object obj, ObjectOutput out) throws IOException { throw new UnsupportedOperationException(); } }