package serializers; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import data.media.*; public final class JavaManual { public static void register(TestGroups groups) { groups.media.add(JavaBuiltIn.mediaTransformer, new MediaContentSerializer(), new SerFeatures( SerFormat.BINARY, SerGraph.FLAT_TREE, SerClass.MANUAL_OPT, "" ) ); } // ------------------------------------------------------------ // Serializer (just one) private static final class MediaContentSerializer extends Serializer<MediaContent> { public MediaContentSerializer() { super(); } public String getName() { return "java-manual"; } public MediaContent deserialize(byte[] array) throws IOException { return readMediaContent(new DataInputStream(new ByteArrayInputStream(array))); } public byte[] serialize(MediaContent data) throws IOException { ByteArrayOutputStream baos = outputStream(data); DataOutputStream oos = new DataOutputStream(baos); writeMediaContent(oos, data); oos.flush(); return baos.toByteArray(); } @Override public final void serializeItems(MediaContent[] items, OutputStream out0) throws IOException { DataOutputStream out = new DataOutputStream(out0); for (int i = 0, len = items.length; i < len; ++i) { writeMediaContent(out, items[i]); } out.flush(); } @Override public MediaContent[] deserializeItems(InputStream in0, int numberOfItems) throws IOException { DataInputStream in = new DataInputStream(in0); MediaContent[] result = new MediaContent[numberOfItems]; for (int i = 0; i < numberOfItems; ++i) { result[i] = readMediaContent(in); } return result; } // MediaContent private static MediaContent readMediaContent(DataInputStream in) throws IOException { Media media = readMedia(in); int numImages = in.readInt(); ArrayList<Image> images = new ArrayList<Image>(numImages); for (int i = 0; i < numImages; i++) { images.add(readImage(in)); } return new MediaContent(media, images); } private static void writeMediaContent(DataOutputStream out, MediaContent m) throws IOException { writeMedia(out, m.media); out.writeInt(m.images.size()); for (Image im : m.images) { writeImage(out, im); } } // Media private static Media readMedia(DataInputStream in) throws IOException { String uri = in.readUTF(); String title = readMaybeString(in); int width = in.readInt(); int height = in.readInt(); String format = in.readUTF(); long duration = in.readLong(); long size = in.readLong(); boolean hasBitrate = in.readBoolean(); int bitrate = 0; if (hasBitrate) bitrate = in.readInt(); int numPersons = in.readInt(); ArrayList<String> persons = new ArrayList<String>(numPersons); for (int i = 0; i < numPersons; i++) { persons.add(in.readUTF()); } Media.Player player = Media.Player.values()[in.readByte()]; String copyright = readMaybeString(in); return new Media( uri, title, width, height, format, duration, size, bitrate, hasBitrate, persons, player, copyright); } private static void writeMedia(DataOutputStream out, Media m) throws IOException { out.writeUTF(m.uri); writeMaybeString(out, m.title); out.writeInt(m.width); out.writeInt(m.height); out.writeUTF(m.format); out.writeLong(m.duration); out.writeLong(m.size); writeMaybeInt(out, m.hasBitrate, m.bitrate); out.writeInt(m.persons.size()); for (String p : m.persons) { out.writeUTF(p); } out.writeByte(m.player.ordinal()); writeMaybeString(out, m.copyright); } // Image private static Image readImage(DataInputStream in) throws IOException { String uri = in.readUTF(); String title = readMaybeString(in); int width = in.readInt(); int height = in.readInt(); Image.Size size = Image.Size.values()[in.readByte()]; return new Image(uri, title, width, height, size); } private static void writeImage(DataOutputStream out, Image im) throws IOException { out.writeUTF(im.uri); writeMaybeString(out, im.title); out.writeInt(im.width); out.writeInt(im.height); out.writeByte(im.size.ordinal()); } } public static void writeMaybeString(DataOutputStream out, String s) throws IOException { if (s != null) { out.writeBoolean(true); out.writeUTF(s); } else { out.writeBoolean(false); } } public static String readMaybeString(DataInputStream in) throws IOException { if (in.readBoolean()) { return in.readUTF(); } else { return null; } } public static void writeMaybeInt(DataOutputStream out, boolean exists, int value) throws IOException { if (exists) { out.writeBoolean(true); out.writeInt(value); } else { out.writeBoolean(false); } } }