001 /*
002 * Created on Jul 22, 2008
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2008-2010 the original author or authors.
015 */
016 package org.fest.swing.edt;
017
018 import static javax.swing.SwingUtilities.isEventDispatchThread;
019 import static org.fest.swing.exception.ActionFailedException.actionFailure;
020
021 import org.fest.swing.exception.ActionFailedException;
022
023 /**
024 * Understands executing an action, in the event dispatch thread, that returns a value.
025 * @param <T> the return type of the action to execute.
026 *
027 * @author Alex Ruiz
028 */
029 public abstract class GuiQuery<T> extends GuiAction {
030
031 private T result;
032
033 /**
034 * Executes the query in the event dispatch thread. This method waits until the action has finish its execution.
035 * @throws ActionFailedException if this task is not executed in the event dispatch thread.
036 */
037 public final void run() {
038 if (!isEventDispatchThread())
039 throw actionFailure("Query should be executed in the event dispatch thread");
040 try {
041 result = executeInEDT();
042 } catch (Throwable t) {
043 catchedException(t);
044 } finally {
045 notifyExecutionCompleted();
046 }
047 }
048
049 /**
050 * Specifies the action to execute in the event dispatch thread.
051 * @return the result of the execution of the action.
052 * @throws Throwable any error thrown when executing an action in the event dispatch thread.
053 */
054 protected abstract T executeInEDT() throws Throwable;
055
056 final T result() { return result; }
057
058 final void clearResult() {
059 result = null;
060 }
061 }