1 /*
2 * Copyright 2007 Tim Peierls
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.directwebremoting.guice;
17
18 import com.google.inject.Provider;
19
20 import java.util.concurrent.Callable;
21 import java.util.concurrent.ExecutionException;
22 import java.util.concurrent.FutureTask;
23
24 /**
25 * A provider implementation that uses the FutureTask machinery.
26 * @author Tim Peierls [tim at peierls dot net]
27 */
28 class FutureTaskProvider<T> extends FutureTask<T> implements InstanceProvider<T>
29 {
30 FutureTaskProvider(final Provider<T> creator)
31 {
32 super(new Callable<T>()
33 {
34 public T call()
35 {
36 return creator.get();
37 }
38 });
39 }
40
41 @Override public T get()
42 {
43 try
44 {
45 return super.get();
46 }
47 catch (InterruptedException e)
48 {
49 Thread.currentThread().interrupt();
50 return null;
51 }
52 catch (ExecutionException e)
53 {
54 Throwable t = e.getCause();
55 if (t instanceof RuntimeException)
56 {
57 throw (RuntimeException) t;
58 }
59 else if (t instanceof Error)
60 {
61 throw (Error) t;
62 }
63 else
64 {
65 throw new IllegalStateException("unexpected Exception: " + t, t);
66 }
67 }
68 }
69 }