Example usage for com.google.common.util.concurrent Futures addCallback

List of usage examples for com.google.common.util.concurrent Futures addCallback

Introduction

In this page you can find the example usage for com.google.common.util.concurrent Futures addCallback.

Prototype

public static <V> void addCallback(final ListenableFuture<V> future, final FutureCallback<? super V> callback,
        Executor executor) 

Source Link

Document

Registers separate success and failure callbacks to be run when the Future 's computation is java.util.concurrent.Future#isDone() complete or, if the computation is already complete, immediately.

Usage

From source file:com.facebook.presto.util.MoreFutures.java

public static <T> ListenableFuture<T> addTimeout(final ListenableFuture<T> future,
        final Callable<T> timeoutTask, Duration timeout, ScheduledExecutorService executorService) {
    // if the future is already complete, just return it
    if (future.isDone()) {
        return future;
    }//from   w w w  . j  av  a 2 s.co m

    // wrap the future, so we can set the result directly
    final SettableFuture<T> settableFuture = SettableFuture.create();

    // schedule a task to complete the future when the time expires
    final ScheduledFuture<?> timeoutTaskFuture = executorService.schedule(
            new TimeoutFutureTask<>(settableFuture, timeoutTask, future), timeout.toMillis(),
            TimeUnit.MILLISECONDS);

    // add a listener to the core future, which simply updates the settable future
    Futures.addCallback(future, new FutureCallback<T>() {
        @Override
        public void onSuccess(@Nullable T result) {
            settableFuture.set(result);
            timeoutTaskFuture.cancel(true);
        }

        @Override
        public void onFailure(Throwable t) {
            settableFuture.setException(t);
            timeoutTaskFuture.cancel(true);
        }
    }, executorService);

    return settableFuture;
}

From source file:com.orangerhymelabs.helenus.cassandra.database.DatabaseService.java

public void read(String name, FutureCallback<Database> callback) {
    Futures.addCallback(read(name), callback, MoreExecutors.directExecutor());
}

From source file:com.android.tools.idea.apk.viewer.diff.ApkDiffPanel.java

public ApkDiffPanel(ApkDiffParser apkDiffParser) {
    // construct the main tree
    ListenableFuture<DefaultMutableTreeNode> treeStructureFuture = apkDiffParser.constructTreeStructure();
    FutureCallBackAdapter<DefaultMutableTreeNode> setRootNode = new FutureCallBackAdapter<DefaultMutableTreeNode>() {
        @Override/*  w  w w .j  a  va 2  s  .  c o  m*/
        public void onSuccess(DefaultMutableTreeNode result) {
            setRootNode(result);
        }
    };
    Futures.addCallback(treeStructureFuture, setRootNode, EdtExecutor.INSTANCE);
}

From source file:org.glowroot.central.util.MoreFutures.java

public static <V> ListenableFuture<V> onSuccessAndFailure(ListenableFuture<V> future, Runnable onSuccess,
        Runnable onFailure) {/*from   w w w  . ja v a  2  s  .  co  m*/
    SettableFuture<V> outerFuture = SettableFuture.create();
    Futures.addCallback(future, new FutureCallback<V>() {
        @Override
        public void onSuccess(V result) {
            onSuccess.run();
            outerFuture.set(result);
        }

        @Override
        public void onFailure(Throwable t) {
            logger.debug(t.getMessage(), t);
            onFailure.run();
            outerFuture.setException(t);
        }
    }, MoreExecutors.directExecutor());
    return outerFuture;
}

From source file:com.datastax.driver.stress.AsynchronousConsumer.java

protected void handle(QueryGenerator.Request request) {

    final Reporter.Context ctx = reporter.newRequest();

    ResultSetFuture resultSetFuture = request.executeAsync(session);
    Futures.addCallback(resultSetFuture, new FutureCallback<ResultSet>() {
        @Override//from ww  w. ja  v a 2s .  c o  m
        public void onSuccess(final ResultSet result) {
            ctx.done();
            request();
        }

        @Override
        public void onFailure(final Throwable t) {
            // Could do better I suppose
            System.err.println("Error during request: " + t);
            ctx.done();
            request();
        }
    }, executorService);
}

From source file:com.spotify.futures.FuturesExtra.java

/**
 * Returns a future that fails with a {@link TimeoutException} if the parent future has not
 * finished before the timeout. The new returned future will always be executed on the provided
 * scheduledExecutorService, even when the parent future does not timeout.
 *
 * @param scheduledExecutorService executor that runs the timeout code. If the future times out,
 *                                 this is also the thread any callbacks will run on.
 * @param future                   the future to wrap as a timeout future.
 * @param timeout                  how long to wait before timing out a future
 * @param unit                     unit of the timeout
 * @return a future that may timeout before the parent future is done.
 *///from   w  w w.ja  v  a  2  s  .  c  o m
