Add new FileDictionary intermediate class

Julien LepillerSat Apr 25 23:55:31+0200 2020

ed4f8af

Add new FileDictionary intermediate class

app/src/main/java/eu/lepiller/nani/dictionary/FileDictionary.java unknown status 1

1+
package eu.lepiller.nani.dictionary;
2+
3+
import android.util.Log;
4+
5+
import java.io.File;
6+
import java.io.IOException;
7+
import java.io.RandomAccessFile;
8+
import java.net.MalformedURLException;
9+
import java.net.URL;
10+
import java.util.ArrayList;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
public abstract class FileDictionary extends Dictionary {
15+
    interface Huffman {
16+
    }
17+
18+
    static class HuffmanTree implements Huffman {
19+
        Huffman left, right;
20+
        HuffmanTree(Huffman left, Huffman right) {
21+
            this.left = left;
22+
            this.right = right;
23+
        }
24+
    }
25+
    static class HuffmanValue implements Huffman {
26+
        String character;
27+
        HuffmanValue(String character) {
28+
            this.character = character;
29+
        }
30+
    }
31+
32+
    private String mUrl;
33+
    private static String TAG = "FILEDIC";
34+
35+
    FileDictionary(String name, String description, String fullDescription, File cacheDir, String url) {
36+
        super(name, description, fullDescription, cacheDir);
37+
        mUrl = url;
38+
    }
39+
40+
    @Override
41+
    public boolean isDownloaded() {
42+
        File f = getFile();
43+
        return f.exists();
44+
    }
45+
46+
    @Override
47+
    public int size() {
48+
        return 1;
49+
    }
50+
51+
    @Override
52+
    int currentSize() {
53+
        return 0;
54+
    }
55+
56+
    @Override
57+
    public Map<URL, File> getDownloads() {
58+
        HashMap<URL, File> result = new HashMap<>();
59+
        try {
60+
            result.put(new URL(mUrl), getFile());
61+
        } catch (MalformedURLException e) {
62+
            e.printStackTrace();
63+
        }
64+
        return result;
65+
    }
66+
67+
    @Override
68+
    public void remove() {
69+
        File file = getFile();
70+
        file.delete();
71+
    }
72+
73+
74+
    public int getSize() {
75+
        if(!isDownloaded())
76+
            return 0;
77+
78+
        return (int)(getFile().length() / 1000000);
79+
    }
80+
81+
    String getString(RandomAccessFile file) throws IOException {
82+
        byte b;
83+
        ArrayList<Byte> bs = new ArrayList<>();
84+
        while((b = file.readByte()) != 0) {
85+
            bs.add(b);
86+
        }
87+
        byte[] str = new byte[bs.size()];
88+
        for(int j=0; j<bs.size(); j++) {
89+
            str[j] = bs.get(j);
90+
        }
91+
        return new String(str, "UTF-8");
92+
    }
93+
94+
    ArrayList<String> getStringList(RandomAccessFile file) throws IOException {
95+
        ArrayList<String> results = new ArrayList<>();
96+
        int number = file.readShort();
97+
        for(int i=0; i<number; i++) {
98+
            results.add(getString(file));
99+
        }
100+
        return results;
101+
    }
102+
103+
    ArrayList<Integer> getIntList(RandomAccessFile file) throws IOException {
104+
        ArrayList<Integer> results = new ArrayList<>();
105+
        int number = file.readShort();
106+
        for(int i=0; i<number; i++) {
107+
            results.add(Integer.valueOf(file.readByte()));
108+
        }
109+
        return results;
110+
    }
111+
112+
    Huffman loadHuffman(RandomAccessFile file) throws IOException {
113+
        byte b = file.readByte();
114+
        if(b == 1) {
115+
            Huffman left = loadHuffman(file);
116+
            Huffman right = loadHuffman(file);
117+
118+
            return new HuffmanTree(left, right);
119+
        } else if (b == 0) {
120+
            Log.d(TAG, "Skipping byte " + file.readByte());
121+
            return new HuffmanValue("");
122+
        } else {
123+
            ArrayList<Byte> bs = new ArrayList<>();
124+
            bs.add(b);
125+
            while((b = file.readByte()) != 0) {
126+
                bs.add(b);
127+
            }
128+
            byte[] array = new byte[bs.size()];
129+
            for(int i=0; i<bs.size(); i++) {
130+
                array[i] = bs.get(i);
131+
            }
132+
            return new HuffmanValue(new String(array, "UTF-8"));
133+
        }
134+
    }
135+
136+
    String getHuffmanString(RandomAccessFile file, Huffman huffman) throws IOException {
137+
        StringBuilder b = new StringBuilder();
138+
        ArrayList<Boolean> bits = new ArrayList<>();
139+
        String c = null;
140+
        JMDict.Huffman h = huffman;
141+
        while(c == null || !c.isEmpty()) {
142+
            if(h instanceof JMDict.HuffmanValue) {
143+
                c = ((JMDict.HuffmanValue) h).character;
144+
                Log.d(TAG, "Huffman read: " + c);
145+
                b.append(c);
146+
                h = huffman;
147+
            } else if(h instanceof JMDict.HuffmanTree) {
148+
                if(bits.isEmpty()) {
149+
                    byte by = file.readByte();
150+
                    Log.d(TAG, "Read byte for huffman: " + by);
151+
                    for(int i = 7; i>-1; i--) {
152+
                        bits.add((by&(1<<i))!=0);
153+
                    }
154+
                    Log.d(TAG, "Read byte for huffman: " + bits);
155+
                }
156+
157+
                Boolean bo = bits.get(0);
158+
                bits.remove(0);
159+
                h = bo? ((JMDict.HuffmanTree) h).right: ((JMDict.HuffmanTree) h).left;
160+
            }
161+
        }
162+
163+
        return b.toString();
164+
    }
165+
166+
    void logHuffman(Huffman h, ArrayList<Boolean> addr) {
167+
        if (h instanceof JMDict.HuffmanValue) {
168+
            Log.d(TAG, "HUFF: " + ((JMDict.HuffmanValue) h).character + " -> " + addr.toString());
169+
        } else if(h instanceof JMDict.HuffmanTree) {
170+
            ArrayList<Boolean> addr_l = new ArrayList<>(addr);
171+
            addr_l.add(false);
172+
            ArrayList<Boolean> addr_r = new ArrayList<>(addr);
173+
            addr_r.add(true);
174+
            logHuffman(((JMDict.HuffmanTree) h).left, addr_l);
175+
            logHuffman(((JMDict.HuffmanTree) h).right, addr_r);
176+
        }
177+
    }
178+
179+
    ArrayList<String> getHuffmanStringList(RandomAccessFile file, Huffman huffman) throws IOException {
180+
        ArrayList<String> results = new ArrayList<>();
181+
        int number = file.readShort();
182+
        Log.d(TAG, "huffmanStrings: " + number);
183+
        for(int i=0; i<number; i++) {
184+
            results.add(getHuffmanString(file, huffman));
185+
        }
186+
        return results;
187+
    }
188+
}

