001: /**
002: * The XMOJO Project 5
003: * Copyright © 2003 XMOJO.org. All rights reserved.
004:
005: * NO WARRANTY
006:
007: * BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
008: * THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
009: * OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
010: * PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
011: * OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
012: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
013: * TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE
014: * LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
015: * REPAIR OR CORRECTION.
016:
017: * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
018: * ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
019: * THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
020: * GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
021: * USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF
022: * DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
023: * PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE),
024: * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
025: * SUCH DAMAGES.
026: **/package javax.management.loading;
027:
028: import java.io.Serializable;
029: import java.util.Vector;
030:
031: /**
032: * Keeps the list of Class Loaders registered in the MBean Server. It provides
033: * the necessary methods to load classes using the registered Class Loaders.
034: */
035: public class DefaultLoaderRepository implements Serializable {
036: /** List of class loaders */
037: protected static Vector loaders = new Vector();
038:
039: /**
040: * The default constructor
041: */
042: public DefaultLoaderRepository() {
043: }
044:
045: /**
046: * Go through the list of class loaders and try to load the requested class.
047: * The method will stop as soon as the class is found. If the class is
048: * not found the method will throw a ClassNotFoundException exception.
049: *
050: * @param className The name of the class to be loaded.
051: *
052: * @return This returns a Class after loading the requested class
053: *
054: * @exception java.lang.ClassNotFoundException The specified class
055: * could not be found.
056: */
057: public static Class loadClass(String className)
058: throws ClassNotFoundException {
059: return loadClass((Vector) loaders.clone(), className);
060: }
061:
062: /**
063: * Go through the list of class loaders but exclude the given class loader,
064: * then try to load the requested class. The method will stop as soon as
065: * the class is found. If the class is not found the method will throw a
066: * ClassNotFoundException exception.
067: *
068: * @param className The name of the class to be loaded.
069: *
070: * @param loader The class loader to be excluded.
071: *
072: * @return Returns a requested class which is loaded after goining through
073: * the list of class loaders but exclude the given class loader
074: *
075: * @exception java.lang.ClassNotFoundException The specified class
076: * could not be found.
077: */
078: public static Class loadClassWithout(ClassLoader loader,
079: String className) throws ClassNotFoundException {
080: Vector validLoaders = (Vector) loaders.clone();
081: int size = validLoaders.size();
082:
083: for (int i = 0; i < size; i++) {
084: try {
085: ClassLoader cl = (ClassLoader) loaders.elementAt(i);
086: if (cl.equals(loader))
087: continue;
088:
089: return cl.loadClass(className);
090: } catch (ClassNotFoundException cnfe) {
091: continue;
092: }
093: }
094:
095: throw new ClassNotFoundException(className);
096: }
097:
098: //--------------------------- Package methods ---------------------------//
099:
100: /**
101: * Go through the list of class loaders and try to load the requested class.
102: * The method will stop as soon as the class is found. If the class is not
103: * found the method will throw a ClassNotFoundException exception.
104: *
105: * @param className The name of the class to be loaded.
106: *
107: * @return This returns a Class after loading the requested class
108: *
109: * @exception java.lang.ClassNotFoundException The specified class
110: * could not be found.
111: */
112: static Class loadClass(Vector validLoaders, String className)
113: throws ClassNotFoundException {
114: int size = validLoaders.size();
115: Class clazz = null;
116:
117: Vector tempLoaders = new Vector();
118: Vector positions = new Vector();
119:
120: for (int i = 0; i < validLoaders.size(); i++) {
121: try {
122: ClassLoader cloader = (ClassLoader) validLoaders
123: .elementAt(i);
124:
125: validLoaders.removeElementAt(i);
126: tempLoaders.addElement(cloader);
127: positions.addElement(new Integer(positions.size() + i));
128: i--;
129:
130: if (cloader instanceof MLet) {
131: ((MLet) cloader).setUseDefaultLoader(true);
132: clazz = cloader.loadClass(className);
133: ((MLet) cloader).setUseDefaultLoader(false);
134: } else
135: clazz = cloader.loadClass(className);
136:
137: break;
138:
139: } catch (ClassNotFoundException cnfe) {
140: // continue;
141: }
142: }
143:
144: if (clazz != null)
145: return clazz;
146:
147: throw new ClassNotFoundException(className);
148: }
149:
150: static Class loadClassFromDefaultLoader(String className)
151: throws ClassNotFoundException {
152: int size = loaders.size();
153: Class clazz = null;
154:
155: for (int i = 0; i < loaders.size(); i++) {
156: try {
157: ClassLoader cloader = (ClassLoader) loaders
158: .elementAt(i);
159:
160: if (cloader instanceof MLet)
161: continue;
162:
163: clazz = cloader.loadClass(className);
164: break;
165:
166: } catch (ClassNotFoundException cnfe) {
167: // continue;
168: }
169: }
170:
171: if (clazz != null)
172: return clazz;
173:
174: throw new ClassNotFoundException(className);
175: }
176: }
|