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 package gov.nist.secauto.metaschema.core.datatype.markup.flexmark;
28
29 import com.vladsch.flexmark.parser.ListOptions;
30
31 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
32 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
33
34 import org.codehaus.stax2.evt.XMLEventFactory2;
35
36 import java.util.List;
37 import java.util.Map;
38 import java.util.Objects;
39 import java.util.stream.Collectors;
40
41 import javax.xml.namespace.QName;
42 import javax.xml.stream.XMLEventWriter;
43 import javax.xml.stream.XMLStreamException;
44 import javax.xml.stream.events.Attribute;
45 import javax.xml.stream.events.EndElement;
46 import javax.xml.stream.events.StartElement;
47
48 import edu.umd.cs.findbugs.annotations.NonNull;
49
50 public class MarkupXmlEventWriter
51 extends AbstractMarkupWriter<XMLEventWriter, XMLStreamException> {
52
53 @NonNull
54 protected final XMLEventFactory2 eventFactory;
55
56 public MarkupXmlEventWriter(
57 @NonNull String namespace,
58 @NonNull ListOptions listOptions,
59 @NonNull XMLEventWriter writer,
60 @NonNull XMLEventFactory2 eventFactory) {
61 super(namespace, listOptions, writer);
62 this.eventFactory = Objects.requireNonNull(eventFactory, "eventFactory");
63 }
64
65 @NonNull
66 protected XMLEventFactory2 getEventFactory() {
67 return eventFactory;
68 }
69
70 @NonNull
71 protected List<Attribute> handleAttributes(@NonNull Map<String, String> attributes) {
72 List<Attribute> attrs;
73 if (attributes.isEmpty()) {
74 attrs = CollectionUtil.emptyList();
75 } else {
76 attrs = ObjectUtils.notNull(attributes.entrySet().stream()
77 .map((entry) -> eventFactory.createAttribute(entry.getKey(), entry.getValue()))
78 .collect(Collectors.toList()));
79 }
80 return attrs;
81 }
82
83 @Override
84 public void writeEmptyElement(QName qname, Map<String, String> attributes) throws XMLStreamException {
85 List<Attribute> attrs = handleAttributes(attributes);
86 StartElement start = eventFactory.createStartElement(qname, attrs.isEmpty() ? null : attrs.iterator(), null);
87
88 XMLEventWriter stream = getStream();
89 stream.add(start);
90
91 EndElement end = eventFactory.createEndElement(qname, null);
92 stream.add(end);
93 }
94
95 @Override
96 public void writeElementStart(QName qname, Map<String, String> attributes) throws XMLStreamException {
97 List<Attribute> attrs = handleAttributes(attributes);
98 StartElement start = eventFactory.createStartElement(qname, attrs.isEmpty() ? null : attrs.iterator(), null);
99 getStream().add(start);
100 }
101
102 @Override
103 public void writeElementEnd(QName qname) throws XMLStreamException {
104 EndElement end = eventFactory.createEndElement(qname, null);
105 getStream().add(end);
106 }
107
108 @Override
109 public void writeText(CharSequence text) throws XMLStreamException {
110 getStream().add(eventFactory.createCharacters(text.toString()));
111 }
112
113 @Override
114 protected void writeHtmlEntityInternal(String entityText) throws XMLStreamException {
115 getStream().add(eventFactory.createEntityReference(entityText, null));
116 }
117
118 @Override
119 protected void writeComment(CharSequence text) throws XMLStreamException {
120 getStream().add(eventFactory.createComment(text.toString()));
121 }
122 }