• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * 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, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.android.inputmethod.latin.spellcheck;
18 
19 import java.util.Locale;
20 import java.util.concurrent.LinkedBlockingQueue;
21 
22 /**
23  * A blocking queue that creates dictionaries up to a certain limit as necessary.
24  */
25 @SuppressWarnings("serial")
26 public class DictionaryPool extends LinkedBlockingQueue<DictAndProximity> {
27     private final AndroidSpellCheckerService mService;
28     private final int mMaxSize;
29     private final Locale mLocale;
30     private int mSize;
31     private volatile boolean mClosed;
32 
DictionaryPool(final int maxSize, final AndroidSpellCheckerService service, final Locale locale)33     public DictionaryPool(final int maxSize, final AndroidSpellCheckerService service,
34             final Locale locale) {
35         super();
36         mMaxSize = maxSize;
37         mService = service;
38         mLocale = locale;
39         mSize = 0;
40         mClosed = false;
41     }
42 
43     @Override
take()44     public DictAndProximity take() throws InterruptedException {
45         final DictAndProximity dict = poll();
46         if (null != dict) return dict;
47         synchronized(this) {
48             if (mSize >= mMaxSize) {
49                 // Our pool is already full. Wait until some dictionary is ready.
50                 return super.take();
51             } else {
52                 ++mSize;
53                 return mService.createDictAndProximity(mLocale);
54             }
55         }
56     }
57 
58     // Convenience method
takeOrGetNull()59     public DictAndProximity takeOrGetNull() {
60         try {
61             return take();
62         } catch (InterruptedException e) {
63             return null;
64         }
65     }
66 
close()67     public void close() {
68         synchronized(this) {
69             mClosed = true;
70             for (DictAndProximity dict : this) {
71                 dict.mDictionary.close();
72             }
73             clear();
74         }
75     }
76 
77     @Override
offer(final DictAndProximity dict)78     public boolean offer(final DictAndProximity dict) {
79         if (mClosed) {
80             dict.mDictionary.close();
81             return false;
82         } else {
83             return super.offer(dict);
84         }
85     }
86 }
87