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.
// --------------------------------------------------------------------------
+ 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);
}
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 {
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);