# Class GenericController

java.lang.Object
org.apache.jmeter.testelement.AbstractTestElement
org.apache.jmeter.control.GenericController

All Implemented Interfaces:
  `Serializable, Cloneable, Controller, Searchable, TestElement, TestCompilerHelper`

Direct Known Subclasses:
  `CriticalSectionController, ForeachController, IfController, IncludeController, InterleaveControl, LoopController, ModuleController, OnceOnlyController, ProxyControl, RandomOrderController, RecordingController, RunTime, SwitchController, TestFragmentController, ThroughputController, TransactionController, WhileController`

public class GenericController extends AbstractTestElement implements Controller, Serializable, TestCompilerHelper

This class is the basis for all the controllers. It also implements SimpleController.

The main entry point is next(), which is called by by JMeterThread as follows:

`while (running && (sampler = controller.next()) != null)`

See Also:
  - Serialized Form

## Field Summary

Fields
Modifier and Type
Field
Description
`protected int`
`current`
Index of current sub controller or sampler
`protected List<TestElement>`
`subControllersAndSamplers`

### Fields inherited from interface TestElement

`COMMENTS, ENABLED, GUI_CLASS, NAME, TEST_CLASS`

## Constructor Summary

Constructors
Constructor
Description
`GenericController()`
Creates a Generic Controller

## Method Summary

Modifier and Type
Method
Description
`void`
`addIterationListener(LoopIterationListener lis)`
Controllers have to notify listeners of when they begin an iteration through their sub-elements.
`void`
`addTestElement(TestElement child)`
`final boolean`
`addTestElementOnce(TestElement child)`
Add child test element only if it has not already been added.
`protected void`
`currentReturnedNull(Controller c)`
If the controller is done, remove it from the list, otherwise increment to next entry in list.
`protected void`
`fireIterationStart()`
`protected void`
`fireIterEvents()`
`protected TestElement`
`getCurrentElement()`
Gets the element indicated by the `current` index, if one exists, from the `subControllersAndSamplers` list.
`protected int`
`getIterCount()`
`protected List<TestElement>`
`getSubControllers()`
Gets the SubControllers attribute of the GenericController object
`protected void`
`incrementCurrent()`
Increments the current pointer; called by currentReturnedNull to move the controller on to its next child.
`protected void`
`incrementIterCount()`
`void`
`initialize()`
Called to initialize a controller at the beginning of a test iteration.
`protected void`
`initializeSubControllers()`
(re)Initializes sub controllers See Bug 50032
`boolean`
`isDone()`
Indicates whether the Controller is done delivering Samplers for the rest of the test.
`protected boolean`
`isFirst()`
`Sampler`
`next()`
Determines the next sampler to be processed.
`protected Sampler`
`nextIsAController(Controller controller)`
Called by `next()` if the element is a Controller, and returns the next sampler from the controller.
`protected Sampler`
`nextIsASampler(Sampler element)`
Increment the current pointer and return the element.
`protected Sampler`
`nextIsNull()`
Called by `next()` when `getCurrentElement()` returns `null`.
`protected Object`
`readResolve()`
`protected void`
`reInitialize()`
Resets the controller (called after execution of last child of controller): resetCurrent() (i.e. current=0) increment iteration count sets first=true recoverRunningVersion() to set the controller back to the initial state
`protected void`
`reInitializeSubController()`
Deprecated.
replaced by GeneriController#initializeSubControllers
`protected void`
`removeCurrentElement()`
`void`
`removeIterationListener(LoopIterationListener iterationListener)`
Remove listener
`protected void`
`resetCurrent()`
`protected void`
`resetIterCount()`
`protected void`
`setCurrentElement(TestElement currentElement)`
Empty implementation - does nothing.
`protected void`
`setDone(boolean done)`
`void`
`setFirst(boolean b)`
If b is true, it means first is reset which means Controller has executed all its children
`void`
`triggerEndOfLoop()`
Trigger end of loop condition on controller (used by Start Next Loop feature)

### Methods inherited from class AbstractTestElement

`addPropertiesValues, addProperty, addProperty, canRemove, clear, clearTemporary, clearTestElementChildren, clone, emptyTemporary, equals, getComment, getName, getProperty, getPropertyAsBoolean, getPropertyAsBoolean, getPropertyAsDouble, getPropertyAsFloat, getPropertyAsInt, getPropertyAsInt, getPropertyAsLong, getPropertyAsLong, getPropertyAsString, getPropertyAsString, getSearchableTokens, getThreadContext, getThreadName, hashCode, isEnabled, isRunningVersion, isTemporary, logProperties, mergeIn, propertyIterator, recoverRunningVersion, removeProperty, setComment, setEnabled, setName, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setRunningVersion, setTemporary, setThreadContext, setThreadName, traverse, traverseCollection, traverseMap, traverseProperty`

### Methods inherited from class Object

