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.model.xml;
28
29 import com.vladsch.flexmark.parser.ListOptions;
30
31 import gov.nist.secauto.metaschema.core.datatype.markup.IMarkupString;
32 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.AbstractMarkupWriter;
33 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.IMarkupVisitor;
34 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.IMarkupWriter;
35 import gov.nist.secauto.metaschema.core.datatype.markup.flexmark.MarkupVisitor;
36 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
37
38 import org.apache.xmlbeans.XmlCursor;
39 import org.apache.xmlbeans.XmlObject;
40
41 import java.util.Map;
42
43 import javax.xml.namespace.QName;
44
45 import edu.umd.cs.findbugs.annotations.NonNull;
46
47 @SuppressWarnings("PMD.AvoidUncheckedExceptionsInSignatures")
48 class XmlbeansMarkupVisitor
49 extends AbstractMarkupWriter<XmlCursor, IllegalArgumentException> {
50
51
52
53
54
55
56
57
58
59
60
61 @SuppressWarnings("resource")
62 public static void visit(@NonNull IMarkupString<?> markup, @NonNull String namespace,
63 @NonNull XmlObject obj) {
64 try (XmlCursor cursor = ObjectUtils.notNull(obj.newCursor())) {
65 visit(markup, namespace, cursor);
66 }
67 }
68
69
70
71
72
73
74
75
76
77
78
79 public static void visit(@NonNull IMarkupString<?> markup, @NonNull String namespace,
80 @NonNull XmlCursor cursor) {
81 IMarkupWriter<XmlCursor, IllegalArgumentException> writer = new XmlbeansMarkupVisitor(
82 namespace,
83 markup.getFlexmarkFactory().getListOptions(),
84 cursor);
85 IMarkupVisitor<XmlCursor, IllegalArgumentException> visitor = new MarkupVisitor<>(markup.isBlock());
86 visitor.visitDocument(markup.getDocument(), writer);
87 }
88
89
90
91
92
93
94
95
96
97
98
99 protected XmlbeansMarkupVisitor(
100 @NonNull String namespace,
101 @NonNull ListOptions options,
102 @NonNull XmlCursor writer) {
103 super(namespace, options, writer);
104 }
105
106 @Override
107 public void writeEmptyElement(QName qname, Map<String, String> attributes)
108 throws IllegalArgumentException {
109 @SuppressWarnings("resource")
110 XmlCursor cursor = getStream();
111 cursor.beginElement(qname);
112
113 attributes.forEach((name, value) -> cursor.insertAttributeWithValue(name, value));
114
115
116 cursor.toEndToken();
117
118
119 cursor.toNextToken();
120 }
121
122 @Override
123 public void writeElementStart(QName qname, Map<String, String> attributes)
124 throws IllegalArgumentException {
125 @SuppressWarnings("resource")
126 XmlCursor cursor = getStream();
127 cursor.beginElement(qname);
128
129 attributes.forEach((name, value) -> cursor.insertAttributeWithValue(name, value));
130
131
132 cursor.push();
133 }
134
135 @Override
136 public void writeElementEnd(QName qname) throws IllegalArgumentException {
137 @SuppressWarnings("resource")
138 XmlCursor cursor = getStream();
139
140
141 cursor.pop();
142
143
144 cursor.toEndToken();
145
146
147 cursor.toNextToken();
148 }
149
150 @Override
151 public void writeText(CharSequence text) throws IllegalArgumentException {
152 @SuppressWarnings("resource")
153 XmlCursor cursor = getStream();
154 cursor.insertChars(text.toString());
155 }
156
157 @Override
158 protected void writeComment(CharSequence text) throws IllegalArgumentException {
159 @SuppressWarnings("resource")
160 XmlCursor cursor = getStream();
161 cursor.insertComment(text.toString());
162 }
163 }