blob: 60cdc9a72a10a69c2c2fb2b40c0f5ca87bf9ab52 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.command.internal.env.core.fragment;
import org.eclipse.wst.command.internal.env.core.CommandFactory;
import org.eclipse.wst.command.internal.env.core.common.RangeVector;
/**
* This class returns a dynamically determined number of
* fragments. This loop will return the fragment parameter
* as long as the stopCondition evaluates to false. Otherwise,
* null is returned.
**/
public class LoopFragment extends AbstractCommandFragment
{
private LoopCondition stopCondition_;
private CommandFragment fragment_;
private RangeVector fragmentHistory_;
/**
* Copy contructor for this fragment.
**/
protected LoopFragment( LoopFragment fragment )
{
this( fragment.fragment_,
fragment.stopCondition_,
fragment.getCommandFactory(),
fragment.getId() );
}
public LoopFragment( CommandFragment fragment,
LoopCondition stopCondition )
{
this( fragment, stopCondition, null, "" );
}
/**
* @param fragment the fragment that will be returned by the loop.
* @param stopCondition when false the fragment will be returned,
* otherwise null is returned.
* @param state the state passed to the condition.
* @param command the executable command for this fragment.
**/
public LoopFragment( CommandFragment fragment,
LoopCondition stopCondition,
CommandFactory commandFactory,
String id )
{
super( commandFactory, id );
fragment_ = fragment;
stopCondition_ = stopCondition;
fragmentHistory_ = new RangeVector();
}
/**
* Makes a copy of the CommandFragment.
*
* @return returns a copy of this fragment.
**/
public Object clone()
{
return new LoopFragment( this );
}
/**
* Returns the index of the fragment
*
* @param fragment the fragment to search.
* @return the index of this fragment.
**/
public int indexOf( CommandFragment fragment )
{
return fragmentHistory_.indexOf( fragment );
}
/**
* Gets the first child fragment for this fragment.
*
* @return returns the first child fragment for this fragment. Returns
* null when there is no first child.
**/
public CommandFragment getFirstSubFragment()
{
return getNextSubFragment( null );
}
/**
* Gets the next child fragment for this fragment.
*
* @return returns the next child fragment for this fragment. Returns null
* when there is no next child.
**/
public CommandFragment getNextSubFragment( CommandFragment frag )
{
CommandFragment nextFrag = null;
if( stopCondition_.evaluate( this, frag ) )
{
// The stop condition has been met.
// Do nothing.
}
else
{
int fragIndex = indexOf( frag );
// Note: when fragment == null the fragIndex
// should be -1. Therefore, if there
// is already a first fragment in
// fragmentHistory that will be returned.
if( fragIndex + 1 < fragmentHistory_.size() )
{
// We have a copy of the fragment already.
nextFrag = (CommandFragment)(fragmentHistory_.elementAt( fragIndex + 1 ));
}
else
{
nextFrag = (CommandFragment)(fragment_.clone());
fragmentHistory_.add( nextFrag );
}
}
return nextFrag;
}
}