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;
}