1 21 22 package org.armedbear.j; 23 24 import java.io.BufferedReader ; 25 import java.io.BufferedWriter ; 26 import java.io.IOException ; 27 import java.io.InputStreamReader ; 28 import java.io.OutputStreamWriter ; 29 import java.util.ArrayList ; 30 import java.util.Date ; 31 32 public final class TagFileCatalog 33 { 34 private File tagfileDir; 35 private File catalogFile; 36 private ArrayList entries = new ArrayList (); 37 38 public TagFileCatalog(File tagfileDir) 39 { 40 this.tagfileDir = tagfileDir; 41 catalogFile = File.getInstance(tagfileDir, "catalog"); 42 } 43 44 public synchronized void addEntry(File dir, File tagfile, Mode mode) 45 { 46 String directoryPath = dir.canonicalPath(); 47 String modeName = mode.toString(); 48 for (int i = entries.size()-1; i >= 0; i--) { 49 CatalogEntry entry = getEntry(i); 50 if (entry.directoryPath.equals(directoryPath)) { 51 if (entry.modeName == null) { 52 entry.tagfileName = tagfile.getName(); 53 entry.modeName = modeName; 54 return; 55 } else if (entry.modeName.equals(modeName)) { 56 entry.tagfileName = tagfile.getName(); 57 return; 58 } 59 } 60 } 61 entries.add(new CatalogEntry(directoryPath, modeName, tagfile.getName())); 63 } 64 65 public synchronized boolean containsTagFileName(String name) 66 { 67 for (int i = entries.size()-1; i >= 0; i--) { 68 CatalogEntry entry = getEntry(i); 69 if (entry.tagfileName.equals(name)) 70 return true; 71 } 72 return false; 74 } 75 76 public synchronized File getTagFile(File dir, Mode mode) 77 { 78 Debug.assertTrue(mode != null); 79 String directoryPath = dir.canonicalPath(); 80 String modeName = mode.toString(); 81 for (int i = entries.size()-1; i >= 0; i--) { 82 CatalogEntry entry = getEntry(i); 83 if (directoryPath.equals(entry.directoryPath) && modeName.equals(entry.modeName)) 84 return File.getInstance(tagfileDir, entry.tagfileName); 85 } 86 return null; 88 } 89 90 public synchronized void update() 91 { 92 boolean changed = false; 93 for (int i = entries.size()-1; i >= 0; i--) { 94 CatalogEntry entry = getEntry(i); 95 File file = File.getInstance(tagfileDir, entry.tagfileName); 96 if (!file.exists()) { 97 entries.remove(i); 98 changed = true; 99 } 100 } 101 if (changed) 102 save(); 103 } 104 105 public synchronized void load() 106 { 107 try { 108 if (catalogFile.isFile()) { 109 BufferedReader reader = 110 new BufferedReader (new InputStreamReader (catalogFile.getInputStream())); 111 String s; 112 while ((s = reader.readLine()) != null) { 113 if (s.trim().startsWith("#")) 114 continue; 115 int i = s.indexOf('\t'); 116 if (i < 0) { 117 Log.error("TagFileCatalog.load old or invalid format"); 119 entries.clear(); 120 break; 121 } 122 String tagFileName = s.substring(0, i); 123 String remaining = s.substring(i+1).trim(); 124 i = remaining.indexOf('\t'); 125 if (i < 0) { 126 Log.error("TagFileCatalog.load invalid format"); 128 entries.clear(); 129 break; 130 } 131 String modeName = remaining.substring(0, i); 132 String directoryPath = remaining.substring(i+1).trim(); 133 entries.add(new CatalogEntry(directoryPath, modeName, tagFileName)); 134 } 135 reader.close(); 136 } 137 } 138 catch (IOException e) { 139 Log.error(e); 140 } 141 } 142 143 public synchronized void save() 144 { 145 try { 146 BufferedWriter writer = 147 new BufferedWriter (new OutputStreamWriter (catalogFile.getOutputStream())); 148 writer.write("# " + new Date ().toString() + '\n'); 149 final int limit = entries.size(); 150 for (int i = 0; i < limit; i++) { 151 CatalogEntry entry = getEntry(i); 152 writer.write(entry.tagfileName); 153 writer.write('\t'); 154 writer.write(entry.modeName); 155 writer.write('\t'); 156 writer.write(entry.directoryPath); 157 writer.write('\n'); 158 } 159 writer.flush(); 160 writer.close(); 161 } 162 catch (IOException e) { 163 Log.error(e); 164 } 165 } 166 167 private final CatalogEntry getEntry(int i) 168 { 169 return (CatalogEntry) entries.get(i); 170 } 171 172 private static class CatalogEntry 173 { 174 final String directoryPath; 175 String modeName; 176 String tagfileName; 177 178 CatalogEntry(String directoryPath, String modeName, String tagfileName) 179 { 180 this.directoryPath = directoryPath; 181 this.modeName = modeName; 182 this.tagfileName = tagfileName; 183 } 184 185 public String toString() 186 { 187 return tagfileName + " " + directoryPath + " " + modeName; 188 } 189 } 190 } 191 | Popular Tags |