Clover coverage report - DrJava Test Coverage (drjava-20120422-r5456)
Coverage timestamp: Sun Apr 22 2012 03:13:25 CDT
file stats: LOC: 134   Methods: 14
NCLOC: 58   Classes: 2
 
 Source file Conditionals Statements Methods TOTAL
SwingWorker.java 0% 0% 0% 0%
coverage
 1    /*BEGIN_COPYRIGHT_BLOCK
 2    *
 3    * Copyright (c) 2001-2010, JavaPLT group at Rice University (drjava@rice.edu)
 4    * All rights reserved.
 5    *
 6    * Redistribution and use in source and binary forms, with or without
 7    * modification, are permitted provided that the following conditions are met:
 8    * * Redistributions of source code must retain the above copyright
 9    * notice, this list of conditions and the following disclaimer.
 10    * * Redistributions in binary form must reproduce the above copyright
 11    * notice, this list of conditions and the following disclaimer in the
 12    * documentation and/or other materials provided with the distribution.
 13    * * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
 14    * names of its contributors may be used to endorse or promote products
 15    * derived from this software without specific prior written permission.
 16    *
 17    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 18    * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 19    * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 20    * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 21    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 22    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 23    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 24    * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 25    * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 26    * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 27    * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 28    *
 29    * This software is Open Source Initiative approved Open Source Software.
 30    * Open Source Initative Approved is a trademark of the Open Source Initiative.
 31    *
 32    * This file is part of DrJava. Download the current version of this project
 33    * from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
 34    *
 35    * END_COPYRIGHT_BLOCK*/
 36   
 37    package edu.rice.cs.util.swing;
 38   
 39    import java.awt.EventQueue;
 40   
 41    /** SwingWorker, adapted from Sun's Java Tutorial. This is the 3rd version of SwingWorker (also known as
 42    * SwingWorker 3), an abstract class that you subclass to perform GUI-related work in a dedicated thread. For
 43    * instructions on using this class, see: http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
 44    *
 45    * Note that the API changed slightly in the 3rd version: you must now invoke start() on the SwingWorker after
 46    * creating it.
 47    * @version $Id: SwingWorker.java 5175 2010-01-20 08:46:32Z mgricken $
 48    */
 49    public abstract class SwingWorker {
 50    private volatile Object _value; // see getValue(), setValue()
 51    // private Thread _thread;
 52   
 53    /** Class to maintain reference to current worker thread under separate synchronization control. */
 54    private static class ThreadVar {
 55    private volatile Thread _thread;
 56  0 ThreadVar(Thread t) { _thread = t; }
 57  0 Thread get() { return _thread; }
 58  0 void clear() { _thread = null; }
 59    }
 60   
 61    private volatile ThreadVar _threadVar;
 62   
 63    /** Gets the value produced by the worker thread, or null if it hasn't been constructed yet. */
 64  0 protected Object getValue() { return _value; }
 65   
 66    /** Sets the value produced by worker thread. */
 67  0 private void setValue(Object x) { _value = x; }
 68   
 69    /** Compute the value to be returned by the <code>get</code> method. */
 70    public abstract Object construct();
 71   
 72    /** Called from the event dispatching thread (not on the worker thread) after the <code>construct</code> method
 73    * has returned.
 74    */
 75  0 public void finished() { }
 76   
 77    /** A new method that interrupts the worker thread. Call this method to force the worker to stop what it's doing. */
 78  0 public void interrupt() {
 79  0 Thread t = _threadVar.get();
 80  0 if (t != null) t.interrupt();
 81  0 _threadVar.clear();
 82    }
 83   
 84    /** Return the value created by the <code>construct</code> method. Returns null if either the constructing thread
 85    * or the current thread was interrupted before a value was produced.
 86    * @return the value created by the <code>construct</code> method
 87    */
 88  0 public Object get() {
 89  0 while (true) {
 90  0 Thread t = _threadVar.get();
 91  0 if (t == null) return getValue();
 92  0 try { t.join(); }
 93    catch (InterruptedException e) {
 94  0 Thread.currentThread().interrupt(); // propagate
 95  0 return null;
 96    }
 97    }
 98    }
 99   
 100    /** Start a thread that will call the <code>construct</code> method and then exit. */
 101  0 public SwingWorker() {
 102  0 final Runnable doFinished = new Runnable() {
 103  0 public void run() { finished(); }
 104    };
 105   
 106  0 Runnable doConstruct = new Runnable() {
 107  0 public void run() {
 108  0 try { setValue(construct()); }
 109    catch (final RuntimeException e) {
 110    // Throw the exception in the event dispatching thread.
 111  0 EventQueue.invokeLater(new Runnable() { public void run() { throw e; } });
 112  0 throw e;
 113    }
 114    catch (final Error e) {
 115    // Throw the error in the event dispatching thread.
 116  0 EventQueue.invokeLater(new Runnable() { public void run() { throw e; } });
 117  0 throw e;
 118    }
 119  0 finally { _threadVar.clear(); }
 120   
 121  0 EventQueue.invokeLater(doFinished);
 122    }
 123    };
 124   
 125  0 Thread t = new Thread(doConstruct);
 126  0 _threadVar = new ThreadVar(t);
 127    }
 128   
 129    /** Start the worker thread. */
 130  0 public void start() {
 131  0 Thread t = _threadVar.get();
 132  0 if (t != null) t.start();
 133    }
 134    }