X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2Fengine%2FHtmlEntry.java;h=fc15c788b41ef31f23cb9ac631cb8dbc9ad1cc26;hb=96dd589699bcbe61a13bf68a1a673c8ad4d6690e;hp=8e2b9ba3686dfd6f7d66fb2b63d71e7ab160431b;hpb=9aefce5e3be1428ef19e1cb7f94a1fb34e0de3e0;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/engine/HtmlEntry.java b/src/com/hughes/android/dictionary/engine/HtmlEntry.java index 8e2b9ba..fc15c78 100644 --- a/src/com/hughes/android/dictionary/engine/HtmlEntry.java +++ b/src/com/hughes/android/dictionary/engine/HtmlEntry.java @@ -1,27 +1,27 @@ package com.hughes.android.dictionary.engine; -import com.hughes.util.StringUtil; -import com.hughes.util.raf.RAFListSerializer; -import com.hughes.util.raf.RAFSerializable; -import com.ibm.icu.text.Transliterator; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.io.PrintStream; -import java.io.RandomAccessFile; -import java.io.UnsupportedEncodingException; import java.lang.ref.SoftReference; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.regex.Pattern; -public class HtmlEntry extends AbstractEntry implements RAFSerializable, - Comparable { +import com.hughes.util.DataInputBuffer; +import com.hughes.util.StringUtil; +import com.hughes.util.raf.RAFListSerializer; +import com.hughes.util.raf.RAFListSerializerSkippable; +import com.ibm.icu.text.Transliterator; + +public class HtmlEntry extends AbstractEntry implements Comparable { // Title is not HTML escaped. public final String title; - public final LazyHtmlLoader lazyHtmlLoader; + private final LazyHtmlLoader lazyHtmlLoader; + @SuppressWarnings("WeakerAccess") public String html; public HtmlEntry(final EntrySource entrySource, String title) { @@ -31,40 +31,27 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable { + static final class Serializer implements RAFListSerializerSkippable { final Dictionary dictionary; @@ -96,6 +83,20 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable= 7) + { + StringUtil.readVarInt(raf); + } + else + { + raf.skipBytes(2); + } + int l = raf.readUnsignedShort(); + raf.skipBytes(l); + } + @Override public void write(DataOutput raf, HtmlEntry t) throws IOException { t.writeBase(raf); @@ -104,7 +105,7 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable { @Override - public HtmlEntry read(DataInput raf, final int index) throws IOException { + public HtmlEntry read(DataInput raf, final int index) { assert false; return null; } @@ -115,24 +116,24 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable { + static final class DataDeserializer implements RAFListSerializer { @Override - public byte[] read(DataInput raf, final int index) throws IOException { - return HtmlEntry.readData(raf); + public DataInputBuffer read(DataInput raf, final int index) throws IOException { + return readData(raf); } @Override - public void write(DataOutput raf, byte[] t) throws IOException { + public void write(DataOutput raf, DataInputBuffer t) { assert false; } } - public String getRawText(final boolean compact) { + private String getRawText(final boolean compact) { return title + ":\n" + getHtml(); } @Override - public int compareTo(HtmlEntry another) { + public int compareTo(/*@NonNull*/ HtmlEntry another) { if (title.compareTo(another.title) != 0) { return title.compareTo(another.title); } @@ -148,15 +149,13 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable searchTokens, - final Pattern orderedMatchPattern, final Transliterator normalizer, - final boolean swapPairEntries) { + final Pattern orderedMatchPattern, final Transliterator normalizer, + final boolean swapPairEntries) { final String text = normalizer.transform(getRawText(false)); if (orderedMatchPattern.matcher(text).find()) { return RowMatchType.ORDERED_MATCH; @@ -204,16 +203,21 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable%s\n

%s\n", - formatQuickdicUrl(indexShortName, htmlEntry.title), titleEscaped, - htmlEntry.getHtml())); + formatQuickdicUrl(indexShortName, htmlEntry.title), titleEscaped, + htmlEntry.getHtml())); } return result.toString(); } + @SuppressWarnings("WeakerAccess") public static String formatQuickdicUrl(final String indexShortName, final String text) { assert !indexShortName.contains(":"); assert text.length() > 0; - return String.format("q://d?%s&%s", indexShortName, StringUtil.encodeForUrl(text)); + StringBuilder s = new StringBuilder("q://d?"); + s.append(indexShortName); + s.append("&"); + s.append(StringUtil.encodeForUrl(text)); + return s.toString(); } public static boolean isQuickdicUrl(String url) { @@ -222,66 +226,52 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable data; + final List data; final int index; // Not sure this volatile is right, but oh well. - volatile SoftReference htmlRef = new SoftReference(null); + volatile SoftReference htmlRef = new SoftReference<>(null); - private LazyHtmlLoader(final DataInput inp, List data, int index) throws IOException { + private LazyHtmlLoader(final DataInput inp, List data, int index) throws IOException { this.data = data; this.index = index; if (data != null) { - this.raf = null; - this.offset = 0; + buf = null; this.numBytes = -1; - this.numZipBytes = -1; return; } - raf = (RandomAccessFile)inp; - numBytes = raf.readInt(); - numZipBytes = raf.readInt(); - offset = raf.getFilePointer(); - raf.skipBytes(numZipBytes); + numBytes = Math.min(inp.readInt(), 20 * 1024 * 1024); + int numZipBytes = Math.min(inp.readInt(), 20 * 1024 * 1024); + DataInputBuffer b = (DataInputBuffer)inp; + buf = b.slice(numZipBytes); } - public String getHtml() { + String getHtml() { String html = htmlRef.get(); if (html != null) { return html; } if (data != null) { - try { - html = new String(data.get(index), "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - htmlRef = new SoftReference(html); + html = data.get(index).asString(); + htmlRef = new SoftReference<>(html); return html; } System.out.println("Loading Html: numBytes=" + numBytes + ", numZipBytes=" - + numZipBytes); - final byte[] zipBytes = new byte[numZipBytes]; - synchronized (raf) { - try { - raf.seek(offset); - raf.read(zipBytes); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + + buf.limit()); + final byte[] zipBytes = new byte[buf.limit()]; + buf.rewind(); + buf.readFully(zipBytes); try { final byte[] bytes = StringUtil.unzipFully(zipBytes, numBytes); - html = new String(bytes, "UTF-8"); + html = new String(bytes, StandardCharsets.UTF_8); } catch (IOException e) { - throw new RuntimeException(e); + throw new RuntimeException("Dictionary HTML data corrupted", e); } - htmlRef = new SoftReference(html); + htmlRef = new SoftReference<>(html); return html; } }