// ********************************************************************** // // Copyright (c) 2001 // Mutable Realms, Inc. // Huntsville, AL, USA // // All Rights Reserved // // ********************************************************************** //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 slice2freezej. This task extends the abstract * SliceTask class which takes care of attributes common to all slice * translators (see SliceTask.java for details on these attributes). * * Attributes: * * binary - Enables --binary option. * * Nested elements: * * dict - contains the NAME KEY & VALUE of the freeze type. * * Example: * * * * * * * * * * * * * * * * * * * The element installs the slice2freezej task. */ public class Slice2FreezeJTask extends SliceTask { public Slice2FreezeJTask() { } public void setTranslator(File prog) { _translator = prog; } public void setBinary(boolean binary) { _binary = binary; } public Dict createDict() { Dict d = new Dict(); _dicts.add(d); return d; } public void execute() throws BuildException { if(_dicts.isEmpty()) { throw new BuildException("No dictionaries specified"); } // // Read the set of dependencies for this task. // java.util.HashMap dependencies = readDependencies(); // // Check if the set of slice files changed. If it changed we // need to rebuild all the dictionnaries. // boolean build = false; java.util.List sliceFiles = new java.util.LinkedList(); java.util.Iterator p = _fileSets.iterator(); while(p.hasNext()) { FileSet fileset = (FileSet)p.next(); DirectoryScanner scanner = fileset.getDirectoryScanner(project); String[] files = scanner.getIncludedFiles(); for(int i = 0; i < files.length; i++) { File slice = new File(fileset.getDir(project), files[i]); sliceFiles.add(slice); if(!build) { // // The dictionnaries need to be re-created since // on dependency changed. // SliceDependency depend = (SliceDependency)dependencies.get(getSliceTargetKey(slice.toString())); if(depend == null || !depend.isUpToDate()) { build = true; } } } } if(!build) { // // Check that each dictionnaries has been built at least // once. // p = _dicts.iterator(); while(p.hasNext()) { SliceDependency depend = (SliceDependency)dependencies.get(getDictTargetKey((Dict)p.next())); if(depend == null) { build = true; break; } } } // // Add the --dict options. // p = _dicts.iterator(); StringBuffer dictString = new StringBuffer(); while(p.hasNext()) { Dict d = (Dict)p.next(); dictString.append(" --dict "); dictString.append(d.getName() + "," + d.getKey() + "," + d.getValue()); } if(!build) { log("skipping" + dictString); return; } // // Run the translator // StringBuffer cmd = new StringBuffer(); // // Add --ice // cmd.append(" --ice"); // // Add --output-dir // if(_outputDir != null) { cmd.append(" --output-dir "); cmd.append(_outputDir.toString()); } // // Add --binary // if(_binary) { cmd.append(" --binary"); } // // 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 the --dict options. // cmd.append(dictString); // // Add the slice files. // p = sliceFiles.iterator(); while(p.hasNext()) { File f = (File)p.next(); cmd.append(" " + f); } // // 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(); // // Update the dependencies. // if(!sliceFiles.isEmpty()) { cmd = new StringBuffer("--depend"); // // 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 the slice files. // p = sliceFiles.iterator(); while(p.hasNext()) { File f = (File)p.next(); cmd.append(" " + f.toString()); } // // Add the --dict options. // cmd.append(dictString); task = (ExecTask)project.createTask("exec"); task.setFailonerror(true); arg = task.createArg(); arg.setLine(cmd.toString()); task.setExecutable(_translator.toString()); task.setOutputproperty("slice2freezej.depend"); task.execute(); // // Update dependency file. // java.util.List newDependencies = parseDependencies(project.getProperty("slice2freezej.depend")); p = newDependencies.iterator(); while(p.hasNext()) { SliceDependency dep = (SliceDependency)p.next(); dependencies.put(getSliceTargetKey(dep._dependencies[0]), dep); } } p = _dicts.iterator(); while(p.hasNext()) { dependencies.put(getDictTargetKey((Dict)p.next()), new SliceDependency()); } writeDependencies(dependencies); } private String getSliceTargetKey(String slice) { // // Since the dependency file can be shared by several slice // tasks we need to make sure that each dependency has a // unique key. We use the name of the task, the output // directory, the first dictionnary name and the name of the // slice file to be compiled. // return "slice2freezej " + _outputDir.toString() + ((Dict)_dicts.get(0)).getName() + slice; } private String getDictTargetKey(Dict d) { return "slice2freezej " + _outputDir.toString() + d.getName(); } private File _translator = new File("slice2freezej"); private boolean _binary = false; public class Dict { private String _name; private String _key; private String _value; public void setName(String name) { _name = name; } public String getName() { return _name; } public void setKey(String key) { _key = key; } public String getKey() { return _key; } public void setValue(String value) { _value = value; } public String getValue() { return _value; } }; private java.util.List _dicts = new java.util.LinkedList(); }