From 4abb17d87b89b857ff38e118579e8b2ebdca1b3a Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Tue, 29 Nov 2005 04:38:42 +0000 Subject: [PATCH] new resource for stuff that can be loaded via a classloader git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@349633 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual/CoreTypes/resources.html | 55 ++++- .../types/resources/javaresource.xml | 7 + .../tools/ant/types/defaults.properties | 1 + .../ant/types/resources/JavaResource.java | 210 ++++++++++++++++++ .../ant/types/resources/JavaResourceTest.java | 40 ++++ 5 files changed, 306 insertions(+), 7 deletions(-) create mode 100755 src/etc/testcases/types/resources/javaresource.xml create mode 100755 src/main/org/apache/tools/ant/types/resources/JavaResource.java create mode 100755 src/testcases/org/apache/tools/ant/types/resources/JavaResourceTest.java diff --git a/docs/manual/CoreTypes/resources.html b/docs/manual/CoreTypes/resources.html index b0923387c..6d12b2e45 100644 --- a/docs/manual/CoreTypes/resources.html +++ b/docs/manual/CoreTypes/resources.html @@ -22,14 +22,16 @@ explicit use beginning in Ant 1.7.

resource

@@ -98,6 +100,45 @@ implementations are also usable as single-element +

javaresource

+ +

Represents a resource loadable via a Java classloader.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
nameThe namer of the resource.Yes
classpaththe classpath to use when looking up a resource.No
classpathrefthe classpath to use when looking up a resource, + given as reference + to a <path> defined elsewhere..No
loaderRefthe name of the loader that is + used to load the resource, constructed from the specified classpath.No
+ +

The classpath can also be specified as nested classpath element, +where <classpath> is a path-like structure.

+

zipentry

Represents an entry in a ZIP archive. The archive can be specified @@ -157,14 +198,14 @@ collection.

gzipresource

-

This is not a stand-alone reource, but a wrapper around another +

This is not a stand-alone resource, but a wrapper around another resource providing compression of the resource's contents on the fly. A single element resource collection must be specified as a nested element.

bzip2resource

-

This is not a stand-alone reource, but a wrapper around another +

This is not a stand-alone resource, but a wrapper around another resource providing compression of the resource's contents on the fly. A single element resource collection must be specified as a nested element.

