package de.unisiegen.gtitool.core.exceptions.machine;
import java.util.ArrayList;
import de.unisiegen.gtitool.core.entities.State;
import de.unisiegen.gtitool.core.exceptions.CoreException;
import de.unisiegen.gtitool.core.exceptions.StatesInvolvedException;
import de.unisiegen.gtitool.core.i18n.Messages;
import de.unisiegen.gtitool.core.parser.style.PrettyString;
import de.unisiegen.gtitool.core.parser.style.PrettyToken;
import de.unisiegen.gtitool.core.parser.style.Style;
/**
* The {@link MachineStateStartException} is used, if no start state is defined
* or more than one start state is defined.
*
* @author Christian Fehler
* @version $Id: MachineStateStartException.java 946 2008-05-30 14:27:24Z fehler
* $
*/
public final class MachineStateStartException extends MachineException
implements StatesInvolvedException
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = -6464106217286292160L;
/**
* The list of {@link State}s.
*/
private ArrayList < State > stateList = new ArrayList < State > ();
/**
* Allocates a new {@link MachineStateStartException}.
*
* @param stateList The list of {@link State}s.
*/
public MachineStateStartException ( ArrayList < State > stateList )
{
// StateList
if ( stateList == null )
{
throw new NullPointerException ( "state list is null" ); //$NON-NLS-1$
}
this.stateList = stateList;
// StateList
if ( stateList.size () == 1 )
{
throw new IllegalArgumentException ( "no exception: one start state" ); //$NON-NLS-1$
}
// Message and description
if ( stateList.size () == 0 )
{
setPrettyMessage ( Messages
.getPrettyString ( "MachineStateStartException.NoStartStateMessage" ) ); //$NON-NLS-1$
setPrettyDescription ( Messages
.getPrettyString ( "MachineStateStartException.NoStartStateDescription" ) ); //$NON-NLS-1$
}
else
{
setPrettyMessage ( Messages
.getPrettyString ( "MachineStateStartException.MoreThanOneStartStateMessage" ) ); //$NON-NLS-1$
PrettyString prettyString = new PrettyString ();
for ( int i = 0 ; i < stateList.size () ; i++ )
{
prettyString.add ( stateList.get ( i ) );
if ( i < stateList.size () - 2 )
{
prettyString.add ( new PrettyToken ( ", ", Style.NONE ) ); //$NON-NLS-1$
}
if ( i == stateList.size () - 2 )
{
prettyString.add ( new PrettyToken ( " " //$NON-NLS-1$
+ Messages.getString ( "And" ) + " ", Style.NONE ) ); //$NON-NLS-1$ //$NON-NLS-2$
}
}
setPrettyDescription ( Messages.getPrettyString (
"MachineStateStartException.MoreThanOneStartStateDescription", //$NON-NLS-1$
prettyString ) );
}
}
/**
* {@inheritDoc}
*
* @see StatesInvolvedException#getState()
*/
public final ArrayList < State > getState ()
{
return this.stateList;
}
/**
* {@inheritDoc}
*
* @see CoreException#getType()
*/
@Override
public final ErrorType getType ()
{
return ErrorType.ERROR;
}
/**
* {@inheritDoc}
*
* @see Throwable#toString()
*/
@Override
public final String toString ()
{
String lineBreak = System.getProperty ( "line.separator" ); //$NON-NLS-1$
StringBuilder result = new StringBuilder ( super.toString () );
result.append ( lineBreak );
result.append ( "States: " ); //$NON-NLS-1$
for ( int i = 0 ; i < this.stateList.size () ; i++ )
{
if ( i > 0 )
{
result.append ( ", " ); //$NON-NLS-1$
}
result.append ( this.stateList.get ( i ).getName () );
}
return result.toString ();
}
}