patrickl    02/02/27 23:04:37

  Modified:    catalina/src/share/org/apache/naming/resources
                        WARDirContext.java
  Log:
  Fix to handle war files that do not have separate ZipEntry objects for directories. 
Surprisingly, this is a valid format for a jar file. This fix emulates the 
functionality the JDK's jar command provides when unpacking jar files with missing 
directory entries.
  
  Revision  Changes    Path
  1.5       +30 -4     
jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/WARDirContext.java
  
  Index: WARDirContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/WARDirContext.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- WARDirContext.java        27 Feb 2002 01:17:00 -0000      1.4
  +++ WARDirContext.java        28 Feb 2002 07:04:36 -0000      1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/WARDirContext.java,v
 1.4 2002/02/27 01:17:00 craigmcc Exp $
  - * $Revision: 1.4 $
  - * $Date: 2002/02/27 01:17:00 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/naming/resources/WARDirContext.java,v
 1.5 2002/02/28 07:04:36 patrickl Exp $
  + * $Revision: 1.5 $
  + * $Date: 2002/02/28 07:04:36 $
    *
    * ====================================================================
    *
  @@ -100,7 +100,7 @@
    * WAR Directory Context implementation.
    *
    * @author Remy Maucherat
  - * @version $Revision: 1.4 $ $Date: 2002/02/27 01:17:00 $
  + * @version $Revision: 1.5 $ $Date: 2002/02/28 07:04:36 $
    */
   
   public class WARDirContext extends BaseDirContext {
  @@ -788,6 +788,32 @@
                   ZipEntry entry = (ZipEntry) entryList.nextElement();
                   String name = normalize(entry);
                   int pos = name.lastIndexOf('/');
  +                // Check that parent entries exist and, if not, create them.
  +                // This fixes a bug for war files that don't record separate
  +                // zip entries for the directories.
  +                int currentPos = -1;
  +                int lastPos = 0;
  +                while ((currentPos = name.indexOf('/', lastPos)) != -1) {
  +                    Name parentName = new CompositeName(name.substring(0, lastPos));
  +                    Name childName = new CompositeName(name.substring(0, 
currentPos));
  +                    String entryName = name.substring(lastPos, currentPos);
  +                    // Parent should have been created in last cycle through
  +                    // this loop
  +                    Entry parent = treeLookup(parentName);
  +                    Entry child = treeLookup(childName);
  +                    if (child == null) {
  +                        // Create a new entry for missing entry and strip off
  +                        // the leading '/' character and appended on by the
  +                        // normalize method and add '/' character to end to
  +                        // signify that it is a directory entry
  +                        String zipName = name.substring(1, currentPos) + "/";
  +                        child = new Entry(entryName, new ZipEntry(zipName));
  +                        if (parent != null)
  +                            parent.addChild(child);
  +                    }
  +                    // Increment lastPos
  +                    lastPos = currentPos + 1;
  +                }
                   String entryName = name.substring(pos + 1, name.length());
                   Name compositeName = new CompositeName(name.substring(0, pos));
                   Entry parent = treeLookup(compositeName);
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to