1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.inputmethod.latin; 18 19 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; 20 import com.android.inputmethod.latin.common.ComposedData; 21 import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion; 22 23 import java.util.ArrayList; 24 import java.util.Locale; 25 import java.util.concurrent.locks.ReentrantReadWriteLock; 26 27 /** 28 * This class provides binary dictionary reading operations with locking. An instance of this class 29 * can be used by multiple threads. Note that different session IDs must be used when multiple 30 * threads get suggestions using this class. 31 */ 32 public final class ReadOnlyBinaryDictionary extends Dictionary { 33 /** 34 * A lock for accessing binary dictionary. Only closing binary dictionary is the operation 35 * that change the state of dictionary. 36 */ 37 private final ReentrantReadWriteLock mLock = new ReentrantReadWriteLock(); 38 39 private final BinaryDictionary mBinaryDictionary; 40 41 public ReadOnlyBinaryDictionary(final String filename, final long offset, final long length, 42 final boolean useFullEditDistance, final Locale locale, final String dictType) { 43 super(dictType, locale); 44 mBinaryDictionary = new BinaryDictionary(filename, offset, length, useFullEditDistance, 45 locale, dictType, false /* isUpdatable */); 46 } 47 48 public boolean isValidDictionary() { 49 return mBinaryDictionary.isValidDictionary(); 50 } 51 52 @Override 53 public ArrayList<SuggestedWordInfo> getSuggestions(final ComposedData composedData, 54 final NgramContext ngramContext, final long proximityInfoHandle, 55 final SettingsValuesForSuggestion settingsValuesForSuggestion, 56 final int sessionId, final float weightForLocale, 57 final float[] inOutWeightOfLangModelVsSpatialModel) { 58 if (mLock.readLock().tryLock()) { 59 try { 60 return mBinaryDictionary.getSuggestions(composedData, ngramContext, 61 proximityInfoHandle, settingsValuesForSuggestion, sessionId, 62 weightForLocale, inOutWeightOfLangModelVsSpatialModel); 63 } finally { 64 mLock.readLock().unlock(); 65 } 66 } 67 return null; 68 } 69 70 @Override 71 public boolean isInDictionary(final String word) { 72 if (mLock.readLock().tryLock()) { 73 try { 74 return mBinaryDictionary.isInDictionary(word); 75 } finally { 76 mLock.readLock().unlock(); 77 } 78 } 79 return false; 80 } 81 82 @Override 83 public boolean shouldAutoCommit(final SuggestedWordInfo candidate) { 84 if (mLock.readLock().tryLock()) { 85 try { 86 return mBinaryDictionary.shouldAutoCommit(candidate); 87 } finally { 88 mLock.readLock().unlock(); 89 } 90 } 91 return false; 92 } 93 94 @Override 95 public int getFrequency(final String word) { 96 if (mLock.readLock().tryLock()) { 97 try { 98 return mBinaryDictionary.getFrequency(word); 99 } finally { 100 mLock.readLock().unlock(); 101 } 102 } 103 return NOT_A_PROBABILITY; 104 } 105 106 @Override 107 public int getMaxFrequencyOfExactMatches(final String word) { 108 if (mLock.readLock().tryLock()) { 109 try { 110 return mBinaryDictionary.getMaxFrequencyOfExactMatches(word); 111 } finally { 112 mLock.readLock().unlock(); 113 } 114 } 115 return NOT_A_PROBABILITY; 116 } 117 118 @Override 119 public void close() { 120 mLock.writeLock().lock(); 121 try { 122 mBinaryDictionary.close(); 123 } finally { 124 mLock.writeLock().unlock(); 125 } 126 } 127 } 128