1
2
3
4
5 package xjavadoc.ant;
6
7 import org.apache.tools.ant.Task;
8 import org.apache.tools.ant.BuildException;
9 import org.apache.tools.ant.DirectoryScanner;
10 import org.apache.tools.ant.AntClassLoader;
11 import org.apache.tools.ant.types.Path;
12 import org.apache.tools.ant.types.FileSet;
13
14 import java.util.LinkedList;
15 import java.io.File;
16
17 import xjavadoc.XJavaDoc;
18 import xjavadoc.DefaultXTag;
19 import xjavadoc.filesystem.FileSourceSet;
20
21 /***
22 * This class should be subclassed to be used for XDocletImpl, revXDoclet etc.
23 *
24 * @author Aslak Hellesøy
25 * @author Ara Abrahamian
26 * @created 26. februar 2003
27 */
28 public abstract class XJavadocTask extends Task
29 {
30 private final XJavaDoc _xJavaDoc = new XJavaDoc();
31 private final LinkedList _fileSets = new LinkedList();
32
33 protected XJavaDoc getXJavaDoc() {
34 return _xJavaDoc;
35 }
36
37 /***
38 * Sets the tags to ignore if validation is true. The value should be a
39 * comma-separated list of tag names (without the tag name)
40 *
41 * @param tags tags that should be ignored when doing validation.
42 */
43 public void setIgnoredtags( String tags )
44 {
45 _xJavaDoc.getTagFactory().setIgnoredTags( tags );
46 }
47
48 /***
49 * Sets whether or not tags will be validated.
50 *
51 * @param flag validate?
52 */
53 public void setValidating( boolean flag )
54 {
55 _xJavaDoc.getTagFactory().setValidating( flag );
56 }
57
58 /***
59 * set source file charset
60 *
61 * @param enc the encoding
62 */
63 public void setEncoding(String enc)
64 {
65 _xJavaDoc.setEncoding(enc);
66 }
67
68 /***
69 * set generated file charset
70 *
71 * @param enc the encoding
72 */
73 public void setDocencoding(String enc)
74 {
75 _xJavaDoc.setDocEncoding(enc);
76 }
77
78 /***
79 * Implementation of Ant's {@link Task#execute()}.
80 *
81 * @exception BuildException Ant's way of reporting build exception
82 */
83 public final void execute() throws BuildException
84 {
85 _xJavaDoc.reset( true );
86 _xJavaDoc.setPropertyMap( project.getProperties() );
87 try
88 {
89 validateOptions();
90
91 FileSourceSet[] sourceSets = new FileSourceSet[_fileSets.size()];
92
93 for( int i = 0; i < _fileSets.size(); i++ )
94 {
95 FileSet fs = ( FileSet ) _fileSets.get( i );
96 File dir = fs.getDir( project );
97
98 DirectoryScanner ds = fs.getDirectoryScanner( project );
99 String[] files = ds.getIncludedFiles();
100
101 sourceSets[i] = new FileSourceSet( dir, files );
102 _xJavaDoc.addSourceSet( sourceSets[i] );
103 }
104
105 start();
106 }
107 catch( OutOfMemoryError e )
108 {
109 System.err.println( e.getMessage() );
110 XJavaDoc.printMemoryStatus();
111 System.err.println( "Try to increase heap size. Can be done by defining ANT_OPTS=-Xmx640m" );
112 System.err.println( "See the JDK tooldocs." );
113 throw new BuildException( e.getMessage(), e, location );
114 }
115 catch( Throwable t )
116 {
117 t.printStackTrace();
118 throw new BuildException( "Unexpected error", t, location );
119 }
120 finally
121 {
122
123
124 _xJavaDoc.printLogMessages( System.out, XJavaDoc.NO_IMPORTED_PACKAGES );
125 _xJavaDoc.printLogMessages( System.out, XJavaDoc.ONE_OR_MORE_IMPORTED_PACKAGES );
126 _xJavaDoc.reset(true);
127 System.gc();
128 }
129 }
130
131 /***
132 * Ignores one tag
133 *
134 * @return
135 */
136 public Object createIgnoredtag()
137 {
138 return
139 new Object()
140 {
141 public void addText( String text )
142 {
143 _xJavaDoc.getTagFactory().registerTagClass( text, DefaultXTag.class );
144 }
145 };
146 }
147
148 /***
149 * Ant's <fileset> definition. To define the files to parse.
150 *
151 * @param set a fileset to add
152 */
153 public void addFileset( FileSet set )
154 {
155 _fileSets.add( set );
156 }
157
158 /***
159 * Returns the classpath
160 *
161 * @return the classpath
162 */
163 protected String getClasspath()
164 {
165 return ( ( AntClassLoader ) getClass().getClassLoader() ).getClasspath();
166 }
167
168 /***
169 * Implement this method and play with _xJavaDoc
170 *
171 * @exception BuildException Ant's way of reporting exception
172 */
173 protected abstract void start() throws BuildException;
174
175 /***
176 * Validate a Xdoclet task before running it.
177 *
178 * @exception BuildException in case the validation fails.
179 */
180 protected void validateOptions() throws BuildException
181 {
182 if( _fileSets.size() == 0 )
183 {
184 throw new BuildException( "At least one fileset must be specified", location );
185 }
186 }
187 }