app/src/main/java/eu/lepiller/nani/dictionary/JMDict.java

1616
import eu.lepiller.nani.R;
1717
import eu.lepiller.nani.result.Result;
1818
19-
public class JMDict extends Dictionary {
20-
    interface Huffman {
21-
    }
22-
23-
    static class HuffmanTree implements Huffman {
24-
        Huffman left, right;
25-
        HuffmanTree(Huffman left, Huffman right) {
26-
            this.left = left;
27-
            this.right = right;
28-
        }
29-
    }
30-
    static class HuffmanValue implements Huffman {
31-
        String character;
32-
        HuffmanValue(String character) {
33-
            this.character = character;
34-
        }
35-
    }
36-
19+
public class JMDict extends FileDictionary {
3720
    final private static String TAG = "JMDICT";
3821
    private String mUrl;
3922
    private Huffman kanjiHuffman, readingHuffman, meaningHuffman;
4023
4124
    JMDict(String name, String description, String fullDescription, File cacheDir, String url) {
42-
        super(name, description, fullDescription, cacheDir);
43-
        mUrl = url;
44-
    }
45-
46-
    @Override
47-
    public boolean isDownloaded() {
48-
        File f = getFile();
49-
        return f.exists();
50-
    }
51-
52-
    @Override
53-
    public int size() {
54-
        return 1;
55-
    }
56-
57-
    @Override
58-
    int currentSize() {
59-
        return 0;
60-
    }
61-
62-
    @Override
63-
    public Map<URL, File> getDownloads() {
64-
        HashMap<URL, File> result = new HashMap<>();
65-
        try {
66-
            result.put(new URL(mUrl), getFile());
67-
        } catch (MalformedURLException e) {
68-
            e.printStackTrace();
69-
        }
70-
        return result;
25+
        super(name, description, fullDescription, cacheDir, url);
7126
    }
7227
7328
    @Override

7732
7833
    @Override
7934
    public void remove() {
80-
        File file = getFile();
81-
        file.delete();
35+
        super.remove();
8236
        kanjiHuffman = null;
8337
        readingHuffman = null;
8438
        meaningHuffman = null;
8539
    }
8640
87-
    public int getSize() {
88-
        if(!isDownloaded())
89-
            return 0;
90-
91-
        return (int)(getFile().length() / 1000000);
92-
    }
93-
94-
    private String getString(RandomAccessFile file) throws IOException {
95-
        byte b;
96-
        ArrayList<Byte> bs = new ArrayList<>();
97-
        while((b = file.readByte()) != 0) {
98-
            bs.add(b);
99-
        }
100-
        byte[] str = new byte[bs.size()];
101-
        for(int j=0; j<bs.size(); j++) {
102-
            str[j] = bs.get(j);
103-
        }
104-
        return new String(str, "UTF-8");
105-
    }
106-
107-
    private ArrayList<String> getStringList(RandomAccessFile file) throws IOException {
108-
        ArrayList<String> results = new ArrayList<>();
109-
        int number = file.readShort();
110-
        for(int i=0; i<number; i++) {
111-
            results.add(getString(file));
112-
        }
113-
        return results;
114-
    }
115-
116-
    private String getHuffmanString(RandomAccessFile file, Huffman huffman) throws IOException {
117-
        StringBuilder b = new StringBuilder();
118-
        ArrayList<Boolean> bits = new ArrayList<>();
119-
        String c = null;
120-
        Huffman h = huffman;
121-
        while(c == null || !c.isEmpty()) {
122-
            if(h instanceof HuffmanValue) {
123-
                c = ((HuffmanValue) h).character;
124-
                Log.d(TAG, "Huffman read: " + c);
125-
                b.append(c);
126-
                h = huffman;
127-
            } else if(h instanceof HuffmanTree) {
128-
                if(bits.isEmpty()) {
129-
                    byte by = file.readByte();
130-
                    Log.d(TAG, "Read byte for huffman: " + by);
131-
                    for(int i = 7; i>-1; i--) {
132-
                        bits.add((by&(1<<i))!=0);
133-
                    }
134-
                    Log.d(TAG, "Read byte for huffman: " + bits);
135-
                }
136-
137-
                Boolean bo = bits.get(0);
138-
                bits.remove(0);
139-
                h = bo? ((HuffmanTree) h).right: ((HuffmanTree) h).left;
140-
            }
141-
        }
142-
143-
        return b.toString();
144-
    }
145-
146-
    private void logHuffman(Huffman h, ArrayList<Boolean> addr) {
147-
        if (h instanceof HuffmanValue) {
148-
            Log.d(TAG, "HUFF: " + ((HuffmanValue) h).character + " -> " + addr.toString());
149-
        } else if(h instanceof HuffmanTree) {
150-
            ArrayList<Boolean> addr_l = new ArrayList<>(addr);
151-
            addr_l.add(false);
152-
            ArrayList<Boolean> addr_r = new ArrayList<>(addr);
153-
            addr_r.add(true);
154-
            logHuffman(((HuffmanTree) h).left, addr_l);
155-
            logHuffman(((HuffmanTree) h).right, addr_r);
156-
        }
157-
    }
158-
159-
    private ArrayList<String> getHuffmanStringList(RandomAccessFile file, Huffman huffman) throws IOException {
160-
        ArrayList<String> results = new ArrayList<>();
161-
        int number = file.readShort();
162-
        Log.d(TAG, "huffmanStrings: " + number);
163-
        for(int i=0; i<number; i++) {
164-
            results.add(getHuffmanString(file, huffman));
165-
        }
166-
        return results;
167-
    }
168-
169-
    private ArrayList<Integer> getIntList(RandomAccessFile file) throws IOException {
170-
        ArrayList<Integer> results = new ArrayList<>();
171-
        int number = file.readShort();
172-
        for(int i=0; i<number; i++) {
173-
            results.add(Integer.valueOf(file.readByte()));
174-
        }
175-
        return results;
176-
    }
177-
17841
    private Result getValue(RandomAccessFile file, long pos) throws IOException {
17942
        file.seek(pos);
18043
        Log.d(TAG, "Getting value at " + pos);

278141
        }
279142
    }
280143
281-
    private Huffman loadHuffman(RandomAccessFile file) throws IOException {
282-
        byte b = file.readByte();
283-
        if(b == 1) {
284-
            Huffman left = loadHuffman(file);
285-
            Huffman right = loadHuffman(file);
286-
287-
            return new HuffmanTree(left, right);
288-
        } else if (b == 0) {
289-
            Log.d(TAG, "Skipping byte " + file.readByte());
290-
            return new HuffmanValue("");
291-
        } else {
292-
            ArrayList<Byte> bs = new ArrayList<>();
293-
            bs.add(b);
294-
            while((b = file.readByte()) != 0) {
295-
                bs.add(b);
296-
            }
297-
            byte[] array = new byte[bs.size()];
298-
            for(int i=0; i<bs.size(); i++) {
299-
                array[i] = bs.get(i);
300-
            }
301-
            return new HuffmanValue(new String(array, "UTF-8"));
302-
        }
303-
    }
304-
305144
    ArrayList<Result> search(String text) throws IncompatibleFormatException {
306145
        if (isDownloaded()) {
307146
            try {