From ef9f0a4cdd9795df697235d6d14a07011792df11 Mon Sep 17 00:00:00 2001 From: Thad Hughes Date: Sun, 8 Aug 2010 05:55:25 -0700 Subject: [PATCH] go --- .../hughes/android/dictionary/Dictionary.java | 20 ++-- .../android/dictionary/engine/Dictionary.java | 31 ++++++ .../dictionary/engine/EntrySource.java | 14 ++- .../android/dictionary/engine/Index.java | 53 +++++++-- .../android/dictionary/engine/PairEntry.java | 38 ++++++- .../hughes/android/dictionary/engine/Row.java | 53 --------- .../android/dictionary/engine/RowBase.java | 102 ++++++++++++++++++ .../dictionary/engine/RowWithIndex.java | 50 --------- .../android/dictionary/engine/TokenRow.java | 10 +- 9 files changed, 245 insertions(+), 126 deletions(-) delete mode 100644 src/com/hughes/android/dictionary/engine/Row.java create mode 100644 src/com/hughes/android/dictionary/engine/RowBase.java delete mode 100644 src/com/hughes/android/dictionary/engine/RowWithIndex.java diff --git a/src/com/hughes/android/dictionary/Dictionary.java b/src/com/hughes/android/dictionary/Dictionary.java index d8fd3c6..3133e28 100755 --- a/src/com/hughes/android/dictionary/Dictionary.java +++ b/src/com/hughes/android/dictionary/Dictionary.java @@ -7,12 +7,12 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import com.hughes.util.CachingList; -import com.hughes.util.raf.FileList; +import com.hughes.util.raf.RAFList; import com.hughes.util.raf.RAFFactory; import com.hughes.util.raf.RAFSerializable; import com.hughes.util.raf.RAFSerializableSerializer; import com.hughes.util.raf.RAFSerializer; -import com.hughes.util.raf.UniformFileList; +import com.hughes.util.raf.UniformRAFList; public final class Dictionary implements RAFSerializable { @@ -40,8 +40,8 @@ public final class Dictionary implements RAFSerializable { public Dictionary(final RandomAccessFile raf) throws IOException { dictionaryInfo = raf.readUTF(); - sources = new ArrayList(FileList.create(raf, RAFSerializer.STRING, raf.getFilePointer())); - entries = CachingList.create(FileList.create(raf, ENTRY_SERIALIZER, raf + sources = new ArrayList(RAFList.create(raf, RAFSerializer.STRING, raf.getFilePointer())); + entries = CachingList.create(RAFList.create(raf, ENTRY_SERIALIZER, raf .getFilePointer()), 10000); languageDatas[0] = new LanguageData(this, raf, SimpleEntry.LANG1); languageDatas[1] = new LanguageData(this, raf, SimpleEntry.LANG2); @@ -53,8 +53,8 @@ public final class Dictionary implements RAFSerializable { public void write(RandomAccessFile raf) throws IOException { raf.writeUTF(dictionaryInfo); - FileList.write(raf, sources, RAFSerializer.STRING); - FileList.write(raf, entries, ENTRY_SERIALIZER); + RAFList.write(raf, sources, RAFSerializer.STRING); + RAFList.write(raf, entries, ENTRY_SERIALIZER); languageDatas[0].write(raf); languageDatas[1].write(raf); raf.writeUTF(VERSION_CODE); @@ -82,16 +82,16 @@ public final class Dictionary implements RAFSerializable { throw new RuntimeException("Unknown language."); } this.lang = lang; - rows = CachingList.create(UniformFileList.create(raf, ROW_SERIALIZER, raf + rows = CachingList.create(UniformRAFList.create(raf, ROW_SERIALIZER, raf .getFilePointer()), 10000); - sortedIndex = CachingList.create(FileList.create(raf, + sortedIndex = CachingList.create(RAFList.create(raf, INDEX_ENTRY_SERIALIZER, raf.getFilePointer()), 10000); } public void write(final RandomAccessFile raf) throws IOException { raf.writeUTF(language.symbol); - UniformFileList.write(raf, rows, ROW_SERIALIZER, 4); - FileList.write(raf, sortedIndex, INDEX_ENTRY_SERIALIZER); + UniformRAFList.write(raf, rows, ROW_SERIALIZER, 4); + RAFList.write(raf, sortedIndex, INDEX_ENTRY_SERIALIZER); } String rowToString(final Row row, final boolean onlyFirstSubentry) { diff --git a/src/com/hughes/android/dictionary/engine/Dictionary.java b/src/com/hughes/android/dictionary/engine/Dictionary.java index 861ba43..cea0c7d 100644 --- a/src/com/hughes/android/dictionary/engine/Dictionary.java +++ b/src/com/hughes/android/dictionary/engine/Dictionary.java @@ -1,7 +1,13 @@ package com.hughes.android.dictionary.engine; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; import java.util.List; +import com.hughes.util.raf.RAFList; +import com.hughes.util.raf.RAFSerializer; + public class Dictionary { @@ -11,7 +17,32 @@ public class Dictionary { // persisted final List sources; + // persisted final List indices; + + public Dictionary() { + pairEntries = new ArrayList(); + sources = new ArrayList(); + indices = new ArrayList(); + } + + public Dictionary(final RandomAccessFile raf) throws IOException { + pairEntries = RAFList.create(raf, PairEntry.SERIALIZER, raf.getFilePointer()); + sources = new ArrayList(); + + final RAFSerializer indexSerializer = new RAFSerializer() { + + @Override + public Index read(RandomAccessFile raf) throws IOException { + return new Index(Dictionary.this, raf); + } + @Override + public void write(RandomAccessFile raf, Index t) throws IOException { + t.write(raf); + + }}; + indices = RAFList.create(raf, indexSerializer, raf.getFilePointer()); + } } \ No newline at end of file diff --git a/src/com/hughes/android/dictionary/engine/EntrySource.java b/src/com/hughes/android/dictionary/engine/EntrySource.java index 07e825f..f773f60 100644 --- a/src/com/hughes/android/dictionary/engine/EntrySource.java +++ b/src/com/hughes/android/dictionary/engine/EntrySource.java @@ -1,5 +1,17 @@ package com.hughes.android.dictionary.engine; -public class EntrySource { +import java.io.Serializable; +import com.hughes.util.IndexedObject; + +public class EntrySource extends IndexedObject implements Serializable { + + private static final long serialVersionUID = -1323165134846120269L; + + final String name; + + public EntrySource(final String name) { + this.name = name; + } + } diff --git a/src/com/hughes/android/dictionary/engine/Index.java b/src/com/hughes/android/dictionary/engine/Index.java index 62c3324..9185d9d 100644 --- a/src/com/hughes/android/dictionary/engine/Index.java +++ b/src/com/hughes/android/dictionary/engine/Index.java @@ -5,30 +5,67 @@ package com.hughes.android.dictionary.engine; import java.io.IOException; import java.io.RandomAccessFile; +import java.util.Collection; import java.util.List; -import com.hughes.android.dictionary.engine.Dictionary.Index.IndexEntry; +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 { - final Dictionary dict; - final String name; +final class Index implements RAFSerializable { + final Dictionary dict; + final String shortName; + final String longName; + + // persisted + final List sortedIndexEntries; + // One big list! // Various sub-types. // persisted - final List rows; + final List rows; - // persisted - final List sortedIndexEntries; + // -------------------------------------------------------------------------- + + public Index(final Dictionary dict, final RandomAccessFile raf) throws IOException { + this.dict = dict; + shortName = raf.readUTF(); + longName = raf.readUTF(); + // TODO: caching + sortedIndexEntries = RAFList.create(raf, IndexEntry.SERIALIZER, raf.getFilePointer()); + rows = UniformRAFList.create(raf, new RowBase.Serializer(this), raf.getFilePointer()); + } + @Override + public void write(final RandomAccessFile raf) throws IOException { + raf.writeUTF(shortName); + raf.writeUTF(longName); + RAFList.write(raf, sortedIndexEntries, IndexEntry.SERIALIZER); + UniformRAFList.write(raf, (Collection) rows, new RowBase.Serializer(this), 5); + } + static final class IndexEntry implements RAFSerializable { String token; int startRow; - + static final RAFSerializer SERIALIZER = new RAFSerializer () { + @Override + public IndexEntry read(RandomAccessFile raf) throws IOException { + return new IndexEntry(raf); + } + @Override + public void write(RandomAccessFile raf, IndexEntry t) throws IOException { + t.write(raf); + }}; + 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); } } + } \ No newline at end of file diff --git a/src/com/hughes/android/dictionary/engine/PairEntry.java b/src/com/hughes/android/dictionary/engine/PairEntry.java index efdfa00..e22969e 100644 --- a/src/com/hughes/android/dictionary/engine/PairEntry.java +++ b/src/com/hughes/android/dictionary/engine/PairEntry.java @@ -4,7 +4,29 @@ import java.io.IOException; import java.io.RandomAccessFile; import java.util.List; -public class PairEntry extends Entry { +import com.hughes.util.raf.RAFSerializable; +import com.hughes.util.raf.RAFSerializer; + +public class PairEntry extends Entry implements RAFSerializable { + + public PairEntry(final RandomAccessFile raf) { + } + @Override + public void write(RandomAccessFile raf) throws IOException { + } + + static final RAFSerializer SERIALIZER = new RAFSerializer() { + @Override + public PairEntry read(RandomAccessFile raf) throws IOException { + return new PairEntry(raf); + } + + @Override + public void write(RandomAccessFile raf, PairEntry t) throws IOException { + t.write(raf); + } + }; + @Override List getMainTokens() { @@ -15,16 +37,28 @@ public class PairEntry extends Entry { List getOtherTokens() { return null; } + + - public static class Row extends RowWithIndex { + public static class Row extends RowBase { + Row(final RandomAccessFile raf, final int thisRowIndex, final Index index) throws IOException { super(raf, thisRowIndex, index); } + public PairEntry getEntry() { return index.dict.pairEntries.get(referenceIndex); } + + @Override + public Object draw(String searchText) { + // TODO Auto-generated method stub + return null; + } } + + } diff --git a/src/com/hughes/android/dictionary/engine/Row.java b/src/com/hughes/android/dictionary/engine/Row.java deleted file mode 100644 index fd10d5b..0000000 --- a/src/com/hughes/android/dictionary/engine/Row.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.hughes.android.dictionary.engine; - -import java.io.IOException; -import java.io.RandomAccessFile; - -import com.hughes.util.raf.RAFListSerializer; - -public interface Row { - - public void write(RandomAccessFile raf) throws IOException; - - /** - * @return the TokenRow that this row is "filed under". - */ - public TokenRow getTokenRow(final boolean search); - - public void setTokenRow(final TokenRow tokenRow); - - public Object draw(final String searchText); - - - // Row must manage "disk-based" polymorphism. All other polymorphism is - // dealt with in the normal manner. - static class Serializer implements RAFListSerializer { - - final Index index; - - Serializer(final Index index) { - this.index = index; - } - - @Override - public Row read(RandomAccessFile raf, final int listIndex) throws IOException { - final byte rowType = raf.readByte(); - if (rowType == 0) { - return new PairEntry.Row(raf, listIndex, index); - } else if (rowType == 1) { - return new TokenRow(raf, listIndex, index); - } - throw new RuntimeException("Invalid rowType:" + rowType); - } - - @Override - public void write(RandomAccessFile raf, Row t) throws IOException { - if (t instanceof PairEntry.Row) { - raf.writeByte(0); - } else if (t instanceof TokenRow) { - raf.writeByte(1); - } - t.write(raf); - } - }; -} diff --git a/src/com/hughes/android/dictionary/engine/RowBase.java b/src/com/hughes/android/dictionary/engine/RowBase.java new file mode 100644 index 0000000..95c2267 --- /dev/null +++ b/src/com/hughes/android/dictionary/engine/RowBase.java @@ -0,0 +1,102 @@ +package com.hughes.android.dictionary.engine; + +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.hughes.util.raf.RAFListSerializer; + +public abstract class RowBase { + /** + * the Index owning this RowBase. + */ + final Index index; + + /** + * Where this row lives within the list of Rows. + */ + int thisRowIndex; + + /** + * Where this RowBase points to. + */ + int referenceIndex; + + /** + * the TokenRow above this RowBase, populated on demand. + */ + TokenRow tokenRow = null; + + RowBase(final RandomAccessFile raf, final int thisRowIndex, final Index index) throws IOException { + this.index = index; + this.thisRowIndex = thisRowIndex; // where this was inside the list. + this.referenceIndex = raf.readInt(); // what this points to. + } + + public void write(RandomAccessFile raf) throws IOException { + raf.writeInt(referenceIndex); + } + + /** + * @return the TokenRow that this row is "filed under". + */ + public TokenRow getTokenRow(final boolean search) { + if (tokenRow == null && search) { + int r = thisRowIndex - 1; + while (r >= 0) { + final RowBase row = index.rows.get(r); + final TokenRow candidate = row.getTokenRow(false); + if (candidate != null) { + for (++r; r <= thisRowIndex; ++r) { + index.rows.get(r).setTokenRow(candidate); + } + } + } + assert tokenRow != null; + } + return tokenRow; + } + + public void setTokenRow(TokenRow tokenRow) { + assert this.tokenRow == null; + assert tokenRow != null; + this.tokenRow = tokenRow; + } + + + public abstract Object draw(final String searchText); + + + // RowBase must manage "disk-based" polymorphism. All other polymorphism is + // dealt with in the normal manner. + static class Serializer implements RAFListSerializer { + + final Index index; + + Serializer(final Index index) { + this.index = index; + } + + @Override + public RowBase read(RandomAccessFile raf, final int listIndex) throws IOException { + final byte rowType = raf.readByte(); + if (rowType == 0) { + return new PairEntry.Row(raf, listIndex, index); + } else if (rowType == 1) { + return new TokenRow(raf, listIndex, index); + } + throw new RuntimeException("Invalid rowType:" + rowType); + } + + @Override + public void write(RandomAccessFile raf, RowBase t) throws IOException { + if (t instanceof PairEntry.Row) { + raf.writeByte(0); + } else if (t instanceof TokenRow) { + raf.writeByte(1); + } + t.write(raf); + } + }; + + +} diff --git a/src/com/hughes/android/dictionary/engine/RowWithIndex.java b/src/com/hughes/android/dictionary/engine/RowWithIndex.java deleted file mode 100644 index b947ff8..0000000 --- a/src/com/hughes/android/dictionary/engine/RowWithIndex.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.hughes.android.dictionary.engine; - -import java.io.IOException; -import java.io.RandomAccessFile; - -public abstract class RowWithIndex implements Row { - final Index index; - int thisRowIndex; - int referenceIndex; - - TokenRow tokenRow = null; - - RowWithIndex(final RandomAccessFile raf, final int thisRowIndex, final Index index) throws IOException { - this.index = index; - this.thisRowIndex = thisRowIndex; // where this was inside the list. - this.referenceIndex = raf.readInt(); // what this points to. - } - - @Override - public void write(RandomAccessFile raf) throws IOException { - raf.writeInt(referenceIndex); - } - - @Override - public TokenRow getTokenRow(final boolean search) { - if (tokenRow == null && search) { - int r = thisRowIndex - 1; - while (r >= 0) { - final Row row = index.rows.get(r); - final TokenRow candidate = row.getTokenRow(false); - if (candidate != null) { - for (++r; r <= thisRowIndex; ++r) { - index.rows.get(r).setTokenRow(candidate); - } - } - } - assert tokenRow != null; - } - return tokenRow; - } - - @Override - public void setTokenRow(TokenRow tokenRow) { - assert this.tokenRow == null; - assert tokenRow != null; - this.tokenRow = tokenRow; - } - - -} diff --git a/src/com/hughes/android/dictionary/engine/TokenRow.java b/src/com/hughes/android/dictionary/engine/TokenRow.java index 3335d28..7a9f5d9 100644 --- a/src/com/hughes/android/dictionary/engine/TokenRow.java +++ b/src/com/hughes/android/dictionary/engine/TokenRow.java @@ -3,7 +3,7 @@ package com.hughes.android.dictionary.engine; import java.io.IOException; import java.io.RandomAccessFile; -public class TokenRow extends RowWithIndex { +public class TokenRow extends RowBase { TokenRow(final RandomAccessFile raf, final int thisRowIndex, final Index index) throws IOException { super(raf, thisRowIndex, index); @@ -16,12 +16,18 @@ public class TokenRow extends RowWithIndex { @Override public void setTokenRow(TokenRow tokenRow) { - throw new RuntimeException("Shouldn't be setting TokenRow!"); + throw new RuntimeException("Shouldn't be setting TokenRow's TokenRow!"); } public String getToken() { return index.sortedIndexEntries.get(referenceIndex).token; } + @Override + public Object draw(String searchText) { + // TODO Auto-generated method stub + return null; + } + } -- 2.43.0