]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
go
authorthadh <thadh@THADH-MTV.ad.corp.google.com>
Mon, 9 Mar 2009 05:20:30 +0000 (22:20 -0700)
committerthadh <thadh@THADH-MTV.ad.corp.google.com>
Mon, 9 Mar 2009 05:20:30 +0000 (22:20 -0700)
src/com/hughes/android/dictionary/Dictionary.java
src/com/hughes/android/dictionary/Entry.java

index ec0d0f683adba9dfb1e79aaa8b911895d11b6be4..f0efe823eeac3abfde9248afed284073824600ce 100755 (executable)
 package com.hughes.android.dictionary;\r
 \r
-import java.io.File;\r
 import java.io.IOException;\r
 import java.io.RandomAccessFile;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
 \r
-import com.hughes.util.FileUtil;\r
-import com.hughes.util.LRUCacheMap;\r
+import com.hughes.util.CachingList;\r
+import com.hughes.util.raf.FileList;\r
+import com.hughes.util.raf.RAFFactory;\r
+import com.hughes.util.raf.RAFSerializable;\r
+import com.hughes.util.raf.RAFSerializableSerializer;\r
+import com.hughes.util.raf.RAFSerializer;\r
 \r
-public final class Dictionary {\r
-\r
-  public static final String INDEX_FORMAT = "%s_index_%d";\r
-\r
-  private final byte lang;\r
-  private final File dictionaryFile;\r
-  private final RandomAccessFile dictionaryRaf;\r
-  private final Index index;\r
+public final class Dictionary implements RAFSerializable<Dictionary> {\r
   \r
-  private final LRUCacheMap<Integer,Row> positionToRow = new LRUCacheMap<Integer, Row>(2000);\r
+  static final RAFSerializer<Entry> ENTRY_SERIALIZER = new RAFSerializableSerializer<Entry>(Entry.RAF_FACTORY);\r
+  static final RAFSerializer<Row> ROW_SERIALIZER = new RAFSerializableSerializer<Row>(Row.RAF_FACTORY);\r
+  static final RAFSerializer<IndexEntry> INDEX_ENTRY_SERIALIZER = new RAFSerializableSerializer<IndexEntry>(IndexEntry.RAF_FACTORY);\r
 \r
-  public Dictionary(final String dictionaryFileName, final byte lang)\r
-      throws IOException {\r
-    this.lang = lang;\r
-    this.dictionaryFile = new File(dictionaryFileName);\r
+  final List<Entry> entries;\r
+  final Language[] languages = new Language[2];\r
+  \r
+  Language activeLanguage = null;\r
 \r
-    dictionaryRaf = new RandomAccessFile(dictionaryFile, "r");\r
-    index = new Index(String.format(INDEX_FORMAT, dictionaryFile\r
-        .getAbsolutePath(), lang));\r
+  public Dictionary(final String lang0, final String lang1) {\r
+    languages[0] = new Language(lang0);\r
+    languages[1] = new Language(lang1);\r
+    entries = new ArrayList<Entry>();\r
   }\r
   \r
-  public int numRows() {\r
-    return index.root.getDescendantCount();\r
+  public Dictionary(final RandomAccessFile raf) throws IOException {\r
+    entries = CachingList.create(FileList.create(raf, ENTRY_SERIALIZER, raf.getFilePointer()), 10000);\r
+    languages[0] = new Language(raf);\r
+    languages[1] = new Language(raf);\r
+  }\r
+  public void write(RandomAccessFile raf) throws IOException {\r
+    FileList.write(raf, entries, ENTRY_SERIALIZER);\r
+    languages[0].write(raf);\r
+    languages[1].write(raf);\r
   }\r
   \r
-  public Row getRow(final int position) throws IOException {\r
-    Row row = positionToRow.get(position);\r
-    if (row == null) {\r
-      final Object o = index.root.getDescendant(position);\r
-      if (o instanceof Integer) {\r
-        final Entry entry = new Entry(FileUtil.readLine(dictionaryRaf, (Integer) o));\r
-        row = new Row(entry.getFormattedEntry(lang), false);\r
-      } else if (o instanceof String) {\r
-        row = new Row((String) o, true);\r
-      } else {\r
-        throw new RuntimeException(o.toString());\r
-      }\r
-      positionToRow.put(position, row);\r
-    }\r
-    return row;\r
+  static final class Language implements RAFSerializable<Language> {\r
+    final String symbol;\r
+    final List<Row> rows;\r
+    final List<IndexEntry> sortedIndex;\r
+    \r
+    public Language(final String symbol) {\r
+      this.symbol = symbol;\r
+      rows = new ArrayList<Row>();\r
+      sortedIndex = new ArrayList<IndexEntry>();\r
+    }\r
+\r
+    public Language(final RandomAccessFile raf) throws IOException {\r
+      symbol = raf.readUTF();\r
+      rows = CachingList.create(FileList.create(raf, ROW_SERIALIZER, raf.getFilePointer()), 10000);\r
+      sortedIndex = CachingList.create(FileList.create(raf, INDEX_ENTRY_SERIALIZER, raf.getFilePointer()), 10000);\r
+    }\r
+    public void write(final RandomAccessFile raf) throws IOException {\r
+      raf.writeUTF(symbol);\r
+      FileList.write(raf, rows, ROW_SERIALIZER);\r
+      FileList.write(raf, sortedIndex, INDEX_ENTRY_SERIALIZER);\r
+    }\r
   }\r
   \r
-  public static class Row {\r
-    final String text;\r
-    final boolean isWord;\r
-    public Row(final String text, final boolean isWord) {\r
-      this.text = text;\r
-      this.isWord = isWord;\r
+  public static final class Row implements RAFSerializable<Row> {\r
+    final int index;\r
+\r
+    public Row(int index) {\r
+      this.index = index;\r
+    }\r
+\r
+    static final RAFFactory<Row> RAF_FACTORY = new RAFFactory<Row>() {\r
+      public Row create(RandomAccessFile raf) throws IOException {\r
+        return new Row(raf.readInt());\r
+      }};\r
+    public void write(RandomAccessFile raf) throws IOException {\r
+      raf.writeInt(index);\r
+    }\r
+  }\r
+\r
+  public static final class IndexEntry implements RAFSerializable<IndexEntry> {\r
+    final String word;\r
+    final int startRow;\r
+    \r
+    public IndexEntry(final String word, final int startRow) {\r
+      this.word = word;\r
+      this.startRow = startRow;\r
+    }\r
+\r
+    static final RAFFactory<IndexEntry> RAF_FACTORY = new RAFFactory<IndexEntry>() {\r
+      public IndexEntry create(RandomAccessFile raf) throws IOException {\r
+        final String word = raf.readUTF();\r
+        final int startRow = raf.readInt();\r
+        return new IndexEntry(word, startRow);\r
+      }};\r
+    public void write(final RandomAccessFile raf) throws IOException {\r
+      raf.writeUTF(word);\r
+      raf.writeInt(startRow);\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+      return word + "@" + startRow;\r
     }\r
+    \r
+    \r
   }\r
 \r
 }\r
index 0c4cd60f7869c68b94814bb623084b1f42dccea4..bd000f408b5c5cbef114c5e57831471ca14cc9fd 100755 (executable)
@@ -1,33 +1,55 @@
 package com.hughes.android.dictionary;\r
 \r
+import java.io.IOException;\r
+import java.io.RandomAccessFile;\r
 import java.util.regex.Pattern;\r
 \r
-public final class Entry {\r
+import com.hughes.util.raf.RAFFactory;\r
+import com.hughes.util.raf.RAFSerializable;\r
+\r
+public final class Entry implements RAFSerializable<Entry> {\r
 \r
   static final byte LANG1 = 0;\r
   static final byte LANG2 = 1;\r
 \r
   static final Pattern lineSplitPattern = Pattern.compile("\\s+::\\s+");\r
 \r
-  String lang1 = "";\r
-  String lang2 = "";\r
+  final String lang1;\r
+  final String lang2;\r
+  \r
+  @Override\r
+  public boolean equals(Object o) {\r
+    if (!(o instanceof Entry)) {\r
+      return false;\r
+    }\r
+    final Entry that = (Entry) o;\r
+    return that.lang1.equals(lang1) && that.lang2.equals(lang2);\r
+  }\r
 \r
-  Entry() {}\r
+  @Override\r
+  public int hashCode() {\r
+    return lang1.hashCode() + lang2.hashCode();\r
+  }\r
 \r
-  Entry(final String line) {\r
-    final boolean parsed = parseFromLine(line);\r
-    assert parsed;\r
+  @Override\r
+  public String toString() {\r
+    return getRawText();\r
   }\r
 \r
-  boolean parseFromLine(final String line) {\r
-    final String[] parts = lineSplitPattern.split(line);\r
-    if (parts.length != 2) {\r
-      System.err.println("Entry:" + "Invalid line: " + line);\r
-      return false;\r
-    }\r
-    lang1 = parts[0];\r
-    lang2 = parts[1];\r
-    return true;\r
+  public Entry(String lang1, String lang2) {\r
+    this.lang1 = lang1;\r
+    this.lang2 = lang2;\r
+  }\r
+\r
+  public static final RAFFactory<Entry> RAF_FACTORY = new RAFFactory<Entry>() {\r
+    public Entry create(RandomAccessFile raf) throws IOException {\r
+      final String lang1 = raf.readUTF();\r
+      final String lang2 = raf.readUTF();\r
+      return new Entry(lang1, lang2);\r
+    }};\r
+  public void write(RandomAccessFile raf) throws IOException {\r
+    raf.writeUTF(lang1);\r
+    raf.writeUTF(lang2);\r
   }\r
 \r
   String getAllText(final byte lang) {\r
@@ -57,5 +79,16 @@ public final class Entry {
   public String getRawText() {\r
     return getAllText(LANG1) + " :: " + getAllText(LANG2);\r
   }\r
+  \r
+  \r
+\r
+  static Entry parseFromLine(final String line) {\r
+    final String[] parts = lineSplitPattern.split(line);\r
+    if (parts.length != 2) {\r
+      System.err.println("Entry:" + "Invalid line: " + line);\r
+      return null;\r
+    }\r
+    return new Entry(parts[0], parts[1]);\r
+  }\r
 \r
 }\r