1 17 package org.apache.geronimo.system.sharedlib; 18 19 import org.apache.geronimo.gbean.GBeanInfo; 20 import org.apache.geronimo.gbean.GBeanInfoBuilder; 21 import java.util.Arrays ; 22 import java.util.Set ; 23 import java.util.HashSet ; 24 import java.util.LinkedHashSet ; 25 import java.util.Iterator ; 26 import java.net.URL ; 27 import java.net.MalformedURLException ; 28 import java.io.File ; 29 30 import org.apache.geronimo.system.serverinfo.ServerInfo; 31 import org.apache.geronimo.kernel.config.MultiParentClassLoader; 32 33 36 public class SharedLib { 37 public SharedLib(ClassLoader classLoader, String [] classesDirs, String [] libDirs, ServerInfo serverInfo) throws MalformedURLException { 38 MultiParentClassLoader multiParentClassLoader = (MultiParentClassLoader) classLoader; 39 Set currentUrls = new HashSet (Arrays.asList(multiParentClassLoader.getURLs())); 40 41 int size=0; 42 if (classesDirs != null) size += classesDirs.length; 43 if (libDirs != null) size += libDirs.length; 44 45 LinkedHashSet newUrls = new LinkedHashSet (size); 46 if (classesDirs != null) { 47 for (int i = 0; i < classesDirs.length; i++) { 48 String classesDir = classesDirs[i]; 49 File dir = serverInfo.resolve(classesDir); 50 if (!dir.exists()) { 51 if (!dir.mkdirs()) { 52 throw new IllegalArgumentException ("Failed to create classes dir: " + dir); 53 } 54 } 55 if (!dir.isDirectory()) { 56 throw new IllegalArgumentException ("Classes dir is not a directory: " + dir); 57 } 58 URL location = dir.toURL(); 59 if (!currentUrls.contains(location)) { 60 newUrls.add(location); 61 } 62 } 63 } 64 65 if (libDirs != null) { 66 for (int i = 0; i < libDirs.length; i++) { 67 String libDir = libDirs[i]; 68 File dir = serverInfo.resolve(libDir); 69 if (!dir.exists()) { 70 if (!dir.mkdirs()) { 71 throw new IllegalArgumentException ("Failed to create lib dir: " + dir); 72 } 73 } 74 if (!dir.isDirectory()) { 75 throw new IllegalArgumentException ("Lib dir is not a directory: " + dir); 76 } 77 78 File [] files = dir.listFiles(); 79 for (int j = 0; j < files.length; j++) { 80 File file = files[j]; 81 if (file.canRead() && (file.getName().endsWith(".jar") || file.getName().endsWith(".zip"))) { 82 URL location = file.toURL(); 83 if (!currentUrls.contains(location)) { 84 newUrls.add(location); 85 } 86 } 87 } 88 } 89 } 90 91 for (Iterator iterator = newUrls.iterator(); iterator.hasNext();) { 92 URL url = (URL ) iterator.next(); 93 multiParentClassLoader.addURL(url); 94 } 95 } 96 97 public static final GBeanInfo GBEAN_INFO; 98 99 static { 100 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(SharedLib.class); 101 infoFactory.addAttribute("classLoader", ClassLoader .class, false, false); 102 infoFactory.addAttribute("classesDirs", String [].class, true, true); 103 infoFactory.addAttribute("libDirs", String [].class, true, true); 104 infoFactory.addReference("ServerInfo", ServerInfo.class, "GBean"); 105 106 infoFactory.setConstructor(new String []{"classLoader", "classesDirs", "libDirs", "ServerInfo"}); 107 GBEAN_INFO = infoFactory.getBeanInfo(); 108 } 109 110 public static GBeanInfo getGBeanInfo() { 111 return GBEAN_INFO; 112 } 113 } 114 | Popular Tags |