aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java268
1 files changed, 268 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java
new file mode 100644
index 00000000..281fa0f1
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/types/resources/BaseResourceCollectionContainer.java
@@ -0,0 +1,268 @@
+/*
+ * 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.resources;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Stack;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+
+/**
+ * Base class for ResourceCollections that nest multiple ResourceCollections.
+ * @since Ant 1.7
+ */
+public abstract class BaseResourceCollectionContainer
+ extends DataType implements ResourceCollection, Cloneable {
+ private List<ResourceCollection> rc = new ArrayList<ResourceCollection>();
+ private Collection<Resource> coll = null;
+ private boolean cache = true;
+
+ /**
+ * Create a new BaseResourceCollectionContainer.
+ */
+ public BaseResourceCollectionContainer() {
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * Create a new BaseResourceCollectionContainer.
+ * @since Ant 1.8
+ */
+ public BaseResourceCollectionContainer(Project project) {
+ setProject(project);
+ }
+
+ /**
+ * Set whether to cache collections.
+ * @param b boolean cache flag.
+ */
+ public synchronized void setCache(boolean b) {
+ cache = b;
+ }
+
+ /**
+ * Learn whether to cache collections. Default is <code>true</code>.
+ * @return boolean cache flag.
+ */
+ public synchronized boolean isCache() {
+ return cache;
+ }
+
+ /**
+ * Clear the container.
+ * @throws BuildException on error.
+ */
+ public synchronized void clear() throws BuildException {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ rc.clear();
+ FailFast.invalidate(this);
+ coll = null;
+ setChecked(false);
+ }
+
+ /**
+ * Add a ResourceCollection to the container.
+ * @param c the ResourceCollection to add.
+ * @throws BuildException on error.
+ */
+ public synchronized void add(ResourceCollection c) throws BuildException {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ if (c == null) {
+ return;
+ }
+ if (Project.getProject(c) == null) {
+ Project p = getProject();
+ if (p != null) {
+ p.setProjectReference(c);
+ }
+ }
+ rc.add(c);
+ FailFast.invalidate(this);
+ coll = null;
+ setChecked(false);
+ }
+
+ /**
+ * Add the Collection of ResourceCollections to the container.
+ * @param c the Collection whose elements to add.
+ * @throws BuildException on error.
+ */
+ public synchronized void addAll(Collection<? extends ResourceCollection> c) throws BuildException {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ try {
+ for (ResourceCollection resourceCollection : c) {
+ add(resourceCollection);
+ }
+ } catch (ClassCastException e) {
+ throw new BuildException(e);
+ }
+ }
+
+ /**
+ * Fulfill the ResourceCollection contract. The Iterator returned
+ * will throw ConcurrentModificationExceptions if ResourceCollections
+ * are added to this container while the Iterator is in use.
+ * @return a "fail-fast" Iterator.
+ */
+ public final synchronized Iterator<Resource> iterator() {
+ if (isReference()) {
+ return ((BaseResourceCollectionContainer) getCheckedRef()).iterator();
+ }
+ dieOnCircularReference();
+ return new FailFast(this, cacheCollection().iterator());
+ }
+
+ /**
+ * Fulfill the ResourceCollection contract.
+ * @return number of elements as int.
+ */
+ public synchronized int size() {
+ if (isReference()) {
+ return getCheckedRef(BaseResourceCollectionContainer.class, getDataTypeName()).size();
+ }
+ dieOnCircularReference();
+ return cacheCollection().size();
+ }
+
+ /**
+ * Fulfill the ResourceCollection contract.
+ * @return whether this is a filesystem-only resource collection.
+ */
+ public synchronized boolean isFilesystemOnly() {
+ if (isReference()) {
+ return ((BaseResourceCollectionContainer) getCheckedRef()).isFilesystemOnly();
+ }
+ dieOnCircularReference();
+ //first the easy way, if all children are filesystem-only, return true:
+ boolean goEarly = true;
+ for (Iterator<ResourceCollection> i = rc.iterator(); goEarly && i.hasNext();) {
+ goEarly = i.next().isFilesystemOnly();
+ }
+ if (goEarly) {
+ return true;
+ }
+ /* now check each Resource in case the child only
+ lets through files from any children IT may have: */
+ for (Resource r : cacheCollection()) {
+ if (r.as(FileProvider.class) == null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Overrides the version of DataType to recurse on all DataType
+ * child elements that may have been added.
+ * @param stk the stack of data types to use (recursively).
+ * @param p the project to use to dereference the references.
+ * @throws BuildException on error.
+ */
+ protected synchronized void dieOnCircularReference(Stack<Object> stk, Project p)
+ throws BuildException {
+ if (isChecked()) {
+ return;
+ }
+ if (isReference()) {
+ super.dieOnCircularReference(stk, p);
+ } else {
+ for (ResourceCollection resourceCollection : rc) {
+ if (resourceCollection instanceof DataType) {
+ pushAndInvokeCircularReferenceCheck((DataType) resourceCollection, stk, p);
+ }
+ }
+ setChecked(true);
+ }
+ }
+
+ /**
+ * Get the nested ResourceCollections.
+ * @return List.
+ */
+ public final synchronized List<ResourceCollection> getResourceCollections() {
+ dieOnCircularReference();
+ return Collections.unmodifiableList(rc);
+ }
+
+ /**
+ * Template method for subclasses to return a Collection object of Resources.
+ * @return Collection.
+ */
+ protected abstract Collection<Resource> getCollection();
+
+ /**
+ * Implement clone. The set of nested resource
+ * collections is shallowly cloned.
+ * @return a cloned instance.
+ */
+ public Object clone() {
+ try {
+ BaseResourceCollectionContainer c
+ = (BaseResourceCollectionContainer) super.clone();
+ c.rc = new ArrayList<ResourceCollection>(rc);
+ c.coll = null;
+ return c;
+ } catch (CloneNotSupportedException e) {
+ throw new BuildException(e);
+ }
+ }
+
+ /**
+ * Format this BaseResourceCollectionContainer as a String.
+ * @return a descriptive <code>String</code>.
+ */
+ public synchronized String toString() {
+ if (isReference()) {
+ return getCheckedRef().toString();
+ }
+ if (cacheCollection().size() == 0) {
+ return "";
+ }
+ StringBuilder sb = new StringBuilder();
+ for (Resource resource : coll) {
+ if (sb.length() > 0) {
+ sb.append(File.pathSeparatorChar);
+ }
+ sb.append(resource);
+ }
+ return sb.toString();
+ }
+
+ private synchronized Collection<Resource> cacheCollection() {
+ if (coll == null || !isCache()) {
+ coll = getCollection();
+ }
+ return coll;
+ }
+
+}