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 } |