Antoine Lévy-Lambert wrote:

Hi Peter,

can we improve the new classloader so that the work of inspecting the jars does not happen each time an <antcall/> is done ?

Yes by keeping a static map of file->manifest class path.

With the following:
<project default="call-all">
 <taskdef resource="net/sf/antcontrib/antcontrib.properties" />
 <taskdef resource="cpptasks.tasks"/>
 <typedef resource="cpptasks.types"/>
 <target name="call-all">
   <foreach list="1,2,3,4,5,6,7,8,9,10" param="name" target="doit"/>
   <echo>Done</echo>
 </target>
 <target name="doit">
   <foreach list="1,2,3,4,5,6,7,8,9,10" param="name" target="doit2"/>
 </target>
 <target name="doit2"/>
</project>

and the included patch, the time is reduced from 6 seconds to 3 seconds - not
a great improvement considering that there is 100 ant-calls, but it is a improvement!


Peter
Index: src/main/org/apache/tools/ant/loader/AntClassLoader2.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/loader/AntClassLoader2.java,v
retrieving revision 1.7
diff -u -r1.7 AntClassLoader2.java
--- src/main/org/apache/tools/ant/loader/AntClassLoader2.java	17 Jul 2003 10:36:27 -0000	1.7
+++ src/main/org/apache/tools/ant/loader/AntClassLoader2.java	15 Jan 2004 17:34:19 -0000
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2003 The Apache Software Foundation.  All rights
+ * Copyright (c) 2003-2004 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -68,6 +68,9 @@
 import java.net.URL;
 import java.net.MalformedURLException;
 import java.util.zip.ZipEntry;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.StringTokenizer;
 import org.apache.tools.ant.util.FileUtils;
 
@@ -81,6 +84,9 @@
     /** Instance of a utility class to use for file operations. */
     private FileUtils fileUtils;
 
+    /** Static map of jar file/time to manifiest class-path entries */
+    private static Map pathMap = Collections.synchronizedMap(new HashMap());
+
     /**
      * Constructor
      */
@@ -272,36 +278,46 @@
             return;
         }
 
+        String absPathPlusTimeAndLength =
+            pathComponent.getAbsolutePath() + pathComponent.lastModified() + "-"
+            + pathComponent.length();
         String classpath = null;
-        ZipFile jarFile = null;
-        InputStream manifestStream = null;
-        try {
-            jarFile = new ZipFile(pathComponent);
-            manifestStream
-                = jarFile.getInputStream(new ZipEntry("META-INF/MANIFEST.MF"));
-
-            if (manifestStream == null) {
-                return;
-            }
-            Reader manifestReader
-                = new InputStreamReader(manifestStream, "UTF-8");
-            org.apache.tools.ant.taskdefs.Manifest manifest
-                = new org.apache.tools.ant.taskdefs.Manifest(manifestReader);
-            classpath
-                = manifest.getMainSection().getAttributeValue("Class-Path");
+                classpath = (String) pathMap.get(absPathPlusTimeAndLength);
+        if (classpath == null) {
+            ZipFile jarFile = null;
+            InputStream manifestStream = null;
+            try {
+                jarFile = new ZipFile(pathComponent);
+                manifestStream
+                    = jarFile.getInputStream(new ZipEntry("META-INF/MANIFEST.MF"));
+
+                if (manifestStream == null) {
+                    return;
+                }
+                Reader manifestReader
+                    = new InputStreamReader(manifestStream, "UTF-8");
+                org.apache.tools.ant.taskdefs.Manifest manifest
+                    = new org.apache.tools.ant.taskdefs.Manifest(manifestReader);
+                classpath
+                    = manifest.getMainSection().getAttributeValue("Class-Path");
 
-        } catch (org.apache.tools.ant.taskdefs.ManifestException e) {
-            // ignore
-        } finally {
-            if (manifestStream != null) {
-                manifestStream.close();
+            } catch (org.apache.tools.ant.taskdefs.ManifestException e) {
+                // ignore
+            } finally {
+                if (manifestStream != null) {
+                    manifestStream.close();
+                }
+                if (jarFile != null) {
+                    jarFile.close();
+                }
             }
-            if (jarFile != null) {
-                jarFile.close();
+            if (classpath == null) {
+                classpath = "";
             }
+            pathMap.put(absPathPlusTimeAndLength, classpath);
         }
 
-        if (classpath != null) {
+        if (!"".equals(classpath)) {
             URL baseURL = fileUtils.getFileURL(pathComponent);
             StringTokenizer st = new StringTokenizer(classpath);
             while (st.hasMoreTokens()) {

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to