1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 package com.cedarsoft.serialization.stax;
33
34 import com.cedarsoft.version.Version;
35 import com.cedarsoft.version.VersionRange;
36 import com.cedarsoft.serialization.AbstractXmlSerializer;
37
38 import javax.annotation.Nonnull;
39 import javax.xml.stream.XMLStreamException;
40 import javax.xml.stream.XMLStreamReader;
41 import javax.xml.stream.XMLStreamWriter;
42 import java.io.IOException;
43 import java.io.OutputStream;
44
45
46
47
48
49
50 public abstract class AbstractStaxSerializer<T> extends AbstractStaxBasedSerializer<T, XMLStreamWriter> {
51
52
53
54
55
56
57
58 protected AbstractStaxSerializer( @Nonnull String defaultElementName, @Nonnull String nameSpaceUriBase, @Nonnull VersionRange formatVersionRange ) {
59 super( defaultElementName, nameSpaceUriBase, formatVersionRange );
60 }
61
62 @Override
63 public void serialize( @Nonnull T object, @Nonnull OutputStream out ) throws IOException {
64 try {
65 XMLStreamWriter writer = StaxSupport.getXmlOutputFactory().createXMLStreamWriter( out );
66
67
68 String nameSpace = getNameSpace();
69 writer.setDefaultNamespace( nameSpace );
70
71 writer.writeStartElement( getDefaultElementName() );
72 writer.writeDefaultNamespace( nameSpace );
73
74 serialize( writer, object, getFormatVersion() );
75 writer.writeEndElement();
76
77 writer.close();
78 } catch ( XMLStreamException e ) {
79 throw new IOException( e );
80 }
81 }
82
83
84
85
86
87
88
89
90
91
92
93
94 protected <T> void serializeCollection( @Nonnull Iterable<? extends T> objects, @Nonnull Class<T> type, @Nonnull String elementName, @Nonnull XMLStreamWriter serializeTo, @Nonnull Version formatVersion ) throws XMLStreamException, IOException {
95 AbstractXmlSerializer<? super T, XMLStreamWriter, XMLStreamReader, XMLStreamException> serializer = getSerializer( type );
96 Version resolvedVersion = getDelegatesMappings().resolveVersion( type, formatVersion );
97
98 for ( T object : objects ) {
99 serializeTo.writeStartElement( elementName );
100 serializer.serialize( serializeTo, object, resolvedVersion );
101 serializeTo.writeEndElement();
102 }
103 }
104
105 protected <T> void serializeCollection( @Nonnull Iterable<? extends T> objects, @Nonnull Class<T> type, @Nonnull XMLStreamWriter serializeTo, @Nonnull Version formatVersion ) throws XMLStreamException, IOException {
106 AbstractXmlSerializer<? super T, XMLStreamWriter, XMLStreamReader, XMLStreamException> serializer = getSerializer( type );
107 Version resolvedVersion = getDelegatesMappings().resolveVersion( type, formatVersion );
108
109 for ( T object : objects ) {
110 serializeTo.writeStartElement( serializer.getDefaultElementName() );
111 serializer.serialize( serializeTo, object, resolvedVersion );
112 serializeTo.writeEndElement();
113 }
114 }
115 }