/* * Copyright (C) 2011 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.errai.bus.client.api.base; import org.jboss.errai.common.client.api.ErrorCallback; import org.jboss.errai.common.client.api.Assert; import org.jboss.errai.common.client.api.tasks.HasAsyncTaskRef; import org.jboss.errai.bus.client.api.messaging.Message; /** * An error callback decorator for repeating tasks which automatically cancels * them when they cause an error. Can also be used on its own, without wrapping * another error callback. */ public class AsyncDelegateErrorCallback implements ErrorCallback<Message> { private final HasAsyncTaskRef asyncTaskRef; private final ErrorCallback delegate; /** * Creates an error callback that optionally wraps another error callback. In * either case, future executions of the given task will be cancelled. * * @param task * The task whose failures will be handled by this wrapper callback. * Must not be null. * @param delegate * The ErrorCallback that should be wrapped. Can be null, in which * case errors in executions of {@code task} are logged to System.out. */ public AsyncDelegateErrorCallback(final HasAsyncTaskRef task, final ErrorCallback delegate) { this.asyncTaskRef = Assert.notNull(task); this.delegate = delegate; } /** * Cancels future executions of the task by calling * {@link org.jboss.errai.common.client.api.tasks.AsyncTask#cancel(boolean)} on the AsyncTask that controls its execution. * * @return the value returned by the delegate error handler's * <code>error()</code> method. If there is no delegate, the return * value is always {@code true}. */ @Override public boolean error(final Message message, final Throwable throwable) { if (asyncTaskRef.getAsyncTask() == null) { System.err.println("Unable to access async task reference! Cannot safely cancel task."); } else { asyncTaskRef.getAsyncTask().cancel(true); } if (delegate == null) { throwable.printStackTrace(System.out); return true; } else { return delegate.error(message, throwable); } } }