KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mule > registry > ClassLoaderFactory


1 /*
2  * $Id: ClassLoaderFactory.java 3798 2006-11-04 04:07:14Z aperepel $
3  * --------------------------------------------------------------------------------------
4  * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
5  *
6  * The software in this package is published under the terms of the MuleSource MPL
7  * license, a copy of which has been included with this distribution in the
8  * LICENSE.txt file.
9  */

10
11 package org.mule.registry;
12
13 import java.io.File JavaDoc;
14 import java.net.MalformedURLException JavaDoc;
15 import java.net.URL JavaDoc;
16 import java.net.URLClassLoader JavaDoc;
17 import java.security.SecureClassLoader JavaDoc;
18 import java.util.ArrayList JavaDoc;
19 import java.util.HashMap JavaDoc;
20 import java.util.Iterator JavaDoc;
21 import java.util.List JavaDoc;
22 import java.util.Map JavaDoc;
23
24 /**
25  * @author <a HREF="mailto:gnt@codehaus.org">Guillaume Nodet</a>
26  */

27 public class ClassLoaderFactory
28 {
29
30     private static ClassLoaderFactory factory;
31     private Map JavaDoc sharedClassLoaders;
32
33     public static ClassLoaderFactory getInstance()
34     {
35         if (factory == null)
36         {
37             factory = new ClassLoaderFactory();
38         }
39         return factory;
40     }
41
42     private ClassLoaderFactory()
43     {
44         this.sharedClassLoaders = new HashMap JavaDoc();
45     }
46
47     public ClassLoader JavaDoc createComponentClassLoader(RegistryComponent component) throws MalformedURLException JavaDoc
48     {
49         DelegatingClassLoader dcl = new DelegatingClassLoader();
50         Library[] libraries = component.getLibraries();
51         for (int i = 0; i < libraries.length; i++)
52         {
53             dcl.addClassLoader(getSharedClassLoader(libraries[i]));
54         }
55         URL JavaDoc[] urls = getUrlsFrom(component.getInstallRoot(), component.getClassPathElements());
56         boolean isParentFirst = component.isClassLoaderParentFirst();
57         JbiClassLoader ccl = new JbiClassLoader(urls, dcl, isParentFirst);
58         return ccl;
59     }
60
61     private ClassLoader JavaDoc getSharedClassLoader(Library library) throws MalformedURLException JavaDoc
62     {
63         ClassLoader JavaDoc cl = (ClassLoader JavaDoc)this.sharedClassLoaders.get(library.getName());
64         if (cl == null)
65         {
66             URL JavaDoc[] urls = getUrlsFrom(library.getInstallRoot(), library.getClassPathElements());
67             boolean isParentFirst = library.isClassLoaderParentFirst();
68             cl = new JbiClassLoader(urls, null, isParentFirst);
69             this.sharedClassLoaders.put(library.getName(), cl);
70         }
71         return cl;
72     }
73
74     private URL JavaDoc[] getUrlsFrom(String JavaDoc root, List JavaDoc paths) throws MalformedURLException JavaDoc
75     {
76         URL JavaDoc[] urls = new URL JavaDoc[paths.size()];
77         for (int i = 0; i < urls.length; i++)
78         {
79             String JavaDoc cpElement = (String JavaDoc)paths.get(i);
80             urls[i] = new File JavaDoc(root, cpElement).toURL();
81         }
82         return urls;
83     }
84
85     /**
86      * ClassLoader for a component. This class loader is able to resolve class either
87      * by first looking at the parent ot itself.
88      *
89      * @author <a HREF="mailto:gnt@codehaus.org">Guillaume Nodet</a>
90      */

91     public static class JbiClassLoader extends URLClassLoader JavaDoc
92     {
93
94         private boolean parentFirst;
95
96         public JbiClassLoader(URL JavaDoc[] urls, ClassLoader JavaDoc parent, boolean parentFirst)
97         {
98             super(urls, parent);
99             this.parentFirst = parentFirst;
100         }
101
102         protected synchronized Class JavaDoc loadClass(String JavaDoc name, boolean resolve) throws ClassNotFoundException JavaDoc
103         {
104             // First, check if the class has already been loaded
105
Class JavaDoc clazz = findLoadedClass(name);
106             if (clazz == null)
107             {
108                 if (this.parentFirst)
109                 {
110                     try
111                     {
112                         clazz = getParent().loadClass(name);
113                     }
114                     catch (ClassNotFoundException JavaDoc cnfe)
115                     {
116                         clazz = findClass(name);
117                     }
118                 }
119                 else
120                 {
121                     try
122                     {
123                         clazz = findClass(name);
124                     }
125                     catch (ClassNotFoundException JavaDoc e)
126                     {
127                         clazz = getParent().loadClass(name);
128                     }
129                 }
130             }
131             if (resolve)
132             {
133                 resolveClass(clazz);
134             }
135             return clazz;
136         }
137     }
138
139     /**
140      * ClassLoader for shared libraries
141      *
142      * @author <a HREF="mailto:gnt@codehaus.org">Guillaume Nodet</a>
143      */

144     public static class DelegatingClassLoader extends SecureClassLoader JavaDoc
145     {
146         private List JavaDoc loaders;
147
148         public DelegatingClassLoader()
149         {
150             this.loaders = new ArrayList JavaDoc();
151         }
152
153         public void addClassLoader(ClassLoader JavaDoc loader)
154         {
155             if (loader == null)
156             {
157                 throw new IllegalArgumentException JavaDoc("loader can not be null");
158             }
159             loaders.add(loader);
160         }
161
162         protected Class JavaDoc findClass(String JavaDoc name) throws ClassNotFoundException JavaDoc
163         {
164             for (Iterator JavaDoc iter = this.loaders.iterator(); iter.hasNext();)
165             {
166                 ClassLoader JavaDoc loader = (ClassLoader JavaDoc)iter.next();
167                 try
168                 {
169                     return loader.loadClass(name);
170                 }
171                 catch (ClassNotFoundException JavaDoc e)
172                 {
173                     // expected
174
}
175             }
176             throw new ClassNotFoundException JavaDoc(name);
177         }
178     }
179
180 }
181
Popular Tags