]> gitweb.fperrin.net Git - Dictionary.git/blob - src/com/hughes/android/dictionary/engine/Index.java
go
[Dictionary.git] / src / com / hughes / android / dictionary / engine / Index.java
1 /**
2  * 
3  */
4 package com.hughes.android.dictionary.engine;
5
6 import java.io.IOException;
7 import java.io.PrintStream;
8 import java.io.RandomAccessFile;
9 import java.util.ArrayList;
10 import java.util.Collection;
11 import java.util.List;
12
13 import com.hughes.android.dictionary.Language;
14 import com.hughes.util.raf.RAFList;
15 import com.hughes.util.raf.RAFSerializable;
16 import com.hughes.util.raf.RAFSerializer;
17 import com.hughes.util.raf.UniformRAFList;
18
19 public final class Index implements RAFSerializable<Index> {
20   final Dictionary dict;
21   
22   final String shortName;
23   final String longName;
24   
25   // persisted: tells how the entries are sorted.
26   final Language sortLanguage;
27     
28   // persisted
29   final List<IndexEntry> sortedIndexEntries;
30
31   // One big list!
32   // Various sub-types.
33   // persisted
34   final List<RowBase> rows;
35   
36   // --------------------------------------------------------------------------
37   
38   public Index(final Dictionary dict, final String shortName, final String longName, final Language sortLanguage) {
39     this.dict = dict;
40     this.shortName = shortName;
41     this.longName = longName;
42     this.sortLanguage = sortLanguage;
43     sortedIndexEntries = new ArrayList<IndexEntry>();
44     rows = new ArrayList<RowBase>();
45   }
46   
47   public Index(final Dictionary dict, final RandomAccessFile raf) throws IOException {
48     this.dict = dict;
49     shortName = raf.readUTF();
50     longName = raf.readUTF();
51     final String languageCode = raf.readUTF();
52     sortLanguage = Language.lookup(languageCode);
53     if (sortLanguage == null) {
54       throw new IOException("Unsupported language: " + languageCode);
55     }
56     // TODO: caching
57     sortedIndexEntries = RAFList.create(raf, IndexEntry.SERIALIZER, raf.getFilePointer());
58     rows = UniformRAFList.create(raf, new RowBase.Serializer(this), raf.getFilePointer());
59   }
60   
61   public void print(final PrintStream out) {
62     for (final RowBase row : rows) {
63       row.print(out);
64     }
65   }
66   
67   @Override
68   public void write(final RandomAccessFile raf) throws IOException {
69     raf.writeUTF(shortName);
70     raf.writeUTF(longName);
71     raf.writeUTF(sortLanguage.getSymbol());
72     RAFList.write(raf, sortedIndexEntries, IndexEntry.SERIALIZER);
73     UniformRAFList.write(raf, (Collection<RowBase>) rows, new RowBase.Serializer(this), 5);
74   }
75
76   
77   static final class IndexEntry implements RAFSerializable<Index.IndexEntry> {
78     String token;
79     int startRow;
80     
81     static final RAFSerializer<IndexEntry> SERIALIZER = new RAFSerializer<IndexEntry> () {
82       @Override
83       public IndexEntry read(RandomAccessFile raf) throws IOException {
84         return new IndexEntry(raf);
85       }
86       @Override
87       public void write(RandomAccessFile raf, IndexEntry t) throws IOException {
88         t.write(raf);
89       }};
90       
91     public IndexEntry(final String token, final int startRow) {
92       assert token.equals(token.trim());
93       assert token.length() > 0;
94       this.token = token;
95       this.startRow = startRow;
96     }
97     
98     public IndexEntry(final RandomAccessFile raf) throws IOException {
99       token = raf.readUTF();
100       startRow = raf.readInt();
101     }
102     
103     public void write(RandomAccessFile raf) throws IOException {
104       raf.writeUTF(token);
105       raf.write(startRow);
106     }
107   }
108
109 }