// **********************************************************************
//
// Copyright (c) 2003
// ZeroC, Inc.
// Billerica, MA, USA
//
// All Rights Reserved.
//
// Ice is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License version 2 as published by
// the Free Software Foundation.
//
// **********************************************************************
//package Ice.Ant;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.taskdefs.ExecTask;
import org.apache.tools.ant.types.Commandline.Argument;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
import java.io.File;
import java.io.FileOutputStream;
/**
* An ant task for slice2xsd. The task minimizes regeneration by
* creating a tag file whose timestamp represents the last time
* the corresponding Slice file was generated.
*
* Attributes:
*
* translator - The pathname of the translator (default: "slice2xsd").
* tagdir - The directory in which tag files are located (default: ".").
* outputdir - The value for the --output-dir translator option.
* package - The value for the --package translator option.
* casesensitive - The value for the --case-sensitive translator option.
*
* Nested elements:
*
* includepath - The directories in which to search for Slice files.
* These are converted into -I directives for the translator.
* fileset - The set of Slice files to generate.
*
* Example:
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* The element installs the slice2xsd task.
*/
public class Slice2XsdTask extends org.apache.tools.ant.Task
{
public
Slice2XsdTask()
{
_translator = new File("slice2xsd");
_tagDir = new File(".");
_outputDir = null;
_package = null;
_includePath = null;
_fileSet = null;
_caseSensitive = false;
}
public void
setTranslator(File prog)
{
_translator = prog;
}
public void
setTagdir(File dir)
{
_tagDir = dir;
}
public void
setOutputdir(File dir)
{
_outputDir = dir;
}
public void
setPackage(String pkg)
{
_package = pkg;
}
public void
setCaseSensitive(boolean c)
{
_caseSensitive = c;
}
public Path
createIncludePath()
{
if(_includePath == null)
{
_includePath = new Path(project);
}
return _includePath.createPath();
}
public void
setIncludePathRef(Reference ref)
{
createIncludePath().setRefid(ref);
}
public void
setIncludePath(Path includePath)
{
if(_includePath == null)
{
_includePath = includePath;
}
else
{
_includePath.append(includePath);
}
}
public FileSet
createFileset()
{
if(_fileSet == null)
{
_fileSet = new FileSet();
}
return _fileSet;
}
public void
execute()
throws BuildException
{
if(_fileSet == null)
{
throw new BuildException("No fileset specified");
}
//
// Compose a list of the files that need to be translated
//
java.util.Vector buildList = new java.util.Vector();
java.util.Vector tagList = new java.util.Vector();
DirectoryScanner scanner = _fileSet.getDirectoryScanner(project);
scanner.scan();
String[] files = scanner.getIncludedFiles();
for(int i = 0; i < files.length; i++)
{
File slice = new File(_fileSet.getDir(project), files[i]);
File tag = new File(_tagDir, "." + slice.getName() + ".tag");
if(tag.exists() && slice.lastModified() <= tag.lastModified())
{
log("skipping " + files[i]);
}
else
{
buildList.addElement(slice);
tagList.addElement(tag);
}
}
//
// Run the translator
//
if(!buildList.isEmpty())
{
StringBuffer cmd = new StringBuffer();
//
// Add --ice
//
cmd.append(" --ice");
//
// Add --output-dir
//
if(_outputDir != null)
{
cmd.append(" --output-dir ");
StringBuffer fixedOutDir = new StringBuffer();
String outDir = _outputDir.toString();
for(int i = 0; i < outDir.length(); i++)
{
if(outDir.charAt(i) == '\\')
{
fixedOutDir = fixedOutDir.append("/");
}
else
{
fixedOutDir = fixedOutDir.append(outDir.charAt(i));
}
}
cmd.append(fixedOutDir.toString());
}
//
// Add --package
//
if(_package != null)
{
cmd.append(" --package ");
cmd.append(_package);
}
//
// Add --case-sensitive
//
if(_caseSensitive)
{
cmd.append(" --case-sensitive");
}
//
// Add include directives
//
if(_includePath != null)
{
String[] dirs = _includePath.list();
for(int i = 0; i < dirs.length; i++)
{
cmd.append(" -I");
cmd.append(dirs[i]);
}
}
//
// Add files to be translated
//
for(int i = 0; i < buildList.size(); i++)
{
File f = (File)buildList.elementAt(i);
cmd.append(" ");
StringBuffer fixedFile = new StringBuffer();
String filePath = f.toString();
for(int j = 0; j < filePath.length(); j++)
{
if(filePath.charAt(j) == '\\')
{
fixedFile = fixedFile.append("/");
}
else
{
fixedFile = fixedFile.append(filePath.charAt(j));
}
}
cmd.append(fixedFile.toString());
}
//
// Execute
//
log(_translator.toString() + " " + cmd);
ExecTask task = (ExecTask)project.createTask("exec");
task.setFailonerror(true);
Argument arg = task.createArg();
arg.setLine(cmd.toString());
task.setExecutable(_translator.toString());
task.execute();
//
// Touch the tag files
//
for(int i = 0; i < tagList.size(); i++)
{
File f = (File)tagList.elementAt(i);
try
{
FileOutputStream out = new FileOutputStream(f);
out.close();
}
catch(java.io.IOException ex)
{
throw new BuildException("Unable to create tag file " +
f + ": " + ex);
}
}
}
}
private File _translator;
private File _tagDir;
private File _outputDir;
private String _package;
private Path _includePath;
private FileSet _fileSet;
private boolean _caseSensitive;
}