Author: musachy
Date: Sun Jul 12 01:36:27 2009
New Revision: 793255

URL: http://svn.apache.org/viewvc?rev=793255&view=rev
Log:
Fix NPE from class loader and add a JarResourceStore

Added:
    
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/JarResourceStore.java
Modified:
    
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/ReloadingClassLoader.java

Added: 
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/JarResourceStore.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/JarResourceStore.java?rev=793255&view=auto
==============================================================================
--- 
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/JarResourceStore.java
 (added)
+++ 
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/JarResourceStore.java
 Sun Jul 12 01:36:27 2009
@@ -0,0 +1,88 @@
+/*
+ * $Id: FileResourceStore.java 763792 2009-04-09 20:30:06Z musachy $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.struts2.convention.classloader;
+
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+import java.io.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/**
+ * Read resources from a jar file
+ */
+public class JarResourceStore implements ResourceStore {
+    private static final Logger LOG = 
LoggerFactory.getLogger(JarResourceStore.class);
+
+    private final File file;
+
+    public JarResourceStore(File file) {
+        this.file = file;
+    }
+
+    public void write(String pResourceName, byte[] pResourceData) {
+    }
+
+    public byte[] read(String pResourceName) {
+        InputStream in = null;
+        try {
+            ZipFile jarFile = new ZipFile(file);
+            ZipEntry entry = jarFile.getEntry(pResourceName);
+
+            //read into byte array
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            in = jarFile.getInputStream(entry);
+            copy(in, out);
+
+            return out.toByteArray();
+        } catch (Exception e) {
+            if (LOG.isDebugEnabled())
+                LOG.debug("Unable to read file [#0] from [#1]", e, 
pResourceName, file.getName());
+            return null;
+        } finally {
+            closeQuietly(in);
+        }
+    }
+
+    public static long copy(InputStream input, OutputStream output)
+            throws IOException {
+        byte[] buffer = new byte[1024 * 4];
+        long count = 0;
+        int n = 0;
+        while (-1 != (n = input.read(buffer))) {
+            output.write(buffer, 0, n);
+            count += n;
+        }
+        return count;
+    }
+
+    private void closeQuietly(InputStream is) {
+        try {
+            if (is != null)
+                is.close();
+        } catch (IOException e) {
+            if (LOG.isErrorEnabled())
+                LOG.error("Unable to close input stream", e);
+        }
+    }
+}

Modified: 
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/ReloadingClassLoader.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/ReloadingClassLoader.java?rev=793255&r1=793254&r2=793255&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/ReloadingClassLoader.java
 (original)
+++ 
struts/struts2/trunk/plugins/convention/src/main/java/org/apache/struts2/convention/classloader/ReloadingClassLoader.java
 Sun Jul 12 01:36:27 2009
@@ -48,7 +48,7 @@
     public ReloadingClassLoader(final ClassLoader pParent) {
         super(pParent);
         parent = pParent;
-        URL root = pParent.getResource("/");
+        URL root = pParent.getResource("");
         try {
             if (root != null) {
                 stores = new ResourceStore[]{new FileResourceStore(new 
File(root.toURI()))};
@@ -61,7 +61,10 @@
         } catch (RuntimeException e) {
             // see WW-3121
             // TODO: Fix this for a reloading mechanism to be marked as stable
-            LOG.error("Exception while trying to build the ResourceStore for 
URL [#0]", e, root.toString());
+            if (root != null)
+                LOG.error("Exception while trying to build the ResourceStore 
for URL [#0]", e, root.toString());
+            else
+                 LOG.error("Exception while trying to get root resource from 
class loader", e);
             LOG.error("Consider setting 
struts.convention.classes.reload=false");
             throw e;
         }


Reply via email to