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    }