public static <T> ListenableFuture<T> makeTimeoutFuture(ScheduledExecutorService scheduledExecutorService,
        ListenableFuture<T> future, final long timeout, final TimeUnit unit) {
    final SettableFuture<T> promise = SettableFuture.create();

    scheduledExecutorService.schedule(new Runnable() {
        @Override
        public void run() {
            String message = "Future timed out after " + timeout + " " + unit.name();
            promise.setException(new TimeoutException(message));
        }
    }, timeout, unit);

    Futures.addCallback(future, new FutureCallback<T>() {
        @Override
        public void onSuccess(T result) {
            promise.set(result);
        }

        @Override
        public void onFailure(Throwable t) {
            promise.setException(t);
        }
    }, scheduledExecutorService);

    return promise;
}

From source file:com.orangerhymelabs.helenus.cassandra.database.DatabaseService.java

public void readAll(FutureCallback<List<Database>> callback, Object... parms) {
    Futures.addCallback(readAll(parms), callback, MoreExecutors.directExecutor());
}

From source file:io.v.v23.InputChannels.java

private static <T> FutureCallback<T> newCallbackForList(final InputChannel<T> channel, final List<T> list,
        final SettableFuture<List<T>> future, final Executor executor) {
    return new FutureCallback<T>() {
        @Override//  w  ww  . j  av a  2  s.c  o m
        public void onSuccess(T result) {
            list.add(result);
            Futures.addCallback(channel.recv(), newCallbackForList(channel, list, future, executor), executor);
        }

        @Override
        public void onFailure(Throwable t) {
            if (t instanceof EndOfFileException) {
                future.set(list);
            } else {
                future.setException(t);
            }
        }
    };
}

From source file:io.v.android.apps.reader.DeviceSetChooserActivity.java

@Override
protected void onStart() {
    super.onStart();

    // Set the adapter only after the DB is initialized.
    Futures.addCallback(getDB().onInitialized(), new FutureCallback<Void>() {

        @Override//w w  w . j a v a  2  s  . c o  m
        public void onSuccess(Void result) {
            // The adapter for the recycler view
            mAdapter = new DeviceSetListAdapter(DeviceSetChooserActivity.this);

            // When a file is clicked from the list, start the PdfViewerActivity.
            mAdapter.setOnDeviceSetClickListener((adapter, v, position) -> {
                Intent intent = PdfViewerActivity.createIntent(getApplicationContext(),
                        adapter.getDeviceSetId(position));
                startActivity(intent);
            });

            mRecyclerView.setAdapter(mAdapter);
        }

        @Override
        public void onFailure(Throwable t) {
            Log.e(TAG, "Could not initialize the database.", t);
        }

    }, Utils.mainThreadExecutor());

    // ItemTouchHelper for handling the swipe action.
    ItemTouchHelper.SimpleCallback touchCallback;
    touchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            // Delete the device set on left swipe.
            if (direction == ItemTouchHelper.LEFT) {
                getDB().deleteDeviceSet(mAdapter.getDeviceSetId(viewHolder.getLayoutPosition()));
            }
        }
    };
    new ItemTouchHelper(touchCallback).attachToRecyclerView(mRecyclerView);
}

From source file:com.skcraft.launcher.update.UpdateManager.java

public void performUpdate(final Window window) {
    final URL url = pendingUpdateUrl;

    if (url != null) {
        SelfUpdater downloader = new SelfUpdater(launcher, url);
        ObservableFuture<File> future = new ObservableFuture<File>(launcher.getExecutor().submit(downloader),
                downloader);//from  ww  w . jav  a2s.c  o  m

        Futures.addCallback(future, new FutureCallback<File>() {
            @Override
            public void onSuccess(File result) {
                propertySupport.firePropertyChange("pendingUpdate", true, false);
                UpdateManager.this.pendingUpdateUrl = null;

                SwingHelper.showMessageDialog(window, SharedLocale.tr("launcher.selfUpdateComplete"),
                        SharedLocale.tr("launcher.selfUpdateCompleteTitle"), null,
                        JOptionPane.INFORMATION_MESSAGE);
            }

            @Override
            public void onFailure(Throwable t) {
            }
        }, SwingExecutor.INSTANCE);

        ProgressDialog.showProgress(window, future, SharedLocale.tr("launcher.selfUpdatingTitle"),
                SharedLocale.tr("launcher.selfUpdatingStatus"));
        SwingHelper.addErrorDialogCallback(window, future);
    } else {
        propertySupport.firePropertyChange("pendingUpdate", false, false);
    }
}