4 package com.hughes.android.dictionary.engine;
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;
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;
19 public final class Index implements RAFSerializable<Index> {
20 final Dictionary dict;
22 final String shortName;
23 final String longName;
25 // persisted: tells how the entries are sorted.
26 final Language sortLanguage;
29 final List<IndexEntry> sortedIndexEntries;
34 final List<RowBase> rows;
36 // --------------------------------------------------------------------------
38 public Index(final Dictionary dict, final String shortName, final String longName, final Language sortLanguage) {
40 this.shortName = shortName;
41 this.longName = longName;
42 this.sortLanguage = sortLanguage;
43 sortedIndexEntries = new ArrayList<IndexEntry>();
44 rows = new ArrayList<RowBase>();
47 public Index(final Dictionary dict, final RandomAccessFile raf) throws IOException {
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);
57 sortedIndexEntries = RAFList.create(raf, IndexEntry.SERIALIZER, raf.getFilePointer());
58 rows = UniformRAFList.create(raf, new RowBase.Serializer(this), raf.getFilePointer());
61 public void print(final PrintStream out) {
62 for (final RowBase row : rows) {
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);
77 static final class IndexEntry implements RAFSerializable<Index.IndexEntry> {
81 static final RAFSerializer<IndexEntry> SERIALIZER = new RAFSerializer<IndexEntry> () {
83 public IndexEntry read(RandomAccessFile raf) throws IOException {
84 return new IndexEntry(raf);
87 public void write(RandomAccessFile raf, IndexEntry t) throws IOException {
91 public IndexEntry(final String token, final int startRow) {
92 assert token.equals(token.trim());
93 assert token.length() > 0;
95 this.startRow = startRow;
98 public IndexEntry(final RandomAccessFile raf) throws IOException {
99 token = raf.readUTF();
100 startRow = raf.readInt();
103 public void write(RandomAccessFile raf) throws IOException {