/* * $Id$ */ package com.googlecode.objectify.util; import java.lang.reflect.UndeclaredThrowableException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; /** * This provides some of the methods of Google's (package-private) FutureHelper * * @see com.google.appengine.api.datastore.FutureHelper * * @author Jeff Schnitzer */ public class FutureHelper { private FutureHelper() { } /** Quietly perform the get() on a future */ public static <T> T quietGet(Future<T> future) { try { return future.get(); } catch (Exception ex) { unwrapAndThrow(ex); return null; // just to make the compiler happy } } /** * Properly unwraps ExecutionException, throwing the relevant original cause. Otherwise * RuntimeExceptions get thrown and checked exceptions get wrapped in a RuntimeException. */ public static void unwrapAndThrow(Throwable ex) { if (ex instanceof RuntimeException) throw (RuntimeException)ex; else if (ex instanceof Error) throw (Error)ex; else if (ex instanceof ExecutionException) unwrapAndThrow(ex.getCause()); else throw new UndeclaredThrowableException(ex); } }