]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/engine/Index.java
go
[Dictionary.git] / src / com / hughes / android / dictionary / engine / Index.java
index 9185d9d4623a32378eb8b40bf9a7cc352d412f9f..49536003bf29502a9e953302139d271b65bf9002 100644 (file)
@@ -4,23 +4,29 @@
 package com.hughes.android.dictionary.engine;
 
 import java.io.IOException;
+import java.io.PrintStream;
 import java.io.RandomAccessFile;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import com.hughes.android.dictionary.Language;
 import com.hughes.util.raf.RAFList;
 import com.hughes.util.raf.RAFSerializable;
 import com.hughes.util.raf.RAFSerializer;
 import com.hughes.util.raf.UniformRAFList;
 
-final class Index implements RAFSerializable<Index> {
+public final class Index implements RAFSerializable<Index> {
   final Dictionary dict;
   
   final String shortName;
   final String longName;
+  
+  // persisted: tells how the entries are sorted.
+  final Language sortLanguage;
     
   // persisted
-  final List<Index.IndexEntry> sortedIndexEntries;
+  final List<IndexEntry> sortedIndexEntries;
 
   // One big list!
   // Various sub-types.
@@ -29,18 +35,40 @@ final class Index implements RAFSerializable<Index> {
   
   // --------------------------------------------------------------------------
   
+  public Index(final Dictionary dict, final String shortName, final String longName, final Language sortLanguage) {
+    this.dict = dict;
+    this.shortName = shortName;
+    this.longName = longName;
+    this.sortLanguage = sortLanguage;
+    sortedIndexEntries = new ArrayList<IndexEntry>();
+    rows = new ArrayList<RowBase>();
+  }
+  
   public Index(final Dictionary dict, final RandomAccessFile raf) throws IOException {
     this.dict = dict;
     shortName = raf.readUTF();
     longName = raf.readUTF();
+    final String languageCode = raf.readUTF();
+    sortLanguage = Language.lookup(languageCode);
+    if (sortLanguage == null) {
+      throw new IOException("Unsupported language: " + languageCode);
+    }
     // TODO: caching
     sortedIndexEntries = RAFList.create(raf, IndexEntry.SERIALIZER, raf.getFilePointer());
     rows = UniformRAFList.create(raf, new RowBase.Serializer(this), raf.getFilePointer());
   }
+  
+  public void print(final PrintStream out) {
+    for (final RowBase row : rows) {
+      row.print(out);
+    }
+  }
+  
   @Override
   public void write(final RandomAccessFile raf) throws IOException {
     raf.writeUTF(shortName);
     raf.writeUTF(longName);
+    raf.writeUTF(sortLanguage.getSymbol());
     RAFList.write(raf, sortedIndexEntries, IndexEntry.SERIALIZER);
     UniformRAFList.write(raf, (Collection<RowBase>) rows, new RowBase.Serializer(this), 5);
   }
@@ -49,6 +77,7 @@ final class Index implements RAFSerializable<Index> {
   static final class IndexEntry implements RAFSerializable<Index.IndexEntry> {
     String token;
     int startRow;
+    
     static final RAFSerializer<IndexEntry> SERIALIZER = new RAFSerializer<IndexEntry> () {
       @Override
       public IndexEntry read(RandomAccessFile raf) throws IOException {
@@ -58,10 +87,19 @@ final class Index implements RAFSerializable<Index> {
       public void write(RandomAccessFile raf, IndexEntry t) throws IOException {
         t.write(raf);
       }};
+      
+    public IndexEntry(final String token, final int startRow) {
+      assert token.equals(token.trim());
+      assert token.length() > 0;
+      this.token = token;
+      this.startRow = startRow;
+    }
+    
     public IndexEntry(final RandomAccessFile raf) throws IOException {
       token = raf.readUTF();
       startRow = raf.readInt();
     }
+    
     public void write(RandomAccessFile raf) throws IOException {
       raf.writeUTF(token);
       raf.write(startRow);