]> source.dussan.org Git - gitblit.git/commitdiff
Improve WAR resource extraction by using ServletContext.getResourcePaths
authorJames Moger <james.moger@gitblit.com>
Fri, 10 May 2013 12:50:09 +0000 (08:50 -0400)
committerJames Moger <james.moger@gitblit.com>
Fri, 10 May 2013 12:50:09 +0000 (08:50 -0400)
src/main/java/com/gitblit/GitBlit.java

index 3a79f8bc60e375bb680a6d2e56503980f2311366..01ebe080407aac0842d51ce8f5dc5f00660d0689 100644 (file)
@@ -18,9 +18,12 @@ package com.gitblit;
 import java.io.BufferedReader;\r
 import java.io.File;\r
 import java.io.FileFilter;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileOutputStream;\r
 import java.io.IOException;\r
 import java.io.InputStream;\r
 import java.io.InputStreamReader;\r
+import java.io.OutputStream;\r
 import java.lang.reflect.Field;\r
 import java.lang.reflect.Type;\r
 import java.net.URI;\r
@@ -3462,21 +3465,10 @@ public class GitBlit implements ServletContextListener {
                                File base = com.gitblit.utils.FileUtils.resolveParameter(Constants.contextFolder$, contextFolder, path);\r
                                base.mkdirs();\r
 \r
-                               // try to copy the data folder contents to the baseFolder\r
+                               // try to extract the data folder resource to the baseFolder\r
                                File localSettings = new File(base, "gitblit.properties");\r
-                               if (contextFolder != null) {\r
-                                       if (!localSettings.exists()) {\r
-                                               File contextData = new File(contextFolder, "/WEB-INF/data");\r
-                                               if (!base.equals(contextData)) {\r
-                                                       try {\r
-                                                               com.gitblit.utils.FileUtils.copy(base, contextData.listFiles());\r
-                                                       } catch (IOException e) {\r
-                                                               logger.error(MessageFormat.format(\r
-                                                                               "Failed to copy included data from {0} to {1}",\r
-                                                                               contextData, base));\r
-                                                       }\r
-                                               }\r
-                                       }\r
+                               if (!localSettings.exists()) {\r
+                                       extractResources(context, "/WEB-INF/data/", base);\r
                                }\r
 \r
                                // delegate all config to baseFolder/gitblit.properties file\r
@@ -3488,6 +3480,38 @@ public class GitBlit implements ServletContextListener {
                settingsModel = loadSettingModels();\r
                serverStatus.servletContainer = servletContext.getServerInfo();\r
        }\r
+       \r
+       protected void extractResources(ServletContext context, String path, File toDir) {\r
+               for (String resource : context.getResourcePaths(path)) {\r
+                       // extract the resource to the directory if it does not exist\r
+                       File f = new File(toDir, resource.substring(path.length()));\r
+                       if (!f.exists()) {\r
+                               try {\r
+                                       if (resource.charAt(resource.length() - 1) == '/') {\r
+                                               // directory\r
+                                               f.mkdirs();\r
+                                               extractResources(context, resource, f);\r
+                                       } else {\r
+                                               // file\r
+                                               f.getParentFile().mkdirs();\r
+                                               InputStream is = context.getResourceAsStream(resource);\r
+                                               OutputStream os = new FileOutputStream(f);\r
+                                               byte [] buffer = new byte[4096];\r
+                                               int len = 0;\r
+                                               while ((len = is.read(buffer)) > -1) {\r
+                                                       os.write(buffer, 0, len);\r
+                                               }\r
+                                               is.close();\r
+                                               os.close();\r
+                                       }\r
+                               } catch (FileNotFoundException e) {\r
+                                       logger.error("Failed to find resource \"" + resource + "\"", e);\r
+                               } catch (IOException e) {\r
+                                       logger.error("Failed to copy resource \"" + resource + "\" to " + f, e);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
 \r
        /**\r
         * Gitblit is being shutdown either because the servlet container is\r