FailableCache.java revision fcbdf999a15039ecad6157c1bf44a835df826a27
1b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit/** 2b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * Copyright (C) 2008 Google Inc. 3b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * 4b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * Licensed under the Apache License, Version 2.0 (the "License"); 5b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * you may not use this file except in compliance with the License. 6b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * You may obtain a copy of the License at 7b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * 8b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * http://www.apache.org/licenses/LICENSE-2.0 9b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * 10b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * Unless required by applicable law or agreed to in writing, software 11b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * distributed under the License is distributed on an "AS IS" BASIS, 12b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * See the License for the specific language governing permissions and 14b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * limitations under the License. 15b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit */ 16b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit 17b3a8f0bda3259af41e639f1872c42377989704d9limpbizkitpackage com.google.inject.internal; 18b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit 19b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit/** 20b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * Lazily creates (and caches) values for keys. If creating the value fails (with errors), an 21b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * exception is thrown on retrieval. 22b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * 23b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit * @author jessewilson@google.com (Jesse Wilson) 24b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit */ 25b3a8f0bda3259af41e639f1872c42377989704d9limpbizkitpublic abstract class FailableCache<K, V> { 26b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit 27b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit private final ReferenceCache<K, Object> delegate = new ReferenceCache<K, Object>() { 28b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit protected final Object create(K key) { 29b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit Errors errors = new Errors(); 30b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit V result = null; 31b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit try { 32b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit result = FailableCache.this.create(key, errors); 33b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit } catch (ErrorsException e) { 34b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit errors.merge(e.getErrors()); 35b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit } 3606898069ffc810f4dd71ef9aa8b63e2b67cacb8flimpbizkit return errors.hasErrors() ? errors : result; 37b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit } 38b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit }; 39b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit 40b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit protected abstract V create(K key, Errors errors) throws ErrorsException; 41b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit 42b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit public V get(K key, Errors errors) throws ErrorsException { 43b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit Object resultOrError = delegate.get(key); 44b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit if (resultOrError instanceof Errors) { 45b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit errors.merge((Errors) resultOrError); 46b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit throw errors.toException(); 47b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit } else { 48fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit @SuppressWarnings("unchecked") // create returned a non-error result, so this is safe 49fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit V result = (V) resultOrError; 50fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit return result; 51b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit } 52b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit } 53b3a8f0bda3259af41e639f1872c42377989704d9limpbizkit} 54