1 package com.hughes.android.dictionary.engine;
3 import java.io.IOException;
4 import java.io.PrintStream;
5 import java.io.RandomAccessFile;
6 import java.util.ArrayList;
9 import com.hughes.util.CachingList;
10 import com.hughes.util.raf.RAFList;
11 import com.hughes.util.raf.RAFListSerializer;
12 import com.hughes.util.raf.RAFSerializable;
15 public class Dictionary implements RAFSerializable<Dictionary> {
17 static final int CACHE_SIZE = 5000;
19 static final String END_OF_DICTIONARY = "END OF DICTIONARY";
22 final int dictFileVersion;
23 final long creationMillis;
24 public final String dictInfo;
25 public final List<PairEntry> pairEntries;
26 public final List<TextEntry> textEntries;
27 public final List<EntrySource> sources;
28 public final List<Index> indices;
30 public Dictionary(final String dictInfo) {
31 this.dictFileVersion = 0;
32 this.creationMillis = System.currentTimeMillis();
33 this.dictInfo = dictInfo;
34 pairEntries = new ArrayList<PairEntry>();
35 textEntries = new ArrayList<TextEntry>();
36 sources = new ArrayList<EntrySource>();
37 indices = new ArrayList<Index>();
40 public Dictionary(final RandomAccessFile raf) throws IOException {
41 dictFileVersion = raf.readInt();
42 if (dictFileVersion != 0) {
43 throw new IOException("Invalid dictionary version: " + dictFileVersion);
45 creationMillis = raf.readLong();
46 dictInfo = raf.readUTF();
47 sources = CachingList.createFullyCached(RAFList.create(raf, EntrySource.SERIALIZER, raf.getFilePointer()));
48 pairEntries = CachingList.create(RAFList.create(raf, PairEntry.SERIALIZER, raf.getFilePointer()), CACHE_SIZE);
49 textEntries = CachingList.create(RAFList.create(raf, TextEntry.SERIALIZER, raf.getFilePointer()), CACHE_SIZE);
50 indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, raf.getFilePointer()));
51 final String end = raf.readUTF();
52 if (!end.equals(END_OF_DICTIONARY)) {
53 throw new IOException("Dictionary seems corrupt: " + end);
58 public void write(RandomAccessFile raf) throws IOException {
59 raf.writeInt(dictFileVersion);
60 raf.writeLong(creationMillis);
61 raf.writeUTF(dictInfo);
62 RAFList.write(raf, sources, EntrySource.SERIALIZER);
63 RAFList.write(raf, pairEntries, PairEntry.SERIALIZER);
64 RAFList.write(raf, textEntries, TextEntry.SERIALIZER);
65 RAFList.write(raf, indices, indexSerializer);
66 raf.writeUTF(END_OF_DICTIONARY);
69 private final RAFListSerializer<Index> indexSerializer = new RAFListSerializer<Index>() {
71 public Index read(RandomAccessFile raf, final int readIndex) throws IOException {
72 return new Index(Dictionary.this, raf);
75 public void write(RandomAccessFile raf, Index t) throws IOException {
79 public void print(final PrintStream out) {
80 out.println("dictInfo=" + dictInfo);
81 for (final Index index : indices) {