KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mx4j > server > DefaultClassLoaderRepository


1 /*
2  * Copyright (C) The MX4J Contributors.
3  * All rights reserved.
4  *
5  * This software is distributed under the terms of the MX4J License version 1.0.
6  * See the terms of the MX4J License in the documentation provided with this software.
7  */

8
9 package mx4j.server;
10
11 import java.util.ArrayList JavaDoc;
12 import javax.management.loading.MLet JavaDoc;
13
14 /**
15  * Default implementation of a ClassLoaderRepository
16  *
17  * @version $Revision: 1.8 $
18  */

19 public class DefaultClassLoaderRepository extends ModifiableClassLoaderRepository
20 {
21    private static final int WITHOUT = 1;
22    private static final int BEFORE = 2;
23
24    private ArrayList JavaDoc classLoaders = new ArrayList JavaDoc();
25
26    public Class JavaDoc loadClass(String JavaDoc className) throws ClassNotFoundException JavaDoc
27    {
28       return loadClassWithout(null, className);
29    }
30
31    public Class JavaDoc loadClassWithout(ClassLoader JavaDoc loader, String JavaDoc className) throws ClassNotFoundException JavaDoc
32    {
33       return loadClassFromRepository(loader, className, WITHOUT);
34    }
35
36    public Class JavaDoc loadClassBefore(ClassLoader JavaDoc loader, String JavaDoc className) throws ClassNotFoundException JavaDoc
37    {
38       return loadClassFromRepository(loader, className, BEFORE);
39    }
40
41    protected void addClassLoader(ClassLoader JavaDoc cl)
42    {
43       if (cl == null) return;
44
45       ArrayList JavaDoc loaders = getClassLoaders();
46       synchronized (loaders)
47       {
48          if (!loaders.contains(cl)) loaders.add(cl);
49       }
50    }
51
52    protected void removeClassLoader(ClassLoader JavaDoc cl)
53    {
54       if (cl == null) return;
55
56       ArrayList JavaDoc loaders = getClassLoaders();
57       synchronized (loaders)
58       {
59          loaders.remove(cl);
60       }
61    }
62
63    protected ArrayList JavaDoc cloneClassLoaders()
64    {
65       ArrayList JavaDoc loaders = getClassLoaders();
66       synchronized (loaders)
67       {
68          return (ArrayList JavaDoc)loaders.clone();
69       }
70    }
71
72    protected ArrayList JavaDoc getClassLoaders()
73    {
74       return classLoaders;
75    }
76
77    private Class JavaDoc loadClassFromRepository(ClassLoader JavaDoc loader, String JavaDoc className, int algorithm) throws ClassNotFoundException JavaDoc
78    {
79       ArrayList JavaDoc copy = cloneClassLoaders();
80       for (int i = 0; i < copy.size(); ++i)
81       {
82          try
83          {
84             ClassLoader JavaDoc cl = (ClassLoader JavaDoc)copy.get(i);
85             if (cl.equals(loader))
86             {
87                if (algorithm == BEFORE)
88                   break;
89                else
90                   continue;
91             }
92
93             return loadClass(cl, className);
94          }
95          catch (ClassNotFoundException JavaDoc ignored)
96          {
97          }
98       }
99       throw new ClassNotFoundException JavaDoc(className);
100    }
101
102    private Class JavaDoc loadClass(ClassLoader JavaDoc loader, String JavaDoc className) throws ClassNotFoundException JavaDoc
103    {
104       // This is an optimization: if the classloader is an MLet (and not a subclass)
105
// then the method MLet.loadClass(String, ClassLoaderRepository) is used.
106
if (loader.getClass() == MLet JavaDoc.class) return ((MLet JavaDoc)loader).loadClass(className, null);
107       return loader.loadClass(className);
108    }
109
110    private int getSize()
111    {
112       ArrayList JavaDoc loaders = getClassLoaders();
113       synchronized (loaders)
114       {
115          return loaders.size();
116       }
117    }
118 }
119
Popular Tags