Index: editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/analysis/CacheReader.java |
=================================================================== |
--- editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/analysis/CacheReader.java (revision 0) |
+++ editor/tools/plugins/com.google.dart.tools.core/src/com/google/dart/tools/core/analysis/CacheReader.java (revision 0) |
@@ -0,0 +1,156 @@ |
+package com.google.dart.tools.core.analysis; |
+ |
+import java.io.File; |
+import java.io.IOException; |
+import java.io.LineNumberReader; |
+import java.io.Reader; |
+import java.util.Collection; |
+import java.util.HashMap; |
+import java.util.HashSet; |
+import java.util.Map; |
+import java.util.Set; |
+ |
+/** |
+ * Internal class for reading analysis state from disk when starting a new session. |
+ */ |
+public class CacheReader { |
+ static final String CACHE_VERSION_TAG = "v2"; |
+ |
+ private final LineNumberReader reader; |
+ |
+ public CacheReader(Reader reader) throws IOException { |
+ if (!reader.markSupported()) { |
+ throw new IllegalArgumentException(); |
+ } |
+ this.reader = reader instanceof LineNumberReader ? (LineNumberReader) reader |
+ : new LineNumberReader(reader); |
+ String line = this.reader.readLine(); |
+ if (!CACHE_VERSION_TAG.equals(line)) { |
+ throw new IOException("Expected cache version " + CACHE_VERSION_TAG + " but found " + line); |
+ } |
+ } |
+ |
+ /** |
+ * Read a boolean originally written by {@link CacheWriter#writeBoolean(boolean)} |
+ */ |
+ public boolean readBoolean() throws IOException { |
+ String line = reader.readLine(); |
+ if ("true".equals(line)) { |
+ return true; |
+ } |
+ if ("false".equals(line)) { |
+ return false; |
+ } |
+ throw new IOException("Expected true or false, but found " + line); |
+ } |
+ |
+ /** |
+ * Read a collection of file paths originally written by {@link |
+ * CacheWriter#writeFilePaths(Collection<File>, String)} |
+ * |
+ * @param files the collection into which files are placed (not <code>null</code> ) |
+ * @param endTag the tag used to denote the end of the collection of file paths |
+ */ |
+ public void readFilePaths(Collection<File> files, String endTag) throws IOException { |
+ while (true) { |
+ String path = readString(); |
+ if (path == null) { |
+ throw new IOException("Expected " + endTag + " but found EOF"); |
+ } |
+ if (path.equals(endTag)) { |
+ break; |
+ } |
+ files.add(new File(path)); |
+ } |
+ } |
+ |
+ /** |
+ * Read a string originally written by {@link CacheWriter#writeString(String)} |
+ * |
+ * @return the string or <code>null</code> if EOF |
+ */ |
+ public String readString() throws IOException { |
+ |
+ // Normal case... read a line |
+ |
+ reader.mark(1); |
+ int ch = reader.read(); |
+ if (ch == -1) { |
+ throw new IOException("Unexpected EOF when reading string"); |
+ } |
+ if (ch != '!') { |
+ reader.reset(); |
+ return reader.readLine(); |
+ } |
+ |
+ // If the string contains a line separator, then string length is encoded |
+ // preceding the string as bang-number-bang |
+ |
+ int length = 0; |
+ while (true) { |
+ ch = reader.read(); |
+ if (ch == '!') { |
+ break; |
+ } |
+ if (ch < '0' || ch > '9') { |
+ throw new IOException("Expected digit, but found character value " + ch); |
+ } |
+ length = length * 10 + ch - '0'; |
+ } |
+ char[] buf = new char[length]; |
+ int count = reader.read(buf); |
+ if (length != count) { |
+ throw new IOException("Expected " + length + " characters, but found only " + count); |
+ } |
+ reader.readLine(); |
+ return new String(buf); |
+ } |
+ |
+ /** |
+ * Read a collection of key/value pairs originally written by |
+ * {@link CacheWriter#writeStringFileMap(Map, String)} where the keys are strings and the values |
+ * are instances of {@link java.io.File}. |
+ * |
+ * @param endTag the tag used to denote the end of the collection |
+ * @return the collection (not <code>null</code>) |
+ */ |
+ public HashMap<String, File> readStringFileMap(String endTag) throws IOException { |
+ HashMap<String, File> result = new HashMap<String, File>(); |
+ while (true) { |
+ String key = readString(); |
+ if (key == null) { |
+ throw new IOException("Expected " + endTag + " but found EOF"); |
+ } |
+ if (key.equals(endTag)) { |
+ break; |
+ } |
+ String absFilePath = readString(); |
+ if (absFilePath == null) { |
+ throw new IOException("Expected absolute file path but found EOF"); |
+ } |
+ result.put(key, new File(absFilePath)); |
+ } |
+ return result; |
+ } |
+ |
+ /** |
+ * Read a collection of strings originally written by |
+ * {@link CacheWriter#writeStringSet(Set, String)}. |
+ * |
+ * @param endTag the tag used to denote the end of the collection of strings |
+ * @return the collection of strings (not <code>null</code>) |
+ */ |
+ public HashSet<String> readStringSet(String endTag) throws IOException { |
+ HashSet<String> result = new HashSet<String>(); |
+ while (true) { |
+ String string = readString(); |
+ if (string == null) { |
+ throw new IOException("Expected " + endTag + " but found EOF"); |
+ } |
+ if (string.equals(endTag)) { |
+ return result; |
+ } |
+ result.add(string); |
+ } |
+ } |
+} |