package org.infinispan.server.hotrod;
import java.io.IOException;
import org.infinispan.commons.CacheException;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.commons.marshall.jboss.GenericJBossMarshaller;
import org.infinispan.compat.TypeConverter;
import org.infinispan.context.Flag;
/**
* Hot Rod type converter for compatibility mode.
*
* @author Galder ZamarreƱo
* @since 5.3
*/
public class HotRodTypeConverter implements TypeConverter<Object, Object, Object, Object> {
// Default marshaller is the one used by the Hot Rod client,
// but can be configured for compatibility use cases
private Marshaller marshaller;
public HotRodTypeConverter() {
this(null);
}
public HotRodTypeConverter(Marshaller marshaller) {
if (marshaller == null) {
this.marshaller = new GenericJBossMarshaller();
} else {
this.marshaller = marshaller;
}
}
@Override
public Object boxKey(Object key) {
return unmarshall(key);
}
@Override
public Object boxValue(Object value) {
return unmarshall(value);
}
@Override
public Object unboxKey(Object target) {
return marshall(target);
}
@Override
public Object unboxValue(Object target) {
return marshall(target);
}
@Override
public boolean supportsInvocation(Flag flag) {
return flag == Flag.OPERATION_HOTROD;
}
@Override
public void setMarshaller(Marshaller marshaller) {
this.marshaller = marshaller;
}
private Object unmarshall(Object source) {
if (source instanceof byte[]) {
try {
return marshaller.objectFromByteBuffer((byte[]) source);
} catch (IOException | ClassNotFoundException e) {
throw new CacheException(e);
}
} else {
return source;
}
}
private Object marshall(Object source) {
if (source != null) {
try {
if (marshaller.isMarshallable(source)) {
return marshaller.objectToByteBuffer(source);
} else {
return source;
}
} catch (Exception e) {
throw new CacheException(e);
}
} else return null;
}
}