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.util;
018    
019    import java.io.File;
020    import java.io.FileOutputStream;
021    import java.io.IOException;
022    import java.io.InputStream;
023    import java.io.OutputStream;
024    import java.net.JarURLConnection;
025    import java.net.URL;
026    import java.net.URLConnection;
027    import java.util.Enumeration;
028    import java.util.jar.JarEntry;
029    import java.util.jar.JarFile;
030    
031    import org.apache.geronimo.gbean.GBeanInfo;
032    import org.apache.geronimo.gbean.GBeanInfoBuilder;
033    import org.apache.geronimo.system.serverinfo.ServerInfo;
034    
035    /**
036     * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $
037     */
038    public class DirectoryInitializationGBean {
039    
040    
041        public DirectoryInitializationGBean(String prefix, String path, ServerInfo serverInfo, ClassLoader classLoader) throws IOException {
042    
043            if (!prefix.endsWith("/")) {
044                prefix = prefix + "/";
045            }
046            int prefixLength = prefix.length();
047            if (!path.endsWith("/")) {
048                path = path + "/";
049            }
050    
051            URL sourceURL = classLoader.getResource(prefix + path);
052            URLConnection conn = sourceURL.openConnection();
053            JarURLConnection jarConn = (JarURLConnection) conn;
054            JarFile jarFile = jarConn.getJarFile();
055            JarEntry sourceEntry = jarConn.getJarEntry();
056            byte[] buf = new byte[1024 * 8];
057            for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) {
058                JarEntry entry = (JarEntry) entries.nextElement();
059                if (entry.getName().startsWith(sourceEntry.getName())) {
060                    String entryName = entry.getName();
061                    String entryPath = entryName.substring(prefixLength);
062                    File targetPath = serverInfo.resolveServer(entryPath);
063                    if (!targetPath.exists()) {
064                        if (entry.isDirectory()) {
065                            targetPath.mkdirs();
066                        } else {
067                            InputStream in = jarFile.getInputStream(entry);
068                            try {
069                                OutputStream out = new FileOutputStream(targetPath);
070                                try {
071                                    int chunk;
072                                    while ((chunk = in.read(buf)) > 0) {
073                                        out.write(buf, 0, chunk);
074                                    }
075                                } finally {
076                                    out.close();
077                                }
078                            } finally {
079                                in.close();
080                            }
081                        }
082                    }
083                }
084            }
085    
086        }
087    
088        public static final GBeanInfo GBEAN_INFO;
089    
090        static {
091            GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(DirectoryInitializationGBean.class, "GBean");
092            infoBuilder.addAttribute("prefix", String.class, true);
093            infoBuilder.addAttribute("path", String.class, true);
094            infoBuilder.addReference("ServerInfo", ServerInfo.class, "GBean");
095            infoBuilder.addAttribute("classLoader", ClassLoader.class, false);
096    
097            infoBuilder.setConstructor(new String[]{"prefix", "path", "ServerInfo", "classLoader"});
098    
099            GBEAN_INFO = infoBuilder.getBeanInfo();
100        }
101    
102        public static GBeanInfo getGBeanInfo() {
103            return GBEAN_INFO;
104        }
105    
106    }
107    
108