diff --git a/proposal/sandbox/clearcase/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMatchingTask.java b/proposal/sandbox/clearcase/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMatchingTask.java
index 31ef38014..1cfa8e0f5 100644
--- a/proposal/sandbox/clearcase/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMatchingTask.java
+++ b/proposal/sandbox/clearcase/src/main/org/apache/tools/ant/taskdefs/optional/clearcase/CCMatchingTask.java
@@ -63,33 +63,45 @@ import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
/**
+ * Base task for all Clearcase tasks involving multiple-file processing.
*
* @author Stephane Bailliez
*/
public abstract class CCMatchingTask extends MatchingTask {
-
+
+ /** view path to use. Equivalent to base directory of processing */
protected File viewpath;
+ /** cc helper tools */
protected CCUtils utils = new CCUtils(this);
-
+
+ /** the set of collected files to checkin */
protected Hashtable files = null;
+ /** comments to use for the operation */
protected String comment = null;
+ /** the comment file created from the comments. It avoids escaping issues */
protected File commentFile;
+ /** cleartool options (and command as well) */
protected String[] options;
- public void setViewPath(File value){
- this.viewpath = value;
- }
-
- public void setComment(String value){
- comment = value;
- }
-
+ /**
+ * @return a vector of options representing the cleartool arguments.
+ * The last arguments is normally allocated and replaced at the last
+ * moment before running the command.
+ * @see #execute(String[], CCFile)
+ */
protected abstract Vector getOptions();
-
+
+ /**
+ * @param file the clearcase file
+ * @return whether this file should be accepted or not by the
+ * command to restrict the file processing and errors. For
+ * example you might not want to checkin files that are
+ * already checked in and that are collected by the fileset
+ */
protected boolean accept(CCFile file){
return true;
}
@@ -102,7 +114,8 @@ public abstract class CCMatchingTask extends MatchingTask {
postExecute();
}
}
-
+
+ /** check for attributes and builds the options array */
protected void preExecute() throws BuildException {
if (viewpath == null){
throw new BuildException("Invalid viewpath");
@@ -114,13 +127,18 @@ public abstract class CCMatchingTask extends MatchingTask {
options = new String[v.size()];
v.copyInto(options);
}
-
+
+ /** clean up method calls after doExecute */
protected void postExecute(){
if (commentFile != null){
commentFile.delete();
}
}
+ /**
+ * The core processing. It loops over all files and calls
+ * execute(String[], CCFile)
+ */
protected void doExecute() throws BuildException {
Enumeration elems = getFiles().elements();
log("Processing " + files.size() + " elements...");
@@ -128,7 +146,16 @@ public abstract class CCMatchingTask extends MatchingTask {
execute(options, (CCFile)elems.nextElement());
}
}
-
+
+ /**
+ * Calls the cleartool command with the appropriate parameters. Note the
+ * the last array element is supposed to be used by the filepath.
+ * @param args the cleartool command to execute. The last element being allocated
+ * and representing the filepath.
+ * @param file the file element to process.
+ * @throws BuildException thrown if an error occurs when processing the
+ * cleartool command.
+ */
protected void execute(String[] args, CCFile file) throws BuildException {
args[args.length - 1] = file.getPath();
CmdResult res = utils.cleartool(args);
@@ -137,6 +164,12 @@ public abstract class CCMatchingTask extends MatchingTask {
}
}
+ /**
+ * Restrict the set of files/directories to be processed.
+ * @return the set of files to be processed. The key is made up
+ * the filepath and the value is the CCFile instance.
+ * @see #accept(CCFile)
+ */
protected Hashtable getFiles(){
if (files != null){
return files;
@@ -150,6 +183,14 @@ public abstract class CCMatchingTask extends MatchingTask {
return files;
}
+ /**
+ * Helper method to restrict a set of relative elements and add them
+ * to a map.
+ * @param map the map w/ a path/CCFile mapping to add elements to.
+ * @param basedir the base directory for all elements in the array.
+ * @param elems the set of elements to restrict.
+ * @see #accept(CCFile)
+ */
protected void addElements(Hashtable map, File basedir, String[] elems){
for (int i = 0; i < elems.length; i++){
CCFile f = new CCFile(basedir, elems[i]);
@@ -158,4 +199,15 @@ public abstract class CCMatchingTask extends MatchingTask {
}
}
}
+
+// Ant bean setters
+
+ public void setViewPath(File value){
+ this.viewpath = value;
+ }
+
+ public void setComment(String value){
+ comment = value;
+ }
+
}