/*
* Po2Prop.java
*
*/
package edu.xtec.ant;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.*;
import org.apache.tools.ant.util.FileUtils;
import java.io.File;
import java.util.Vector;
import org.apache.tools.ant.util.JavaEnvUtils;
import org.apache.tools.ant.taskdefs.ExecTask;
import java.util.Enumeration;
import java.io.IOException;
/**
* @author fbusquet
*/
public class Po2Prop extends Task {
// Original source code
/**
* The name of the po file.
*/
protected File inputFile;
protected File checkAgainstFile;
protected File checkAgainstDir;
/**
* The template file.
*/
protected File templateFile;
protected File outputFile;
protected File destDir;
protected boolean verbose;
protected boolean preserveTimestamps;
/**
* the filesets of the .po to convert
*/
protected Vector filesets = new Vector();
protected FileUtils fileUtils = FileUtils.newFileUtils();
/**
* the .po file to convert; required
*/
public void setInputFile(final File inputFile) {
this.inputFile = inputFile;
}
/**
* set the preserveTimestamps value
*/
public void setPreserveTimestamps(boolean preserveTimestamps) {
this.preserveTimestamps = preserveTimestamps;
}
/**
* the .po file to check against; optional
*/
public void setCheckAgainstFile(final File checkAgainstFile) {
this.checkAgainstFile = checkAgainstFile;
}
/**
* the .directory containing .po files to check against
*/
public void setCheckAgainstDir(final File checkAgainstDir) {
this.checkAgainstDir = checkAgainstDir;
}
/**
* template location; required
*/
public void setTemplateFile(final File templateFile) {
this.templateFile = templateFile;
}
/**
* name of exported .properties file; optional
*/
public void setOutputFile(final File outputFile) {
this.outputFile = outputFile;
}
/**
* Sets the destination directory.
* @param destDir the destination directory
*/
public void setDestDir(File destDir) {
this.destDir = destDir;
}
/**
* Adds a set of files to convert
*/
public void addFileset(final FileSet set) {
filesets.addElement(set);
}
/**
* Convert the files
*/
public void execute() throws BuildException {
if (null == inputFile && null == filesets) {
throw new BuildException("a .po file must be set through inputFile attribute "
+ "or nested filesets");
}
if (null != inputFile) {
doOneFile(inputFile, outputFile, checkAgainstFile);
return;
} else {
//Assume null != filesets
// deal with the filesets
for (int i = 0; i < filesets.size(); i++) {
FileSet fs = (FileSet) filesets.elementAt(i);
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
String[] inputFiles = ds.getIncludedFiles();
for (int j = 0; j < inputFiles.length; j++) {
doOneFile(new File(fs.getDir(getProject()), inputFiles[j]), null, null);
}
}
}
}
/**
* convert one file
*/
private void doOneFile(File inputFile, File outputFile, File checkAgainstFile)
throws BuildException {
if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
throw new BuildException("The Po2Prop task is only available on "
+ "JDK versions 1.2 or greater");
}
if(outputFile==null){
if(destDir==null){
destDir=inputFile.getParentFile();
}
String justFName=inputFile.getName();
int lastDot=justFName.lastIndexOf('.');
if(lastDot>0)
justFName=justFName.substring(0, lastDot);
outputFile=new File(destDir, justFName+".properties");
}
if(checkAgainstFile==null && checkAgainstDir!=null && inputFile!=null){
checkAgainstFile=new File(checkAgainstDir, inputFile.getName());
}
if (isUpToDate(inputFile, outputFile, checkAgainstFile)) {
return;
}
final ExecTask cmd = (ExecTask) getProject().createTask("exec");
cmd.setExecutable("po2prop");
if (null != templateFile) {
cmd.createArg().setValue("--template="+templateFile.toString());
}
if (null != inputFile) {
cmd.createArg().setValue("--input="+inputFile.toString());
}
if (null != outputFile) {
cmd.createArg().setValue("--output="+outputFile.toString());
}
log("Converting properties: " + inputFile.getAbsolutePath());
cmd.setFailonerror(true);
cmd.setTaskName(getTaskName());
cmd.execute();
if(preserveTimestamps){
outputFile.setLastModified(inputFile.lastModified());
}
}
protected boolean isUpToDate(File inputFile, File outputFile, File checkAgainstFile) throws BuildException {
if (null == inputFile) {
return false;
}
if (null != outputFile) {
if (!inputFile.exists()) {
return false;
}
if (null!=checkAgainstFile && checkAgainstFile.exists()){
if(checkAgainstFile.lastModified() >= inputFile.lastModified()){
return true;
} else{
try {
if(fileUtils.contentEquals(inputFile, checkAgainstFile, true))
return true;
} catch(Exception ex){
throw new BuildException(ex);
}
}
}
if (!outputFile.exists()) {
return false;
}
if (inputFile.equals(outputFile)) {
return false;
}
if (outputFile.lastModified() >= inputFile.lastModified()) {
return true;
}
}
return false;
}
}