1 32 package net.sf.retrotranslator.transformer; 33 34 import java.io.*; 35 import java.util.*; 36 37 40 class FolderFileContainer extends FileContainer { 41 42 private Map<String , FolderFileEntry> entries; 43 44 public FolderFileContainer(File location) { 45 super(location); 46 } 47 48 public FolderFileContainer(File location, List<String > fileNames) { 49 super(location); 50 entries = new LinkedHashMap<String , FolderFileEntry>(); 51 for (String fileName : fileNames) { 52 String name = fileName.replace(File.separatorChar, '/'); 53 entries.put(name, new FolderFileEntry(name, new File(location, name))); 54 } 55 } 56 57 public Collection<? extends FileEntry> getEntries() { 58 if (entries == null) { 59 entries = new LinkedHashMap<String , FolderFileEntry>(); 60 scanFolder(location, location.getPath().length() + 1); 61 } 62 return new ArrayList<FolderFileEntry>(entries.values()); 63 } 64 65 public void removeEntry(String name) { 66 if (entries != null) { 67 FolderFileEntry entry = entries.remove(name); 68 if (entry != null) entry.file.delete(); 69 } else { 70 new File(location, name).delete(); 71 } 72 } 73 74 private void scanFolder(File folder, int prefixLength) { 75 for (File file : folder.listFiles()) { 76 String name = file.getPath().substring(prefixLength).replace(File.separatorChar, '/'); 77 if (file.isDirectory()) { 78 scanFolder(file, prefixLength); 79 } else { 80 entries.put(name, new FolderFileEntry(name, file)); 81 } 82 } 83 } 84 85 public void putEntry(String name, byte[] contents) { 86 File file = new File(location, name); 87 if (entries == null) entries = new LinkedHashMap<String , FolderFileEntry>(); 88 entries.put(name, new FolderFileEntry(name, file)); 89 file.getParentFile().mkdirs(); 90 try { 91 FileOutputStream stream = new FileOutputStream(file); 92 try { 93 stream.write(contents); 94 } finally { 95 stream.close(); 96 } 97 } catch (IOException e) { 98 throw new RuntimeException (e); 99 } 100 } 101 102 public void flush(SystemLogger logger) { 103 } 105 106 private static class FolderFileEntry extends FileEntry { 107 108 private File file; 109 110 public FolderFileEntry(String name, File file) { 111 super(name); 112 this.file = file; 113 } 114 115 public byte[] getContent() { 116 try { 117 FileInputStream stream = new FileInputStream(file); 118 try { 119 return readFully(stream, (int) file.length()); 120 } finally { 121 stream.close(); 122 } 123 } catch (IOException e) { 124 throw new RuntimeException (e); 125 } 126 } 127 } 128 } 129 | Popular Tags |