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