/tpc/src/serializers/XStreamSerializer.java

http://thrift-protobuf-compare.googlecode.com/ · Java · 219 lines · 181 code · 37 blank · 1 comment · 8 complexity · c296f875c4226753aa98f3bdaa374a2d MD5 · raw file

  1. package serializers;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import com.thoughtworks.xstream.XStream;
  6. import com.thoughtworks.xstream.converters.Converter;
  7. import com.thoughtworks.xstream.converters.MarshallingContext;
  8. import com.thoughtworks.xstream.converters.UnmarshallingContext;
  9. import com.thoughtworks.xstream.io.HierarchicalStreamReader;
  10. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
  11. import com.thoughtworks.xstream.io.xml.StaxDriver;
  12. import com.thoughtworks.xstream.io.xml.XppDriver;
  13. import serializers.java.Image;
  14. import serializers.java.Media;
  15. import serializers.java.MediaContent;
  16. import serializers.java.Media.Player;
  17. import serializers.java.Image.Size;
  18. import javax.xml.stream.XMLInputFactory;
  19. import javax.xml.stream.XMLOutputFactory;
  20. import java.io.Writer;
  21. import com.thoughtworks.xstream.io.xml.CompactWriter;
  22. public class XStreamSerializer extends StdMediaSerializer
  23. {
  24. private XStream xstream = null;
  25. private String name = "xstream";
  26. public int expectedSize = 0;
  27. public XStreamSerializer(String name, boolean withSpecialConverter, final XMLInputFactory inf, final XMLOutputFactory outf) throws Exception
  28. {
  29. super(name);
  30. if (inf != null && outf != null) {
  31. xstream = new XStream(new StaxDriver() {
  32. public XMLInputFactory getInputFactory() {
  33. return inf;
  34. }
  35. public XMLOutputFactory getOutputFactory() {
  36. return outf;
  37. }
  38. });
  39. } else {
  40. xstream = new XStream(new XppDriver(){
  41. public HierarchicalStreamWriter createWriter(Writer out) {
  42. //return new PrettyPrintWriter(out, xmlFriendlyReplacer());
  43. return new CompactWriter(out, xmlFriendlyReplacer());
  44. }
  45. });
  46. }
  47. if (withSpecialConverter) {
  48. registerConverters();
  49. }
  50. }
  51. public MediaContent deserialize(byte[] array) throws Exception
  52. {
  53. return (MediaContent) xstream.fromXML(new ByteArrayInputStream(array));
  54. }
  55. public byte[] serialize(MediaContent content) throws IOException,
  56. Exception
  57. {
  58. ByteArrayOutputStream baos = new ByteArrayOutputStream(expectedSize);
  59. xstream.toXML(content, baos);
  60. byte[] array = baos.toByteArray();
  61. expectedSize = array.length;
  62. return array;
  63. }
  64. public void registerConverters() throws Exception
  65. {
  66. xstream.alias("im", Image.class);
  67. xstream.registerConverter(new ImageConverter());
  68. xstream.alias("md", Media.class);
  69. xstream.registerConverter(new MediaConverter());
  70. xstream.alias("mc", MediaContent.class);
  71. xstream.registerConverter(new MediaContentConverter());
  72. }
  73. static class MediaContentConverter implements Converter
  74. {
  75. public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context)
  76. {
  77. MediaContent content = (MediaContent) obj;
  78. writer.startNode("md");
  79. context.convertAnother(content.getMedia());
  80. writer.endNode();
  81. writer.startNode("im");
  82. context.convertAnother(content.getImage(0));
  83. writer.endNode();
  84. writer.startNode("im");
  85. context.convertAnother(content.getImage(1));
  86. writer.endNode();
  87. }
  88. public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context)
  89. {
  90. reader.moveDown();
  91. Media media = (Media) context.convertAnother(null, Media.class);
  92. reader.moveUp();
  93. MediaContent content = new MediaContent(media);
  94. reader.moveDown();
  95. content.addImage((Image) context.convertAnother(content, Image.class));
  96. reader.moveUp();
  97. reader.moveDown();
  98. content.addImage((Image) context.convertAnother(content, Image.class));
  99. reader.moveUp();
  100. return content;
  101. }
  102. @SuppressWarnings("unchecked")
  103. public boolean canConvert(Class arg0)
  104. {
  105. return MediaContent.class.equals(arg0);
  106. }
  107. }
  108. static class ImageConverter implements Converter
  109. {
  110. public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context)
  111. {
  112. Image image = (Image) obj;
  113. writer.addAttribute("ul", image.getUri());
  114. writer.addAttribute("tl", image.getTitle());
  115. writer.addAttribute("wd", String.valueOf(image.getWidth()));
  116. writer.addAttribute("hg", String.valueOf(image.getHeight()));
  117. writer.addAttribute("sz", String.valueOf(image.getSize().ordinal()));
  118. }
  119. public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context)
  120. {
  121. Image image = new Image();
  122. image.setUri(reader.getAttribute("ul"));
  123. image.setTitle(reader.getAttribute("tl"));
  124. image.setWidth(Integer.valueOf(reader.getAttribute("wd")));
  125. image.setHeight(Integer.valueOf(reader.getAttribute("hg")));
  126. image.setSize(Size.values()[Integer.valueOf(reader.getAttribute("sz"))]);
  127. return image;
  128. }
  129. @SuppressWarnings("unchecked")
  130. public boolean canConvert(Class arg0)
  131. {
  132. return Image.class.equals(arg0);
  133. }
  134. }
  135. static class MediaConverter implements Converter
  136. {
  137. public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context)
  138. {
  139. Media media = (Media) obj;
  140. writer.addAttribute("pl", String.valueOf(media.getPlayer().ordinal()));
  141. writer.addAttribute("ul", media.getUri());
  142. writer.addAttribute("tl", media.getTitle());
  143. writer.addAttribute("wd", String.valueOf(media.getWidth()));
  144. writer.addAttribute("hg", String.valueOf(media.getHeight()));
  145. writer.addAttribute("fr", media.getFormat());
  146. writer.addAttribute("dr", String.valueOf(media.getDuration()));
  147. writer.addAttribute("sz", String.valueOf(media.getSize()));
  148. writer.addAttribute("br", String.valueOf(media.getBitrate()));
  149. for (String p : media.getPersons())
  150. {
  151. writer.startNode("pr");
  152. writer.setValue(p);
  153. writer.endNode();
  154. }
  155. }
  156. public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context)
  157. {
  158. Media media = new Media();
  159. media.setPlayer(Player.values()[Integer.valueOf(reader.getAttribute("pl"))]);
  160. media.setUri(reader.getAttribute("ul"));
  161. media.setTitle(reader.getAttribute("tl"));
  162. media.setWidth(Integer.valueOf(reader.getAttribute("wd")));
  163. media.setHeight(Integer.valueOf(reader.getAttribute("hg")));
  164. media.setFormat(reader.getAttribute("fr"));
  165. media.setDuration(Long.valueOf(reader.getAttribute("dr")));
  166. media.setSize(Long.valueOf(reader.getAttribute("sz")));
  167. media.setBitrate(Integer.valueOf(reader.getAttribute("br")));
  168. while (reader.hasMoreChildren())
  169. {
  170. reader.moveDown();
  171. media.addToPerson(reader.getValue());
  172. reader.moveUp();
  173. }
  174. return media;
  175. }
  176. @SuppressWarnings("unchecked")
  177. public boolean canConvert(Class arg0)
  178. {
  179. return Media.class.equals(arg0);
  180. }
  181. }
  182. }