package com.kryptnostic.kodex.v1.serialization.crypto;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.commons.codec.binary.StringUtils;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import com.kryptnostic.kodex.v1.models.blocks.ChunkingStrategy;
/**
* @author sinaiman
*
*/
public class JsonChunkingStrategy implements ChunkingStrategy {
@JsonCreator
public JsonChunkingStrategy() {
}
@Override
@JsonIgnore
/**
* Note: this doesn't split anything
*/
public <T> Iterable<byte[]> split( T object ) throws IOException {
ObjectMapper mapper = Encryptable.getMapper();
byte[] bytes = null;
try {
if ( object instanceof String ) {
bytes = StringUtils.getBytesUtf8( (String) object );
} else {
bytes = mapper.writeValueAsBytes( object );
}
} catch ( JsonProcessingException e ) {
throw new IOException( e );
}
return Lists.newArrayList( bytes );
}
@Override
@JsonIgnore
public <T> T join( Iterable<byte[]> blocks, Class<T> klass ) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
for ( byte[] b : blocks ) {
baos.write( b );
}
ObjectMapper mapper = Encryptable.getMapper();
T plainData = null;
if ( klass.isAssignableFrom( String.class ) ) {
plainData = (T) StringUtils.newStringUtf8( baos.toByteArray() );
} else {
plainData = mapper.<T> readValue( baos.toByteArray(), klass );
}
return plainData;
}
@Override
@JsonIgnore
public int getLength() {
return -1;
}
}