Changeset 13349 for trunk/abcl/src/org


Ignore:
Timestamp:
06/20/11 12:01:18 (10 years ago)
Author:
Mark Evenson
Message:

Implement DIRECTORY wildcard matching for zip inside zip.

With this commit, one can load ABCL fasls ("*.abcl") included inside
jars successfully. I thought this has been working previously, but am
unable to quickly find the evidence.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/Pathname.java

    r13325 r13349  
    16261626            LispObject result = NIL;
    16271627            String wild = "/" + pathname.asEntryPath();
     1628            final SimpleString wildcard = new SimpleString(wild);
    16281629
    16291630            if (pathname.device.cdr() instanceof Cons) {
    1630                 return error(new FileError("Unimplemented directory listing of JAR within JAR.", pathname));
    1631             }
    1632            
    1633             final SimpleString wildcard = new SimpleString(wild);
    1634 
    1635             ZipFile jar = ZipCache.get((Pathname)pathname.device.car());
    1636 
    1637             for (Enumeration<? extends ZipEntry> entries = jar.entries(); entries.hasMoreElements();) {
    1638                 ZipEntry entry = entries.nextElement();
    1639                 String entryName = "/" + entry.getName();
    1640                
    1641                 LispObject matches = Symbol.PATHNAME_MATCH_P
    1642                     .execute(new SimpleString(entryName), wildcard);
    1643 
    1644                 if (!matches.equals(NIL)) {
    1645                     String namestring = new String(pathname.getNamestring());
    1646                     namestring = namestring.substring(0, namestring.lastIndexOf("!/") + 2)
    1647                         + entry.getName();
    1648                     Pathname p = new Pathname(namestring);
    1649                     result = new Cons(p, result);
    1650                 }
     1631                ZipFile outerJar = ZipCache.get((Pathname)pathname.device.car());
     1632                String entryPath = ((Pathname)pathname.device.cdr().car()).getNamestring(); //???
     1633                if (entryPath.startsWith("/")) {
     1634                    entryPath = entryPath.substring(1);
     1635                }
     1636                ZipEntry entry = outerJar.getEntry(entryPath);
     1637                InputStream inputStream = null;
     1638                try {
     1639                    inputStream = outerJar.getInputStream(entry);
     1640                } catch (IOException e) {
     1641                    return new FileError("Failed to read zip input stream inside zip.",
     1642                                         pathname);
     1643                }
     1644                ZipInputStream zipInputStream
     1645                    = new ZipInputStream(inputStream);
     1646
     1647                try {
     1648                    while ((entry = zipInputStream.getNextEntry()) != null) {
     1649                        String entryName = "/" + entry.getName();
     1650                        LispObject matches = Symbol.PATHNAME_MATCH_P
     1651                            .execute(new SimpleString(entryName), wildcard);
     1652                   
     1653                        if (!matches.equals(NIL)) {
     1654                            String namestring = new String(pathname.getNamestring());
     1655                            namestring = namestring.substring(0, namestring.lastIndexOf("!/") + 2)
     1656                                + entry.getName();
     1657                            Pathname p = new Pathname(namestring);
     1658                            result = new Cons(p, result);
     1659                        }
     1660                    }
     1661                } catch (IOException e) {
     1662                    return new FileError("Failed to seek through zip inputstream inside zip.",
     1663                                         pathname);
     1664                }
     1665            } else {
     1666                ZipFile jar = ZipCache.get((Pathname)pathname.device.car());
     1667                for (Enumeration<? extends ZipEntry> entries = jar.entries();
     1668                     entries.hasMoreElements();)
     1669                    {
     1670                        ZipEntry entry = entries.nextElement();
     1671                        String entryName = "/" + entry.getName();
     1672                        LispObject matches = Symbol.PATHNAME_MATCH_P
     1673                            .execute(new SimpleString(entryName), wildcard);
     1674
     1675                        if (!matches.equals(NIL)) {
     1676                            String namestring = new String(pathname.getNamestring());
     1677                            namestring = namestring.substring(0, namestring.lastIndexOf("!/") + 2)
     1678                                + entry.getName();
     1679                            Pathname p = new Pathname(namestring);
     1680                            result = new Cons(p, result);
     1681                        }
     1682                    }
    16511683            }
    16521684            return result;
Note: See TracChangeset for help on using the changeset viewer.