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 ReadOnlyBinaryDictionary(final String filename, final long offset, final long length, final boolean useFullEditDistance, final Locale locale, final String dictType)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 isValidDictionary()48 public boolean isValidDictionary() { 49 return mBinaryDictionary.isValidDictionary(); 50 } 51 52 @Override getSuggestions(final ComposedData composedData, final NgramContext ngramContext, final long proximityInfoHandle, final SettingsValuesForSuggestion settingsValuesForSuggestion, final int sessionId, final float weightForLocale, final float[] inOutWeightOfLangModelVsSpatialModel)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 isInDictionary(final String word)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 shouldAutoCommit(final SuggestedWordInfo candidate)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 getFrequency(final String word)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 getMaxFrequencyOfExactMatches(final String word)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 close()119 public void close() { 120 mLock.writeLock().lock(); 121 try { 122 mBinaryDictionary.close(); 123 } finally { 124 mLock.writeLock().unlock(); 125 } 126 } 127 } 128