/*
** 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 java.util.Enumeration;
import java.util.NoSuchElementException;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* A group is a specialised version of scape in that
* it has both online (currently linked in) members,
* and offline (not-currently linked in) members.
*/
public class Group extends Scape
{
private static final long serialVersionUID = -2114633670388062310L;
public Group()
{
super( true );
setConstraint( Type.PLAYER );
}
protected void constructed()
{
super.constructed();
init();
}
public void loaded()
{
super.loaded();
init();
}
// needs to be called when loaded & when created
private void init()
{
// groups need to be notified when someone logs in
try
{
LoginNotification.register( this );
}
catch( Exception e )
{
Log.error( "during Group::init()", e );
}
// we need to scan all online players to see
// if we should link anyone into this group
for( Enumeration e = Key.instance().players(); e.hasMoreElements(); )
{
Player p = (Player) e.nextElement();
if( contains( p ) )
{
try
{
establish( p );
}
catch( Exception ex )
{
}
}
}
}
public void clearTransient()
{
try
{
LoginNotification.unregister( this );
}
catch( Exception e )
{
e.printStackTrace();
}
}
protected void addInternal( Reference added ) throws BadKeyException, NonUniqueKeyException
{
super.addInternal( added );
//Log.debug( this, "add on Group " + getName() + " called, with added a " + Type.typeOf( added ).getName() );
if( added.isLoaded() )
{
Atom a = (Atom) added.get();
if( a instanceof Player && ((Player)a).connected() )
establish( (Player) a );
}
}
public void argument( String args ) throws IllegalArgumentException
{
throw new IllegalArgumentException( "no arguments to atom '" + getName() + "'" );
}
protected void noSideEffectRemove( Reference removed ) throws NonUniqueKeyException,NoSuchElementException,BadKeyException
{
super.noSideEffectRemove( removed );
// TODO: deestablish scape link
if( removed.isLoaded() )
{
Atom r = removed.get();
if( r instanceof Player && ((Player)r).connected() )
{
//System.out.println( "(normal) removed online player from group " + getId() );
unlinkPlayer( (Player) r );
}
}
}
public void splash( Effect t, SuppressionList s )
{
//if( t instanceof key.effect.Connection )
//{
if( t instanceof key.effect.Login )
{
Player p = (Player) t.getOriginator();
if( contains( p ) )
{
try
{
establish( p );
}
catch( Exception e )
{
Log.error( e );
}
}
if( !propagateLoginEffect() )
return;
}
//}
super.splash( t, s );
}
/**
* If this scape should pass login effects through to
* players, this function should return true. In general,
* this should only occur
*/
protected boolean propagateLoginEffect()
{
return( false );
}
/**
* Given that the player is now linked into this Group,
* he's online, so we're going to link him in
*/
public void establish( Player p ) throws BadKeyException,NonUniqueKeyException
{
linkPlayer( p );
//System.out.println( "linking player " + p.getName() + " into group " + getId() );
}
}