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:")); | |||
} | |||
} |