/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved.
*
* $Id$
*/
package com.sleepycat.persist.model;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
/**
* An {@code ant} task for running the {@link ClassEnhancer}.
*
* <p>{@code ClassEnhancerTask} objects are thread-safe. Multiple threads may
* safely call the methods of a shared {@code ClassEnhancerTask} object.</p>
*
* <p>Note that in the BDB Java Edition product, the {@code ClassEnhancerTask}
* class is included in {@code je-<version>.jar}. However, in the BDB
* (C-based) product, it is not included in {@code db.jar} because the build is
* not dependent on the Ant libraries. Therefore, in the BDB product, the
* application must compile the {@code
* java/src/com/sleepycat/persist/model/ClassEnhancerTask.java} source file and
* ensure that the compiled class is available to the Ant task. For example
* the following Ant task definitions could be used.</p>
*
* <p>For BDB Java Edition product:</p>
* <pre class="code">
* {@literal <taskdef name="enhance-persistent-classes"}
* {@literal classname="com.sleepycat.persist.model.ClassEnhancerTask"}
* {@literal classpath="${je.home}/lib/je-<version>.jar"/>}</pre>
*
* <p>For BDB (C-based Edition) product:</p>
* <pre class="code">
* {@literal <taskdef name="enhance-persistent-classes"}
* {@literal classname="com.sleepycat.persist.model.ClassEnhancerTask"}
* {@literal classpath="/path-to-jar/db.jar:/path-to-ClassEnhancerTask-class"/>}</pre>
*
* <p>The class enhancer task element has no attributes. It may contain one or
* more nested {@code fileset} elements specifying the classes to be enhanced.
* The class files are replaced when they are enhanced, without changing the
* file modification date. For example:</p>
*
* <pre class="code">
* {@literal <target name="main">}
* {@literal <enhance-persistent-classes verbose="no">}
* {@literal <fileset dir="classes"/>}
* {@literal </enhance-persistent-classes>}
* {@literal </target>}</pre>
*
* <p>The verbose attribute may be specified as "true", "yes" or "on" (like
* other Ant boolean attributes) to print the name of each class file that is
* enhanced. The total number of class files enhanced will always be
* printed.</p>
*
* @author Mark Hayes
*/
public class ClassEnhancerTask extends Task {
private List<FileSet> fileSets = new ArrayList<FileSet>();
private boolean verbose;
public void execute() throws BuildException {
if (fileSets.size() == 0) {
throw new BuildException("At least one fileset must be specified");
}
try {
int nFiles = 0;
ClassEnhancer enhancer = new ClassEnhancer();
enhancer.setVerbose(verbose);
for (FileSet fileSet : fileSets) {
DirectoryScanner scanner =
fileSet.getDirectoryScanner(getProject());
String[] fileNames = scanner.getIncludedFiles();
for (String fileName : fileNames) {
File file = new File(scanner.getBasedir(), fileName);
try {
nFiles += enhancer.enhanceFile(file);
} catch (IOException e) {
throw new BuildException(e);
}
}
}
if (nFiles > 0) {
System.out.println("Enhanced: " + nFiles + " files");
}
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
}
public void addConfiguredFileset(FileSet files) {
fileSets.add(files);
}
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
}