From dbab858d18a442a91d10911e36967378e835e1e2 Mon Sep 17 00:00:00 2001 From: adammurdoch Date: Wed, 27 Feb 2002 12:05:36 +0000 Subject: [PATCH] Changes to the VFS data types: * Added FileSelector interface. * now takes file selectors, instead of include and exclude patterns. * Added a bunch of file selector implementations: * , , for combining selectors. * , , for testing bits of the file name against an Ant 1 style pattern, or a regular expression. * , , for testing file type. * Added , which combines nested file sets and paths into a single directory. This allows explicit path -> fileset conversion. * Added , which applies selectors to nested file sets and paths. * Added debug task. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271577 13f79535-47bb-0310-9956-ffa450edef68 --- proposal/myrmidon/lib/jakarta-oro-2.0.5.jar | Bin 0 -> 79297 bytes .../vfile/AbstractNameFileSelector.java | 136 ++++++++++++++++++ .../apache/antlib/vfile/AndFileSelector.java | 57 ++++++++ .../antlib/vfile/BaseNameFileSelector.java | 32 +++++ .../apache/antlib/vfile/CopyFilesTask.java | 8 ++ .../apache/antlib/vfile/DefaultFileList.java | 2 + ...atternFileSet.java => DefaultFileSet.java} | 33 +++-- .../antlib/vfile/ExistenceFileSelector.java | 44 ++++++ .../org/apache/antlib/vfile/FileList.java | 1 + .../org/apache/antlib/vfile/FileSelector.java | 36 +++++ .../java/org/apache/antlib/vfile/FileSet.java | 4 +- .../apache/antlib/vfile/FilteredFileList.java | 71 +++++++++ .../org/apache/antlib/vfile/FlatFileSet.java | 54 +++++++ .../antlib/vfile/IsDirectorySelector.java | 45 ++++++ .../apache/antlib/vfile/IsFileSelector.java | 45 ++++++ .../apache/antlib/vfile/ListFileSetTask.java | 48 +++++++ .../apache/antlib/vfile/ListFilesTask.java | 2 +- .../apache/antlib/vfile/NameFileSelector.java | 32 +++++ .../apache/antlib/vfile/NotFileSelector.java | 50 +++++++ .../apache/antlib/vfile/OrFileSelector.java | 58 ++++++++ .../org/apache/antlib/vfile/PathFileList.java | 2 +- .../apache/antlib/vfile/Resources.properties | 10 ++ .../antlib/vfile/SingletonFileList.java | 5 +- .../apache/antlib/vfile/UrlFileSelector.java | 32 +++++ 24 files changed, 792 insertions(+), 15 deletions(-) create mode 100644 proposal/myrmidon/lib/jakarta-oro-2.0.5.jar create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/AbstractNameFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/AndFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/BaseNameFileSelector.java rename proposal/myrmidon/src/java/org/apache/antlib/vfile/{PatternFileSet.java => DefaultFileSet.java} (77%) create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/ExistenceFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/FilteredFileList.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/FlatFileSet.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/IsDirectorySelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/IsFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFileSetTask.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/NameFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/NotFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/OrFileSelector.java create mode 100644 proposal/myrmidon/src/java/org/apache/antlib/vfile/UrlFileSelector.java diff --git a/proposal/myrmidon/lib/jakarta-oro-2.0.5.jar b/proposal/myrmidon/lib/jakarta-oro-2.0.5.jar new file mode 100644 index 0000000000000000000000000000000000000000..6eafa4a78ed116ae83df3c0da41f971742ee9c37 GIT binary patch literal 79297 zcmbTd1C%A((k@zEwry9JU0t?~RqR5SZQHhO+w8J!+qPY=_de&n@$UQ2+4qjOa%AQj zV?|`n8S9IfUqnXAOM!qw1O4@ZbY`Ua`^&!%P=C%cA^-te30YBk`9ET)K#+fJ{~s~b z|F@WofUJb5h!TKKM)Xc*d`w!3mTm@4ik50}e5ziNVV-&Wz>ZE*hDJhW#<8qH(Po_b z8#MNv-HqKhAbBYW$oKoEPWnHWqx-Y}b;JKWF3>-}TH6`_J*59E0rPJOT^n6}6T^QH zMEG9?t?jJ;K^Xae3Y-3u{9lIoYn=Zc#a|b9Fm!SFhdW^Z7Y#c@V?&pJ(8K&Mdb-Z$ z|Dc8SU$krt?JWL5?LSP*(ZTdz8vhv~l>hTae+(z!Y%XeQVQ8gmY53>tU}#6DZ=q{% z-x$9oi!FdU*!9goSH0n@U&WMK$)u0pj<98#E@teL-j^dMl6@a4bPDYCF+OT9w2Zpt#|Mde{u=vQWgzFOwE_#WbY^v#@C2q9=mSPJXtL?c02l}>U5nsi0ovia;L2B>@$1e!#m>{NjK*dVVkAP_xyq+pT;~-$e95<|*a&0X=+~oVLiKM~tL| zJl(Lbqc>3=MCB1C)M@o;;n%CgBzp13b?_WXBL%{ZOTpI*#H^PHa<0Ik5j0D%i|w0< zNeeGkmLxM79{>cDDh%h(6gz+3(gO+s?`RO>1i}n-v6zJR4E#wdMgi+&{d|chx~y=D zrh2}jzN+4zz1Dwuxxthy(B?NFAp1X#{NKY0^?wA7;$NQdA7PX5Q)x~fapJpBK;rNQqoKI|;*c4)fy#!a)lK zoV=OQu|L}!&(ZnH$3@mg{QK+21y_5BK5u}LCj2gJo@PXV_^@U_u>3Qob?jn?pl+*WGO)}v z$Em~Yz_Sanedm|7R1OtwhXG~GNSh0Hfy_BgnTvtZa%>E=b%xAHvV)F{+#7PeVu|ET zx<0^zRF8bAAEnz;Wsndg#T~S`x1X$-?v^%*Q9AK^v8lspPoCp&F&&JySvSSibK^35 zEhrc`c25#Vc)uBS}wcA$Yt73<(0{A3;UWt3)j5>M^LeVPYaj9Va_7x91NT5z>|Ta z2`0MYyq9|DiO_?Hr;j5J=~=Y*5VUvjLJ9%^1e0*;&zQ;oat6m3b zl4u30VN#Pi54?Gb(+iZJowVuGl@PZRfxkT!&deKID;btby{C$!u-&^H7p zqzdQtBA060SR>$*Hw)n|fBB4(N@d}xZ-UxC264)+*H9w9!E&bZk@{s13JAJj?D4(i z#6aTbjD*_~X+yzqDRsIOu08o{3Uk^`A$6|6e?>K1Nxb!dBXDdNC~XqSYRX&KSRl+I zapeNsoQpsUXK4W=9rqce-lP{4vtHyE43#`B_Yi+Mm)pxg8z=}6kQl^2ITzJ`bS^Oq zYrX&ITS{xPYy5~j=>hDvxW{mcgqBdM6p-)p6nT=ve(03<$R=c2c`|BXs!@?D;5R?J z{R>4;A@1|bCJTx}5G4sp2qw=bCpnn+Rz7a-)|?A!gBG}H#+ediP;dNp$oi;3?8)m& zFjIci{34DH3≪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�(uDf{Yh?^WPc^pTmd1u2RRCM9` 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 Murdoch + * @version $Revision$ $Date$ + */ +public abstract class AbstractNameFileSelector + implements FileSelector +{ + private final static Resources REZ + = ResourceManager.getPackageResources( AbstractNameFileSelector.class ); + + private Object m_type; + private String m_pattern; + + private static final Object TYPE_GLOB = "glob"; + private static final Object TYPE_REGEXP = "regexp"; + + /** + * Sets the GLOB pattern to match the name against. + */ + public void setPattern( final String pattern ) + throws TaskException + { + setPattern( TYPE_GLOB, pattern ); + } + + /** + * Sets the Regexp pattern to match the file basename against. + */ + public void setRegexp( final String pattern ) + throws TaskException + { + setPattern( TYPE_REGEXP, pattern ); + } + + /** + * Sets the pattern and type to match + */ + private void setPattern( final Object type, final String pattern ) + throws TaskException + { + if( m_type != null ) + { + final String message = REZ.getString( "nameselector.too-many-patterns.error" ); + throw new TaskException( message ); + } + m_type = type; + m_pattern = pattern; + } + + /** + * Accepts the file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + if( m_type == null ) + { + final String message = REZ.getString( "nameselector.no-pattern.error" ); + throw new TaskException( message ); + } + + // Create the pattern to match against + final Pattern pattern; + try + { + if( m_type == TYPE_GLOB ) + { + pattern = createGlobPattern( m_pattern ); + } + else + { + pattern = createRegexpPattern( m_pattern ); + } + } + catch( MalformedPatternException e ) + { + final String message = REZ.getString( "nameselector.bad-pattern.error", m_pattern ); + throw new TaskException( message ); + } + + // Get the name to match against + final String name = getNameForMatch( path, file ); + + // Compare the name against the pattern + return new Perl5Matcher().matches( name, pattern ); + } + + /** + * Creates a GLOB pattern for matching the name against. + */ + protected Pattern createGlobPattern( final String pattern ) + throws MalformedPatternException + { + // TODO - need to implement Ant-style patterns + return new GlobCompiler().compile( pattern ); + } + + /** + * Creates a Regexp pattern for matching the name against. + */ + protected Pattern createRegexpPattern( final String pattern ) + throws MalformedPatternException + { + return new Perl5Compiler().compile( pattern ); + } + + /** + * Returns the name to match against. + */ + protected abstract String getNameForMatch( final String path, + final FileObject file ); +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/AndFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/AndFileSelector.java new file mode 100644 index 000000000..dd01cdc14 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/AndFileSelector.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import java.util.ArrayList; +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file selector that performs an AND of nested selectors. Performs + * lazy evaluation. Returns true when no nested elements are supplied. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="and-selector" + * @ant:type type="v-file-selector" name="and" + */ +public class AndFileSelector + implements FileSelector +{ + private final ArrayList m_selectors = new ArrayList(); + + /** + * Adds a nested selector. + */ + public void add( final FileSelector selector ) + { + m_selectors.add( selector ); + } + + /** + * Accepts a file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + for( int i = 0; i < m_selectors.size(); i++ ) + { + final FileSelector fileSelector = (FileSelector)m_selectors.get(i ); + if( ! fileSelector.accept( file, path, context ) ) + { + return false; + } + } + + return true; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/BaseNameFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/BaseNameFileSelector.java new file mode 100644 index 000000000..fefd426b4 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/BaseNameFileSelector.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; + +/** + * A file selector that selects files based on their base-name. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="basename-selector" + * @ant:type type="v-file-selector" name="basename" + */ +public class BaseNameFileSelector + extends AbstractNameFileSelector +{ + /** + * Returns the name to match against. + */ + protected String getNameForMatch( final String path, + final FileObject file ) + { + return file.getName().getBaseName(); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/CopyFilesTask.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/CopyFilesTask.java index a28759b36..6cadccba7 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/CopyFilesTask.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/CopyFilesTask.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Iterator; import org.apache.aut.vfs.FileObject; import org.apache.aut.vfs.FileSystemException; +import org.apache.aut.vfs.FileType; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.myrmidon.api.AbstractTask; @@ -22,6 +23,7 @@ import org.apache.myrmidon.api.TaskException; * A task that copies files. * * @author Adam Murdoch + * * @ant:task name="v-copy" */ public class CopyFilesTask @@ -121,6 +123,12 @@ public class CopyFilesTask // TODO - map destination name + // TODO - maybe include empty dirs + if( srcFile.getType() != FileType.FILE ) + { + continue; + } + // TODO - use scope here, to make sure that the result // is a descendent of the dest dir final FileObject destFile = m_destDir.resolveFile( path ); diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileList.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileList.java index b00df8b3f..d8d288a38 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileList.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileList.java @@ -18,7 +18,9 @@ import org.apache.myrmidon.api.TaskException; * A compound file list, which is made up of several other file lists. * * @author Adam Murdoch + * * @ant:data-type name="v-path" + * @ant:type type="v-path" name="v-path" */ public class DefaultFileList implements FileList { diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/PatternFileSet.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileSet.java similarity index 77% rename from proposal/myrmidon/src/java/org/apache/antlib/vfile/PatternFileSet.java rename to proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileSet.java index e624b107b..9fb1e4d6a 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/PatternFileSet.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/DefaultFileSet.java @@ -15,23 +15,24 @@ import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.api.TaskException; -import org.apache.myrmidon.framework.AbstractFileSet; /** * A file set, that contains those files under a directory that match - * a set of patterns. + * a set of selectors. * * @author Adam Murdoch + * * @ant:data-type name="v-fileset" + * @ant:type type="v-fileset" name="v-fileset" */ -public class PatternFileSet - extends AbstractFileSet +public class DefaultFileSet implements FileSet { private final static Resources REZ = - ResourceManager.getPackageResources( PatternFileSet.class ); + ResourceManager.getPackageResources( DefaultFileSet.class ); private FileObject m_dir; + private final AndFileSelector m_selector = new AndFileSelector(); /** * Sets the root directory. @@ -41,6 +42,14 @@ public class PatternFileSet m_dir = dir; } + /** + * Adds a selector. + */ + public void add( final FileSelector selector ) + { + m_selector.add( selector ); + } + /** * Returns the contents of the set. */ @@ -59,7 +68,7 @@ public class PatternFileSet final ArrayList stack = new ArrayList(); final ArrayList pathStack = new ArrayList(); stack.add( m_dir ); - pathStack.add( "." ); + pathStack.add( "" ); while( stack.size() > 0 ) { @@ -72,17 +81,19 @@ public class PatternFileSet for( int i = 0; i < children.length; i++ ) { FileObject child = children[ i ]; - String childPath = path + '/' + child.getName().getBaseName(); - if( child.getType() == FileType.FILE ) + String childPath = path + child.getName().getBaseName(); + + // Check whether to include the file in the result + if( m_selector.accept( child, childPath, context ) ) { - // A regular file - add it straight to the result result.addElement( child, childPath ); } - else + + if( child.getType() == FileType.FOLDER ) { // A folder - push it on to the stack stack.add( 0, child ); - pathStack.add( 0, childPath ); + pathStack.add( 0, childPath + '/' ); } } } diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/ExistenceFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/ExistenceFileSelector.java new file mode 100644 index 000000000..ad0a15657 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/ExistenceFileSelector.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.aut.vfs.FileSystemException; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file selector that only selects files that exist. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="exists-selector" + * @ant:type type="v-file-selector" name="exists" + */ +public class ExistenceFileSelector + implements FileSelector +{ + /** + * Accepts a file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + try + { + return file.exists(); + } + catch( FileSystemException e ) + { + throw new TaskException( e.getMessage(), e ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileList.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileList.java index 9f0c7e760..2ee4d7e78 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileList.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileList.java @@ -16,6 +16,7 @@ import org.apache.myrmidon.framework.DataType; * An ordered list of files. * * @author Adam Murdoch + * * @ant:role shorthand="v-path" */ public interface FileList diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSelector.java new file mode 100644 index 000000000..7ad5932d2 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSelector.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.framework.DataType; + +/** + * Accepts files as part of a set. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:role shorthand="v-file-selector" + */ +public interface FileSelector + extends DataType +{ + /** + * Accepts a file. + * + * @param path The virtual path associated with the file. May be null + * if such a path is not available. + * @param file The file to select. + * @param context The context to perform the selection in. + */ + boolean accept( FileObject file, String path, TaskContext context ) + throws TaskException; +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSet.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSet.java index c56a68930..8bf9ec40b 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSet.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FileSet.java @@ -16,6 +16,7 @@ import org.apache.myrmidon.framework.DataType; * with it. * * @author Adam Murdoch + * * @ant:role shorthand="v-fileset" */ public interface FileSet @@ -30,5 +31,6 @@ public interface FileSet * @throws TaskException * On error building the set. */ - FileSetResult getResult( TaskContext context ) throws TaskException; + FileSetResult getResult( TaskContext context ) + throws TaskException; } diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FilteredFileList.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FilteredFileList.java new file mode 100644 index 000000000..27386c395 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FilteredFileList.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import java.util.ArrayList; +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file-list which filters another. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="filtered-path" + * @ant:type type="v-path" name="filtered-path" + */ +public class FilteredFileList + implements FileList +{ + private DefaultFileList m_fileList = new DefaultFileList(); + private FileSelector m_selector; + + /** + * Sets the selector to use to filter with. + */ + public void setCondition( final AndFileSelector selector ) + { + m_selector = selector; + } + + /** + * Sets the filelist to filter. + */ + public void add( final FileList fileList ) + { + m_fileList.add( fileList ); + } + + /** + * Returns the files in the list. + */ + public FileObject[] listFiles( final TaskContext context ) + throws TaskException + { + if( m_selector == null ) + { + throw new TaskException( "filteredfilelist.no-selector.error" ); + } + + // Build the set of files + final ArrayList acceptedFiles = new ArrayList(); + final FileObject[] files = m_fileList.listFiles( context ); + for( int i = 0; i < files.length; i++ ) + { + final FileObject file = files[ i ]; + if( m_selector.accept( file, null, context ) ) + { + acceptedFiles.add( file ); + } + } + + return (FileObject[])acceptedFiles.toArray( new FileObject[acceptedFiles.size() ] ); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/FlatFileSet.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FlatFileSet.java new file mode 100644 index 000000000..f190c950c --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/FlatFileSet.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file set that flattens its contents into a single directory. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="flat-fileset" + * @ant:type type="v-fileset" name="flat-fileset" + */ +public class FlatFileSet + implements FileSet +{ + private DefaultFileList m_files = new DefaultFileList(); + + /** + * Adds a file list to this set. + */ + public void add( final FileList files ) + { + m_files.add( files ); + } + + /** + * Returns the contents of the set. + */ + public FileSetResult getResult( final TaskContext context ) + throws TaskException + { + DefaultFileSetResult result = new DefaultFileSetResult(); + FileObject[] files = m_files.listFiles( context ); + for( int i = 0; i < files.length; i++ ) + { + final FileObject file = files[ i ]; + + // TODO - detect collisions + result.addElement( file, file.getName().getBaseName() ); + } + + return result; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/IsDirectorySelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/IsDirectorySelector.java new file mode 100644 index 000000000..5a17f2d84 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/IsDirectorySelector.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.aut.vfs.FileSystemException; +import org.apache.aut.vfs.FileType; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file selector which only selects folders, not files. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="is-folder-selector" + * @ant:type type="v-file-selector" name="is-folder" + */ +public class IsDirectorySelector + implements FileSelector +{ + /** + * Accepts a file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + try + { + return ( file.exists() && file.getType() == FileType.FOLDER ); + } + catch( FileSystemException e ) + { + throw new TaskException( e.getMessage(), e ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/IsFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/IsFileSelector.java new file mode 100644 index 000000000..cc275c051 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/IsFileSelector.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.aut.vfs.FileSystemException; +import org.apache.aut.vfs.FileType; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file selector which only selects files, not folders. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="is-file-selector" + * @ant:type type="v-file-selector" name="is-file" + */ +public class IsFileSelector + implements FileSelector +{ + /** + * Accepts a file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + try + { + return ( file.exists() && file.getType() == FileType.FILE ); + } + catch( FileSystemException e ) + { + throw new TaskException( e.getMessage(), e ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFileSetTask.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFileSetTask.java new file mode 100644 index 000000000..fa64e9862 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFileSetTask.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.AbstractTask; +import org.apache.myrmidon.api.TaskException; + +/** + * A debug task, that lists the contents of a {@link FileSet}. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:task name="v-list-fileset" + */ +public class ListFileSetTask + extends AbstractTask +{ + private FileSet m_fileSet; + + public void set( final FileSet fileSet ) + { + m_fileSet = fileSet; + } + + /** + * Execute task. + */ + public void execute() + throws TaskException + { + FileSetResult result = m_fileSet.getResult( getContext() ); + final FileObject[] files = result.getFiles(); + final String[] paths = result.getPaths(); + for( int i = 0; i < files.length; i++ ) + { + final FileObject file = files[ i ]; + final String path = paths[ i ]; + getLogger().info( path + " = " + file ); + } + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFilesTask.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFilesTask.java index 7bea957e3..c313ce3fc 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFilesTask.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/ListFilesTask.java @@ -17,7 +17,7 @@ import org.apache.myrmidon.api.TaskException; * @author Adam Murdoch * @version $Revision$ $Date$ * - * @ant:task name="v-list-files" + * @ant:task name="v-list-path" */ public class ListFilesTask extends AbstractTask diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/NameFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/NameFileSelector.java new file mode 100644 index 000000000..9f498b0df --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/NameFileSelector.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; + +/** + * A file selector that selects files based on their name. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="name-selector" + * @ant:type type="v-file-selector" name="name" + */ +public class NameFileSelector + extends AbstractNameFileSelector +{ + /** + * Returns the name to match against. + */ + protected String getNameForMatch( final String path, + final FileObject file ) + { + return path; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/NotFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/NotFileSelector.java new file mode 100644 index 000000000..ac67fbad2 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/NotFileSelector.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file selector that negates a nested file selector. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="not-selector" + * @ant:type type="v-file-selector" name="not" + */ +public class NotFileSelector + implements FileSelector +{ + private FileSelector m_selector; + + /** + * Sets the nested selector. + */ + public void set( final FileSelector selector ) + { + m_selector = selector; + } + + /** + * Accepts a file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + if( m_selector == null ) + { + throw new TaskException( "notfileselector.no-selector.error" ); + } + return ! m_selector.accept( file, path, context ); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/OrFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/OrFileSelector.java new file mode 100644 index 000000000..32ba9330e --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/OrFileSelector.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import java.util.ArrayList; +import org.apache.aut.vfs.FileObject; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; + +/** + * A file selector that performs an OR of nested selectors. Performs + * lazy evaluation. Returns true when no nested elements are supplied. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="or-selector" + * @ant:type type="v-file-selector" name="or" + */ +public class OrFileSelector + implements FileSelector +{ + private final ArrayList m_selectors = new ArrayList(); + + /** + * Adds a nested selector. + */ + public void add( final FileSelector selector ) + { + m_selectors.add( selector ); + } + + /** + * Accepts a file. + */ + public boolean accept( final FileObject file, + final String path, + final TaskContext context ) + throws TaskException + { + for( int i = 0; i < m_selectors.size(); i++ ) + { + final FileSelector fileSelector = (FileSelector)m_selectors.get(i ); + if( fileSelector.accept( file, path, context ) ) + { + return true; + } + } + + // Return true if there are no selectors, false if there are + return (m_selectors.size() == 0); + } +} diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/PathFileList.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/PathFileList.java index 5975077f6..12e0cc5fe 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/PathFileList.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/PathFileList.java @@ -48,7 +48,7 @@ public class PathFileList implements FileList String element = elements[ i ]; try { - result[ i ] = fileSystemManager.resolveFile( element ); + result[ i ] = fileSystemManager.resolveFile( context.getBaseDirectory(), element ); } catch( FileSystemException e ) { diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/Resources.properties b/proposal/myrmidon/src/java/org/apache/antlib/vfile/Resources.properties index ccaed603b..ad2489458 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/Resources.properties +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/Resources.properties @@ -1,7 +1,17 @@ bad-convert-string-to-file.error=Could not convert URI "{0}" into a file object. + fileset.dir-not-set.error=Fileset root directory is not set. fileset.list-files.error=Could not list the files in folder "{0}". + copyfilestask.no-source.error=No source files specified for {0} task. copyfilestask.no-destination.error=No destination file or directory specified for {0} task. copyfilestask.no-destination.error=No destination directory specified for {0} task. copyfilestask.copy-file.error=Could not copy "{0}" to "{1}". + +nameselector.too-many-patterns.error=Too many name patterns specified. +nameselector.no-pattern.error=No name pattern specified. +nameselector.bad-pattern.error=Invalid name pattern "{0}". + +filteredfilelist.no-selector.error=No filter criteria specified. + +notfileselector.no-selector.error=No selector specified. diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/SingletonFileList.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/SingletonFileList.java index 595be62e7..13fd2ed64 100644 --- a/proposal/myrmidon/src/java/org/apache/antlib/vfile/SingletonFileList.java +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/SingletonFileList.java @@ -15,9 +15,12 @@ import org.apache.myrmidon.api.TaskException; * A file list that contains a single file. * * @author Adam Murdoch + * * @ant:data-type name="v-file" + * @ant:type type="v-path" name="v-file" */ -public class SingletonFileList implements FileList +public class SingletonFileList + implements FileList { private FileObject m_file; diff --git a/proposal/myrmidon/src/java/org/apache/antlib/vfile/UrlFileSelector.java b/proposal/myrmidon/src/java/org/apache/antlib/vfile/UrlFileSelector.java new file mode 100644 index 000000000..6196831aa --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/antlib/vfile/UrlFileSelector.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE.txt file. + */ +package org.apache.antlib.vfile; + +import org.apache.aut.vfs.FileObject; + +/** + * A file selector that selects files based on their URL. + * + * @author Adam Murdoch + * @version $Revision$ $Date$ + * + * @ant:data-type name="url-selector" + * @ant:type type="v-file-selector" name="url" + */ +public class UrlFileSelector + extends AbstractNameFileSelector +{ + /** + * Returns the name to match against. + */ + protected String getNameForMatch( final String path, + final FileObject file ) + { + return file.getName().getURI(); + } +}