git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@349633 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -22,14 +22,16 @@ explicit use beginning in <b>Ant 1.7</b>. | |||
| <ul> | |||
| <li><a href="#basic">resource</a> - a basic resource.</li> | |||
| <li><a href="#bzip2resource">bzip2resource</a> - a BZip2 compressed resource.</li> | |||
| <li><a href="#file">file</a> - a file.</li> | |||
| <li><a href="#tarentry">tarentry</a> - an entry in a tar file.</li> | |||
| <li><a href="#zipentry">zipentry</a> - an entry in a zip file.</li> | |||
| <li><a href="#gzipresource">gzipresource</a> - a GZip compressed resource.</li> | |||
| <li><a href="#bzip2resource">bzip2resource</a> - a BZip2 compressed resource.</li> | |||
| <li><a href="#url">url</a> - a URL.</li> | |||
| <li><a href="#string">string</a> - a text string.</li> | |||
| <li><a href="#javaresource">javaresource</a> - a resource loadable | |||
| via a Java classloader.</li> | |||
| <li><a href="#property">property</a> - an Ant property.</li> | |||
| <li><a href="#string">string</a> - a text string.</li> | |||
| <li><a href="#tarentry">tarentry</a> - an entry in a tar file.</li> | |||
| <li><a href="#url">url</a> - a URL.</li> | |||
| <li><a href="#zipentry">zipentry</a> - an entry in a zip file.</li> | |||
| </ul> | |||
| <h4><a name="basic">resource</a></h4> | |||
| @@ -98,6 +100,45 @@ implementations are also usable as single-element | |||
| </tr> | |||
| </table> | |||
| <h4><a name="javaresource">javaresource</a></h4> | |||
| <p>Represents a resource loadable via a Java classloader.</p> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">name</td> | |||
| <td valign="top">The namer of the resource.</td> | |||
| <td align="center" valign="top">Yes</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">classpath</td> | |||
| <td valign="top">the classpath to use when looking up a resource.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">classpathref</td> | |||
| <td valign="top">the classpath to use when looking up a resource, | |||
| given as <a href="../using.html#references">reference</a> | |||
| to a <code><path></code> defined elsewhere..</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">loaderRef</td> | |||
| <td valign="top">the name of the loader that is | |||
| used to load the resource, constructed from the specified classpath.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| </table> | |||
| <p>The classpath can also be specified as nested classpath element, | |||
| where <b><classpath></b> is a <a | |||
| href="../using.html#path">path-like</a> structure.</p> | |||
| <h4><a name="zipentry">zipentry</a></h4> | |||
| <p>Represents an entry in a ZIP archive. The archive can be specified | |||
| @@ -157,14 +198,14 @@ collection.</p> | |||
| <h4><a name="gzipresource">gzipresource</a></h4> | |||
| <p>This is not a stand-alone reource, but a wrapper around another | |||
| <p>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.</p> | |||
| <h4><a name="bzip2resource">bzip2resource</a></h4> | |||
| <p>This is not a stand-alone reource, but a wrapper around another | |||
| <p>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.</p> | |||
| @@ -0,0 +1,7 @@ | |||
| <project> | |||
| <target name="loadManifest"> | |||
| <loadresource property="manifest"> | |||
| <javaresource name="META-INF/MANIFEST.MF"/> | |||
| </loadresource> | |||
| </target> | |||
| </project> | |||
| @@ -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 | |||
| @@ -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 <code>LoadProperties</code>. | |||
| * @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); | |||
| } | |||
| } | |||
| @@ -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:")); | |||
| } | |||
| } | |||