| filelist/fileset with multiple directory | filelist/fileset with multiple directory 2007-01-24 - By Dominique Devienne
Oops, depends on this base class ;-)
import java.io.File;
import java.util.StringTokenizer;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.Parameter;
import org.apache.tools.ant.types.selectors.FileSelector; import org.apache.tools.ant.types.selectors.BaseExtendSelector;
/** * Base class for composite selectors. */ public abstract class AbstractCompositeSelector extends BaseExtendSelector {
private FileSelector _root;
/** * Configures this composite selector. * <p> * This method is guaranteed for be called only once, * when {@(protected) #isSelected} is called the first time. * * @(protected) params the selectors type-less parameters. * @(protected) the configured composite selector. */ protected abstract FileSelector configure(Parameter[] params);
/** Gets the root selector, configuring it if necessary. */ private FileSelector getRoot() { if (_root == null) { _root = configure(getParameters()); } return _root; }
/** * Checks whether a given file should be selected or not. * * @(protected) basedir the base directory * @(protected) filename the file path name relative to <code>basedir</code> * @(protected) file the file instance corresponding to <code>filename</code> * @(protected) <code>true</code> if selected; <code>false</code> otherwise. */ public boolean isSelected(File basedir, String filename, File file) { return getRoot().isSelected(basedir, filename, file); }
}
On 1/24/07, Dominique Devienne <ddevienne@(protected)> wrote: > On 1/24/07, Matt Benson <gudnabrsam@(protected)> wrote: > > If we can think of an elegant way to design this, this > > question comes up enough that it might be useful to > > include such a selector in Ant core. > > This is not exactly the same selector, but close enough that the code > should be trivial to adapt to this new particular need. Stefan's > pseudo-code selector is not far from the pseudo-code selector in the > javadoc below. --DD > > import java.io.File; > > import java.util.List; > import java.util.ArrayList; > import java.util.StringTokenizer; > > import org.apache.tools.ant.Project; > import org.apache.tools.ant.BuildException; > > import org.apache.tools.ant.types.Parameter; > > import org.apache.tools.ant.types.selectors.FileSelector; > import org.apache.tools.ant.types.selectors.OrSelector; > import org.apache.tools.ant.types.selectors.AndSelector; > import org.apache.tools.ant.types.selectors.PresentSelector; > > /** > * A selector that looks whether the given file from the source directory > * exists in more than one of the target directories, and returns > * <code>true</code> in this condition only. > * <p> > * This selector is useful when one is attempting to partition a directory > * hierarchy into many separate independent directory hierarchies, to find > * the <em>duplicate</em> files of the source hierarchy which were put into > * more than one of the target hierarchies. > * <p> > * Equivalent to the following composite selector: > * <pre> > * <or> > * <and> > * <present targetdir="dir#1"/> > * <or> > * <present targetdir="dir#2"/> > * <present targetdir="dir#3"/> > * etc... > * <present targetdir="dir#N"/> > * </or> > * </and> > * <and> > * <present targetdir="dir#2"/> > * <or> > * <present targetdir="dir#3"/> > * <present targetdir="dir#4"/> > * etc... > * <present targetdir="dir#N"/> > * </or> > * </and> > * etc... > * <and> > * <present targetdir="dir#N-1"/> > * <or> > * <present targetdir="dir#N"/> > * </or> > * </and> > * </or> > * </pre> > */ > public class MultiPresentSelector > extends AbstractCompositeSelector { > > /** {@(protected)} */ > protected FileSelector configure(Parameter[] params) { > String path = null; > String suffix = ""; > > for (int i = 0; i < params.length; ++i) { > Parameter param = params[i]; > if (param.getName().equals("path")) { > path = param.getValue(); > } > else if (param.getName().equals("suffix")) { > suffix = param.getValue(); > } > else { > throw new BuildException("Unknown param: " + param.getName()); > } > } > > if (path == null) { > throw new BuildException("Unset required param: path"); > } > > File[] files = getFiles(path, suffix); > if (files.length < 2) { > throw new BuildException("Empty selector"); > } > > OrSelector or = new OrSelector(); > for (int i = 0; i < files.length - 1; ++i) { > AndSelector and = new AndSelector(); > PresentSelector present = new PresentSelector(); > present.setTargetdir(files[i]); > and.appendSelector(present); > OrSelector or2 = new OrSelector(); > for (int j = i+1; j < files.length; ++j) { > PresentSelector present2 = new PresentSelector(); > present2.setTargetdir(files[j]); > or2.appendSelector(present2); > } > and.appendSelector(or2); > or.appendSelector(and); > } > > return or; > } > > private File[] getFiles(String path, String suffix) { > List files = new ArrayList(32); > StringTokenizer st = new StringTokenizer(path, File.pathSeparator); > while (st.hasMoreTokens()) { > File file = new File(st.nextToken() + suffix); > if (file.isDirectory()) { > files.add(file); > } > } > return (File[])files.toArray(new File[0]); > } > > } >
--------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscribe@(protected) For additional commands, e-mail: user-help@(protected)
|
|
 |