View Javadoc

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 1410919 2012-11-18 16:34:59Z hboutemy $
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      private boolean firstTag  = true;
42  
43      private boolean insertNewline = true;
44  
45      public void setInsertNewline( boolean insertNewline )
46      {
47          this.insertNewline = insertNewline;
48      }
49  
50      /**
51       * Sets the default namespace that is prepended to all tags written by this sink.
52       *
53       * @param ns the default namespace.
54       * @since 1.1
55       */
56      public void setNameSpace( String ns )
57      {
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      {
69          return this.nameSpace;
70      }
71  
72      /**
73       * Starts a Tag. For instance:
74       * <pre>
75       * &lt;tag&gt;
76       * </pre>
77       *
78       * @param t a non null tag
79       * @see #writeStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet)
80       */
81      protected void writeStartTag( Tag t )
82      {
83          writeStartTag ( t, null );
84      }
85  
86      /**
87       * Starts a Tag with attributes. For instance:
88       * <pre>
89       * &lt;tag attName="attValue"&gt;
90       * </pre>
91       *
92       * @param t a non null tag.
93       * @param att a set of attributes. May be null.
94       * @see #writeStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet, boolean).
95       */
96      protected void writeStartTag( Tag t, MutableAttributeSet att )
97      {
98          writeStartTag ( t, att, false );
99      }
100 
101     /**
102      * Starts a Tag with attributes. For instance:
103      * <pre>
104      * &lt;tag attName="attValue"&gt;
105      * </pre>
106      *
107      * @param t a non null tag.
108      * @param att a set of attributes. May be null.
109      * @param isSimpleTag boolean to write as a simple tag.
110      */
111     protected void writeStartTag( Tag t, MutableAttributeSet att, boolean isSimpleTag )
112     {
113         if ( t == null )
114         {
115             throw new IllegalArgumentException( "A tag is required" );
116         }
117 
118         StringBuilder sb = new StringBuilder();
119 
120         if ( insertNewline && t.isBlock() && !firstTag )
121         {
122             sb.append( EOL );
123         }
124         firstTag = false;
125 
126         sb.append( LESS_THAN );
127 
128         if ( nameSpace != null )
129         {
130             sb.append( nameSpace ).append( ':' );
131         }
132 
133         sb.append( t.toString() );
134 
135         sb.append( SinkUtils.getAttributeString( att ) );
136 
137         if ( isSimpleTag )
138         {
139             sb.append( SPACE ).append( SLASH );
140         }
141 
142         sb.append( GREATER_THAN );
143 
144         write( sb.toString() );
145     }
146 
147     /**
148      * Writes a system EOL.
149      *
150      * @since 1.1
151      */
152     protected void writeEOL()
153     {
154         write( EOL );
155     }
156 
157     /**
158      * Ends a Tag without writing an EOL. For instance: <pre>&lt;/tag&gt;</pre>.
159      *
160      * @param t a tag.
161      */
162     protected void writeEndTag( Tag t )
163     {
164         if ( t == null )
165         {
166             throw new IllegalArgumentException( "A tag is required" );
167         }
168 
169         StringBuilder sb = new StringBuilder();
170         sb.append( LESS_THAN );
171         sb.append( SLASH );
172 
173         if ( nameSpace != null )
174         {
175             sb.append( nameSpace ).append( ':' );
176         }
177 
178         sb.append( t.toString() );
179         sb.append( GREATER_THAN );
180 
181         write( sb.toString() );
182     }
183 
184     /**
185      * Starts a simple Tag. For instance:
186      * <pre>
187      * &lt;tag /&gt;
188      * </pre>
189      *
190      * @param t a non null tag
191      * @see #writeSimpleTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet)
192      */
193     protected void writeSimpleTag( Tag t )
194     {
195         writeSimpleTag( t, null );
196     }
197 
198     /**
199      * Starts a simple Tag with attributes. For instance:
200      * <pre>
201      * &lt;tag attName="attValue" /&gt;
202      * </pre>
203      *
204      * @param t a non null tag.
205      * @param att a set of attributes. May be null.
206      * @see #writeStartTag(javax.swing.text.html.HTML.Tag, javax.swing.text.MutableAttributeSet, boolean).
207      */
208     protected void writeSimpleTag( Tag t, MutableAttributeSet att )
209     {
210         writeStartTag ( t, att, true );
211     }
212 
213     /**
214      * Write a text to the sink.
215      *
216      * @param text the given text to write
217      */
218     protected abstract void write( String text );
219 }