1 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 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 109 | Popular Tags |