package mit.krb4.ui ;

public class LoginComponent
extends mit.swing.xJComponent
implements	mit.krb4.event.ValidUserRaiser
	,	mit.comm.event.DisplayResultRaiser
	,	mit.event.Listener
{
	private mit.event.RaiserAdapter raiserAdapter = new mit.event.RaiserAdapter( this ) ;
	public mit.event.RaiserAdapter getRaiserAdapter() { return this.raiserAdapter ; }
	public void setRaiserAdapter( mit.event.RaiserAdapter raiserAdapter ) { this.raiserAdapter = raiserAdapter ; }

	private mit.event.ListenerAdapter listenerAdapter = new mit.event.ListenerAdapter( this ) ;
	public mit.event.ListenerAdapter getListenerAdapter() { return this.listenerAdapter ; }
	public void setListenerAdapter( mit.event.ListenerAdapter listenerAdapter ) { this.listenerAdapter = listenerAdapter ; }

	private String userName = null ;
	public String getUserName() { return this.userName ; }
	public void setUserName( String userName ) { this.userName = userName ; }

	private String userInst = null ;
	public String getUserInst() { return this.userInst ; }
	public void setUserInst( String userInst ) { this.userInst = userInst ; }

	private String status = null ;
	public String getStatus() { return this.status ; }
	public void setStatus( String status ) { this.status = status ; }

	private String statusMessage = null ;
	public String getStatusMessage() { return this.statusMessage ; }
	public void setStatusMessage( String statusMessage ) { this.statusMessage = statusMessage ; }

	private javax.swing.JComponent resultsComponent = null ;
	public javax.swing.JComponent getResultsComponent() { return this.resultsComponent ; }
	public void setResultsComponent( javax.swing.JComponent resultsComponent ) { this.resultsComponent = resultsComponent ; }

	private java.util.Vector criteriaComponents = null ;
	public java.util.Vector getCriteriaComponents() { return this.criteriaComponents ; }
	public void setCriteriaComponents( java.util.Vector criteriaComponents ) { this.criteriaComponents = criteriaComponents ; }

	private mit.swing.xJButton[] actionButtons = null ;
	public mit.swing.xJButton[] getActionButtons() { return this.actionButtons ; }
	public void setActionButtons( mit.swing.xJButton[] actionButtons ) { this.actionButtons = actionButtons ; }

	private char[] password = null ;

	private mit.krb4.Authenticate authenticate = new mit.krb4.Authenticate() ;

	private krb4.lib.Krb4Creds creds = null ;
	public krb4.lib.Krb4Creds getCreds() { return this.creds ; }
	public void setCreds( krb4.lib.Krb4Creds creds ) { this.creds = creds ; }

	public void eventRaised( mit.event.Event e )
	{
		try
		{
			if( e instanceof mit.krb4.event.UsernameEvent )
			{
				HandleUsernameEvent( ( mit.krb4.event.UsernameEvent ) e ) ;
			}
			else if( e instanceof mit.krb4.event.PasswordEvent )
			{
				HandlePasswordEvent( ( mit.krb4.event.PasswordEvent ) e ) ;
			}
			else if( e instanceof mit.krb4.event.LoginEvent )
			{
				HandleLoginEvent( ( mit.krb4.event.LoginEvent ) e ) ;
			}
			else if( e instanceof mit.comm.event.ResultEvent )
			{
				HandleResultEvent( ( mit.comm.event.ResultEvent ) e ) ;
			}
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
	}

	private boolean userSet()
	{
		if 
		(	( null != getUserName() )
		&&	( null != password )
		)
		{
			return true ;
		}
		return false ;
	}

	private boolean serverSet()
	{
		if 
		(	( null != getUserName() )
		&&	( null != password )
		)
		{
			return true ;
		}
		return false ;
	}

	private void HandleUsernameEvent( mit.krb4.event.UsernameEvent e )
	{
		mit.krb4.event.UsernameRaiser r = ( mit.krb4.event.UsernameRaiser ) e.getSource() ;
		setUserName( r.getUserName() ) ;
	}
	
	private void HandlePasswordEvent( mit.krb4.event.PasswordEvent e )
	{
		mit.krb4.event.PasswordRaiser r = ( mit.krb4.event.PasswordRaiser ) e.getSource() ;
		password = r.getPassword() ;
	}
	
	private void HandleLoginEvent( mit.krb4.event.LoginEvent e )
	{
		try
		{
			if( userSet() )
			{
				setUserInst( "" ) ;
				int indexOfInst = getUserName().indexOf( "." ) ;
				if( -1 == indexOfInst )
				{
					indexOfInst = getUserName().indexOf( "/" ) ;
				}
				if( -1 != indexOfInst )
				{
					setUserName( getUserName().substring( 0 , indexOfInst ) ) ;
					setUserInst( getUserName().substring( indexOfInst + 1 ) ) ;
				}
				setCreds( authenticate.getUserCredentials( getUserName() , getUserInst() , password ) ) ;
				if( null != getCreds() )
				{
					( new mit.krb4.event.ValidUserEvent( this ) ).raise() ;
				}
			}
		}
		catch( Throwable ex )
		{
			setStatus( "Login failed." ) ;
			setStatusMessage( ex.getMessage() ) ;
			( new mit.comm.event.DisplayResultEvent( this ) ).raise() ;
		}
	}
	
	private void HandleResultEvent( mit.comm.event.ResultEvent e )
	{
		mit.comm.event.ResultRaiser r = ( mit.comm.event.ResultRaiser ) e.getSource() ;
		if( r.getResult().startsWith( mit.mitid.PROTOCOL.WELCOME + mit.mitid.PROTOCOL.FIELD_DELIMITER_STRING ) )
		{
			setStatus( null ) ;
			setStatusMessage( null ) ;
			setResultsComponent( null ) ;
			mit.swing.xJTextArea welcome = new mit.swing.xJTextArea() ;
			welcome.setEditable( false ) ;
			welcome.setText( r.getResult() ) ;
			( new mit.comm.event.DisplayResultEvent( this ) ).raise() ;
		}
	}
	
	public void addNotify()
	{
		super.addNotify() ;
		try
		{
			getListenerAdapter().addHandled( mit.krb4.event.UsernameEvent.class ) ;
			getListenerAdapter().addHandled( mit.krb4.event.PasswordEvent.class ) ;
			getListenerAdapter().addHandled( mit.krb4.event.LoginEvent.class ) ;
			getListenerAdapter().addHandled( mit.comm.event.ResultEvent.class ) ;
		}
		catch( Exception ex )
		{
			ex.printStackTrace() ;
		}
	}
}