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 }