/*
** j###t ########## #### ####
** j###t ########## #### ####
** j###T "###L J###"
** ######P' ########## #########
** ######k, ########## T######T
** ####~###L ####
** #### q###L ########## .#####
** #### \###L ########## #####"
**
** $Id$
**
** Class History
**
** Date Name Description
** ---------|------------|-----------------------------------------------
** 28Jan98 subtle created
**
*/
package key;
import key.util.MultiEnumeration;
import java.util.Vector;
import java.util.Enumeration;
/**
* This class contains the structure of the various subclasses
* of an Atom. It is essentially a table which may be looked
* up to determine the 'visible' properties of an Atom. A
* visible property may, for instance, be the atoms "Name", or
* a players "Title".
*
* META: Efficiency: You could write an enumerator for a
* array and use that, instead of putting it into a vector
* and double storing everything.
*/
public final class AtomicStructure
{
private AtomicStructure parent;
private Vector elements;
public AtomicStructure( AtomicStructure ourParent, AtomicElement[] ourElements )
{
parent = ourParent;
elements = new Vector( ourElements.length, 1 );
for( int i = 0; i < ourElements.length; i++ )
elements.addElement( ourElements[i] );
}
public AtomicStructure getParent()
{
return( parent );
}
public Enumeration elements()
{
if( parent != null )
return( new MultiEnumeration( parent.elements(), elements.elements() ) );
else
return( elements.elements() );
}
public AtomicElement getElement( String name )
{
name = name.toLowerCase();
int hc = name.hashCode();
for( Enumeration e = elements(); e.hasMoreElements(); )
{
AtomicElement ae = (AtomicElement) e.nextElement();
//System.out.println( "Scanning (for '" + name + "'): " + ae.getName() );
// only bother doing a string compare if these
// are equivalent
if( ae.getHashCode() == hc )
{
if( ae.getLowerName().equalsIgnoreCase( name ) )
return( ae );
//else
//System.out.println( " but " + ae.getName() + " != " + name );
}
}
return( null );
}
}