1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.maven.doxia.sink.impl;
20
21 import javax.swing.text.MutableAttributeSet;
22 import javax.swing.text.html.HTML.Tag;
23
24 import java.util.Objects;
25
26 import org.apache.maven.doxia.markup.XmlMarkup;
27
28 /**
29 * An abstract <code>Sink</code> for xml markup syntax.
30 *
31 * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
32 * @since 1.0
33 */
34 public abstract class AbstractXmlSink extends SinkAdapter implements XmlMarkup {
35 /** Default namespace prepended to all tags */
36 private String nameSpace;
37
38 private boolean firstTag = true;
39
40 private boolean insertNewline = true;
41
42 /**
43 * <p>Setter for the field <code>insertNewline</code>.</p>
44 *
45 * @param insertNewline a boolean.
46 */
47 public void setInsertNewline(boolean insertNewline) {
48 this.insertNewline = insertNewline;
49 }
50
51 /**
52 * Sets the default namespace that is prepended to all tags written by this sink.
53 *
54 * @param ns the default namespace.
55 * @since 1.1
56 */
57 public void setNameSpace(String ns) {
58 this.nameSpace = ns;
59 }
60
61 /**
62 * Return the default namespace that is prepended to all tags written by this sink.
63 *
64 * @return the current default namespace.
65 * @since 1.1
66 */
67 public String getNameSpace() {
68 return this.nameSpace;
69 }
70
71 /**
72 * Starts a Tag. For instance:
73 * <pre>
74 * <tag>
75 * </pre>
76 *
77 * @param t a non null tag
78 * @see #writeStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet)
79 */
80 protected void writeStartTag(Tag t) {
81 writeStartTag(t, null);
82 }
83
84 /**
85 * Starts a Tag with attributes. For instance:
86 * <pre>
87 * <tag attName="attValue">
88 * </pre>
89 *
90 * @param t a non null tag.
91 * @param att a set of attributes. May be null.
92 * @see #writeStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet, boolean)
93 */
94 protected void writeStartTag(Tag t, MutableAttributeSet att) {
95 writeStartTag(t, att, false);
96 }
97
98 /**
99 * Starts a Tag with attributes. For instance:
100 * <pre>
101 * <tag attName="attValue">
102 * </pre>
103 *
104 * @param t a non null tag.
105 * @param att a set of attributes. May be null.
106 * @param isSimpleTag boolean to write as a simple tag.
107 */
108 protected void writeStartTag(Tag t, MutableAttributeSet att, boolean isSimpleTag) {
109 Objects.requireNonNull(t, "t cannot be null");
110
111 StringBuilder sb = new StringBuilder();
112
113 if (insertNewline && t.isBlock() && !firstTag) {
114 sb.append(EOL);
115 }
116 firstTag = false;
117
118 sb.append(LESS_THAN);
119
120 if (nameSpace != null) {
121 sb.append(nameSpace).append(':');
122 }
123
124 sb.append(t.toString());
125
126 sb.append(SinkUtils.getAttributeString(att));
127
128 if (isSimpleTag) {
129 sb.append(SPACE).append(SLASH);
130 }
131
132 sb.append(GREATER_THAN);
133
134 write(sb.toString());
135 }
136
137 /**
138 * Writes a system EOL.
139 *
140 * @since 1.1
141 */
142 protected void writeEOL() {
143 write(EOL);
144 }
145
146 /**
147 * Ends a Tag without writing an EOL. For instance: <pre></tag></pre>.
148 *
149 * @param t a tag.
150 */
151 protected void writeEndTag(Tag t) {
152 Objects.requireNonNull(t, "t cannot be null");
153
154 StringBuilder sb = new StringBuilder();
155 sb.append(LESS_THAN);
156 sb.append(SLASH);
157
158 if (nameSpace != null) {
159 sb.append(nameSpace).append(':');
160 }
161
162 sb.append(t.toString());
163 sb.append(GREATER_THAN);
164
165 write(sb.toString());
166 }
167
168 /**
169 * Starts a simple Tag. For instance:
170 * <pre>
171 * <tag />
172 * </pre>
173 *
174 * @param t a non null tag
175 * @see #writeSimpleTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet)
176 */
177 protected void writeSimpleTag(Tag t) {
178 writeSimpleTag(t, null);
179 }
180
181 /**
182 * Starts a simple Tag with attributes. For instance:
183 * <pre>
184 * <tag attName="attValue" />
185 * </pre>
186 *
187 * @param t a non null tag.
188 * @param att a set of attributes. May be null.
189 * @see #writeStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet, boolean)
190 */
191 protected void writeSimpleTag(Tag t, MutableAttributeSet att) {
192 writeStartTag(t, att, true);
193 }
194
195 /**
196 * Write a text to the sink.
197 *
198 * @param text the given text to write
199 */
200 protected abstract void write(String text);
201 }