001: /**
002: * Redistribution and use of this software and associated documentation
003: * ("Software"), with or without modification, are permitted provided
004: * that the following conditions are met:
005: *
006: * 1. Redistributions of source code must retain copyright
007: * statements and notices. Redistributions must also contain a
008: * copy of this document.
009: *
010: * 2. Redistributions in binary form must reproduce the
011: * above copyright notice, this list of conditions and the
012: * following disclaimer in the documentation and/or other
013: * materials provided with the distribution.
014: *
015: * 3. The name "Exolab" must not be used to endorse or promote
016: * products derived from this Software without prior written
017: * permission of Intalio, Inc. For written permission,
018: * please contact info@exolab.org.
019: *
020: * 4. Products derived from this Software may not be called "Exolab"
021: * nor may "Exolab" appear in their names without prior written
022: * permission of Intalio, Inc. Exolab is a registered
023: * trademark of Intalio, Inc.
024: *
025: * 5. Due credit should be given to the Exolab Project
026: * (http://www.exolab.org/).
027: *
028: * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS
029: * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
030: * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
031: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
032: * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
033: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
034: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
035: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
036: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
037: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
038: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
039: * OF THE POSSIBILITY OF SUCH DAMAGE.
040: *
041: * Copyright 1999 (C) Intalio, Inc. All Rights Reserved.
042: */package org.exolab.javasource;
043:
044: /**
045: * A class that represents a Java comment.
046: *
047: * @author <a href="mailto:keith AT kvisco DOT com">Keith Visco</a>
048: * @version $Revision: 6669 $ $Date: 2005-02-26 17:30:28 -0700 (Sat, 26 Feb 2005) $
049: */
050: public final class JComment {
051: //--------------------------------------------------------------------------
052:
053: /** The auto style, allows this JComment to automatically choose a style for
054: * this comment. */
055: public static final short AUTO_STYLE = 0;
056:
057: /** The block comment style. \/* *\/ */
058: public static final short BLOCK_STYLE = 1;
059:
060: /** The line comment style. \/\/ */
061: public static final short LINE_STYLE = 2;
062:
063: /** The header style, similiar to block, but with an '*' at the start of each line. */
064: public static final short HEADER_STYLE = 3;
065:
066: /** Similiar to HEADER_STYLE. But starts with: \/** */
067: public static final short JAVADOC_STYLE = 4;
068:
069: private static final String START_BLOCK = "/*";
070: private static final String END_BLOCK = " */";
071:
072: private static final String START_JAVADOC = "/**";
073: private static final String END_JAVADOC = " */";
074:
075: private static final String ASTERIX_PREFIX = " * ";
076: private static final String LINE_COMMENT_PREFIX = "// ";
077: private static final String SPACE_PREFIX = " ";
078:
079: //--------------------------------------------------------------------------
080:
081: /** The style of this comment. */
082: private short _style = AUTO_STYLE;
083:
084: /** The main comment for this JDocComment. */
085: private StringBuffer _comment = null;
086:
087: /** The maximum number of characters per line. */
088: protected static final int MAX_LENGTH = 65;
089:
090: /** The maximum number of characters to indent comments. */
091: protected static final int MAX_INDENT = 17;
092:
093: //--------------------------------------------------------------------------
094:
095: /**
096: * Creates a new Java Comment.
097: */
098: public JComment() {
099: super ();
100:
101: _comment = new StringBuffer();
102: }
103:
104: /**
105: * Creates a new Java comment with the given style.
106: *
107: * @param style The desired style.
108: */
109: public JComment(final short style) {
110: this ();
111:
112: _style = style;
113: }
114:
115: //--------------------------------------------------------------------------
116:
117: /**
118: * Appends the comment String to this JDocComment.
119: *
120: * @param comment The comment to append.
121: */
122: public void appendComment(final String comment) {
123: _comment.append(comment);
124: }
125:
126: /**
127: * Sets the comment String of this JDocComment.
128: *
129: * @param comment The comment String of this JDocComment.
130: */
131: public void setComment(final String comment) {
132: _comment.setLength(0);
133: _comment.append(comment);
134: }
135:
136: /**
137: * Sets the style for this JComment.
138: *
139: * @param style The style to use for this JComment.
140: */
141: public void setStyle(final short style) {
142: _style = style;
143: }
144:
145: //--------------------------------------------------------------------------
146:
147: /**
148: * Prints this JComment using the given JSourceWriter.
149: *
150: * @param jsw The JSourceWriter to print to.
151: */
152: public void print(final JSourceWriter jsw) {
153: if (jsw == null) {
154: return;
155: }
156:
157: JCommentFormatter formatter = null;
158:
159: //-- calculate comment length
160: short currentIndent = jsw.getIndentSize();
161: int maxLength = MAX_LENGTH - currentIndent;
162:
163: //-- a simple check to make sure we have some room to print the comment
164: if (maxLength <= MAX_INDENT) {
165: maxLength = MAX_LENGTH / 2;
166: }
167:
168: short resolvedStyle = _style;
169:
170: if (_style == AUTO_STYLE) {
171: //-- estimation of number of lines
172: int nbrLines = _comment.length() / maxLength;
173:
174: if (nbrLines > 2) {
175: resolvedStyle = BLOCK_STYLE;
176: } else {
177: resolvedStyle = LINE_STYLE;
178: }
179: }
180:
181: //-- start comment
182: String prefix = null;
183: String start = null;
184: String end = null;
185:
186: switch (resolvedStyle) {
187: case BLOCK_STYLE:
188: start = START_BLOCK;
189: end = END_BLOCK;
190: prefix = SPACE_PREFIX;
191: break;
192: case HEADER_STYLE:
193: start = START_BLOCK;
194: end = END_BLOCK;
195: prefix = ASTERIX_PREFIX;
196: break;
197: case JAVADOC_STYLE:
198: start = START_JAVADOC;
199: end = END_JAVADOC;
200: prefix = ASTERIX_PREFIX;
201: break;
202: default: //-- LINE
203: prefix = LINE_COMMENT_PREFIX;
204: break;
205: }
206:
207: if (start != null) {
208: jsw.writeln(start);
209: }
210: //-- print main comment
211: formatter = new JCommentFormatter(_comment.toString(),
212: maxLength, prefix);
213: while (formatter.hasMoreLines()) {
214: jsw.writeln(formatter.nextLine());
215: }
216: if (end != null) {
217: jsw.writeln(end);
218: }
219: jsw.flush();
220: }
221:
222: /**
223: * {@inheritDoc}
224: */
225: public String toString() {
226: return "";
227: }
228:
229: //--------------------------------------------------------------------------
230: }
|