1 /** 2 * 3 * Copyright 2005 The Apache Software Foundation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.geronimo.system.util; 18 19 import java.io.File; 20 import java.io.FileOutputStream; 21 import java.io.IOException; 22 import java.io.InputStream; 23 import java.io.OutputStream; 24 import java.net.JarURLConnection; 25 import java.net.URL; 26 import java.net.URLConnection; 27 import java.util.Enumeration; 28 import java.util.jar.JarEntry; 29 import java.util.jar.JarFile; 30 31 import org.apache.geronimo.gbean.GBeanInfo; 32 import org.apache.geronimo.gbean.GBeanInfoBuilder; 33 import org.apache.geronimo.system.serverinfo.ServerInfo; 34 35 /** 36 * @version $Rev: 407990 $ $Date: 2006-05-20 05:29:57 -0700 (Sat, 20 May 2006) $ 37 */ 38 public class DirectoryInitializationGBean { 39 40 41 public DirectoryInitializationGBean(String prefix, String path, ServerInfo serverInfo, ClassLoader classLoader) throws IOException { 42 43 if (!prefix.endsWith("/")) { 44 prefix = prefix + "/"; 45 } 46 int prefixLength = prefix.length(); 47 if (!path.endsWith("/")) { 48 path = path + "/"; 49 } 50 51 URL sourceURL = classLoader.getResource(prefix + path); 52 URLConnection conn = sourceURL.openConnection(); 53 JarURLConnection jarConn = (JarURLConnection) conn; 54 JarFile jarFile = jarConn.getJarFile(); 55 JarEntry sourceEntry = jarConn.getJarEntry(); 56 byte[] buf = new byte[1024 * 8]; 57 for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) { 58 JarEntry entry = (JarEntry) entries.nextElement(); 59 if (entry.getName().startsWith(sourceEntry.getName())) { 60 String entryName = entry.getName(); 61 String entryPath = entryName.substring(prefixLength); 62 File targetPath = serverInfo.resolveServer(entryPath); 63 if (!targetPath.exists()) { 64 if (entry.isDirectory()) { 65 targetPath.mkdirs(); 66 } else { 67 InputStream in = jarFile.getInputStream(entry); 68 try { 69 OutputStream out = new FileOutputStream(targetPath); 70 try { 71 int chunk; 72 while ((chunk = in.read(buf)) > 0) { 73 out.write(buf, 0, chunk); 74 } 75 } finally { 76 out.close(); 77 } 78 } finally { 79 in.close(); 80 } 81 } 82 } 83 } 84 } 85 86 } 87 88 public static final GBeanInfo GBEAN_INFO; 89 90 static { 91 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(DirectoryInitializationGBean.class, "GBean"); 92 infoBuilder.addAttribute("prefix", String.class, true); 93 infoBuilder.addAttribute("path", String.class, true); 94 infoBuilder.addReference("ServerInfo", ServerInfo.class, "GBean"); 95 infoBuilder.addAttribute("classLoader", ClassLoader.class, false); 96 97 infoBuilder.setConstructor(new String[]{"prefix", "path", "ServerInfo", "classLoader"}); 98 99 GBEAN_INFO = infoBuilder.getBeanInfo(); 100 } 101 102 public static GBeanInfo getGBeanInfo() { 103 return GBEAN_INFO; 104 } 105 106 } 107 108