// Copyright FreeHEP 2005.
package org.freehep.maven.filter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.resources.PropertyUtils;
import org.apache.maven.plugin.resources.ReflectionProperties;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.InterpolationFilterReader;
/**
* Copy application sources while filtering them.
*
* @author Mark Donszelmann
* @version $Id: FilterMojo.java 8584 2006-08-10 23:06:37Z duns $
* @goal process
* @phase process-sources
*/
public class FilterMojo extends AbstractMojo {
/**
* The target directory into which to filter the output
*
* @parameter expression="${project.build.directory}/filtered-sources/java"
* @required
*/
private File targetDirectory;
/**
* The source directory.
*
* @parameter expression="${basedir}/src/main/java"
* @required
*/
private File sourceDirectory;
/**
* A list of inclusion filters for sources. Defaults to **\/*.java
*
* @parameter
*/
private Set includes = new HashSet();
/**
* A list of exclusion filters for sources.
*
* @parameter
*/
private Set excludes = new HashSet();
/**
* @parameter expression="${project.build.filters}"
*/
private List filters;
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
private Properties filterProperties;
public void execute() throws MojoExecutionException {
System.err.println("Filter");
if (!targetDirectory.exists()) targetDirectory.mkdirs();
project.addCompileSourceRoot(targetDirectory.getPath());
if (includes.isEmpty()) {
includes.add("**/*.java.template");
}
initializeFiltering();
DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir(sourceDirectory);
scanner.setIncludes((String[])includes.toArray(new String[0]));
if (!excludes.isEmpty()) scanner.setExcludes((String[])excludes.toArray(new String[0]));
scanner.addDefaultExcludes();
scanner.scan();
List includedFiles = Arrays.asList(scanner.getIncludedFiles());
for (Iterator j = includedFiles.iterator(); j.hasNext();) {
String name = (String) j.next();
File destination = new File(targetDirectory, name);
File source = new File(sourceDirectory, name);
if (!destination.getParentFile().exists()) {
destination.getParentFile().mkdirs();
}
try {
copyFile(source, destination, true);
} catch (IOException e) {
throw new MojoExecutionException("Error copying sources", e);
}
}
}
// copied from maven-resource-plugin
private void initializeFiltering() throws MojoExecutionException {
// System properties
filterProperties = new Properties(System.getProperties());
// Project properties
filterProperties.putAll(project.getProperties());
for (Iterator i = filters.iterator(); i.hasNext();) {
String filtersfile = (String) i.next();
try {
Properties properties = PropertyUtils.loadPropertyFile(
new File(filtersfile), true, true);
filterProperties.putAll(properties);
} catch (IOException e) {
throw new MojoExecutionException(
"Error loading property file '" + filtersfile + "'", e);
}
}
}
// copied from maven-resource-plugin
private void copyFile(File from, File to, boolean filtering)
throws IOException {
if (!filtering) {
if (to.lastModified() < from.lastModified()) {
FileUtils.copyFile(from, to);
}
} else {
// buffer so it isn't reading a byte at a time!
Reader fileReader = null;
Writer fileWriter = null;
try {
fileReader = new BufferedReader(new FileReader(from));
fileWriter = new FileWriter(to);
// support ${token}
Reader reader = new InterpolationFilterReader(fileReader,
filterProperties, "${", "}");
// support @token@
reader = new InterpolationFilterReader(reader,
filterProperties, "@", "@");
reader = new InterpolationFilterReader(reader,
new ReflectionProperties(project), "${", "}");
IOUtil.copy(reader, fileWriter);
} finally {
IOUtil.close(fileReader);
IOUtil.close(fileWriter);
}
}
}
}