00001
00027 package org.objectweb.jonas_lib.loader;
00028
00029 import java.io.File;
00030 import java.io.IOException;
00031 import java.net.URL;
00032 import java.net.URLClassLoader;
00033 import java.util.List;
00034 import java.util.Iterator;
00035
00036 import org.objectweb.jonas_lib.loader.factory.URLFactory;
00037 import org.objectweb.jonas_lib.loader.locator.Locator;
00038
00045 public abstract class AbsModuleClassLoader extends URLClassLoader {
00046
00048 private URLFactory[] factories;
00049
00051 private Locator[] locators;
00052
00054 private URL[] bases;
00055
00063 public AbsModuleClassLoader(URL[] modules) throws IOException {
00064 super(new URL[0]);
00065 bases = modules;
00066 init();
00067 }
00068
00077 public AbsModuleClassLoader(URL[] modules, ClassLoader parent) throws IOException {
00078 super(new URL[0], parent);
00079 bases = modules;
00080 init();
00081 }
00082
00088 protected void init() throws IOException {
00089 factories = new URLFactory[bases.length];
00090 locators = new Locator[bases.length];
00091
00092
00093 for (int i = 0; i < bases.length; i++) {
00094
00095 factories[i] = URLFactory.getFactory(bases[i]);
00096 locators[i] = Locator.getLocator(bases[i]);
00097 }
00098 }
00099
00109 protected void addInRepository(String location) throws IOException {
00110
00111 for (int i = 0; i < bases.length; i++) {
00112 if (locators[i].hasDirectory(location)
00113 || locators[i].hasFile(location)) {
00114 addURL(factories[i].getURL(location));
00115 }
00116 }
00117 }
00118
00129 protected void addContentInRepository(String location) throws IOException {
00130
00131 for (int i = 0; i < bases.length; i++) {
00132 List list = locators[i].listContent(location);
00133 for (Iterator l = list.iterator(); l.hasNext();) {
00134 addURL(factories[i].getURL((String) l.next()));
00135 }
00136 }
00137 }
00138
00142 public String toString() {
00143 StringBuffer sb = new StringBuffer();
00144
00145 sb.append("classloader : " + getClass().getName() + "\n");
00146 sb.append("\tmodules bases (not in loader!) : \n");
00147 for (int i = 0; i < bases.length; i++) {
00148 sb.append("\t\t -" + bases[i] + "\n");
00149 }
00150 sb.append("\trepositories :\n");
00151 URL[] rep = getURLs();
00152 for (int i = 0; i < rep.length; i++) {
00153 sb.append("\t\t -" + rep[i] + "\n");
00154 }
00155 sb.append("\tparent : " + getParent() + "\n");
00156
00157 return sb.toString();
00158 }
00159
00163 public URL[] getBases() {
00164 return bases;
00165 }
00166
00170 public String getClasspath() {
00171 URL[] urls = getURLs();
00172 StringBuffer cp = new StringBuffer();
00173 for (int i = 0; i < urls.length; i++) {
00174 String url = urls[i].getFile();
00175
00176 if (url.indexOf("!/") == -1) {
00177 cp.append(File.pathSeparator + url);
00178 }
00179 }
00180 return cp.toString();
00181 }
00182 }