1 /*
2 * #%L
3 * FutureUtils.java - mongodb-async-driver - Allanbank Consulting, Inc.
4 * %%
5 * Copyright (C) 2011 - 2014 Allanbank Consulting, Inc.
6 * %%
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * #L%
19 */
20 package com.allanbank.mongodb.util;
21
22 import java.util.concurrent.ExecutionException;
23 import java.util.concurrent.Future;
24
25 import com.allanbank.mongodb.MongoDbException;
26
27 /**
28 * FutureUtils provides helper methods for dealing with {@link Future}s.
29 *
30 * @api.no This class is <b>NOT</b> part of the drivers API. This class may be
31 * mutated in incompatible ways between any two releases of the driver.
32 * @copyright 2012-2013, Allanbank Consulting, Inc., All Rights Reserved
33 */
34 public final class FutureUtils {
35
36 /**
37 * Unwraps the contents of the Future.
38 *
39 * @param <T>
40 * The type of the future and response.
41 * @param future
42 * The future value to get.
43 * @return The response from the Future.
44 * @throws MongoDbException
45 * On an error from the Future.
46 */
47 public static <T> T unwrap(final Future<T> future) {
48 try {
49 return future.get();
50 }
51 catch (final InterruptedException e) {
52 e.fillInStackTrace();
53 throw new MongoDbException(e);
54 }
55 catch (final ExecutionException e) {
56 final Throwable cause = e.getCause();
57 cause.fillInStackTrace();
58 if (cause instanceof MongoDbException) {
59 throw (MongoDbException) cause;
60 }
61 throw new MongoDbException(cause);
62 }
63 }
64
65 /**
66 * Stop creation of a new FutureUtils.
67 */
68 private FutureUtils() {
69 // Nothing.
70 }
71 }