package serializers.xml; import com.fasterxml.aalto.stax.InputFactoryImpl; import com.fasterxml.aalto.stax.OutputFactoryImpl; import data.media.MediaContent; import serializers.*; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class JaxbAalto<T> extends Serializer<T> { public static void register(TestGroups groups) { groups.media.add(JavaBuiltIn.mediaTransformer, new JaxbAalto<>("xml/JAXB/aalto", MediaContent.class, new InputFactoryImpl(), new OutputFactoryImpl()), new SerFeatures( SerFormat.XML, SerGraph.FULL_GRAPH, SerClass.CLASSES_KNOWN, "" ) ); } private final String name; private final XMLInputFactory inputFactory; private final XMLOutputFactory outputFactory; private final JAXBContext jaxbContext; @SuppressWarnings("UnusedParameters") public JaxbAalto(String name, Class<T> clazz, XMLInputFactory inputF, XMLOutputFactory outputF) { this.name = name; inputFactory = inputF; outputFactory = outputF; try { jaxbContext = JAXBContext.newInstance(MediaContent.class); } catch (JAXBException e) { throw new IllegalStateException(e); } } @Override public String getName() { return name; } @Override public byte[] serialize(T data) throws IOException { ByteArrayOutputStream baos = outputStream(data); try { XMLStreamWriter sw = outputFactory.createXMLStreamWriter(baos, "UTF-8"); jaxbContext.createMarshaller().marshal(data, sw); sw.close(); } catch (Exception e) { throw new IOException(e); } return baos.toByteArray(); } @Override public T deserialize(byte[] data) throws Exception { try { XMLStreamReader sr = inputFactory.createXMLStreamReader(new ByteArrayInputStream(data)); @SuppressWarnings("unchecked") T result = (T) jaxbContext.createUnmarshaller().unmarshal(sr); sr.close(); return result; } catch (Exception e) { throw new IOException(e); } } }