src/share/classes/com/sun/tools/javac/file/SymbolArchive.java

changeset 103
e571266ae14f
parent 57
aa67a5da66e3
child 333
7c2d6da61646
     1.1 --- a/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java	Fri Aug 22 11:46:29 2008 +0100
     1.2 +++ b/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java	Tue Aug 26 14:52:59 2008 -0700
     1.3 @@ -25,47 +25,75 @@
     1.4  
     1.5  package com.sun.tools.javac.file;
     1.6  
     1.7 -import com.sun.tools.javac.util.List;
     1.8  import java.io.File;
     1.9  import java.io.IOException;
    1.10  import java.util.zip.ZipEntry;
    1.11  import java.util.zip.ZipFile;
    1.12  import javax.tools.JavaFileObject;
    1.13  
    1.14 +import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
    1.15 +import com.sun.tools.javac.file.RelativePath.RelativeFile;
    1.16 +import com.sun.tools.javac.util.List;
    1.17 +
    1.18  public class SymbolArchive extends ZipArchive {
    1.19  
    1.20      final File origFile;
    1.21 -    final String prefix;
    1.22 +    final RelativeDirectory prefix;
    1.23  
    1.24 -    public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, String prefix) throws IOException {
    1.25 -        super(fileManager, zdir);
    1.26 +    public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, RelativeDirectory prefix) throws IOException {
    1.27 +        super(fileManager, zdir, false);
    1.28          this.origFile = orig;
    1.29          this.prefix = prefix;
    1.30 +        initMap();
    1.31      }
    1.32  
    1.33      @Override
    1.34      void addZipEntry(ZipEntry entry) {
    1.35          String name = entry.getName();
    1.36 -        if (!name.startsWith(prefix)) {
    1.37 +        if (!name.startsWith(prefix.path)) {
    1.38              return;
    1.39          }
    1.40 -        name = name.substring(prefix.length());
    1.41 +        name = name.substring(prefix.path.length());
    1.42          int i = name.lastIndexOf('/');
    1.43 -        String dirname = name.substring(0, i + 1);
    1.44 +        RelativeDirectory dirname = new RelativeDirectory(name.substring(0, i+1));
    1.45          String basename = name.substring(i + 1);
    1.46          if (basename.length() == 0) {
    1.47              return;
    1.48          }
    1.49          List<String> list = map.get(dirname);
    1.50 -        if (list == null) {
    1.51 +        if (list == null)
    1.52              list = List.nil();
    1.53 -        }
    1.54          list = list.prepend(basename);
    1.55          map.put(dirname, list);
    1.56      }
    1.57  
    1.58 -    @Override
    1.59 -    public JavaFileObject getFileObject(String subdirectory, String file) {
    1.60 -        return super.getFileObject(prefix + subdirectory, file);
    1.61 +    public JavaFileObject getFileObject(RelativeDirectory subdirectory, String file) {
    1.62 +        RelativeDirectory prefix_subdir = new RelativeDirectory(prefix, subdirectory.path);
    1.63 +        ZipEntry ze = new RelativeFile(prefix_subdir, file).getZipEntry(zdir);
    1.64 +        return new SymbolFileObject(this, file, ze);
    1.65      }
    1.66 +
    1.67 +    public String toString() {
    1.68 +        return "SymbolArchive[" + zdir.getName() + "]";
    1.69 +    }
    1.70 +
    1.71 +    /**
    1.72 +     * A subclass of JavaFileObject representing zip entries in a symbol file.
    1.73 +     */
    1.74 +    public static class SymbolFileObject extends ZipFileObject {
    1.75 +        protected SymbolFileObject(SymbolArchive zarch, String name, ZipEntry entry) {
    1.76 +            super(zarch, name, entry);
    1.77 +        }
    1.78 +
    1.79 +        @Override
    1.80 +        protected String inferBinaryName(Iterable<? extends File> path) {
    1.81 +            String entryName = getZipEntryName();
    1.82 +            String prefix = ((SymbolArchive) zarch).prefix.path;
    1.83 +            if (entryName.startsWith(prefix))
    1.84 +                entryName = entryName.substring(prefix.length());
    1.85 +            return removeExtension(entryName).replace('/', '.');
    1.86 +        }
    1.87 +    }
    1.88 +
    1.89 +
    1.90  }

mercurial