X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FDictionary.java;h=18f1c9afa8f889a41a09d4d6ca7c4846f1fb2001;hb=6a6d3ea1aec31eb2f7ba0a3fd727b80c96a67868;hp=861ba4373b511a691f7944f9368240b5d3f815e7;hpb=1adc593498a8fba745f6c433fdc0ddde26bd379f;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/Dictionary.java b/src/com/hughes/android/dictionary/engine/Dictionary.java index 861ba43..18f1c9a 100644 --- a/src/com/hughes/android/dictionary/engine/Dictionary.java +++ b/src/com/hughes/android/dictionary/engine/Dictionary.java @@ -1,17 +1,89 @@ 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.List; +import com.hughes.util.CachingList; +import com.hughes.util.raf.RAFList; +import com.hughes.util.raf.RAFListSerializer; +import com.hughes.util.raf.RAFSerializable; -public class Dictionary { + +public class Dictionary implements RAFSerializable { - // persisted - final List pairEntries; + static final int CACHE_SIZE = 5000; + + static final String END_OF_DICTIONARY = "END OF DICTIONARY"; // persisted - final List sources; + final int dictFileVersion; + final long creationMillis; + public final String dictInfo; + public final List pairEntries; + public final List textEntries; + public final List sources; + public final List indices; - final List indices; + public Dictionary(final String dictInfo) { + this.dictFileVersion = 0; + this.creationMillis = System.currentTimeMillis(); + this.dictInfo = dictInfo; + pairEntries = new ArrayList(); + textEntries = new ArrayList(); + sources = new ArrayList(); + indices = new ArrayList(); + } + public Dictionary(final RandomAccessFile raf) throws IOException { + dictFileVersion = raf.readInt(); + if (dictFileVersion != 0) { + throw new IOException("Invalid dictionary version: " + dictFileVersion); + } + creationMillis = raf.readLong(); + dictInfo = raf.readUTF(); + sources = CachingList.createFullyCached(RAFList.create(raf, EntrySource.SERIALIZER, raf.getFilePointer())); + pairEntries = CachingList.create(RAFList.create(raf, PairEntry.SERIALIZER, raf.getFilePointer()), CACHE_SIZE); + textEntries = CachingList.create(RAFList.create(raf, TextEntry.SERIALIZER, raf.getFilePointer()), CACHE_SIZE); + indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, raf.getFilePointer())); + final String end = raf.readUTF(); + if (!end.equals(END_OF_DICTIONARY)) { + throw new IOException("Dictionary seems corrupt: " + end); + } + } + @Override + public void write(RandomAccessFile raf) throws IOException { + raf.writeInt(dictFileVersion); + raf.writeLong(creationMillis); + raf.writeUTF(dictInfo); + RAFList.write(raf, sources, EntrySource.SERIALIZER); + RAFList.write(raf, pairEntries, PairEntry.SERIALIZER); + RAFList.write(raf, textEntries, TextEntry.SERIALIZER); + RAFList.write(raf, indices, indexSerializer); + raf.writeUTF(END_OF_DICTIONARY); + } + + private final RAFListSerializer indexSerializer = new RAFListSerializer() { + @Override + public Index read(RandomAccessFile raf, final int readIndex) throws IOException { + return new Index(Dictionary.this, raf); + } + @Override + public void write(RandomAccessFile raf, Index t) throws IOException { + t.write(raf); + }}; + + public void print(final PrintStream out) { + out.println("dictInfo=" + dictInfo); + for (final Index index : indices) { + out.printf("Index: %s %s\n", index.shortName, index.longName); + index.print(out); + out.println(); + } + } + + } \ No newline at end of file