port DirectoryScanner from Ant code base and hook up FileSet to it
Project: http://git-wip-us.apache.org/repos/asf/flex-utilities/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-utilities/commit/3a58a60e Tree: http://git-wip-us.apache.org/repos/asf/flex-utilities/tree/3a58a60e Diff: http://git-wip-us.apache.org/repos/asf/flex-utilities/diff/3a58a60e Branch: refs/heads/develop Commit: 3a58a60e9ad01f5bdf26806bd17f92c409fb360d Parents: 2cc92bf Author: Alex Harui <[email protected]> Authored: Sat Dec 7 21:46:49 2013 -0800 Committer: Alex Harui <[email protected]> Committed: Sat Dec 7 21:50:43 2013 -0800 ---------------------------------------------------------------------- .../src/org/apache/flex/ant/tags/FileSet.as | 86 + .../org/apache/flex/ant/tags/FileSetExclude.as | 40 + .../org/apache/flex/ant/tags/FileSetInclude.as | 40 + .../flex/ant/tags/filesetClasses/Character.as | 34 + .../ant/tags/filesetClasses/CollectionUtils.as | 41 + .../flex/ant/tags/filesetClasses/DataType.as | 330 ++++ .../ant/tags/filesetClasses/DirectoryScanner.as | 1764 ++++++++++++++++++ .../ant/tags/filesetClasses/FileProvider.as | 27 + .../ant/tags/filesetClasses/FileResource.as | 146 ++ .../ant/tags/filesetClasses/FileSelector.as | 27 + .../flex/ant/tags/filesetClasses/FileUtils.as | 657 +++++++ .../ant/tags/filesetClasses/PathTokenizer.as | 118 ++ .../flex/ant/tags/filesetClasses/Reference.as | 106 ++ .../flex/ant/tags/filesetClasses/Resource.as | 349 ++++ .../ant/tags/filesetClasses/SelectorUtils.as | 638 +++++++ .../ant/tags/filesetClasses/StringTokenizer.as | 68 + .../ant/tags/filesetClasses/TokenizedPath.as | 221 +++ .../ant/tags/filesetClasses/TokenizedPattern.as | 173 ++ .../filesetClasses/exceptions/BuildException.as | 28 + .../filesetClasses/exceptions/IOException.as | 28 + .../exceptions/IllegalStateException.as | 28 + .../exceptions/UnsupportedOperationException.as | 28 + 22 files changed, 4977 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/3a58a60e/ant_on_air/src/org/apache/flex/ant/tags/FileSet.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/FileSet.as b/ant_on_air/src/org/apache/flex/ant/tags/FileSet.as new file mode 100644 index 0000000..4a01395 --- /dev/null +++ b/ant_on_air/src/org/apache/flex/ant/tags/FileSet.as @@ -0,0 +1,86 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.flex.ant.tags +{ + import mx.core.IFlexModuleFactory; + + import org.apache.flex.ant.Ant; + import org.apache.flex.ant.tags.filesetClasses.DirectoryScanner; + import org.apache.flex.ant.tags.filesetClasses.exceptions.BuildException; + import org.apache.flex.ant.tags.supportClasses.IValueTagHandler; + import org.apache.flex.ant.tags.supportClasses.NamedTagHandler; + import org.apache.flex.ant.tags.supportClasses.ParentTagHandler; + + [Mixin] + public class FileSet extends ParentTagHandler implements IValueTagHandler + { + public static function init(mf:IFlexModuleFactory):void + { + Ant.antTagProcessors["fileset"] = FileSet; + } + + public function FileSet() + { + super(); + } + + private var _dir:String; + + public function get dir():String + { + return _dir; + } + + private var _value:Vector.<String>; + + public function get value():Object + { + if (_value) return _value; + + var ds:DirectoryScanner = new DirectoryScanner(); + var n:int = numChildren; + var includes:Vector.<String> = new Vector.<String>(); + var excludes:Vector.<String> = new Vector.<String>(); + for (var i:int = 0; i < n; i++) + { + var tag:NamedTagHandler = getChildAt(i) as NamedTagHandler; + if (tag is FileSetInclude) + includes.push(tag.name); + else if (tag is FileSetExclude) + excludes.push(tag.name); + else + throw new BuildException("Unsupported Tag at index " + i); + } + ds.setIncludes(includes); + ds.setExcludes(excludes); + if (_dir != null) + ds.setBasedir(_dir); + ds.scan(); + _value = ds.getIncludedFiles(); + return _value; + } + + override protected function processAttribute(name:String, value:String):void + { + if (name == "dir") + _dir = value; + } + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/3a58a60e/ant_on_air/src/org/apache/flex/ant/tags/FileSetExclude.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/FileSetExclude.as b/ant_on_air/src/org/apache/flex/ant/tags/FileSetExclude.as new file mode 100644 index 0000000..e2c0f02 --- /dev/null +++ b/ant_on_air/src/org/apache/flex/ant/tags/FileSetExclude.as @@ -0,0 +1,40 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.flex.ant.tags +{ + import mx.core.IFlexModuleFactory; + + import org.apache.flex.ant.Ant; + import org.apache.flex.ant.tags.supportClasses.NamedTagHandler; + + [Mixin] + public class FileSetExclude extends NamedTagHandler + { + public static function init(mf:IFlexModuleFactory):void + { + Ant.antTagProcessors["exclude"] = FileSetExclude; + } + + public function FileSetExclude() + { + super(); + } + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/3a58a60e/ant_on_air/src/org/apache/flex/ant/tags/FileSetInclude.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/FileSetInclude.as b/ant_on_air/src/org/apache/flex/ant/tags/FileSetInclude.as new file mode 100644 index 0000000..8c6f98f --- /dev/null +++ b/ant_on_air/src/org/apache/flex/ant/tags/FileSetInclude.as @@ -0,0 +1,40 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.flex.ant.tags +{ + import mx.core.IFlexModuleFactory; + + import org.apache.flex.ant.Ant; + import org.apache.flex.ant.tags.supportClasses.NamedTagHandler; + + [Mixin] + public class FileSetInclude extends NamedTagHandler + { + public static function init(mf:IFlexModuleFactory):void + { + Ant.antTagProcessors["include"] = FileSetInclude; + } + + public function FileSetInclude() + { + super(); + } + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/3a58a60e/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/Character.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/Character.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/Character.as new file mode 100644 index 0000000..d2b6b87 --- /dev/null +++ b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/Character.as @@ -0,0 +1,34 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.flex.ant.tags.filesetClasses +{ + public class Character + { + public function Character() + { + super(); + } + + public static function isLetter(c:String):Boolean + { + return "a" <= c && c <= "z" || + "A" <= c && c <= "Z"; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/3a58a60e/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/CollectionUtils.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/CollectionUtils.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/CollectionUtils.as new file mode 100644 index 0000000..0717a4e --- /dev/null +++ b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/CollectionUtils.as @@ -0,0 +1,41 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package org.apache.flex.ant.tags.filesetClasses +{ + public class CollectionUtils + { + public function CollectionUtils() + { + super(); + } + + private static var target:String; + + private static function callback(item:String, index:int, list:Vector.<String>):Boolean + { + return CollectionUtils.target == item; + } + + public static function frequency(list:Vector.<String>, c:String):int + { + target = c; + return list.filter(callback).length; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/3a58a60e/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DataType.as ---------------------------------------------------------------------- diff --git a/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DataType.as b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DataType.as new file mode 100644 index 0000000..1efa665 --- /dev/null +++ b/ant_on_air/src/org/apache/flex/ant/tags/filesetClasses/DataType.as @@ -0,0 +1,330 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*/ + +package org.apache.flex.ant.tags.filesetClasses +{ + import flash.system.ApplicationDomain; + import flash.utils.getQualifiedClassName; + + import org.apache.flex.ant.Ant; + import org.apache.flex.ant.tags.Project; + import org.apache.flex.ant.tags.filesetClasses.exceptions.BuildException; + + /** + * Ported from org.apache.tools.ant.types.DataType.java on 12/3/13 + * Base class for those classes that can appear inside the build file + * as stand alone data types. + * + * <p>This class handles the common description attribute and provides + * a default implementation for reference handling and checking for + * circular references that is appropriate for types that can not be + * nested inside elements of the same type (i.e. <patternset> + * but not <path>).</p> + * + */ + public class DataType + { + // CheckStyle:VisibilityModifier OFF + + /** + * Value to the refid attribute. + * + * @deprecated since 1.7. + * The user should not be directly referencing + * variable. Please use {@link #getRefid} instead. + */ + protected var ref:Reference; + + /** + * Are we sure we don't hold circular references? + * + * <p>Subclasses are responsible for setting this value to false + * if we'd need to investigate this condition (usually because a + * child element has been added that is a subclass of + * DataType).</p> + * + * @deprecated since 1.7. + * The user should not be directly referencing + * variable. Please use {@link #setChecked} or + * {@link #isChecked} instead. + */ + protected var checked:Boolean = true; + // CheckStyle:VisibilityModifier ON + + /** + * Has the refid attribute of this element been set? + * @return true if the refid attribute has been set + */ + public function isReference():Boolean + { + return ref != null; + } + + /** + * Set the value of the refid attribute. + * + * <p>Subclasses may need to check whether any other attributes + * have been set as well or child elements have been created and + * thus override this method. if they do the must call + * <code>super.setRefid</code>.</p> + * @param ref the reference to use + */ + public function setRefid(ref:Reference):void + { + this.ref = ref; + checked = false; + } + + /** + * Gets as descriptive as possible a name used for this datatype instance. + * @return <code>String</code> name. + */ + protected function getDataTypeName():String + { + return "DataType"; + } + + /** + * Check to see whether any DataType we hold references to is + * included in the Stack (which holds all DataType instances that + * directly or indirectly reference this instance, including this + * instance itself). + * + * <p>If one is included, throw a BuildException created by {@link + * #circularReference circularReference}.</p> + * + * <p>This implementation is appropriate only for a DataType that + * cannot hold other DataTypes as children.</p> + * + * <p>The general contract of this method is that it shouldn't do + * anything if {@link #checked <code>checked</code>} is true and + * set it to true on exit.</p> + * @param stack the stack of references to check. + * @param project the project to use to dereference the references. + * @throws BuildException on error. + */ + protected function dieOnCircularReference(stack:Vector.<String> = null, project:Project = null):void + { + if (!project) + project = Ant.project; + + if (!stack) + stack = new Vector.<String>(); + + if (checked || !isReference()) { + return; + } + var o:Object = ref.getReferencedObject(project); + + if (o is DataType) { + if (stack.indexOf(o) != -1) { + throw circularReference(); + } else { + stack.push(o); + DataType(o).dieOnCircularReference(Vector.<String>([id]), project); + stack.pop(); + } + } + checked = true; + } + + /** + * Allow DataTypes outside org.apache.tools.ant.types to indirectly call + * dieOnCircularReference on nested DataTypes. + * @param dt the DataType to check. + * @param stk the stack of references to check. + * @param p the project to use to dereference the references. + * @throws BuildException on error. + * @since Ant 1.7 + */ + public static function invokeCircularReferenceCheck(dt:DataType, stk:Vector.<String>, + p:Project):void + { + dt.dieOnCircularReference(stk, p); + } + + /** + * Allow DataTypes outside org.apache.tools.ant.types to indirectly call + * dieOnCircularReference on nested DataTypes. + * + * <p>Pushes dt on the stack, runs dieOnCircularReference and pops + * it again.</p> + * @param dt the DataType to check. + * @param stk the stack of references to check. + * @param p the project to use to dereference the references. + * @throws BuildException on error. + * @since Ant 1.8.0 + */ + public static function pushAndInvokeCircularReferenceCheck(dt:DataType, + stk:Vector.<String>, + p:Project):void + { + stk.push(dt); + dt.dieOnCircularReference(stk, p); + stk.pop(); + } + + /** + * Performs the check for circular references and returns the + * referenced object. + * @param p the Ant Project instance against which to resolve references. + * @return the dereferenced object. + * @throws BuildException if the reference is invalid (circular ref, wrong class, etc). + * @since Ant 1.7 + */ + protected function getCheckedRef(p:Project = null):Object + { + if (!p) + p = Ant.project; + return getCheckedRefActual(Class(ApplicationDomain.currentDomain.getDefinition(getQualifiedClassName(this))), + getDataTypeName(), p); + } + + /** + * Performs the check for circular references and returns the + * referenced object. This version allows the fallback Project instance to be specified. + * @param requiredClass the class that this reference should be a subclass of. + * @param dataTypeName the name of the datatype that the reference should be + * (error message use only). + * @param project the fallback Project instance for dereferencing. + * @return the dereferenced object. + * @throws BuildException if the reference is invalid (circular ref, wrong class, etc), + * or if <code>project</code> is <code>null</code>. + * @since Ant 1.7 + */ + protected function getCheckedRefActual(requiredClass:Class, + dataTypeName:String, project:Project):Object { + if (project == null) { + throw new BuildException("No Project specified"); + } + dieOnCircularReference(null, project); + var o:Object = ref.getReferencedObject(project); + var oClass:Class = ApplicationDomain.currentDomain.getDefinition(getQualifiedClassName(o)) as Class; + if (!(requiredClass is oClass)) { + Ant.log("Class " + oClass + " is not a subclass of " + requiredClass, + Project.MSG_VERBOSE); + var msg:String = ref.getRefId() + " doesn\'t denote a " + dataTypeName; + throw new BuildException(msg); + } + return o; + } + + /** + * Creates an exception that indicates that refid has to be the + * only attribute if it is set. + * @return the exception to throw + */ + protected function tooManyAttributes():BuildException + { + return new BuildException("You must not specify more than one " + + "attribute when using refid"); + } + + /** + * Creates an exception that indicates that this XML element must + * not have child elements if the refid attribute is set. + * @return the exception to throw + */ + protected function noChildrenAllowed():BuildException + { + return new BuildException("You must not specify nested elements " + + "when using refid"); + } + + /** + * Creates an exception that indicates the user has generated a + * loop of data types referencing each other. + * @return the exception to throw + */ + protected function circularReference():BuildException + { + return new BuildException("This data type contains a circular " + + "reference."); + } + + /** + * The flag that is used to indicate that circular references have been checked. + * @return true if circular references have been checked + */ + protected function isChecked():Boolean + { + return checked; + } + + /** + * Set the flag that is used to indicate that circular references have been checked. + * @param checked if true, if circular references have been checked + */ + protected function setChecked(checked:Boolean):void + { + this.checked = checked; + } + + /** + * get the reference set on this object + * @return the reference or null + */ + public function getRefid():Reference + { + return ref; + } + + /** + * check that it is ok to set attributes, i.e that no reference is defined + * @since Ant 1.6 + * @throws BuildException if not allowed + */ + protected function checkAttributesAllowed():void + { + if (isReference()) { + throw tooManyAttributes(); + } + } + + /** + * check that it is ok to add children, i.e that no reference is defined + * @since Ant 1.6 + * @throws BuildException if not allowed + */ + protected function checkChildrenAllowed():void + { + if (isReference()) { + throw noChildrenAllowed(); + } + } + + /** + * Basic DataType toString(). + * @return this DataType formatted as a String. + */ + public function toString():String { + var d:String = getDescription(); + return d == null ? getDataTypeName() : getDataTypeName() + " " + d; + } + + /** + * Basic description + */ + public function getDescription():String + { + return null; + } + + public var id:String; + } +}
