• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  *******************************************************************************
6  * Copyright (C) 2009-2010, International Business Machines Corporation and    *
7  * others. All Rights Reserved.                                                *
8  *******************************************************************************
9  */
10 package ohos.global.icu.impl.locale;
11 
12 import java.lang.ref.ReferenceQueue;
13 import java.lang.ref.SoftReference;
14 import java.util.concurrent.ConcurrentHashMap;
15 
16 /**
17  * @hide exposed on OHOS
18  */
19 public abstract class LocaleObjectCache<K, V> {
20     private ConcurrentHashMap<K, CacheEntry<K, V>> _map;
21     private ReferenceQueue<V> _queue = new ReferenceQueue<V>();
22 
LocaleObjectCache()23     public LocaleObjectCache() {
24         this(16, 0.75f, 16);
25     }
26 
LocaleObjectCache(int initialCapacity, float loadFactor, int concurrencyLevel)27     public LocaleObjectCache(int initialCapacity, float loadFactor, int concurrencyLevel) {
28         _map = new ConcurrentHashMap<K, CacheEntry<K, V>>(initialCapacity, loadFactor, concurrencyLevel);
29     }
30 
get(K key)31     public V get(K key) {
32         V value = null;
33 
34         cleanStaleEntries();
35         CacheEntry<K, V> entry = _map.get(key);
36         if (entry != null) {
37             value = entry.get();
38         }
39         if (value == null) {
40             key = normalizeKey(key);
41             V newVal = createObject(key);
42             if (key == null || newVal == null) {
43                 // subclass must return non-null key/value object
44                 return null;
45             }
46 
47             CacheEntry<K, V> newEntry = new CacheEntry<K, V>(key, newVal, _queue);
48 
49             while (value == null) {
50                 cleanStaleEntries();
51                 entry = _map.putIfAbsent(key, newEntry);
52                 if (entry == null) {
53                     value = newVal;
54                     break;
55                 } else {
56                     value = entry.get();
57                 }
58             }
59         }
60         return value;
61     }
62 
63     @SuppressWarnings("unchecked")
cleanStaleEntries()64     private void cleanStaleEntries() {
65         CacheEntry<K, V> entry;
66         while ((entry = (CacheEntry<K, V>)_queue.poll()) != null) {
67             _map.remove(entry.getKey());
68         }
69     }
70 
createObject(K key)71     protected abstract V createObject(K key);
72 
normalizeKey(K key)73     protected K normalizeKey(K key) {
74         return key;
75     }
76 
77     private static class CacheEntry<K, V> extends SoftReference<V> {
78         private K _key;
79 
CacheEntry(K key, V value, ReferenceQueue<V> queue)80         CacheEntry(K key, V value, ReferenceQueue<V> queue) {
81             super(value, queue);
82             _key = key;
83         }
84 
getKey()85         K getKey() {
86             return _key;
87         }
88     }
89 }
90