/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
**
** $Id$
**
** Class History
**
** Date Name Description
** ---------|------------|-----------------------------------------------
** 27Aug98 subtle start of recorded history
**
*/
package key.events;
import key.*;
import java.util.Enumeration;
import java.io.*;
import java.util.StringTokenizer;
public class Census extends Event
{
public static final AtomicElement[] ELEMENTS =
{
// String getName();
AtomicElement.construct( Census.class, Reference.class, "container",
AtomicElement.PUBLIC_FIELD,
"the container to scan in" ),
AtomicElement.construct( Census.class, String.class, "scan",
AtomicElement.PUBLIC_FIELD,
"the scan parameters" )
};
public static final AtomicStructure STRUCTURE = new AtomicStructure( Event.STRUCTURE, ELEMENTS );
Reference container = Reference.EMPTY;
String scan = null;
public Census()
{
}
public AtomicStructure getDeclaredStructure()
{
return( STRUCTURE );
}
public void run( Daemon scheduler )
{
if( container != null )
{
Container c = (Container) container.get();
if( c != null )
{
String scanLine = scan;
if( scanLine != null )
{
Log.debug( this, "scanning container " + c.getId() );
Type type = null;
IntegerCensus integerCensusData = null;
for( Enumeration e = c.elements(); e.hasMoreElements(); )
{
Atom a = (Atom) e.nextElement();
Log.debug( this, " scanning " + a.getName() );
Object o = new Search( scanLine, Key.instance() ).result;
if( type != null )
{
Type scannedType = Type.typeOf( o );
if( scannedType != type )
{
Log.debug( this, " invalid " + scannedType.getName() + " type doesn't match previously scanned " + type.getName() + " type." );
continue;
}
}
else
type = Type.typeOf( o );
if( type == Type.INTEGER )
{
int v = ((Integer)o).intValue();
if( integerCensusData == null )
{
integerCensusData = new IntegerCensus( v );
}
else
{
integerCensusData.sum += v;
integerCensusData.count++;
if( integerCensusData.largest < v )
integerCensusData.largest = v;
if( integerCensusData.smallest > v )
integerCensusData.smallest = v;
}
}
else
{
Log.debug( this, "Unsupported census data type '" + type.getName() + "'" );
return;
}
Thread.yield();
}
Log.debug( this, "Census complete - type was '" + type.getName() +"'" );
if( integerCensusData != null )
Log.debug( this, integerCensusData.toString() );
}
else
Log.debug( this, "scanLine null" );
}
else
Log.debug( this, "container null" );
}
else
Log.debug( this, "container null" );
}
}
class IntegerCensus
{
public int sum;
public int count;
public int largest;
public int smallest;
public IntegerCensus( int v )
{
sum = v;
count = 1;
largest = v;
smallest = v;
}
public String toString()
{
return( count + " integers, adding to " + sum + ". The values ranged between " + smallest + " and " + largest );
}
}