package rabbitescape.engine.solution;
import static rabbitescape.engine.util.Util.*;
import java.util.Arrays;
import rabbitescape.engine.err.RabbitEscapeException;
import rabbitescape.engine.util.Util;
public class SolutionCommand
{
public final class WaitActionInMultiActionCommand extends RabbitEscapeException
{
private static final long serialVersionUID = 1L;
final public String command;
public WaitActionInMultiActionCommand( String command )
{
this.command = command;
}
}
public final CommandAction[] actions;
/**
* If the supplied array (vararg) of CommandActions is empty
* a default WaitAction of 1 step will be created. The solution fragment
* ";;" has implied ones, "1;1;".
*/
public SolutionCommand( CommandAction... actions )
{
if ( 0 == actions.length )
{
this.actions = new CommandAction[] { new WaitAction( 1 ) };
}
else
{
this.actions = actions;
}
checkWaitInMultiAction();
}
private void checkWaitInMultiAction()
{
if ( actions.length > 1 )
{
for ( CommandAction a: actions )
{
if ( a instanceof WaitAction )
{
throw new WaitActionInMultiActionCommand( this.toString() );
}
}
}
}
@Override
public String toString()
{
return "SolutionCommand( "
+ Util.join( ", ", toStringList( actions ) )
+ " )";
}
@Override
public boolean equals( Object other )
{
if ( ! ( other instanceof SolutionCommand ) )
{
return false;
}
SolutionCommand otherSolution = (SolutionCommand)other;
return Arrays.deepEquals( actions, otherSolution.actions );
}
/**
* Try to combine two commands. If this is not possible then return null.
*/
public static SolutionCommand tryToSimplify(
SolutionCommand existingCmd, SolutionCommand newCmd )
{
if( null == existingCmd || null == newCmd )
{
return null;
}
CommandAction action1 = existingCmd.actions[0];
CommandAction action2 = newCmd.actions[0];
if (
action1 instanceof WaitAction
&& action2 instanceof WaitAction
)
{
WaitAction wait1 = (WaitAction)action1;
WaitAction wait2 = (WaitAction)action2;
return new SolutionCommand(
new WaitAction( wait1.steps + wait2.steps ) );
}
return null;
}
@Override
public int hashCode()
{
return Arrays.deepHashCode( actions );
}
public CommandAction lastAction()
{
if ( actions.length == 0 )
{
return null;
}
else
{
return actions[ actions.length - 1 ];
}
}
}