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