1be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia/* 2ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia * Copyright (C) 2010 The Libphonenumber Authors 3be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * 4be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * Licensed under the Apache License, Version 2.0 (the "License"); 5be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * you may not use this file except in compliance with the License. 6be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * You may obtain a copy of the License at 7be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * 8be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * http://www.apache.org/licenses/LICENSE-2.0 9be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * 10be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * Unless required by applicable law or agreed to in writing, software 11be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * distributed under the License is distributed on an "AS IS" BASIS, 12be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * See the License for the specific language governing permissions and 14be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * limitations under the License. 15be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia */ 16be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 17a77faddfc3b3e4cca8f585c82d669054aec221f4Narayan Kamathpackage com.google.i18n.phonenumbers; 18be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 19be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiaimport java.util.LinkedHashMap; 20be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiaimport java.util.Map; 21be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiaimport java.util.regex.Pattern; 22be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 23be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia/** 24be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * LRU Cache for compiled regular expressions used by the libphonenumbers libary. 25be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * 26be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * @author Shaopeng Jia 27be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia */ 28be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiapublic class RegexCache { 29be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia private LRUCache<String, Pattern> cache; 30be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 31be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia public RegexCache(int size) { 32be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia cache = new LRUCache<String, Pattern>(size); 33be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 34be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 35be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia public Pattern getPatternForRegex(String regex) { 36be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia Pattern pattern = cache.get(regex); 37be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia if (pattern == null) { 38be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia pattern = Pattern.compile(regex); 39be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia cache.put(regex, pattern); 40be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 41be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia return pattern; 42be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 43be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 44be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia // This method is used for testing. 45be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia boolean containsRegex(String regex) { 46be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia return cache.containsKey(regex); 47be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 48be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 49f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia private static class LRUCache<K, V> { 50be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia // LinkedHashMap offers a straightforward implementation of LRU cache. 51be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia private LinkedHashMap<K, V> map; 52be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia private int size; 53be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 54f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia @SuppressWarnings("serial") 55be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia public LRUCache(int size) { 56be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia this.size = size; 57f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia map = new LinkedHashMap<K, V>(size * 4 / 3 + 1, 0.75f, true) { 58f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia @Override 59be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { 60be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia return size() > LRUCache.this.size; 61be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 62be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia }; 63be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 64be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 65be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia public synchronized V get(K key) { 66be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia return map.get(key); 67be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 68be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 69be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia public synchronized void put(K key, V value) { 70be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia map.put(key, value); 71be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 72be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia 73be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia public synchronized boolean containsKey(K key) { 74be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia return map.containsKey(key); 75be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 76be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia } 77be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia} 78f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia 79