conor 01/05/09 08:14:57
Modified: src/main/org/apache/tools/ant AntClassLoader.java
Log:
Add getResource() implementation to AntClassLoader
PR: 749
Submitted by: [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Revision Changes Path
1.17 +100 -0
jakarta-ant/src/main/org/apache/tools/ant/AntClassLoader.java
Index: AntClassLoader.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/AntClassLoader.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- AntClassLoader.java 2001/03/15 13:53:29 1.16
+++ AntClassLoader.java 2001/05/09 15:14:46 1.17
@@ -58,6 +58,7 @@
import java.util.*;
import java.util.zip.*;
import java.io.*;
+import java.net.*;
import org.apache.tools.ant.types.Path;
/**
@@ -378,6 +379,105 @@
}
return useSystemFirst;
+ }
+
+
+
+
+
+ /**
+ * Finds the resource with the given name. A resource is
+ * some data (images, audio, text, etc)
+ * that can be accessed by class
+ * code in a way that is independent of the location of the code.
+ *
+ * @param name the name of the resource for which a stream is required.
+ *
+ * @return a URL for reading the resource, or null if the resource
+ * could not be found or the caller
+ * doesn't have adequate privileges to get the resource.
+ */
+ public URL getResource(String name) {
+ // we need to search the components of the path to see if we can
find the
+ // class we want.
+ URL url = null;
+ if (isSystemFirst(name)) {
+ url = super.getResource(name);
+ }
+
+ // try and load from this loader if the parent eitehr didn't find it
or
+ // wasn;t consulted.
+ if (url == null) {
+ String[] pathElements = classpath.list();
+ for (int i = 0; i < pathElements.length && url == null; ++i) {
+ File pathComponent =
project.resolveFile((String)pathElements[i]);
+ url = getResourceURL(pathComponent, name);
+ }
+ }
+
+ if (url == null && !isSystemFirst(name)) {
+ // this loader was first but it didn't find it - try the parent
+ url = super.getResource(name);
+ }
+
+ return url;
+ }
+
+ /**
+ * Get an inputstream to a given resource in the given file which may
+ * either be a directory or a zip file.
+ *
+ * @param file the file (directory or jar) in which to search for
+ * the resource.
+ * @param resourceName the name of the resource for which a stream
+ * is required.
+ *
+ * @return a stream to the required resource or null if the
+ * resource cannot be found in the given file object
+ */
+ private URL getResourceURL(File file, String resourceName) {
+ try {
+ if (!file.exists()) {
+ return null;
+ }
+
+ if (file.isDirectory()) {
+ File resource = new File(file, resourceName);
+
+ if (resource.exists()) {
+ try {
+ return new URL("file:"+resource.toString());
+ } catch (MalformedURLException ex) {
+ return null;
+ }
+ }
+ }
+ else {
+ ZipFile zipFile = null;
+ try {
+ zipFile = new ZipFile(file);
+
+ ZipEntry entry = zipFile.getEntry(resourceName);
+ if (entry != null) {
+ try {
+ return new
URL("jar:file:"+file.toString()+"!/"+entry);
+ } catch (MalformedURLException ex) {
+ return null;
+ }
+ }
+ }
+ finally {
+ if (zipFile != null) {
+ zipFile.close();
+ }
+ }
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return null;
}