Throw exceptions in some cases

Julien LepillerFri Apr 19 21:28:51+0200 2019

0b58b87

Throw exceptions in some cases

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

1212
1313
abstract public class Dictionary {
1414
    private String name;
15-
    private String description;
15+
    private String description, fullDescription;
1616
    File file;
1717
18-
    Dictionary(String n, String descr, File cacheDir) {
18+
    Dictionary(String n, String descr, String fullDescr, File cacheDir) {
1919
        name = n;
2020
        description = descr;
21+
        fullDescription = fullDescr;
2122
        this.file = new File(cacheDir, "/dico/" + name);
2223
    }
2324

2829
    public String getDescription() {
2930
        return description;
3031
    }
32+
    public String getFullDescription() {
33+
        return fullDescription;
34+
    }
3135
3236
    protected File getFile() {
3337
        return file;
3438
    }
3539
40+
    abstract public int getSize();
41+
3642
    abstract public boolean isDownloaded();
3743
3844
    abstract public int size();

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

11
package eu.lepiller.nani.dictionary;
22
3-
public interface DictionaryException {
3+
public class DictionaryException extends Exception {
44
}

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

1515
        dictionaries = new ArrayList<>();
1616
        dictionaries.add(new JMDict("JMdict_e",
1717
                context.getString(R.string.dico_jmdict_e),
18+
                context.getString(R.string.dico_jmdict_long),
1819
                context.getCacheDir(),
1920
                "https://nani.lepiller.eu/dicos/JMdict_e.nani"));
2021
        dictionaries.add(new JMDict("JMdict_dut",
2122
                context.getString(R.string.dico_jmdict_dut),
23+
                context.getString(R.string.dico_jmdict_long),
2224
                context.getCacheDir(),
2325
                "https://nani.lepiller.eu/dicos/JMdict_dut.nani"));
2426
        dictionaries.add(new JMDict("JMdict_fre",
2527
                context.getString(R.string.dico_jmdict_fre),
28+
                context.getString(R.string.dico_jmdict_long),
2629
                context.getCacheDir(),
2730
                "https://nani.lepiller.eu/dicos/JMdict_fre.nani"));
2831
        dictionaries.add(new JMDict("JMdict_ger",
2932
                context.getString(R.string.dico_jmdict_ger),
33+
                context.getString(R.string.dico_jmdict_long),
3034
                context.getCacheDir(),
3135
                "https://nani.lepiller.eu/dicos/JMdict_ger.nani"));
3236
        dictionaries.add(new JMDict("JMdict_hun",
3337
                context.getString(R.string.dico_jmdict_hun),
38+
                context.getString(R.string.dico_jmdict_long),
3439
                context.getCacheDir(),
3540
                "https://nani.lepiller.eu/dicos/JMdict_hun.nani"));
3641
        dictionaries.add(new JMDict("JMdict_rus",
3742
                context.getString(R.string.dico_jmdict_rus),
43+
                context.getString(R.string.dico_jmdict_long),
3844
                context.getCacheDir(),
3945
                "https://nani.lepiller.eu/dicos/JMdict_rus.nani"));
4046
        dictionaries.add(new JMDict("JMdict_slv",
4147
                context.getString(R.string.dico_jmdict_slv),
48+
                context.getString(R.string.dico_jmdict_long),
4249
                context.getCacheDir(),
4350
                "https://nani.lepiller.eu/dicos/JMdict_slv.nani"));
4451
        dictionaries.add(new JMDict("JMdict_spa",
4552
                context.getString(R.string.dico_jmdict_spa),
53+
                context.getString(R.string.dico_jmdict_long),
4654
                context.getCacheDir(),
4755
                "https://nani.lepiller.eu/dicos/JMdict_spa.nani"));
4856
        dictionaries.add(new JMDict("JMdict_swe",
4957
                context.getString(R.string.dico_jmdict_swe),
58+
                context.getString(R.string.dico_jmdict_long),
5059
                context.getCacheDir(),
5160
                "https://nani.lepiller.eu/dicos/JMdict_swe.nani"));
5261
    }
5362
54-
    public static ArrayList<Result> search(Context context, String text) {
63+
    public static ArrayList<Result> search(Context context, String text) throws DictionaryException {
5564
        if(instance == null)
5665
            instance = new DictionaryFactory(context);
5766
67+
        int available = 0;
5868
        ArrayList<Result> results = new ArrayList<>();
5969
        for(Dictionary d: dictionaries) {
60-
            if (d instanceof JMDict) {
70+
            if (d instanceof JMDict && d.isDownloaded()) {
71+
                available++;
6172
                ArrayList<Result> dr = ((JMDict) d).search(text);
6273
                if(dr != null)
6374
                    results.addAll(dr);
6475
            }
6576
        }
77+
78+
        if(available == 0) {
79+
            throw new NoDictionaryException();
80+
        }
6681
        return results;
6782
    }
6883

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

11
package eu.lepiller.nani.dictionary;
22
3-
public class IncompatibleFormatException {
3+
public class IncompatibleFormatException extends DictionaryException {
4+
    String name;
5+
6+
    public IncompatibleFormatException(String name) {
7+
        this.name = name;
8+
    }
9+
10+
    public String getName() {
11+
        return name;
12+
    }
413
}

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

11
package eu.lepiller.nani.dictionary;
22
3-
import android.support.annotation.RequiresPermission;
43
import android.util.Log;
54
65
import java.io.File;

1110
import java.net.URL;
1211
import java.util.ArrayList;
1312
import java.util.Arrays;
14-
import java.util.Comparator;
1513
import java.util.HashMap;
16-
import java.util.List;
1714
import java.util.Map;
1815
1916
import eu.lepiller.nani.R;

4138
    private String mUrl;
4239
    private Huffman kanjiHuffman, readingHuffman, meaningHuffman;
4340
44-
    JMDict(String name, String description, File cacheDir, String url) {
45-
        super(name, description, cacheDir);
41+
    JMDict(String name, String description, String fullDescription, File cacheDir, String url) {
42+
        super(name, description, fullDescription, cacheDir);
4643
        mUrl = url;
4744
    }
4845

8784
        meaningHuffman = null;
8885
    }
8986
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+
90107
    private ArrayList<String> getStringList(RandomAccessFile file) throws IOException {
91108
        ArrayList<String> results = new ArrayList<>();
92109
        int number = file.readShort();
93110
        for(int i=0; i<number; i++) {
94-
            results.add(file.readUTF());
111+
            results.add(getString(file));
95112
        }
96113
        return results;
97114
    }

111128
                if(bits.isEmpty()) {
112129
                    byte by = file.readByte();
113130
                    Log.d(TAG, "Read byte for huffman: " + by);
114-
                    short mod = (short)256;
115-
                    while(mod != 1) {
116-
                        mod /= 2;
117-
                        bits.add((by / mod) > 0);
118-
                        by = (byte)(by % mod);
131+
                    for(int i = 7; i>-1; i--) {
132+
                        bits.add((by&(1<<i))!=0);
119133
                    }
120134
                    Log.d(TAG, "Read byte for huffman: " + bits);
121135
                }

163177
164178
    private Result getValue(RandomAccessFile file, long pos) throws IOException {
165179
        file.seek(pos);
166-
        Log.d(TAG, "Getting value");
180+
        Log.d(TAG, "Getting value at " + pos);
167181
        ArrayList<String> kanjis = getHuffmanStringList(file, kanjiHuffman);
168182
169183
        Log.d(TAG, "Getting readings");

188202
            ArrayList<String> sense_limits = getStringList(file);
189203
            ArrayList<String> sense_infos = getStringList(file);
190204
            ArrayList<Result.Source> sense_sources = new ArrayList<>();
191-
            int source_number = file.readInt();
205+
            int source_number = file.readShort();
192206
            for(int j=0; j<source_number; j++) {
193207
                ArrayList<String> source_content = getStringList(file);
194208
                boolean source_wasei = file.read() != 0;
195-
                String source_type = file.readUTF();
196-
                String source_language = file.readUTF();
209+
                String source_type = getString(file);
210+
                String source_language = getString(file);
197211
                sense_sources.add(new Result.Source(source_content, source_wasei, source_type, source_language));
198212
            }
199213
            ArrayList<Integer> sense_tags = getIntList(file);
200214
            ArrayList<String> sense_glosses = getHuffmanStringList(file, meaningHuffman);
201-
            String sense_language = file.readUTF();
215+
            String sense_language = getString(file);
202216
            senses.add(new Result.Sense(sense_references, sense_limits, sense_infos, sense_sources,
203217
                    sense_tags, sense_glosses, sense_language));
204218
        }

272286
273287
            return new HuffmanTree(left, right);
274288
        } else if (b == 0) {
275-
            file.skipBytes(1);
289+
            Log.d(TAG, "Skipping byte " + file.readByte());
276290
            return new HuffmanValue("");
277291
        } else {
278292
            ArrayList<Byte> bs = new ArrayList<>();

288302
        }
289303
    }
290304
291-
    ArrayList<Result> search(String text) {
305+
    ArrayList<Result> search(String text) throws IncompatibleFormatException {
292306
        if (isDownloaded()) {
293307
            try {
294308
                RandomAccessFile file = new RandomAccessFile(getFile(), "r");

299313
300314
                // Check file format version
301315
                if(!Arrays.equals(header, "NANI_JMDICT001".getBytes()))
302-
                    return null;
316+
                    throw new IncompatibleFormatException(getName());
303317
304318
                byte[] search = text.getBytes();
305319

335349
                }
336350
337351
                int[] uniqResultsArray = new int[uniqResults.size()];
352+
                for(int i=0; i<uniqResults.size(); i++) {
353+
                    uniqResultsArray[i] = uniqResults.get(i);
354+
                }
338355
                Arrays.sort(uniqResultsArray);
339356
357+
                Log.d(TAG, uniqResults.toString());
358+
340359
                int num = 0;
341-
                for(Integer i: uniqResultsArray) {
360+
                for(int i: uniqResultsArray) {
342361
                    if(num > 10)
343362
                        break;
344363
                    num++;