axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Deepal Jayasinghe <dee...@opensource.lk>
Subject Re: svn commit: r521096 - in /webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment: DeploymentClassLoader.java DeploymentEngine.java POJODeployer.java util/Utils.java
Date Thu, 22 Mar 2007 05:10:15 GMT
Hi Dims;
Yes

findClass  and findResource are familiar to me  :) , as I remember correct we had almost similar
mechanism at the initial stage. And importantly with your changes we can have a parameter
to control child first and parent first scenarios.

(I do agree we need to test some more , Rampart will be a good candidate)

Thanks



dims@apache.org wrote:

>Author: dims
>Date: Wed Mar 21 20:08:39 2007
>New Revision: 521096
>
>URL: http://svn.apache.org/viewvc?view=rev&rev=521096
>Log:
>Does this look familiar Deepal? :) Resurrect some old code. Haven't hooked it up yet.

>The Groovy aar (with embedded groovy jsr jar) and the Jibx sample in 
>AXIS2-2343 both work. Will do a bit more testing. We'll have to add a 
>switch to let user specify the new behavior (where we don't create 
>temp jars).  IMHO, old behavior should be the default for Axis2 1.2.
>
>
>Modified:
>    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
>    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
>    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
>    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
>
>Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
>URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java?view=diff&rev=521096&r1=521095&r2=521096
>==============================================================================
>--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
(original)
>+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentClassLoader.java
Wed Mar 21 20:08:39 2007
>@@ -14,16 +14,30 @@
> * limitations under the License.
> */
> 
>-
> package org.apache.axis2.deployment;
> 
>-import org.apache.axis2.classloader.JarStreamHandlerFactory;
>+import org.apache.axiom.attachments.utils.IOUtils;
>+import org.apache.axis2.classloader.JarFileUrlStreamHandler;
> import org.apache.axis2.deployment.util.Utils;
> 
>+import java.io.ByteArrayInputStream;
>+import java.io.IOException;
>+import java.io.InputStream;
> import java.net.URL;
> import java.net.URLClassLoader;
>+import java.util.ArrayList;
>+import java.util.Collections;
>+import java.util.Enumeration;
>+import java.util.zip.ZipEntry;
>+import java.util.zip.ZipInputStream;
> 
> public class DeploymentClassLoader extends URLClassLoader {
>+    // List of URL's
>+    private URL[] urls = null;
>+
>+    // List of jar files inside the jars in the original url
>+    private ArrayList embedded_jars;
>+
>     /**
>      * DeploymentClassLoader is extended from URLClassLoader. The constructor
>      * does not override the super constructor, but does additional steps like find out
>@@ -33,10 +47,191 @@
>      * @param parent parent classloader <code>ClassLoader</code>
>      */
>     public DeploymentClassLoader(URL[] urls, ClassLoader parent, boolean antiJARLocking)
{
>-        super(Utils.getURLsForAllJars(urls[0], antiJARLocking), parent);
>+        super(Utils.getURLsForAllJars(urls[0]), parent);
>     }
> 
>+    /**
>+     * Experimental!! Is not hooked up yet.
>+     *
>+     * @param urls
>+     * @param parent
>+     */
>     public DeploymentClassLoader(URL[] urls, ClassLoader parent) {
>-        super(Utils.getURLsForAllJars(urls[0]), parent, new JarStreamHandlerFactory());
>+        super(urls, parent);
>+        this.urls = urls;
>+        /**
>+         * though the URL array can contain one or more urls , we only consider the
>+         * first one, since this classLoader is only for Axis2 and the classloader
>+         * is created by Deployment, we definitely know that there will be only one url
in
>+         * the URL array list
>+         */
>+        embedded_jars = Utils.findLibJars(urls[0]);
>+    }
>+
>+    /**
>+     * Finds and loads the class with the specified name from the URL search
>+     * path. Any URLs referring to JAR files are loaded and opened as needed
>+     * until the class is found.
>+     *
>+     * @param name the name of the class
>+     * @return the resulting class
>+     * @exception ClassNotFoundException if the class could not be found
>+     */
>+    protected Class findClass(String name) throws ClassNotFoundException {
>+        Class clazz;
>+        boolean foundClass;
>+        try {
>+            clazz = super.findClass(name);
>+            foundClass = true;
>+            return clazz;
>+        } catch (ClassNotFoundException e) {
>+            foundClass = false;
>+        }
>+        if (!foundClass) {
>+            byte raw[];
>+            try {
>+                String completeFileName = name;
>+                /**
>+                 * Replacing org.apache. -> org/apache/...
>+                 */
>+                completeFileName = completeFileName.replace('.', '/').concat(".class");
>+                raw = getBytes(completeFileName);
>+                if (raw == null) {
>+                    throw new ClassNotFoundException("Class Not found : " + name);
>+                }
>+            } catch (Exception e) {
>+                throw new RuntimeException(e);
>+            }
>+            clazz = defineClass(name, raw, 0, raw.length);
>+            foundClass = true;
>+            return clazz;
>+        }
>+        if (!foundClass) {
>+            throw new ClassNotFoundException("Class Not found : " + name);
>+        }
>+        return null;
>+    }
>+
>+    /**
>+     * Finds the resource with the specified name on the URL search path.
>+     *
>+     * @param resource the name of the resource
>+     * @return a <code>URL</code> for the resource, or <code>null</code>
>+     * if the resource could not be found.
>+     */
>+    public URL findResource(String resource) {
>+        URL url = super.findResource(resource);
>+        if (url != null) {
>+            for (int i = 0; i < embedded_jars.size(); i++) {
>+                String libjar_name = (String) embedded_jars.get(i);
>+                try {
>+                InputStream in = getJarAsStream(libjar_name);
>+                ZipInputStream zin = new ZipInputStream(in);
>+                ZipEntry entry;
>+                String entryName = "";
>+                    while ((entry = zin.getNextEntry()) != null) {
>+                        entryName = entry.getName();
>+                        if (entryName != null &&
>+                                entryName.endsWith(resource)) {
>+                            return new URL("jar", "", -1, urls[0] + "!/" + libjar_name
+ "!/" + entryName, new JarFileUrlStreamHandler());
>+                        }
>+                    }
>+                } catch (Exception e) {
>+                    throw new RuntimeException(e);
>+                }
>+            }
>+        }
>+        return url;
>+    }
>+
>+    /**
>+     * Returns an Enumeration of URLs representing all of the resources
>+     * on the URL search path having the specified name.
>+     *
>+     * @param resource the resource name
>+     * @exception IOException if an I/O exception occurs
>+     * @return an <code>Enumeration</code> of <code>URL</code>s
>+     */
>+    public Enumeration findResources(String resource) throws IOException {
>+        ArrayList resources = new ArrayList();
>+        Enumeration e = super.findResources(resource);
>+        while (e.hasMoreElements()) {
>+            resources.add(e.nextElement());
>+        }
>+        for (int i = 0; i < embedded_jars.size(); i++) {
>+            String libjar_name = (String) embedded_jars.get(i);
>+            try {
>+            InputStream in = getJarAsStream(libjar_name);
>+            ZipInputStream zin = new ZipInputStream(in);
>+            ZipEntry entry;
>+            String entryName = "";
>+                while ((entry = zin.getNextEntry()) != null) {
>+                    entryName = entry.getName();
>+                    if (entryName != null &&
>+                            entryName.endsWith(resource)) {
>+                        resources.add(new URL("jar", "", -1, urls[0] + "!/" + libjar_name
+ "!/" + entryName, new JarFileUrlStreamHandler()));
>+                    }
>+                }
>+            } catch (Exception ex) {
>+                throw new RuntimeException(ex);
>+            }
>+        }
>+        return Collections.enumeration(resources);
>+    }
>+
>+    /**
>+     * Access the jars file (/lib) one by one , then for each one create a <code>ZipInputStream</code>
>+     * and check to see whether there is any entry eith given name. if it is found then
>+     * return the byte array for that
>+     *
>+     * @param resource <code>String</code>  Name of the file to be found
>+     * @return byte[]
>+     * @throws java.io.IOException <code>Exception</code>
>+     */
>+    private byte[] getBytes(String resource) throws Exception {
>+        for (int i = 0; i < embedded_jars.size(); i++) {
>+            String libjar_name = (String) embedded_jars.get(i);
>+            InputStream in = getJarAsStream(libjar_name);
>+            byte[] bytes = getBytes(in, resource);
>+            if(bytes != null) {
>+                return bytes;
>+            }
>+        }
>+        return null;
>+    }
>+
>+    /**
>+     * Get a specific entry's content as a byte array
>+     * 
>+     * @param in
>+     * @param resource
>+     * @return
>+     * @throws Exception
>+     */
>+    private byte[] getBytes(InputStream in, String resource) throws Exception {
>+        ZipInputStream zin = new ZipInputStream(in);
>+        ZipEntry entry;
>+        String entryName = "";
>+        while ((entry = zin.getNextEntry()) != null) {
>+            entryName = entry.getName();
>+            if (entryName != null &&
>+                    entryName.endsWith(resource)) {
>+                byte[] raw = IOUtils.getStreamAsByteArray(zin);
>+                zin.close();
>+                return raw;
>+            }
>+        }
>+        return null;
>+    }
>+
>+    /**
>+     * Get the specified embedded jar from the main jar 
>+     *
>+     * @param libjar_name
>+     * @return
>+     * @throws Exception
>+     */
>+    private InputStream getJarAsStream(String libjar_name) throws Exception {
>+        return new ByteArrayInputStream(getBytes(urls[0].openStream(), libjar_name));
>     }
> }
>
>Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
>URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java?view=diff&rev=521096&r1=521095&r2=521096
>==============================================================================
>--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
(original)
>+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/DeploymentEngine.java
Wed Mar 21 20:08:39 2007
>@@ -198,7 +198,8 @@
>                     DeploymentClassLoader deploymentClassLoader =
>                             new DeploymentClassLoader(
>                                     new URL[]{moduleurl},
>-                                    axisConfig.getModuleClassLoader());
>+                                    axisConfig.getModuleClassLoader(),
>+                                    false);
>                     AxisModule module = new AxisModule();
>                     module.setModuleClassLoader(deploymentClassLoader);
>                     module.setParent(axisConfig);
>
>Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
>URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java?view=diff&rev=521096&r1=521095&r2=521096
>==============================================================================
>--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
(original)
>+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/POJODeployer.java
Wed Mar 21 20:08:39 2007
>@@ -70,7 +70,8 @@
>                     DeploymentClassLoader classLoader =
>                             new DeploymentClassLoader(new URL[]{parentFile.toURL()},
>                                                       configCtx
>-                                                              .getAxisConfiguration().getSystemClassLoader());
>+                                                              .getAxisConfiguration().getSystemClassLoader(),
>+                                                      false);
>                     Thread.currentThread().setContextClassLoader(classLoader);
>                     String className = file.getName();
>                     className = className.replaceAll(".class", "");
>
>Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
>URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java?view=diff&rev=521096&r1=521095&r2=521096
>==============================================================================
>--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
(original)
>+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/deployment/util/Utils.java
Wed Mar 21 20:08:39 2007
>@@ -117,23 +117,16 @@
>         }
>     }
> 
>-    public static URL[] getURLsForAllJars(URL url, boolean antiJARLocking) {
>+    public static URL[] getURLsForAllJars(URL url) {
>         try {
>             ArrayList array = new ArrayList();
>             String urlString = url.toString();
>             InputStream in = url.openStream();
>             ZipInputStream zin;
>             FileInputStream fin = null;
>-            if (antiJARLocking) {
>-                File inputFile = createTempFile(urlString.substring(urlString.length()
- 4), in);
>-                in.close();
>-                array.add(inputFile.toURL());
>-                fin = new FileInputStream(inputFile);
>-                zin = new ZipInputStream(fin);
>-            } else {
>                 array.add(url);
>                 zin = new ZipInputStream(in);
>-            }
>+
>             ZipEntry entry;
>             String entryName;
>             while ((entry = zin.getNextEntry()) != null) {
>@@ -150,9 +143,6 @@
>                 }
>             }
>             zin.close();
>-            if (!antiJARLocking) {
>-                in.close();
>-            }
>             if (fin != null) {
>                 fin.close();
>             }
>@@ -162,35 +152,6 @@
>         }
>     }
> 
>-    public static URL[] getURLsForAllJars(URL url) {
>-        try {
>-            ArrayList array = new ArrayList();
>-            String urlString = url.toString();
>-            InputStream in = url.openStream();
>-            ZipInputStream zin = new ZipInputStream(in);
>-
>-            array.add(url);
>-
>-            ZipEntry entry;
>-            String entryName;
>-            while ((entry = zin.getNextEntry()) != null) {
>-                entryName = entry.getName();
>-                /**
>-                 * id the entry name start with /lib and end with .jar
>-                 * then those entry name will be added to the arraylist
>-                 */
>-                if ((entryName != null) && entryName.toLowerCase().startsWith("lib/")
>-                        && entryName.toLowerCase().endsWith(".jar")) {
>-                    array.add(new URL("jar", "", -1, url.toString() + "!/" + entry.getName()));
>-                }
>-            }
>-            zin.close();
>-            return (URL[]) array.toArray(new URL[array.size()]);
>-        } catch (Exception e) {
>-            throw new RuntimeException(e);
>-        }
>-    }
>-
>     public static File createTempFile(String suffix, InputStream in) throws IOException
{
>         byte data[] = new byte[2048];
>         int count;
>@@ -624,5 +585,34 @@
>             }
>         }
>         return filepath;
>+    }
>+
>+    /**
>+     * Searches for jar files inside /lib dirctory. If there are any, the
>+     * names of those jar files will be added to the array list
>+     */
>+    public static ArrayList findLibJars(URL url) {
>+        ArrayList embedded_jars = new ArrayList();
>+        try {
>+            ZipInputStream zin = new ZipInputStream(url.openStream());
>+            ZipEntry entry;
>+            String entryName = "";
>+            while ((entry = zin.getNextEntry()) != null) {
>+                entryName = entry.getName();
>+                /**
>+                 * if the entry name start with /lib and ends with .jar
>+                 * add it to the the arraylist
>+                 */
>+                if (entryName != null && (entryName.startsWith("lib/") ||
>+                        entryName.startsWith("Lib/")) &&
>+                        entryName.endsWith(".jar")) {
>+                    embedded_jars.add(entryName);
>+                }
>+            }
>+            zin.close();
>+        } catch (Exception e) {
>+            throw new RuntimeException(e);
>+        }
>+        return embedded_jars;
>     }
> }
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
>For additional commands, e-mail: axis-cvs-help@ws.apache.org
>
>
>
>  
>



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org


Mime
View raw message