1edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi/*
2edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * Copyright (C) 2013 The Android Open Source Project
3edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi *
4edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * Licensed under the Apache License, Version 2.0 (the "License");
5edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * you may not use this file except in compliance with the License.
6edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * You may obtain a copy of the License at
7edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi *
8edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi *      http://www.apache.org/licenses/LICENSE-2.0
9edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi *
10edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * Unless required by applicable law or agreed to in writing, software
11edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * distributed under the License is distributed on an "AS IS" BASIS,
12edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * See the License for the specific language governing permissions and
14edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi * limitations under the License.
15edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi */
16edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
17edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagipackage com.android.inputmethod.latin;
18edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
19edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagiimport android.content.Context;
20edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagiimport android.util.Log;
21edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
22c922c8a504ab31aae26193f1bf319bf9f91406a5Yuichiro Hanadaimport com.android.inputmethod.latin.makedict.DictEncoder;
23edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagiimport com.android.inputmethod.latin.makedict.UnsupportedFormatException;
24c922c8a504ab31aae26193f1bf319bf9f91406a5Yuichiro Hanadaimport com.android.inputmethod.latin.makedict.Ver3DictEncoder;
25edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
26edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagiimport java.io.File;
27edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagiimport java.io.IOException;
285ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagiimport java.util.Map;
29edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
30edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi// TODO: Quit extending Dictionary after implementing dynamic binary dictionary.
31edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagiabstract public class AbstractDictionaryWriter extends Dictionary {
32edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    /** Used for Log actions from this class */
33edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    private static final String TAG = AbstractDictionaryWriter.class.getSimpleName();
34edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
35edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    private final Context mContext;
36edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
37edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    public AbstractDictionaryWriter(final Context context, final String dictType) {
38edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        super(dictType);
39edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        mContext = context;
40edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    }
41edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
42edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    abstract public void clear();
43edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
44f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard    /**
45f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     * Add a unigram with an optional shortcut to the dictionary.
46f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     * @param word The word to add.
47f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     * @param shortcutTarget A shortcut target for this word, or null if none.
48f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     * @param frequency The frequency for this unigram.
49f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored
50f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     *   if shortcutTarget is null.
51f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     * @param isNotAWord true if this is not a word, i.e. shortcut only.
52f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard     */
53edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    abstract public void addUnigramWord(final String word, final String shortcutTarget,
54f3204eebb19f0f8fae9d6d81e7e2b430f29829a0Jean Chalard            final int frequency, final int shortcutFreq, final boolean isNotAWord);
55edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
56c8db6f21e936b819a0b818f44eae0d2bc44433c9Keisuke Kuroyanagi    // TODO: Remove lastModifiedTime after making binary dictionary support forgetting curve.
57edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    abstract public void addBigramWords(final String word0, final String word1,
58c8db6f21e936b819a0b818f44eae0d2bc44433c9Keisuke Kuroyanagi            final int frequency, final boolean isValid,
59c8db6f21e936b819a0b818f44eae0d2bc44433c9Keisuke Kuroyanagi            final long lastModifiedTime);
60edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
61edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    abstract public void removeBigramWords(final String word0, final String word1);
62edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
635ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    abstract protected void writeDictionary(final DictEncoder dictEncoder,
645ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            final Map<String, String> attributeMap) throws IOException, UnsupportedFormatException;
65edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi
665ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi    public void write(final String fileName, final Map<String, String> attributeMap) {
67edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        final String tempFileName = fileName + ".temp";
68edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        final File file = new File(mContext.getFilesDir(), fileName);
69edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        final File tempFile = new File(mContext.getFilesDir(), tempFileName);
70edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        try {
710011ab4bf3df9e3fd2f5315309b6961b03ef4628Keisuke Kuroyanagi            final DictEncoder dictEncoder = new Ver3DictEncoder(tempFile);
725ed30a7660048ef4bf78077e77554c97786eae2bKeisuke Kuroyanagi            writeDictionary(dictEncoder, attributeMap);
73edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi            tempFile.renameTo(file);
74edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        } catch (IOException e) {
75edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi            Log.e(TAG, "IO exception while writing file", e);
76edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        } catch (UnsupportedFormatException e) {
77edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi            Log.e(TAG, "Unsupported format", e);
78edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi        }
79edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi    }
80edd1992ed329a84f0e9ef7056fda99f78eeb92b4Keisuke Kuroynagi}
81