package serializers;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import data.media.Image;
import data.media.Media;
import data.media.MediaContent;
import data.media.MediaContentCustom;
import net.sockali.obser.ObserEncoding;
import net.sockali.obser.ObserFactory;
@SuppressWarnings("unchecked")
public class Obser {
public static void register (TestGroups groups) {
register(groups.media, JavaBuiltIn.mediaTransformer);
}
private static <T, S> void register (TestGroup<?> group, Transformer transformer) {
group.add(transformer, new BasicSerializer<S>(),
new SerFeatures(
SerFormat.BINARY,
SerGraph.FULL_GRAPH,
SerClass.CLASSES_KNOWN,
""
)
);
group.add(transformer, new CompactSerializer<S>(),
new SerFeatures(
SerFormat.BINARY,
SerGraph.FULL_GRAPH,
SerClass.CLASSES_KNOWN,
""
)
);
group.add(transformer, new CustomSerializer(),
new SerFeatures(
SerFormat.BINARY,
SerGraph.FULL_GRAPH,
SerClass.MANUAL_OPT,
""
)
);
group.add(transformer, new CustomCompactSerializer(),
new SerFeatures(
SerFormat.BINARY,
SerGraph.FULL_GRAPH,
SerClass.MANUAL_OPT,
""
)
);
}
// ------------------------------------------------------------
// Serializers
public static class BasicSerializer<T> extends Serializer<T> {
final net.sockali.obser.Obser obser;
// private final byte[] buffer = new byte[1024*1024];
private ByteBuffer buffer = ByteBuffer.allocateDirect(1024*1024);
public BasicSerializer () {
this.obser = ObserFactory.createObser(ObserEncoding.nativeEncoding());
obser.registerClass(data.media.MediaContentCustom.class);
obser.registerClass(MediaContent.class);
obser.registerClass(Media.class);
obser.registerClass(Media.Player.class);
obser.registerClass(Image.class);
obser.registerClass(Image.Size.class);
obser.registerClass(ArrayList.class);
obser.registerClass(MediaContent[].class);
obser.registerClass(MediaContentCustom[].class);
}
@Override
public T deserialize (byte[] array) {
buffer.position(0);
buffer.put(array);
return (T) obser.deserialize(buffer, 0);
}
@Override
public byte[] serialize (T content) {
buffer.position(0);
int pos = obser.serialize(content, buffer, 0);
byte[] ret = new byte[pos];
buffer.get(ret);
return ret;
}
@Override
public void serializeItems (T[] items, OutputStream outStream) throws Exception {
obser.serialize(items, outStream);
}
@Override
public T[] deserializeItems (InputStream inStream, int numberOfItems) throws IOException {
return obser.deserialize(inStream);
}
@Override
public String getName () {
return "obser";
}
}
public static class CompactSerializer<T> extends BasicSerializer<T> {
public CompactSerializer () {
super();
obser.setEncoding(ObserEncoding.nativeCompactEncoding());
}
@Override
public String getName () {
return "obser-compact";
}
}
public static class CustomSerializer extends BasicSerializer<Object> {
@Override
public byte[] serialize(Object content) {
MediaContentCustom mcc = new MediaContentCustom((MediaContent) content);
return super.serialize(mcc);
}
@Override
public MediaContent deserialize(byte[] array) {
MediaContentCustom mcc = (MediaContentCustom) ((Object) super.deserialize(array));
return mcc.getContent();
}
@Override
public void serializeItems(Object[] items, OutputStream outStream) throws Exception {
MediaContentCustom[] data = new MediaContentCustom[items.length];
for (int i=0; i<items.length; i++)
data[i] = new MediaContentCustom((MediaContent)items[i]);
super.serializeItems((MediaContent[]) (Object)data, outStream);
}
@Override
public MediaContent[] deserializeItems(InputStream inStream, int numberOfItems) throws IOException {
MediaContentCustom[] data = (MediaContentCustom[]) (Object) super.deserializeItems(inStream, numberOfItems);
MediaContent[] items = new MediaContent[data.length];
for (int i=0; i<data.length; i++)
items[i] = data[i].getContent();
return items;
}
@Override
public String getName () {
return "obser-manual";
}
}
public static class CustomCompactSerializer extends CustomSerializer {
public CustomCompactSerializer() {
obser.setEncoding(ObserEncoding.nativeCompactEncoding());
}
@Override
public String getName () {
return "obser-manual-compact";
}
}
}