`finalize, getClass, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface TestElement

`canRemove, clear, clearTestElementChildren, clone, getComment, getName, getProperty, getPropertyAsBoolean, getPropertyAsBoolean, getPropertyAsDouble, getPropertyAsFloat, getPropertyAsInt, getPropertyAsInt, getPropertyAsLong, getPropertyAsLong, getPropertyAsString, getPropertyAsString, getThreadContext, getThreadName, isEnabled, isRunningVersion, isTemporary, propertyIterator, recoverRunningVersion, removeProperty, setComment, setEnabled, setName, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setProperty, setRunningVersion, setTemporary, setThreadContext, setThreadName, traverse`

## Field Details

### subControllersAndSamplers

protected transient List<TestElement> subControllersAndSamplers

### current

protected transient int current
Index of current sub controller or sampler

## Constructor Details

### GenericController

public GenericController()
Creates a Generic Controller

## Method Details

### initialize

public void initialize()
Description copied from interface: `Controller`
Called to initialize a controller at the beginning of a test iteration.

Specified by:
  `initialize` in interface `Controller`

### initializeSubControllers

protected void initializeSubControllers()
(re)Initializes sub controllers See Bug 50032

### reInitialize

protected void reInitialize()
Resets the controller (called after execution of last child of controller):

- resetCurrent() (i.e. current=0)
- increment iteration count
- sets first=true
- recoverRunningVersion() to set the controller back to the initial state

### next

public Sampler next()

Determines the next sampler to be processed.

If `isDone()` is `true`, returns null.

Gets the list element using current pointer. If this is `null`, calls `nextIsNull()`.

If the list element is a `Sampler`, calls `nextIsASampler(Sampler)`, otherwise calls `nextIsAController(Controller)`

If any of the called methods throws `NextIsNullException`, returns `null`, otherwise the value obtained above is returned.

Specified by:
  `next` in interface `Controller`
Returns:
  the next sampler or `null`

### isDone

public boolean isDone()
Description copied from interface: `Controller`
Indicates whether the Controller is done delivering Samplers for the rest of the test. When the top-level controller returns true to JMeterThread, the thread is complete.

Specified by:
  `isDone` in interface `Controller`
Returns:
  boolean
See Also:
  - `Controller.isDone()`

### setDone

protected void setDone(boolean done)

### isFirst

protected boolean isFirst()

Returns:
  true if it's the controller is returning the first of its children

### setFirst

public void setFirst(boolean b)
If b is true, it means first is reset which means Controller has executed all its children

Parameters:
  `b` - The flag, whether first is reseted

### nextIsAController

protected Sampler nextIsAController(Controller controller) throws NextIsNullException
Called by `next()` if the element is a Controller, and returns the next sampler from the controller. If this is `null`, then updates the current pointer and makes recursive call to `next()`.

Parameters:
  `controller` - the current next element
Returns:
  the next sampler
Throws:
  `NextIsNullException` - when the end of the list has already been reached

### nextIsASampler

protected Sampler nextIsASampler(Sampler element) throws NextIsNullException
Increment the current pointer and return the element. Called by `next()` if the element is a sampler. (May be overriden by sub-classes).

Parameters:
  `element` - the current next element
Returns:
  input element
Throws:
  `NextIsNullException` - when the end of the list has already been reached

### nextIsNull

protected Sampler nextIsNull() throws NextIsNullException
Called by `next()` when `getCurrentElement()` returns `null`. Reinitialises the controller.

Returns:
  null (always, for this class)
Throws:
  `NextIsNullException` - when the end of the list has already been reached

### triggerEndOfLoop

public void triggerEndOfLoop()
Trigger end of loop condition on controller (used by Start Next Loop feature)

Specified by:
  `triggerEndOfLoop` in interface `Controller`

### reInitializeSubController

protected void reInitializeSubController()
Deprecated.
replaced by GeneriController#initializeSubControllers
Called to re-initialize a index of controller's elements (Bug 50032)

### currentReturnedNull

protected void currentReturnedNull(Controller c)
If the controller is done, remove it from the list, otherwise increment to next entry in list.

Parameters:
  `c` - controller

### getSubControllers

protected List<TestElement> getSubControllers()
Gets the SubControllers attribute of the GenericController object

Returns:
  the SubControllers value

### setCurrentElement

protected void setCurrentElement(TestElement currentElement) throws NextIsNullException
Empty implementation - does nothing.

Parameters:
  `currentElement` - the current element
Throws:
  `NextIsNullException` - when the list has been completed already

### getCurrentElement

protected TestElement getCurrentElement() throws NextIsNullException

Gets the element indicated by the `current` index, if one exists, from the `subControllersAndSamplers` list.

If the `subControllersAndSamplers` list is empty, then set done = true, and throw NextIsNullException.

Returns:
  the current element - or null if current index too large
Throws:
  `NextIsNullException` - if list is empty

### removeCurrentElement

protected void removeCurrentElement()

### incrementCurrent

protected void incrementCurrent()
Increments the current pointer; called by currentReturnedNull to move the controller on to its next child.

### resetCurrent

protected void resetCurrent()

### addTestElement

public void addTestElement(TestElement child)
Description copied from class: `AbstractTestElement`

Specified by:
  `addTestElement` in interface `TestElement`
Overrides:
  `addTestElement` in class `AbstractTestElement`

### addTestElementOnce

public final boolean addTestElementOnce(TestElement child)
Add child test element only if it has not already been added.

Only for use by TestCompiler.

Specified by:
  `addTestElementOnce` in interface `TestCompilerHelper`
Parameters:
  `child` - the `TestElement` to be added
Returns:
  `true` if the child was added

### addIterationListener

public void addIterationListener(LoopIterationListener lis)
Description copied from interface: `Controller`
Controllers have to notify listeners of when they begin an iteration through their sub-elements.

Specified by:
  `addIterationListener` in interface `Controller`
Parameters:
  `lis` - The `LoopIterationListener` to add

### removeIterationListener

public void removeIterationListener(LoopIterationListener iterationListener)
Remove listener

Specified by:
  `removeIterationListener` in interface `Controller`
Parameters:
  `iterationListener` - `LoopIterationListener`

### fireIterEvents

protected void fireIterEvents()

### fireIterationStart

protected void fireIterationStart()

### getIterCount

protected int getIterCount()

### incrementIterCount

protected void incrementIterCount()

### resetIterCount

protected void resetIterCount()

### readResolve

protected Object readResolve()