View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Intalio, Inc.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Intalio, Inc. Exolab is a registered
23   *    trademark of Intalio, Inc.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
42   */
43  package org.exolab.javasource;
44  
45  /**
46   * A class that represents a Java comment.
47   *
48   * @author <a href="mailto:keith AT kvisco DOT com">Keith Visco</a>
49   * @version $Revision$ $Date: 2005-02-26 17:30:28 -0700 (Sat, 26 Feb 2005) $
50   */
51  public final class JComment {
52      //--------------------------------------------------------------------------
53  
54      /** The auto style, allows this JComment to automatically choose a style for
55       *  this comment. */
56      public static final short AUTO_STYLE   = 0;
57  
58      /** The block comment style. \/* *\/ */
59      public static final short BLOCK_STYLE  = 1;
60  
61      /** The line comment style. \/\/ */
62      public static final short LINE_STYLE   = 2;
63  
64      /** The header style, similiar to block, but with an '*' at the start of each line. */
65      public static final short HEADER_STYLE = 3;
66  
67      /** Similiar to HEADER_STYLE.  But starts with: \/** */
68      public static final short JAVADOC_STYLE = 4;
69  
70      private static final String START_BLOCK     = "/*";
71      private static final String END_BLOCK       = " */";
72  
73      private static final String START_JAVADOC   = "/**";
74      private static final String END_JAVADOC     = " */";
75  
76      private static final String ASTERIX_PREFIX          = " * ";
77      private static final String LINE_COMMENT_PREFIX     = "// ";
78      private static final String SPACE_PREFIX            = " ";
79  
80      //--------------------------------------------------------------------------
81  
82      /** The style of this comment. */
83      private short _style = AUTO_STYLE;
84  
85      /** The main comment for this JDocComment. */
86      private StringBuffer _comment = null;
87  
88      /** The maximum number of characters per line. */
89      protected static final int MAX_LENGTH = 65;
90  
91      /** The maximum number of characters to indent comments. */
92      protected static final int MAX_INDENT = 17;
93  
94      //--------------------------------------------------------------------------
95  
96      /**
97       * Creates a new Java Comment.
98       */
99      public JComment() {
100         super();
101         
102         _comment = new StringBuffer();
103     }
104 
105     /**
106      * Creates a new Java comment with the given style.
107      * 
108      * @param style The desired style.
109      */
110     public JComment(final short style) {
111         this();
112         
113         _style = style;
114     }
115 
116     //--------------------------------------------------------------------------
117 
118     /**
119      * Appends the comment String to this JDocComment.
120      *
121      * @param comment The comment to append.
122      */
123     public void appendComment(final String comment) {
124         _comment.append(comment);
125     }
126 
127     /**
128      * Sets the comment String of this JDocComment.
129      *
130      * @param comment The comment String of this JDocComment.
131      */
132     public void setComment(final String comment) {
133         _comment.setLength(0);
134         _comment.append(comment);
135     }
136 
137     /**
138      * Sets the style for this JComment.
139      *
140      * @param style The style to use for this JComment.
141      */
142     public void setStyle(final short style) {
143         _style = style;
144     }
145 
146     //--------------------------------------------------------------------------
147 
148     /**
149      * Prints this JComment using the given JSourceWriter.
150      *
151      * @param jsw The JSourceWriter to print to.
152      */
153     public void print(final JSourceWriter jsw) {
154         if (jsw == null) { return; }
155 
156         JCommentFormatter formatter = null;
157 
158         //-- calculate comment length
159         short currentIndent = jsw.getIndentSize();
160         int maxLength = MAX_LENGTH - currentIndent;
161 
162         //-- a simple check to make sure we have some room to print the comment
163         if (maxLength <= MAX_INDENT) { maxLength = MAX_LENGTH / 2; }
164 
165         short resolvedStyle = _style;
166 
167         if (_style == AUTO_STYLE) {
168             //-- estimation of number of lines
169             int nbrLines = _comment.length() / maxLength;
170 
171             if (nbrLines > 2) {
172                 resolvedStyle = BLOCK_STYLE;
173             } else {
174                 resolvedStyle = LINE_STYLE;
175             }
176         }
177 
178         //-- start comment
179         String prefix = null;
180         String start  = null;
181         String end    = null;
182 
183         switch(resolvedStyle) {
184             case BLOCK_STYLE:
185                 start  = START_BLOCK;
186                 end    = END_BLOCK;
187                 prefix = SPACE_PREFIX;
188                 break;
189             case HEADER_STYLE:
190                 start = START_BLOCK;
191                 end   = END_BLOCK;
192                 prefix = ASTERIX_PREFIX;
193                 break;
194             case JAVADOC_STYLE:
195                 start = START_JAVADOC;
196                 end   = END_JAVADOC;
197                 prefix = ASTERIX_PREFIX;
198                 break;
199             default: //-- LINE
200                 prefix = LINE_COMMENT_PREFIX;
201                 break;
202         }
203 
204         if (start != null) { jsw.writeln(start); }
205         //-- print main comment
206         formatter = new JCommentFormatter(_comment.toString(), maxLength, prefix);
207         while (formatter.hasMoreLines()) {
208             jsw.writeln(formatter.nextLine());
209         }
210         if (end != null) { jsw.writeln(end); }
211         jsw.flush();
212     }
213 
214     /**
215      * {@inheritDoc}
216      */
217     public String toString() {
218         return "";
219     }
220 
221     //--------------------------------------------------------------------------
222 }