/*
* Extends org.apache.tools.ant.taskdefs.Javadoc
* and uses org.apache.tools.ant.taskdefs.UpToDate,
* which are Copyright 2000-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.mwrm.ant.tasks;
import java.io.File;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.Javadoc;
import org.apache.tools.ant.taskdefs.UpToDate;
import org.apache.tools.ant.types.FileSet;
/**
* The ExtendJavadocTask
class
* extends the {@link org.apache.tools.ant.taskdefs.Javadoc Javadoc} task.
* It checks whether a set of source files are newer than a set of target files
* and if so, it generates Javadocs.
*
*/
public class ExtendJavadocTask extends Javadoc {
/** The attribute of the task element. */
private File target;
/** A set of file sets,
* each of which is provided by a nested file set. */
private Vector targetFileSets = new Vector();
/** The internal uptodate task. */
private UpToDate utd;
/**
* Creates a new instance of an internal
* <uptodate>
task
* and adds it to the current project.
* @see UpToDate org.apache.tools.ant.taskdefs.UpToDate
*/
public final void init() {
// We need an instance of the task
utd = new UpToDate();
// We need to add the task to this project
utd.setProject(this.getProject());
}
/**
* Checks if Javadocs should be created
* and then calls super.execute()
if so.
* This method does usage checks on the task's attributes
* and its nested elements.
* It will throw a BuildException
if there is a violation.
*/
public final void execute() {
// This is the usage information
// We can't have a target attribute
// and nested targetfiles elements
if (target != null && targetFileSets.size() > 0) {
String msg = "You can't specify a targetfile attribute "
+ "and elements.";
throw new BuildException(msg);
}
// We have to specify either a target attribute
// or at least one nested targetfiles elements
if (target == null && targetFileSets.size() == 0) {
String msg = "You must specify either a targetfile attribute "
+ "or at least one element.";
throw new BuildException(msg);
}
// If this is false, the files aren't up to date
// and we have to run the javadocs
boolean eval = false;
// If we've got to this point, we know the usage must be correct.
// Let's check whether a single target attribute has been used.
if (target != null) {
// Get the results of the check
eval = getResult(target);
} else {
// If a target attribute wasn't specified,
// at least one nested targetfiles element was.
// We first get all the file sets represented by the nested elements
Enumeration e = targetFileSets.elements();
// And then iterate over them
while (e.hasMoreElements()) {
// The next element is a file set, so we get its files
// in a semi-colon-separated list
String files = e.nextElement().toString();
// Next, we split the list into its file names
StringTokenizer st = new StringTokenizer(files, ";");
// And iterate over them to test each one
while (st.hasMoreTokens()) {
// We create a file
//from the current file name in the iteration
File tempTarget = new File(st.nextToken());
// Get the results of the check
eval = getResult(tempTarget);
// One false result is enough to fail the whole file set
if (!eval) {
break;
}
}
// One false result is enough to fail the whole file set
if (!eval) {
break;
}
}
}
// If the test failed, we want to generate Javadocs
if (!eval) {
super.execute();
} else {
log("Skipping Javadoc creation. The files are up to date.",
Project.MSG_INFO);
}
}
/** Checks whether the files are up to date.
* @param file The file to evaluate
* @return boolean The result
*/
private boolean getResult(final File file) {
// Set the target property in the task
utd.setTargetFile(file);
// Evaluate the files
return utd.eval();
}
/**
* The setter method for the target
attribute.
* @param targetFile A file to check against
*/
public final void setTarget(final File targetFile) {
this.target = targetFile;
}
/**
* The setter method for the file set
* contained in the nested <srcfiles>
element.
* @param fileset A file set of source files
*/
public final void addSrcfiles(final FileSet fileset) {
utd.addSrcfiles(fileset);
}
/**
* The setter method for the file sets
* contained in nested <targetfiles>
elements.
* @param fileset A file set of target files
*/
public final void addTargetfiles(final FileSet fileset) {
targetFileSets.add(fileset);
}
}
AntWriteOurOwnTask.zip( 157 k)