1 package prefuse.data.io.sql; 2 3 import java.util.logging.Logger ; 4 5 import prefuse.data.Table; 6 import prefuse.data.io.DataIOException; 7 import prefuse.util.PrefuseConfig; 8 import prefuse.util.StringLib; 9 import prefuse.util.collections.CopyOnWriteArrayList; 10 11 20 public class DataSourceWorker extends Thread { 21 22 private static Logger s_logger 23 = Logger.getLogger(DataSourceWorker.class.getName()); 24 25 private static DataSourceWorker s_instance; 27 28 private static CopyOnWriteArrayList s_queue; 29 30 35 public synchronized static void submit(Entry e) 36 { 37 if ( s_queue == null ) 39 s_queue = new CopyOnWriteArrayList(); 40 if ( s_instance == null ) 41 s_instance = new DataSourceWorker(); 42 43 s_queue.add(e); 45 46 synchronized ( s_instance ) { 48 s_instance.notify(); 49 } 50 } 51 52 54 57 private DataSourceWorker() { 58 super("prefuse_DatabaseWorker"); 59 60 int priority = PrefuseConfig.getInt("data.io.worker.threadPriority"); 61 if ( priority >= Thread.MIN_PRIORITY && 62 priority <= Thread.MAX_PRIORITY ) 63 { 64 this.setPriority(priority); 65 } 66 this.setDaemon(true); 67 this.start(); 68 } 69 70 73 public void run() { 74 while ( true ) { 75 Entry e = null; 76 synchronized ( s_queue ) { 77 if ( s_queue.size() > 0 ) 78 e = (Entry)s_queue.remove(0); 79 } 80 81 if ( e != null ) { 82 try { 83 if ( e.listener != null ) e.listener.preQuery(e); 84 e.ds.getData(e.table, e.query, e.keyField, e.lock); 85 if ( e.listener != null ) e.listener.postQuery(e); 86 } catch ( DataIOException dre ) { 87 s_logger.warning(dre.getMessage() + "\n" 88 + StringLib.getStackTrace(dre)); 89 } 90 } else { 91 try { 93 synchronized (this) { wait(); } 94 } catch (InterruptedException ex) { } 95 } 96 } 97 } 98 99 103 public static class Entry { 104 116 public Entry(DatabaseDataSource ds, Table table, String query, 117 String keyField, Object lock, Listener listener) 118 { 119 this.ds = ds; 120 this.table = table; 121 this.query = query; 122 this.keyField = keyField; 123 this.lock = lock; 124 this.listener = listener; 125 } 126 127 128 DatabaseDataSource ds; 129 131 Listener listener; 132 133 Table table; 134 135 String query; 136 138 String keyField; 139 141 Object lock; 142 } 143 144 149 public static interface Listener { 150 154 public void preQuery(DataSourceWorker.Entry job); 155 159 public void postQuery(DataSourceWorker.Entry job); 160 } 161 162 } | Popular Tags |