X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FDictionary.java;h=309ee60fb61691c33aaf1184f83e80f9fa918653;hb=3d72bc11d5ef9d58e62b5beb4e33a437da28d4b8;hp=2b63be88c115c5b8e4d1bf1903eed4e184e72b7c;hpb=4a0a832b09c2e1c189701b4b9e2529b37592e0b0;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/Dictionary.java b/src/com/hughes/android/dictionary/engine/Dictionary.java index 2b63be8..309ee60 100644 --- a/src/com/hughes/android/dictionary/engine/Dictionary.java +++ b/src/com/hughes/android/dictionary/engine/Dictionary.java @@ -28,154 +28,164 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; - public class Dictionary implements RAFSerializable { - - static final int CACHE_SIZE = 5000; - - static final int CURRENT_DICT_VERSION = 6; - static final String END_OF_DICTIONARY = "END OF DICTIONARY"; - - // persisted - final int dictFileVersion; - final long creationMillis; - public final String dictInfo; - public final List pairEntries; - public final List textEntries; - public final List htmlEntries; - public final List sources; - public final List indices; - - /** - * dictFileVersion 1 adds: - *
  • links to sources? - * - * dictFileVersion 2 adds: - *
  • counts of tokens in indices. - */ - - public Dictionary(final String dictInfo) { - this.dictFileVersion = CURRENT_DICT_VERSION; - this.creationMillis = System.currentTimeMillis(); - this.dictInfo = dictInfo; - pairEntries = new ArrayList(); - textEntries = new ArrayList(); - htmlEntries = new ArrayList(); - sources = new ArrayList(); - indices = new ArrayList(); - } - - public Dictionary(final RandomAccessFile raf) throws IOException { - dictFileVersion = raf.readInt(); - if (dictFileVersion < 0 || dictFileVersion > CURRENT_DICT_VERSION) { - throw new IOException("Invalid dictionary version: " + dictFileVersion); - } - creationMillis = raf.readLong(); - dictInfo = raf.readUTF(); - - // Load the sources, then seek past them, because reading them later disrupts the offset. - try { - final RAFList rafSources = RAFList.create(raf, new EntrySource.Serializer(this), raf.getFilePointer()); - sources = new ArrayList(rafSources); - raf.seek(rafSources.getEndOffset()); - - pairEntries = CachingList.create(RAFList.create(raf, new PairEntry.Serializer(this), raf.getFilePointer()), CACHE_SIZE); - textEntries = CachingList.create(RAFList.create(raf, new TextEntry.Serializer(this), raf.getFilePointer()), CACHE_SIZE); - if (dictFileVersion >= 5) { - htmlEntries = CachingList.create(RAFList.create(raf, new HtmlEntry.Serializer(this), raf.getFilePointer()), CACHE_SIZE); - } else { - htmlEntries = Collections.emptyList(); - } - indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, raf.getFilePointer())); - } catch (RuntimeException e) { - final IOException ioe = new IOException("RuntimeException loading dictionary"); - ioe.initCause(e); - throw ioe; + + static final int CACHE_SIZE = 5000; + + static final int CURRENT_DICT_VERSION = 6; + static final String END_OF_DICTIONARY = "END OF DICTIONARY"; + + // persisted + final int dictFileVersion; + final long creationMillis; + public final String dictInfo; + public final List pairEntries; + public final List textEntries; + public final List htmlEntries; + public final List sources; + public final List indices; + + /** + * dictFileVersion 1 adds:
  • links to sources? dictFileVersion 2 adds:
  • + * counts of tokens in indices. + */ + + public Dictionary(final String dictInfo) { + this.dictFileVersion = CURRENT_DICT_VERSION; + this.creationMillis = System.currentTimeMillis(); + this.dictInfo = dictInfo; + pairEntries = new ArrayList(); + textEntries = new ArrayList(); + htmlEntries = new ArrayList(); + sources = new ArrayList(); + indices = new ArrayList(); } - final String end = raf.readUTF(); - if (!end.equals(END_OF_DICTIONARY)) { - throw new IOException("Dictionary seems corrupt: " + end); + + public Dictionary(final RandomAccessFile raf) throws IOException { + dictFileVersion = raf.readInt(); + if (dictFileVersion < 0 || dictFileVersion > CURRENT_DICT_VERSION) { + throw new IOException("Invalid dictionary version: " + dictFileVersion); + } + creationMillis = raf.readLong(); + dictInfo = raf.readUTF(); + + // Load the sources, then seek past them, because reading them later + // disrupts the offset. + try { + final RAFList rafSources = RAFList.create(raf, new EntrySource.Serializer( + this), raf.getFilePointer()); + sources = new ArrayList(rafSources); + raf.seek(rafSources.getEndOffset()); + + pairEntries = CachingList.create( + RAFList.create(raf, new PairEntry.Serializer(this), raf.getFilePointer()), + CACHE_SIZE); + textEntries = CachingList.create( + RAFList.create(raf, new TextEntry.Serializer(this), raf.getFilePointer()), + CACHE_SIZE); + if (dictFileVersion >= 5) { + htmlEntries = CachingList.create( + RAFList.create(raf, new HtmlEntry.Serializer(this), raf.getFilePointer()), + CACHE_SIZE); + } else { + htmlEntries = Collections.emptyList(); + } + indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, + raf.getFilePointer())); + } catch (RuntimeException e) { + final IOException ioe = new IOException("RuntimeException loading dictionary"); + ioe.initCause(e); + throw ioe; + } + 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, new EntrySource.Serializer(this)); - RAFList.write(raf, pairEntries, new PairEntry.Serializer(this)); - RAFList.write(raf, textEntries, new TextEntry.Serializer(this)); - RAFList.write(raf, htmlEntries, new HtmlEntry.Serializer(this)); - 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); + public void write(RandomAccessFile raf) throws IOException { + raf.writeInt(dictFileVersion); + raf.writeLong(creationMillis); + raf.writeUTF(dictInfo); + RAFList.write(raf, sources, new EntrySource.Serializer(this)); + RAFList.write(raf, pairEntries, new PairEntry.Serializer(this)); + RAFList.write(raf, textEntries, new TextEntry.Serializer(this)); + RAFList.write(raf, htmlEntries, new HtmlEntry.Serializer(this)); + RAFList.write(raf, indices, indexSerializer); + raf.writeUTF(END_OF_DICTIONARY); } - @Override - public void write(RandomAccessFile raf, Index t) throws IOException { - t.write(raf); - }}; - + + 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); + } + }; + final RAFListSerializer htmlEntryIndexSerializer = new RAFListSerializer() { @Override public void write(RandomAccessFile raf, HtmlEntry t) throws IOException { - if (t.index() == -1) throw new IndexOutOfBoundsException(); + if (t.index() == -1) + throw new IndexOutOfBoundsException(); raf.writeInt(t.index()); } + @Override public HtmlEntry read(RandomAccessFile raf, int readIndex) throws IOException { return htmlEntries.get(raf.readInt()); - }}; - + } + }; + public void print(final PrintStream out) { - out.println("dictInfo=" + dictInfo); - for (final EntrySource entrySource : sources) { - out.printf("EntrySource: %s %d\n", entrySource.name, entrySource.numEntries); - } - out.println(); - for (final Index index : indices) { - out.printf("Index: %s %s\n", index.shortName, index.longName); - index.print(out); + out.println("dictInfo=" + dictInfo); + for (final EntrySource entrySource : sources) { + out.printf("EntrySource: %s %d\n", entrySource.name, entrySource.numEntries); + } out.println(); - } + for (final Index index : indices) { + out.printf("Index: %s %s\n", index.shortName, index.longName); + index.print(out); + out.println(); + } } public DictionaryInfo getDictionaryInfo() { - final DictionaryInfo result = new DictionaryInfo(); - result.creationMillis = this.creationMillis; - result.dictInfo = this.dictInfo; - for (final Index index : indices) { - result.indexInfos.add(index.getIndexInfo()); - } - return result; + final DictionaryInfo result = new DictionaryInfo(); + result.creationMillis = this.creationMillis; + result.dictInfo = this.dictInfo; + for (final Index index : indices) { + result.indexInfos.add(index.getIndexInfo()); + } + return result; } - + public static DictionaryInfo getDictionaryInfo(final File file) { - RandomAccessFile raf = null; - try { - raf = new RandomAccessFile(file, "r"); - final Dictionary dict = new Dictionary(raf); - final DictionaryInfo dictionaryInfo = dict.getDictionaryInfo(); - dictionaryInfo.uncompressedFilename = file.getName(); - dictionaryInfo.uncompressedBytes = file.length(); - raf.close(); - return dictionaryInfo; - } catch (IOException e) { - return null; - } finally { - if (raf != null) { - try { + RandomAccessFile raf = null; + try { + raf = new RandomAccessFile(file, "r"); + final Dictionary dict = new Dictionary(raf); + final DictionaryInfo dictionaryInfo = dict.getDictionaryInfo(); + dictionaryInfo.uncompressedFilename = file.getName(); + dictionaryInfo.uncompressedBytes = file.length(); raf.close(); - } catch (IOException e) { - e.printStackTrace(); - } + return dictionaryInfo; + } catch (IOException e) { + return null; + } finally { + if (raf != null) { + try { + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } - } } -} \ No newline at end of file +}