langtools/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java
changeset 1205 b316e32eb90c
parent 810 e4b6a6d206e6
child 3380 a6c2bcab0fec
equal deleted inserted replaced
1109:853d8c191eac 1205:b316e32eb90c
    23  * have any questions.
    23  * have any questions.
    24  */
    24  */
    25 
    25 
    26 package com.sun.tools.javac.file;
    26 package com.sun.tools.javac.file;
    27 
    27 
    28 import com.sun.tools.javac.util.List;
       
    29 import java.io.File;
    28 import java.io.File;
    30 import java.io.IOException;
    29 import java.io.IOException;
    31 import java.util.zip.ZipEntry;
    30 import java.util.zip.ZipEntry;
    32 import java.util.zip.ZipFile;
    31 import java.util.zip.ZipFile;
    33 import javax.tools.JavaFileObject;
    32 import javax.tools.JavaFileObject;
    34 
    33 
       
    34 import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
       
    35 import com.sun.tools.javac.file.RelativePath.RelativeFile;
       
    36 import com.sun.tools.javac.util.List;
       
    37 
    35 public class SymbolArchive extends ZipArchive {
    38 public class SymbolArchive extends ZipArchive {
    36 
    39 
    37     final File origFile;
    40     final File origFile;
    38     final String prefix;
    41     final RelativeDirectory prefix;
    39 
    42 
    40     public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, String prefix) throws IOException {
    43     public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, RelativeDirectory prefix) throws IOException {
    41         super(fileManager, zdir);
    44         super(fileManager, zdir, false);
    42         this.origFile = orig;
    45         this.origFile = orig;
    43         this.prefix = prefix;
    46         this.prefix = prefix;
       
    47         initMap();
    44     }
    48     }
    45 
    49 
    46     @Override
    50     @Override
    47     void addZipEntry(ZipEntry entry) {
    51     void addZipEntry(ZipEntry entry) {
    48         String name = entry.getName();
    52         String name = entry.getName();
    49         if (!name.startsWith(prefix)) {
    53         if (!name.startsWith(prefix.path)) {
    50             return;
    54             return;
    51         }
    55         }
    52         name = name.substring(prefix.length());
    56         name = name.substring(prefix.path.length());
    53         int i = name.lastIndexOf('/');
    57         int i = name.lastIndexOf('/');
    54         String dirname = name.substring(0, i + 1);
    58         RelativeDirectory dirname = new RelativeDirectory(name.substring(0, i+1));
    55         String basename = name.substring(i + 1);
    59         String basename = name.substring(i + 1);
    56         if (basename.length() == 0) {
    60         if (basename.length() == 0) {
    57             return;
    61             return;
    58         }
    62         }
    59         List<String> list = map.get(dirname);
    63         List<String> list = map.get(dirname);
    60         if (list == null) {
    64         if (list == null)
    61             list = List.nil();
    65             list = List.nil();
    62         }
       
    63         list = list.prepend(basename);
    66         list = list.prepend(basename);
    64         map.put(dirname, list);
    67         map.put(dirname, list);
    65     }
    68     }
    66 
    69 
    67     @Override
    70     public JavaFileObject getFileObject(RelativeDirectory subdirectory, String file) {
    68     public JavaFileObject getFileObject(String subdirectory, String file) {
    71         RelativeDirectory prefix_subdir = new RelativeDirectory(prefix, subdirectory.path);
    69         return super.getFileObject(prefix + subdirectory, file);
    72         ZipEntry ze = new RelativeFile(prefix_subdir, file).getZipEntry(zdir);
       
    73         return new SymbolFileObject(this, file, ze);
    70     }
    74     }
       
    75 
       
    76     public String toString() {
       
    77         return "SymbolArchive[" + zdir.getName() + "]";
       
    78     }
       
    79 
       
    80     /**
       
    81      * A subclass of JavaFileObject representing zip entries in a symbol file.
       
    82      */
       
    83     public static class SymbolFileObject extends ZipFileObject {
       
    84         protected SymbolFileObject(SymbolArchive zarch, String name, ZipEntry entry) {
       
    85             super(zarch, name, entry);
       
    86         }
       
    87 
       
    88         @Override
       
    89         protected String inferBinaryName(Iterable<? extends File> path) {
       
    90             String entryName = getZipEntryName();
       
    91             String prefix = ((SymbolArchive) zarch).prefix.path;
       
    92             if (entryName.startsWith(prefix))
       
    93                 entryName = entryName.substring(prefix.length());
       
    94             return removeExtension(entryName).replace('/', '.');
       
    95         }
       
    96     }
       
    97 
       
    98 
    71 }
    99 }