001: /*
002: * TagFileCatalog.java
003: *
004: * Copyright (C) 1998-2002 Peter Graves
005: * $Id: TagFileCatalog.java,v 1.1.1.1 2002/09/24 16:08:01 piso Exp $
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021:
022: package org.armedbear.j;
023:
024: import java.io.BufferedReader;
025: import java.io.BufferedWriter;
026: import java.io.IOException;
027: import java.io.InputStreamReader;
028: import java.io.OutputStreamWriter;
029: import java.util.ArrayList;
030: import java.util.Date;
031:
032: public final class TagFileCatalog {
033: private File tagfileDir;
034: private File catalogFile;
035: private ArrayList entries = new ArrayList();
036:
037: public TagFileCatalog(File tagfileDir) {
038: this .tagfileDir = tagfileDir;
039: catalogFile = File.getInstance(tagfileDir, "catalog");
040: }
041:
042: public synchronized void addEntry(File dir, File tagfile, Mode mode) {
043: String directoryPath = dir.canonicalPath();
044: String modeName = mode.toString();
045: for (int i = entries.size() - 1; i >= 0; i--) {
046: CatalogEntry entry = getEntry(i);
047: if (entry.directoryPath.equals(directoryPath)) {
048: if (entry.modeName == null) {
049: entry.tagfileName = tagfile.getName();
050: entry.modeName = modeName;
051: return;
052: } else if (entry.modeName.equals(modeName)) {
053: entry.tagfileName = tagfile.getName();
054: return;
055: }
056: }
057: }
058: // Not found.
059: entries.add(new CatalogEntry(directoryPath, modeName, tagfile
060: .getName()));
061: }
062:
063: public synchronized boolean containsTagFileName(String name) {
064: for (int i = entries.size() - 1; i >= 0; i--) {
065: CatalogEntry entry = getEntry(i);
066: if (entry.tagfileName.equals(name))
067: return true;
068: }
069: // Not found.
070: return false;
071: }
072:
073: public synchronized File getTagFile(File dir, Mode mode) {
074: Debug.assertTrue(mode != null);
075: String directoryPath = dir.canonicalPath();
076: String modeName = mode.toString();
077: for (int i = entries.size() - 1; i >= 0; i--) {
078: CatalogEntry entry = getEntry(i);
079: if (directoryPath.equals(entry.directoryPath)
080: && modeName.equals(entry.modeName))
081: return File.getInstance(tagfileDir, entry.tagfileName);
082: }
083: // Not found.
084: return null;
085: }
086:
087: public synchronized void update() {
088: boolean changed = false;
089: for (int i = entries.size() - 1; i >= 0; i--) {
090: CatalogEntry entry = getEntry(i);
091: File file = File.getInstance(tagfileDir, entry.tagfileName);
092: if (!file.exists()) {
093: entries.remove(i);
094: changed = true;
095: }
096: }
097: if (changed)
098: save();
099: }
100:
101: public synchronized void load() {
102: try {
103: if (catalogFile.isFile()) {
104: BufferedReader reader = new BufferedReader(
105: new InputStreamReader(catalogFile
106: .getInputStream()));
107: String s;
108: while ((s = reader.readLine()) != null) {
109: if (s.trim().startsWith("#"))
110: continue;
111: int i = s.indexOf('\t');
112: if (i < 0) {
113: // Old or invalid format.
114: Log
115: .error("TagFileCatalog.load old or invalid format");
116: entries.clear();
117: break;
118: }
119: String tagFileName = s.substring(0, i);
120: String remaining = s.substring(i + 1).trim();
121: i = remaining.indexOf('\t');
122: if (i < 0) {
123: // Invalid format.
124: Log.error("TagFileCatalog.load invalid format");
125: entries.clear();
126: break;
127: }
128: String modeName = remaining.substring(0, i);
129: String directoryPath = remaining.substring(i + 1)
130: .trim();
131: entries.add(new CatalogEntry(directoryPath,
132: modeName, tagFileName));
133: }
134: reader.close();
135: }
136: } catch (IOException e) {
137: Log.error(e);
138: }
139: }
140:
141: public synchronized void save() {
142: try {
143: BufferedWriter writer = new BufferedWriter(
144: new OutputStreamWriter(catalogFile
145: .getOutputStream()));
146: writer.write("# " + new Date().toString() + '\n');
147: final int limit = entries.size();
148: for (int i = 0; i < limit; i++) {
149: CatalogEntry entry = getEntry(i);
150: writer.write(entry.tagfileName);
151: writer.write('\t');
152: writer.write(entry.modeName);
153: writer.write('\t');
154: writer.write(entry.directoryPath);
155: writer.write('\n');
156: }
157: writer.flush();
158: writer.close();
159: } catch (IOException e) {
160: Log.error(e);
161: }
162: }
163:
164: private final CatalogEntry getEntry(int i) {
165: return (CatalogEntry) entries.get(i);
166: }
167:
168: private static class CatalogEntry {
169: final String directoryPath;
170: String modeName;
171: String tagfileName;
172:
173: CatalogEntry(String directoryPath, String modeName,
174: String tagfileName) {
175: this .directoryPath = directoryPath;
176: this .modeName = modeName;
177: this .tagfileName = tagfileName;
178: }
179:
180: public String toString() {
181: return tagfileName + " " + directoryPath + " " + modeName;
182: }
183: }
184: }
|