aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java541
1 files changed, 541 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java
new file mode 100644
index 00000000..9fb94050
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/PatternSet.java
@@ -0,0 +1,541 @@
+/*
+ * 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.tools.ant.types;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.PropertyHelper;
+import org.apache.tools.ant.util.FileUtils;
+
+/**
+ * Named collection of include/exclude tags.
+ *
+ * <p>Moved out of MatchingTask to make it a standalone object that
+ * could be referenced (by scripts for example).
+ *
+ */
+public class PatternSet extends DataType implements Cloneable {
+ private List<NameEntry> includeList = new ArrayList<NameEntry>();
+ private List<NameEntry> excludeList = new ArrayList<NameEntry>();
+ private List<NameEntry> includesFileList = new ArrayList<NameEntry>();
+ private List<NameEntry> excludesFileList = new ArrayList<NameEntry>();
+
+ /**
+ * inner class to hold a name on list. "If" and "Unless" attributes
+ * may be used to invalidate the entry based on the existence of a
+ * property (typically set thru the use of the Available task)
+ * or value of an expression.
+ */
+ public class NameEntry {
+ private String name;
+ private Object ifCond;
+ private Object unlessCond;
+
+ /**
+ * Sets the name pattern.
+ *
+ * @param name The pattern string.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Sets the if attribute. This attribute and the "unless"
+ * attribute are used to validate the name, based on the
+ * existence of the property or the value of the evaluated
+ * property expression.
+ *
+ * @param cond A property name or expression. If the
+ * expression evaluates to false or no property of
+ * its value is present, the name is invalid.
+ * @since Ant 1.8.0
+ */
+ public void setIf(Object cond) {
+ ifCond = cond;
+ }
+
+ /**
+ * Sets the if attribute. This attribute and the "unless"
+ * attribute are used to validate the name, based on the
+ * existence of the property or the value of the evaluated
+ * property expression.
+ *
+ * @param cond A property name or expression. If the
+ * expression evaluates to false or no property of
+ * its value is present, the name is invalid.
+ */
+ public void setIf(String cond) {
+ setIf((Object) cond);
+ }
+
+ /**
+ * Sets the unless attribute. This attribute and the "if"
+ * attribute are used to validate the name, based on the
+ * existence of the property or the value of the evaluated
+ * property expression.
+ *
+ * @param cond A property name or expression. If the
+ * expression evaluates to true or a property of
+ * its value is present, the name is invalid.
+ * @since Ant 1.8.0
+ */
+ public void setUnless(Object cond) {
+ unlessCond = cond;
+ }
+
+ /**
+ * Sets the unless attribute. This attribute and the "if"
+ * attribute are used to validate the name, based on the
+ * existence of the property or the value of the evaluated
+ * property expression.
+ *
+ * @param cond A property name or expression. If the
+ * expression evaluates to true or a property of
+ * its value is present, the name is invalid.
+ */
+ public void setUnless(String cond) {
+ setUnless((Object) cond);
+ }
+
+ /**
+ * @return the name attribute.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * This validates the name - checks the if and unless
+ * properties.
+ *
+ * @param p the current project, used to check the presence or
+ * absence of a property.
+ * @return the name attribute or null if the "if" or "unless"
+ * properties are not/are set.
+ */
+ public String evalName(Project p) {
+ return valid(p) ? name : null;
+ }
+
+ private boolean valid(Project p) {
+ PropertyHelper ph = PropertyHelper.getPropertyHelper(p);
+ return ph.testIfCondition(ifCond)
+ && ph.testUnlessCondition(unlessCond);
+ }
+
+ /**
+ * @return a printable form of this object.
+ */
+ public String toString() {
+ StringBuffer buf = new StringBuffer();
+ if (name == null) {
+ buf.append("noname");
+ } else {
+ buf.append(name);
+ }
+ if ((ifCond != null) || (unlessCond != null)) {
+ buf.append(":");
+ String connector = "";
+
+ if (ifCond != null) {
+ buf.append("if->");
+ buf.append(ifCond);
+ connector = ";";
+ }
+ if (unlessCond != null) {
+ buf.append(connector);
+ buf.append("unless->");
+ buf.append(unlessCond);
+ }
+ }
+ return buf.toString();
+ }
+ }
+
+ private static final class InvertedPatternSet extends PatternSet {
+ private InvertedPatternSet(PatternSet p) {
+ setProject(p.getProject());
+ addConfiguredPatternset(p);
+ }
+ public String[] getIncludePatterns(Project p) {
+ return super.getExcludePatterns(p);
+ }
+ public String[] getExcludePatterns(Project p) {
+ return super.getIncludePatterns(p);
+ }
+ }
+
+ /**
+ * Creates a new <code>PatternSet</code> instance.
+ */
+ public PatternSet() {
+ super();
+ }
+
+ /**
+ * Makes this instance in effect a reference to another PatternSet
+ * instance.
+ *
+ * <p>You must not set another attribute or nest elements inside
+ * this element if you make it a reference.</p>
+ * @param r the reference to another patternset.
+ * @throws BuildException on error.
+ */
+ public void setRefid(Reference r) throws BuildException {
+ if (!includeList.isEmpty() || !excludeList.isEmpty()) {
+ throw tooManyAttributes();
+ }
+ super.setRefid(r);
+ }
+
+ /**
+ * This is a patternset nested element.
+ *
+ * @param p a configured patternset nested element.
+ */
+ public void addConfiguredPatternset(PatternSet p) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ String[] nestedIncludes = p.getIncludePatterns(getProject());
+ String[] nestedExcludes = p.getExcludePatterns(getProject());
+
+ if (nestedIncludes != null) {
+ for (int i = 0; i < nestedIncludes.length; i++) {
+ createInclude().setName(nestedIncludes[i]);
+ }
+ }
+ if (nestedExcludes != null) {
+ for (int i = 0; i < nestedExcludes.length; i++) {
+ createExclude().setName(nestedExcludes[i]);
+ }
+ }
+ }
+
+ /**
+ * add a name entry on the include list
+ * @return a nested include element to be configured.
+ */
+ public NameEntry createInclude() {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ return addPatternToList(includeList);
+ }
+
+ /**
+ * add a name entry on the include files list
+ * @return a nested includesfile element to be configured.
+ */
+ public NameEntry createIncludesFile() {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ return addPatternToList(includesFileList);
+ }
+
+ /**
+ * add a name entry on the exclude list
+ * @return a nested exclude element to be configured.
+ */
+ public NameEntry createExclude() {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ return addPatternToList(excludeList);
+ }
+
+ /**
+ * add a name entry on the exclude files list
+ * @return a nested excludesfile element to be configured.
+ */
+ public NameEntry createExcludesFile() {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ return addPatternToList(excludesFileList);
+ }
+
+ /**
+ * Appends <code>includes</code> to the current list of include patterns.
+ * Patterns may be separated by a comma or a space.
+ *
+ * @param includes the string containing the include patterns
+ */
+ public void setIncludes(String includes) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (includes != null && includes.length() > 0) {
+ StringTokenizer tok = new StringTokenizer(includes, ", ", false);
+ while (tok.hasMoreTokens()) {
+ createInclude().setName(tok.nextToken());
+ }
+ }
+ }
+
+ /**
+ * Appends <code>excludes</code> to the current list of exclude patterns.
+ * Patterns may be separated by a comma or a space.
+ *
+ * @param excludes the string containing the exclude patterns
+ */
+ public void setExcludes(String excludes) {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ if (excludes != null && excludes.length() > 0) {
+ StringTokenizer tok = new StringTokenizer(excludes, ", ", false);
+ while (tok.hasMoreTokens()) {
+ createExclude().setName(tok.nextToken());
+ }
+ }
+ }
+
+ /**
+ * add a name entry to the given list
+ */
+ private NameEntry addPatternToList(List<NameEntry> list) {
+ NameEntry result = new NameEntry();
+ list.add(result);
+ return result;
+ }
+
+ /**
+ * Sets the name of the file containing the includes patterns.
+ *
+ * @param includesFile The file to fetch the include patterns from.
+ * @throws BuildException on error.
+ */
+ public void setIncludesfile(File includesFile) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ createIncludesFile().setName(includesFile.getAbsolutePath());
+ }
+
+ /**
+ * Sets the name of the file containing the excludes patterns.
+ *
+ * @param excludesFile The file to fetch the exclude patterns from.
+ * @throws BuildException on error.
+ */
+ public void setExcludesfile(File excludesFile) throws BuildException {
+ if (isReference()) {
+ throw tooManyAttributes();
+ }
+ createExcludesFile().setName(excludesFile.getAbsolutePath());
+ }
+
+ /**
+ * Reads path matching patterns from a file and adds them to the
+ * includes or excludes list (as appropriate).
+ */
+ private void readPatterns(File patternfile, List<NameEntry> patternlist, Project p)
+ throws BuildException {
+
+ BufferedReader patternReader = null;
+ try {
+ // Get a FileReader
+ patternReader = new BufferedReader(new FileReader(patternfile));
+
+ // Create one NameEntry in the appropriate pattern list for each
+ // line in the file.
+ String line = patternReader.readLine();
+ while (line != null) {
+ if (line.length() > 0) {
+ line = p.replaceProperties(line);
+ addPatternToList(patternlist).setName(line);
+ }
+ line = patternReader.readLine();
+ }
+ } catch (IOException ioe) {
+ throw new BuildException("An error occurred while reading from pattern file: "
+ + patternfile, ioe);
+ } finally {
+ FileUtils.close(patternReader);
+ }
+ }
+
+ /**
+ * Adds the patterns of the other instance to this set.
+ * @param other the other PatternSet instance.
+ * @param p the current project.
+ */
+ public void append(PatternSet other, Project p) {
+ if (isReference()) {
+ throw new BuildException("Cannot append to a reference");
+ }
+ dieOnCircularReference(p);
+ String[] incl = other.getIncludePatterns(p);
+ if (incl != null) {
+ for (int i = 0; i < incl.length; i++) {
+ createInclude().setName(incl[i]);
+ }
+ }
+ String[] excl = other.getExcludePatterns(p);
+ if (excl != null) {
+ for (int i = 0; i < excl.length; i++) {
+ createExclude().setName(excl[i]);
+ }
+ }
+ }
+
+ /**
+ * Returns the filtered include patterns.
+ * @param p the current project.
+ * @return the filtered included patterns.
+ */
+ public String[] getIncludePatterns(Project p) {
+ if (isReference()) {
+ return getRef(p).getIncludePatterns(p);
+ }
+ dieOnCircularReference(p);
+ readFiles(p);
+ return makeArray(includeList, p);
+ }
+
+ /**
+ * Returns the filtered include patterns.
+ * @param p the current project.
+ * @return the filtered excluded patterns.
+ */
+ public String[] getExcludePatterns(Project p) {
+ if (isReference()) {
+ return getRef(p).getExcludePatterns(p);
+ }
+ dieOnCircularReference(p);
+ readFiles(p);
+ return makeArray(excludeList, p);
+ }
+
+ /**
+ * Helper for FileSet classes.
+ * Check if there are patterns defined.
+ * @param p the current project.
+ * @return true if there are patterns.
+ */
+ public boolean hasPatterns(Project p) {
+ if (isReference()) {
+ return getRef(p).hasPatterns(p);
+ }
+ dieOnCircularReference(p);
+ return includesFileList.size() > 0 || excludesFileList.size() > 0
+ || includeList.size() > 0 || excludeList.size() > 0;
+ }
+
+ /**
+ * Performs the check for circular references and returns the
+ * referenced PatternSet.
+ */
+ private PatternSet getRef(Project p) {
+ return (PatternSet) getCheckedRef(p);
+ }
+
+ /**
+ * Convert a vector of NameEntry elements into an array of Strings.
+ */
+ private String[] makeArray(List<NameEntry> list, Project p) {
+ if (list.size() == 0) {
+ return null;
+ }
+ ArrayList<String> tmpNames = new ArrayList<String>();
+ for (NameEntry ne : list) {
+ String pattern = ne.evalName(p);
+ if (pattern != null && pattern.length() > 0) {
+ tmpNames.add(pattern);
+ }
+ }
+ return tmpNames.toArray(new String[tmpNames.size()]);
+ }
+
+ /**
+ * Read includesfile ot excludesfile if not already done so.
+ */
+ private void readFiles(Project p) {
+ if (includesFileList.size() > 0) {
+ for (NameEntry ne : includesFileList) {
+ String fileName = ne.evalName(p);
+ if (fileName != null) {
+ File inclFile = p.resolveFile(fileName);
+ if (!inclFile.exists()) {
+ throw new BuildException("Includesfile " + inclFile.getAbsolutePath()
+ + " not found.");
+ }
+ readPatterns(inclFile, includeList, p);
+ }
+ }
+ includesFileList.clear();
+ }
+ if (excludesFileList.size() > 0) {
+ for (NameEntry ne : excludesFileList) {
+ String fileName = ne.evalName(p);
+ if (fileName != null) {
+ File exclFile = p.resolveFile(fileName);
+ if (!exclFile.exists()) {
+ throw new BuildException("Excludesfile " + exclFile.getAbsolutePath()
+ + " not found.");
+ }
+ readPatterns(exclFile, excludeList, p);
+ }
+ }
+ excludesFileList.clear();
+ }
+ }
+
+ /**
+ * @return a printable form of this object.
+ */
+ public String toString() {
+ return "patternSet{ includes: " + includeList + " excludes: " + excludeList + " }";
+ }
+
+ /**
+ * @since Ant 1.6
+ * @return a clone of this patternset.
+ */
+ public Object clone() {
+ try {
+ PatternSet ps = (PatternSet) super.clone();
+ ps.includeList = new ArrayList<NameEntry>(includeList);
+ ps.excludeList = new ArrayList<NameEntry>(excludeList);
+ ps.includesFileList = new ArrayList<NameEntry>(includesFileList);
+ ps.excludesFileList = new ArrayList<NameEntry>(excludesFileList);
+ return ps;
+ } catch (CloneNotSupportedException e) {
+ throw new BuildException(e);
+ }
+ }
+
+ /**
+ * Add an inverted patternset.
+ * @param p the pattern to invert and add.
+ */
+ public void addConfiguredInvert(PatternSet p) {
+ addConfiguredPatternset(new InvertedPatternSet(p));
+ }
+}