/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** $Id$ ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 19Aug98 subtle start of recorded history ** */ package key; import key.events.*; import key.util.LinkedList; import java.io.IOException; import java.io.DataOutput; import java.io.DataInput; import java.util.Enumeration; import java.util.StringTokenizer; public final class Scheduler extends Daemon { private static final long serialVersionUID = 2876463129193477587L; public static final AtomicElement[] ELEMENTS = { AtomicElement.construct( Scheduler.class, Paragraph.class, "entries", AtomicElement.PUBLIC_ACCESSORS | AtomicElement.READ_ONLY | AtomicElement.GENERATED, "the entries in the scheduler" ) }; public static final AtomicStructure STRUCTURE = new AtomicStructure( Daemon.STRUCTURE, ELEMENTS ); LinkedList list; public Scheduler() { super( false ); setKey( "scheduler" ); list = new LinkedList(); } public void remove( Event evt ) { list.remove( evt.getThis() ); } public void add( Event evt ) { LinkedList.Iterator lli = list.iterator(); lli.first(); while( lli.isValid() ) { Event storedEvt = (Event) ((Reference)lli.element()).get(); if( evt.isBefore( storedEvt ) ) { lli.insertBefore( evt.getThis() ); return; } lli.next(); } list.append( evt.getThis() ); } public static final TableParagraph.Column[] columns = { new TableParagraph.Column( "event", 40 ), new TableParagraph.Column( "at", 30 ) }; public Paragraph getEntries() { TableParagraph.Generator tp = new TableParagraph.Generator( columns ); for( Enumeration e = list.elements(); e.hasMoreElements(); ) { String[] rowContents = new String[ 2 ]; Event o = (Event) ((Reference)e.nextElement()).get(); rowContents[0] = o.getId(); rowContents[1] = o.scheduledFor.toString(); tp.appendRow( rowContents ); } tp.setFooter( Integer.toString( list.count() ) + " entries" ); return( tp.getParagraph() ); } public void run() { while( true ) { try { Thread.sleep( 10000 ); // ten seconds } catch( InterruptedException e ) { } //Log.debug( this, "scanned schedule with " + list.count() + " total events" ); Reference r = (Reference) list.getFirstElement(); if( r != null ) { try { Event evt = (Event) r.get(); if( evt != null ) { if( evt.runNow() ) { remove( evt ); evt.run( this ); } } } catch( OutOfDateReferenceException e ) { System.out.println( "SCHEDULER: removed out of date reference: " + r.toString() ); list.remove( r ); } } } } public AtomicStructure getDeclaredStructure() { return( STRUCTURE ); } }