KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jmanage > core > config > ClassLoaderRepository


1 /**
2 * Copyright (c) 2004-2005 jManage.org
3 *
4 * This is a free software; you can redistribute it and/or
5 * modify it under the terms of the license at
6 * http://www.jmanage.org.
7 *
8 * Unless required by applicable law or agreed to in writing, software
9 * distributed under the License is distributed on an "AS IS" BASIS,
10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */

14 package org.jmanage.core.config;
15
16 import org.jmanage.util.StringUtils;
17 import org.jmanage.core.util.Loggers;
18
19 import java.net.URL JavaDoc;
20 import java.net.URLClassLoader JavaDoc;
21 import java.util.HashMap JavaDoc;
22 import java.util.Map JavaDoc;
23 import java.util.Collections JavaDoc;
24 import java.util.logging.Logger JavaDoc;
25
26 /**
27  * Holds classloaders for different application types. This is used so
28  * that we don't end up creating classloaders for the same classpath
29  * "incompatibleJMX" parameter.
30  *
31  * <p>
32  * Date: Sep 25, 2005
33  * @author Rakesh Kalra
34  */

35 public class ClassLoaderRepository {
36
37     private static final Logger JavaDoc logger =
38             Loggers.getLogger(ClassLoaderRepository.class);
39
40     /* key to ClassLoader mapping */
41     private static Map JavaDoc classLoaders = Collections.synchronizedMap(new HashMap JavaDoc());
42
43     public static ClassLoader JavaDoc getClassLoader(URL JavaDoc[] classpath,
44                                              boolean isCompatibleJMX){
45
46         Key key = new Key(classpath, isCompatibleJMX);
47         ClassLoader JavaDoc classLoader = (ClassLoader JavaDoc)classLoaders.get(key);
48         if(classLoader == null){
49             logger.fine("Creating new ClassLoader for classpath : " +
50                     StringUtils.toString(classpath) + ", isCompatibleJMX=" +
51                     isCompatibleJMX);
52             if(!isCompatibleJMX){
53                 classLoader = new JMXMeFirstClassLoader(classpath,
54                         ModuleConfig.class.getClassLoader());
55             }else{
56                 classLoader = new URLClassLoader JavaDoc(classpath,
57                         ModuleConfig.class.getClassLoader());
58             }
59             classLoaders.put(key, classLoader);
60         }
61         return classLoader;
62     }
63
64     private static class Key {
65         URL JavaDoc[] classpath;
66         boolean isCompatibleJMX;
67         Key(URL JavaDoc[] classpath, boolean isCompatibleJMX){
68             this.classpath = classpath;
69             this.isCompatibleJMX = isCompatibleJMX;
70         }
71
72         public boolean equals(Object JavaDoc obj){
73             if(obj instanceof Key){
74                 Key key = (Key)obj;
75                 if(key.isCompatibleJMX == this.isCompatibleJMX
76                         && compare(key.classpath, this.classpath)){
77                     return true;
78                 }
79             }
80             return false;
81         }
82
83         public int hashCode(){
84             return classpath.hashCode() * 31 +
85                     Boolean.valueOf(isCompatibleJMX).hashCode();
86         }
87
88         boolean compare(URL JavaDoc[] a, URL JavaDoc[] b){
89             String JavaDoc strA = StringUtils.toString(a);
90             String JavaDoc strB = StringUtils.toString(b);
91             return strA.equals(strB);
92         }
93     }
94
95     private static class JMXMeFirstClassLoader extends URLClassLoader JavaDoc{
96
97         JMXMeFirstClassLoader(URL JavaDoc[] classpath, ClassLoader JavaDoc parent){
98             super(classpath, parent);
99         }
100
101         protected synchronized Class JavaDoc loadClass(String JavaDoc name, boolean resolve)
102             throws ClassNotFoundException JavaDoc{
103
104             if(name.startsWith("javax.management.")){
105                 // First, check if the class has already been loaded
106
Class JavaDoc c = findLoadedClass(name);
107                 if(c == null){
108                     try {
109                         c = findClass(name);
110                     } catch (ClassNotFoundException JavaDoc e) {
111                         c = getParent().loadClass(name);
112                     }
113                 }
114                 if (resolve) {
115                     resolveClass(c);
116                 }
117                 return c;
118             }
119             return super.loadClass(name, resolve);
120         }
121     }
122 }
123
124
Popular Tags