1e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit/**
2e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * Copyright (C) 2007 Google Inc.
3e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit *
4e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * Licensed under the Apache License, Version 2.0 (the "License");
5e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * you may not use this file except in compliance with the License.
6e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * You may obtain a copy of the License at
7e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit *
8e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * http://www.apache.org/licenses/LICENSE-2.0
9e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit *
10e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * Unless required by applicable law or agreed to in writing, software
11e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * distributed under the License is distributed on an "AS IS" BASIS,
12e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * See the License for the specific language governing permissions and
14e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * limitations under the License.
15e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit */
16e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
17e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitpackage com.google.inject.throwingproviders;
18e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
19b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport static java.lang.annotation.RetentionPolicy.RUNTIME;
20b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
21e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport com.google.inject.Key;
22e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport com.google.inject.Provider;
23e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport com.google.inject.Scope;
24e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport com.google.inject.ScopeAnnotation;
25b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
26e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport java.lang.annotation.Retention;
27e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport java.util.HashMap;
28e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitimport java.util.Map;
29e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
30e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit/**
31e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * A simple scope that can be explicitly reset.
32e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit *
33e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit * @author jmourits@google.com (Jerome Mourits)
34e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit */
35e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkitclass TestScope implements Scope {
36e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
37e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  @Retention(RUNTIME) @ScopeAnnotation
38e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  public @interface Scoped { }
39e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
40e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  private Map<Key, Object> inScopeObjectsMap = new HashMap<Key, Object>();
41e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
42e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  public <T> Provider<T> scope(
43e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit      final Key<T> key, final Provider<T> provider) {
44e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit    return new Provider<T>() {
45e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit      @SuppressWarnings({"unchecked"})
46e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit      public T get() {
47e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit        T t = (T) inScopeObjectsMap.get(key);
48e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit        if (t == null) {
49e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit          t = provider.get();
50e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit          inScopeObjectsMap.put(key, t);
51e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit        }
52e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit        return t;
53e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit      }
54e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit    };
55e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  }
56e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit
57e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  public void beginNewScope() {
58e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit    inScopeObjectsMap = new HashMap<Key, Object>();
59e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit  }
60e451ef79c95a19a0e8044567f133f0ad1a40f4bclimpbizkit}
61