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