001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.geronimo.system.sharedlib; 018 019 import org.apache.geronimo.gbean.GBeanInfo; 020 import org.apache.geronimo.gbean.GBeanInfoBuilder; 021 import org.apache.geronimo.gbean.SingleElementCollection; 022 023 import java.util.Arrays; 024 import java.util.Collection; 025 import java.util.Set; 026 import java.util.HashSet; 027 import java.util.LinkedHashSet; 028 import java.util.Iterator; 029 import java.net.URL; 030 import java.net.MalformedURLException; 031 import java.io.File; 032 033 import org.apache.geronimo.system.serverinfo.ServerInfo; 034 import org.apache.geronimo.kernel.config.MultiParentClassLoader; 035 036 /** 037 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 038 */ 039 public class SharedLib { 040 public SharedLib(ClassLoader classLoader, String[] classesDirs, String[] libDirs, Collection<ServerInfo> serverInfos) throws MalformedURLException { 041 this(classLoader, classesDirs, libDirs, new SingleElementCollection<ServerInfo>(serverInfos).getElement()); 042 } 043 044 private SharedLib(ClassLoader classLoader, String[] classesDirs, String[] libDirs, ServerInfo serverInfo) throws MalformedURLException { 045 MultiParentClassLoader multiParentClassLoader = (MultiParentClassLoader) classLoader; 046 Set currentUrls = new HashSet(Arrays.asList(multiParentClassLoader.getURLs())); 047 048 int size=0; 049 if (classesDirs != null) size += classesDirs.length; 050 if (libDirs != null) size += libDirs.length; 051 052 LinkedHashSet newUrls = new LinkedHashSet(size); 053 if (classesDirs != null) { 054 for (int i = 0; i < classesDirs.length; i++) { 055 String classesDir = classesDirs[i]; 056 File dir = serverInfo.resolveServer(classesDir); 057 if (!dir.exists()) { 058 if (!dir.mkdirs()) { 059 throw new IllegalArgumentException("Failed to create classes dir: " + dir); 060 } 061 } 062 if (!dir.isDirectory()) { 063 throw new IllegalArgumentException("Shared classes dir is not a directory: " + dir); 064 } 065 URL location = dir.toURL(); 066 if (!currentUrls.contains(location)) { 067 newUrls.add(location); 068 } 069 } 070 } 071 072 if (libDirs != null) { 073 for (int i = 0; i < libDirs.length; i++) { 074 String libDir = libDirs[i]; 075 File dir = serverInfo.resolveServer(libDir); 076 if (!dir.exists()) { 077 if (!dir.mkdirs()) { 078 throw new IllegalArgumentException("Failed to create lib dir: " + dir); 079 } 080 } 081 if (!dir.isDirectory()) { 082 throw new IllegalArgumentException("Shared lib dir is not a directory: " + dir); 083 } 084 085 File[] files = dir.listFiles(); 086 for (int j = 0; j < files.length; j++) { 087 File file = files[j]; 088 if (file.canRead() && (file.getName().endsWith(".jar") || file.getName().endsWith(".zip"))) { 089 URL location = file.toURL(); 090 if (!currentUrls.contains(location)) { 091 newUrls.add(location); 092 } 093 } 094 } 095 } 096 } 097 098 for (Iterator iterator = newUrls.iterator(); iterator.hasNext();) { 099 URL url = (URL) iterator.next(); 100 multiParentClassLoader.addURL(url); 101 } 102 } 103 104 public static final GBeanInfo GBEAN_INFO; 105 106 static { 107 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(SharedLib.class); 108 infoFactory.addAttribute("classLoader", ClassLoader.class, false, false); 109 infoFactory.addAttribute("classesDirs", String[].class, true, true); 110 infoFactory.addAttribute("libDirs", String[].class, true, true); 111 infoFactory.addReference("ServerInfo", ServerInfo.class, "GBean"); 112 113 infoFactory.setConstructor(new String[]{"classLoader", "classesDirs", "libDirs", "ServerInfo"}); 114 GBEAN_INFO = infoFactory.getBeanInfo(); 115 } 116 117 public static GBeanInfo getGBeanInfo() { 118 return GBEAN_INFO; 119 } 120 }