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 }