001: /**
002: * JOnAS: Java(TM) Open Application Server
003: * Copyright (C) 1999 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: * Initial developer(s): Guillaume SAUTHIER
022: * --------------------------------------------------------------------------
023: * $Id: AbsModuleClassLoader.java 10095 2007-03-26 07:03:35Z sauthieg $
024: * --------------------------------------------------------------------------
025: */package org.objectweb.jonas_lib.loader;
026:
027: import java.io.File;
028: import java.io.IOException;
029: import java.net.URL;
030: import java.net.URLClassLoader;
031: import java.util.List;
032: import java.util.Iterator;
033:
034: import org.objectweb.jonas_lib.loader.factory.URLFactory;
035: import org.objectweb.jonas_lib.loader.locator.Locator;
036:
037: /**
038: * The <code>AbsModuleClassLoader</code> class is used in JOnAS
039: * for loading web, ejbjars and client modules.
040: *
041: * @author Guillaume Sauthier
042: */
043: public abstract class AbsModuleClassLoader extends URLClassLoader {
044:
045: /** factories used to create URLs for URLClassLoader */
046: private URLFactory[] factories;
047:
048: /** locators used to search jar/dir for files, directories, ... */
049: private Locator[] locators;
050:
051: /** bases URLs */
052: private URL[] bases;
053:
054: /**
055: * Create a new AbsModuleClassLoader for a list of URLs.
056: *
057: * @param modules the list of URL to be used in the ClassLoader.
058: *
059: * @throws IOException when Initialization fails.
060: */
061: public AbsModuleClassLoader(URL[] modules) throws IOException {
062: super (new URL[0]);
063: bases = modules;
064: init();
065: }
066:
067: /**
068: * Create a new AbsModuleClassLoader for a list of URLs with a specified parent loader.
069: *
070: * @param modules the list of URL to be used in the ClassLoader.
071: * @param parent the parent ClassLoader to be used.
072: *
073: * @throws IOException when Initialization fails.
074: */
075: public AbsModuleClassLoader(URL[] modules, ClassLoader parent)
076: throws IOException {
077: super (new URL[0], parent);
078: bases = modules;
079: init();
080: }
081:
082: /**
083: * Base Initialization of the ClassLoader, storage of URL list.
084: *
085: * @throws IOException when URL pointed file is not supported (not an jar nor a directory).
086: */
087: protected void init() throws IOException {
088: factories = new URLFactory[bases.length];
089: locators = new Locator[bases.length];
090:
091: // Create factories and locator for each URL
092: for (int i = 0; i < bases.length; i++) {
093:
094: factories[i] = URLFactory.getFactory(bases[i]);
095: locators[i] = Locator.getLocator(bases[i]);
096: }
097: }
098:
099: /**
100: * Add specified location into the repository.
101: * If location is found in multiple URLs of the bases, new
102: * URLs will be added multiple times.
103: *
104: * @param location an entry name (for a jar) or a path name (for a directory)
105: *
106: * @throws IOException when constructed URL is malformed
107: */
108: protected void addInRepository(String location) throws IOException {
109: // test existence in each base URL
110: for (int i = 0; i < bases.length; i++) {
111: if (locators[i].hasDirectory(location)
112: || locators[i].hasFile(location)) {
113: addURL(factories[i].getURL(location));
114: }
115: }
116: }
117:
118: /**
119: * Add specified location childs into the repository.
120: * Search will be performed on the bases URLs.
121: *
122: * @param location an entry name (for a jar) or a path name (for a directory)
123: *
124: * @throws IOException When a directory content cannot be explored.
125: *
126: * TODO test existence is now done in AbsModuleClassLoader
127: */
128: protected void addContentInRepository(String location)
129: throws IOException {
130: // test existence in each base URL
131: for (int i = 0; i < bases.length; i++) {
132: List list = locators[i].listContent(location);
133: for (Iterator l = list.iterator(); l.hasNext();) {
134: // TODO Exclude non jar content !
135: addURL(factories[i].getURL((String) l.next()));
136: }
137: }
138: }
139:
140: /**
141: * @return Returns a String representation of the AbsModuleClassLoader
142: */
143: public String toString() {
144: StringBuffer sb = new StringBuffer();
145:
146: sb.append("classloader : " + getClass().getName() + "\n");
147: sb.append("\tmodules bases (not in loader!) : \n");
148: for (int i = 0; i < bases.length; i++) {
149: sb.append("\t\t -" + bases[i] + "\n");
150: }
151: sb.append("\trepositories :\n");
152: URL[] rep = getURLs();
153: for (int i = 0; i < rep.length; i++) {
154: sb.append("\t\t -" + rep[i] + "\n");
155: }
156: sb.append("\tparent : " + getParent() + "\n");
157:
158: return sb.toString();
159: }
160:
161: /**
162: * @return Returns the bases.
163: */
164: public URL[] getBases() {
165: return bases;
166: }
167:
168: /**
169: * @return Returns a String representation of the classpath used by this classloader
170: */
171: public String getClasspath() {
172: URL[] urls = getURLs();
173: StringBuffer cp = new StringBuffer();
174: for (int i = 0; i < urls.length; i++) {
175: String url = urls[i].getFile();
176: // do not add URL with !/ inside
177: if (url.indexOf("!/") == -1) {
178: cp.append(File.pathSeparator + url);
179: }
180: }
181: if (getParent() instanceof AbsModuleClassLoader) {
182: AbsModuleClassLoader module = (AbsModuleClassLoader) getParent();
183: cp.append(module.getClasspath());
184: }
185: return cp.toString();
186: }
187: }
|