001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999-2005 Bull S.A.
004: * Contact: jonas-team@objectweb.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: JClassLoader.java 6625 2005-04-22 13:45:57Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.objectweb.jonas.server;
025:
026: import java.io.File;
027: import java.net.URL;
028: import java.net.URLClassLoader;
029:
030: /**
031: * This class implements a URLClassLoader, that permits to add some URLs in it.
032: * @author Ludovic Bert
033: * @author Florent Benoit
034: */
035: public class JClassLoader extends URLClassLoader {
036:
037: /**
038: * JClassLoader name
039: */
040: private String name = null;
041:
042: /**
043: * Need to recompute toString() value ? (urls have changed)
044: * True by default (not done).
045: * Then, compute is done only when required and if needed
046: */
047: private boolean recomputeToString = true;
048:
049: /**
050: * Need to recompute getClassPath() value ? (urls have changed)
051: * True by default (not done).
052: * Then, compute is done only when required and if needed
053: */
054: private boolean recomputeClassPath = true;
055:
056: /**
057: * String representation used by toString() method
058: */
059: private String toStringValue = null;
060:
061: /**
062: * Classpath value
063: */
064: private String classpath = null;
065:
066: /**
067: * Constructs a new ClassLoader with the specified URLs.
068: * @param name ClassLoader name (used for Display)
069: * @param urls the URLs to add at the ClassLoader creation.
070: * @param parent parent ClassLoader, null if no parent.
071: */
072: public JClassLoader(String name, URL[] urls, ClassLoader parent) {
073: super (urls, parent);
074: this .name = name;
075: this .recomputeToString = true;
076: this .recomputeClassPath = true;
077: }
078:
079: /**
080: * Constructs a new ClassLoader with the specified URLs.
081: * Uses the default delegation parent classloader.
082: * @param name ClassLoader name (used for Display)
083: * @param urls the URLs to add at the ClassLoader creation.
084: */
085: public JClassLoader(String name, URL[] urls) {
086: super (urls);
087: this .name = name;
088: this .recomputeToString = true;
089: this .recomputeClassPath = true;
090: }
091:
092: /**
093: * Add the specified URL to this ClassLoader.
094: * @param url the URL to add to this ClassLoader.
095: */
096: public void addURL(URL url) {
097: if (url != null) {
098: super .addURL(url);
099: }
100: this .recomputeToString = true;
101: this .recomputeClassPath = true;
102: }
103:
104: /**
105: * Add the specified URLs to this ClassLoader.
106: * @param urls the URLs to add to this ClassLoader.
107: */
108: public void addURLs(URL[] urls) {
109: if (urls != null) {
110: for (int i = 0; i < urls.length; i++) {
111: if (urls[i] != null) {
112: super .addURL(urls[i]);
113: }
114: }
115: }
116: this .recomputeToString = true;
117: this .recomputeClassPath = true;
118: }
119:
120: /**
121: * Display all the URLs from the class loader
122: */
123: public void printURLs() {
124: System.out.println(name + " ClassLoader :");
125: URL[] urls = super .getURLs();
126: for (int i = 0; i < urls.length; i++) {
127: System.out.println("url="
128: + (new File(urls[i].getFile())).getAbsolutePath());
129: }
130: // display parent classloader
131: if (getParent() != null && getParent() instanceof JClassLoader) {
132: System.out.println("parent :");
133: ((JClassLoader) getParent()).printURLs();
134: }
135: }
136:
137: /**
138: * Get the class path of this classloader
139: * @return the class path of this classloader
140: */
141: public String getClassPath() {
142: // urls have changed, need to build value
143: if (recomputeClassPath) {
144: computeClassPath();
145: }
146: return classpath;
147: }
148:
149: /**
150: * Displays useful information
151: * @return information
152: */
153: public String toString() {
154: // urls have changed, need to build value
155: if (recomputeToString) {
156: computeToString();
157: }
158: return toStringValue;
159: }
160:
161: /**
162: * Compute a string representation used by toString() method
163: */
164: private void computeToString() {
165: StringBuffer sb = new StringBuffer();
166: sb.append(this .getClass().getName());
167: sb.append("[");
168: sb.append(name);
169: sb.append(", urls=");
170: URL[] urls = getURLs();
171: for (int u = 0; u < urls.length; u++) {
172: sb.append(urls[u]);
173: if (u != urls.length - 1) {
174: sb.append(";");
175: }
176: }
177: sb.append("]");
178: toStringValue = sb.toString();
179:
180: // value is updated, no need to do it again.
181: recomputeToString = false;
182: }
183:
184: /**
185: * Compute classpath value
186: */
187: private void computeClassPath() {
188: String cp = "";
189: // add parent classpath before
190: if (getParent() != null && getParent() instanceof JClassLoader) {
191: cp += ((JClassLoader) getParent()).getClassPath();
192: }
193: URL[] urls = super .getURLs();
194: for (int i = 0; i < urls.length; i++) {
195: cp = cp + File.pathSeparator
196: + (new File(urls[i].getFile())).getAbsolutePath();
197: }
198: classpath = cp;
199: // update value
200: recomputeClassPath = false;
201: }
202:
203: }
|