diff --git a/src/etc/testcases/types/resources/javaresource.xml b/src/etc/testcases/types/resources/javaresource.xml new file mode 100755 index 000000000..cf89eab70 --- /dev/null +++ b/src/etc/testcases/types/resources/javaresource.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/main/org/apache/tools/ant/types/defaults.properties b/src/main/org/apache/tools/ant/types/defaults.properties index dc980571e..e1170eaab 100644 --- a/src/main/org/apache/tools/ant/types/defaults.properties +++ b/src/main/org/apache/tools/ant/types/defaults.properties @@ -67,3 +67,4 @@ propertyresource=org.apache.tools.ant.types.resources.PropertyResource tarentry=org.apache.tools.ant.types.resources.TarResource gzipresource=org.apache.tools.ant.types.resources.GZipResource bzip2resource=org.apache.tools.ant.types.resources.BZip2Resource +javaresource=org.apache.tools.ant.types.resources.JavaResource diff --git a/src/main/org/apache/tools/ant/types/resources/JavaResource.java b/src/main/org/apache/tools/ant/types/resources/JavaResource.java new file mode 100755 index 000000000..16d20ec6c --- /dev/null +++ b/src/main/org/apache/tools/ant/types/resources/JavaResource.java @@ -0,0 +1,210 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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.IOException; +import java.io.InputStream; + +import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.Reference; + +/** + * A Resource representation of something loadable via a Java classloader. + * @since Ant 1.7 + */ +public class JavaResource extends Resource { + + private Path classpath; + private Reference loader; + + /** + * Default constructor. + */ + public JavaResource() { + } + + /** + * Construct a new JavaResource using the specified name and + * classpath. + * + * @param name the resource name. + * @param path the classpath. + */ + public JavaResource(String name, Path path) { + setName(name); + classpath = path; + } + + /** + * Set the classpath to use when looking up a resource. + * @param classpath to add to any existing classpath + */ + public void setClasspath(Path classpath) { + checkAttributesAllowed(); + if (this.classpath == null) { + this.classpath = classpath; + } else { + this.classpath.append(classpath); + } + } + + /** + * Add a classpath to use when looking up a resource. + * @return The classpath to be configured + */ + public Path createClasspath() { + checkChildrenAllowed(); + if (this.classpath == null) { + this.classpath = new Path(getProject()); + } + return this.classpath.createPath(); + } + + /** + * Set the classpath to use when looking up a resource, + * given as reference to a <path> defined elsewhere + * @param r The reference value + */ + public void setClasspathRef(Reference r) { + checkAttributesAllowed(); + createClasspath().setRefid(r); + } + + /** + * get the classpath used by this LoadProperties. + * @return The classpath + */ + public Path getClasspath() { + return isReference() + ? ((JavaResource) getCheckedRef()).getClasspath() : classpath; + } + + /** + * Use the reference to locate the loader. If the loader is not + * found, taskdef will use the specified classpath and register it + * with the specified name. + * + * This allow multiple taskdef/typedef to use the same class loader, + * so they can be used together. It eliminate the need to + * put them in the CLASSPATH. + * + * @param r the reference to locate the loader. + */ + public void setLoaderRef(Reference r) { + checkAttributesAllowed(); + loader = r; + } + + /** + * Overrides the super version. + * @param r the Reference to set. + */ + public void setRefid(Reference r) { + if (loader != null || classpath != null) { + throw tooManyAttributes(); + } + super.setRefid(r); + } + + /** + * Learn whether this file exists. + * @return true if this resource exists. + */ + public boolean isExists() { + InputStream is = null; + try { + return isReference() ? ((Resource) getCheckedRef()).isExists() + : (is = getInputStream()) != null; + } catch (IOException ex) { + return false; + } finally { + FileUtils.close(is); + } + } + + /** + * Return an InputStream for reading the contents of this Resource. + * @return an InputStream object. + * @throws IOException if an error occurs. + */ + public InputStream getInputStream() throws IOException { + if (isReference()) { + return ((Resource) getCheckedRef()).getInputStream(); + } + ClassLoader cl = null; + if (loader != null) { + cl = (ClassLoader) loader.getReferencedObject(); + } + if (cl == null) { + if (getClasspath() != null) { + cl = getProject().createClassLoader(classpath); + } else { + cl = JavaResource.class.getClassLoader(); + } + if (loader != null && cl != null) { + getProject().addReference(loader.getRefId(), cl); + } + } + + return cl == null ? ClassLoader.getSystemResourceAsStream(getName()) + : cl.getResourceAsStream(getName()); + } + + /** + * Compare this JavaResource to another Resource. + * @param another the other Resource against which to compare. + * @return a negative integer, zero, or a positive integer as this + * JavaResource is less than, equal to, or greater than the + * specified Resource. + */ + public int compareTo(Object another) { + if (isReference()) { + return ((Comparable) getCheckedRef()).compareTo(another); + } + if (another.getClass().equals(getClass())) { + JavaResource otherjr = (JavaResource) another; + if (!getName().equals(otherjr.getName())) { + return getName().compareTo(otherjr.getName()); + } + if (loader != otherjr.loader) { + if (loader == null) { + return -1; + } + if (otherjr.loader == null) { + return 1; + } + return loader.getRefId().compareTo(otherjr.loader.getRefId()); + } + Path p = getClasspath(); + Path op = otherjr.getClasspath(); + if (p != op) { + if (p == null) { + return -1; + } + if (op == null) { + return 1; + } + return p.toString().compareTo(op.toString()); + } + return 0; + } + return super.compareTo(another); + } + +} diff --git a/src/testcases/org/apache/tools/ant/types/resources/JavaResourceTest.java b/src/testcases/org/apache/tools/ant/types/resources/JavaResourceTest.java new file mode 100755 index 000000000..25b8af301 --- /dev/null +++ b/src/testcases/org/apache/tools/ant/types/resources/JavaResourceTest.java @@ -0,0 +1,40 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed 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 org.apache.tools.ant.BuildFileTest; + +public class JavaResourceTest extends BuildFileTest { + + public JavaResourceTest(String name) { + super(name); + } + + public void setUp() { + configureProject("src/etc/testcases/types/resources/javaresource.xml"); + } + + public void testLoadManifest() { + executeTarget("loadManifest"); + assertNotNull(getProject().getProperty("manifest")); + + // this actually relies on the first manifest being found on + // the classpath (probably rt.jar's) being valid + assertTrue(getProject().getProperty("manifest") + .startsWith("Manifest-Version:")); + } +} \ No newline at end of file