Package org.apache.jmeter.control

# Class GenericController

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

All Implemented Interfaces:
  `Serializable`, `Cloneable`, `Controller`, `Searchable`, `org.apache.jmeter.testelement.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 JMeterThread as follows:

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

See Also:
  - Serialized Form

- ## Nested Class Summary

  ## Nested classes/interfaces inherited from interface org.apache.jmeter.testelement.TestElement

  `org.apache.jmeter.testelement.TestElement.Companion`

- ## Field Summary

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

  ### Fields inherited from interface org.apache.jmeter.testelement.TestElement

  `COMMENTS, Companion, 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(org.apache.jmeter.testelement.TestElement child)`
  `final boolean`
  `addTestElementOnce(org.apache.jmeter.testelement.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 org.apache.jmeter.testelement.TestElement`
  `getCurrentElement()`
  Gets the element indicated by the `current` index, if one exists, from the `subControllersAndSamplers` list.
  `protected int`
  `getIterCount()`
  `org.apache.jmeter.testelement.schema.PropertiesAccessor<? extends GenericController,? extends org.apache.jmeter.control.GenericControllerSchema>`
  `getProps()`
  `org.apache.jmeter.control.GenericControllerSchema`
  `getSchema()`
  `protected List<org.apache.jmeter.testelement.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.
  `protected void`
  `removeCurrentElement()`
  `void`
  `removeIterationListener(LoopIterationListener iterationListener)`
  Remove listener
  `protected void`
  `resetCurrent()`
  `protected void`
  `resetIterCount()`
  `protected void`
  `setCurrentElement(org.apache.jmeter.testelement.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 org.apache.jmeter.testelement.AbstractTestElement

  `addPropertiesValues, addProperty, addProperty, canRemove, clear, clearTemporary, clearTestElementChildren, clone, emptyTemporary, equals, getComment, getName, getProperty, getPropertyAsBoolean, getPropertyAsBoolean, getPropertyAsDouble, getPropertyAsFloat, getPropertyAsInt, getPropertyAsInt, getPropertyAsLong, getPropertyAsLong, getPropertyAsString, getPropertyAsString, getPropertyOrNull, 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 java.lang.Object

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

  ### Methods inherited from interface org.apache.jmeter.testelement.TestElement

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

- ## Field Details

  - ### subControllersAndSamplers

    protected transient List<org.apache.jmeter.testelement.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

  - ### getSchema

    public org.apache.jmeter.control.GenericControllerSchema getSchema()
    Specified by:
      `getSchema` in interface `org.apache.jmeter.testelement.TestElement`

  - ### getProps

    public org.apache.jmeter.testelement.schema.PropertiesAccessor<? extends GenericController,? extends org.apache.jmeter.control.GenericControllerSchema> getProps()
    Specified by:
      `getProps` in interface `org.apache.jmeter.testelement.TestElement`

  - ### 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 overridden 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`

  - ### 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<org.apache.jmeter.testelement.TestElement> getSubControllers()
    Gets the SubControllers attribute of the GenericController object
    Returns:
      the SubControllers value

  - ### setCurrentElement

    protected void setCurrentElement(org.apache.jmeter.testelement.TestElement currentElement) throws NextIsNullException
    Empty implementation - does nothing.
    Parameters:
      `currentElement` - the current element
    Throws:
      `NextIsNullException` - when the list has been completed already

  - ### getCurrentElement

    protected org.apache.jmeter.testelement.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(org.apache.jmeter.testelement.TestElement child)
    Description copied from class: `AbstractTestElement`
    Specified by:
      `addTestElement` in interface `org.apache.jmeter.testelement.TestElement`
    Overrides:
      `addTestElement` in class `AbstractTestElement`

  - ### addTestElementOnce

    public final boolean addTestElementOnce(org.apache.jmeter.testelement.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()