package com.insightfullogic.honest_profiler.framework.scenario;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import com.insightfullogic.honest_profiler.core.parser.LogEvent;
import com.insightfullogic.honest_profiler.core.parser.Method;
import com.insightfullogic.honest_profiler.core.parser.StackFrame;
import com.insightfullogic.honest_profiler.core.parser.ThreadMeta;
import com.insightfullogic.honest_profiler.core.parser.TraceStart;
import com.insightfullogic.honest_profiler.framework.LeanLogCollectorDriver;
/**
* A scenario holds a series of {@link LogEvent}s which will be fed to a {@link LeanLogCollectorDriver} when executed.
*/
public class LogScenario
{
// Instance Properties
private String name;
private List<LogEvent> eventList;
// Instance Constructors
/**
* Constructs an empty scenario.
* <p>
* @param name the name of the scenario
*/
protected LogScenario(String name)
{
this.name = name;
eventList = new ArrayList<>();
}
// Instance Accessors
/**
* Returns the name of the scenario.
* <p>
* @return the name of the scenario
*/
public String getName()
{
return name;
}
// Log Event Addition
/**
* Adds {@link Method} events to the scenario.
* <p>
* @param methods the {@link Method} events to be added.
*/
protected void addMethods(Method... methods)
{
eventList.addAll(asList(methods));
}
/**
* Adds {@link ThreadMeta} events to the scenario.
* <p>
* @param methods the {@link ThreadMeta} events to be added.
*/
protected void addThreads(ThreadMeta... threads)
{
eventList.addAll(asList(threads));
}
/**
* Adds a {@link TraceStart} event to the scenario.
* <p>
* @param start the {@link TraceStart} event to be added
*/
protected void addStart(TraceStart start)
{
eventList.add(start);
}
/**
* Adds a {@link TraceStart} event to the scenario as well as a series of {@link StackFrame} events representing a
* stack trace. Please note that the first {@link StackFrame} actually represents the "bottom" of the trace, i.e.
* the actual method being executed. The last {@link StackFrame} represents the ancestor method called directly by
* the {@link Thread}.
*
* @param start the {@link TraceStart} event to be added
* @param frames the stack trace to be added
*/
protected void addStack(TraceStart start, StackFrame... frames)
{
eventList.add(start);
eventList.addAll(asList(frames));
}
// Execution
/**
* Executes the scenario by feeding the contained log events to the specified {@link LeanLogCollectorDriver}.
* <p>
* @param driver the {@link LeanLogCollectorDriver} which will process the log events
*/
public void execute(LeanLogCollectorDriver driver)
{
eventList.forEach(driver::handle);
}
/**
* Executes the scenario by feeding the contained log events to the specified {@link LeanLogCollectorDriver}, and
* triggering the "end-of-log" event at the end.
* <p>
* @param driver the {@link LeanLogCollectorDriver} which will process the log events
*/
public void executeAndEnd(LeanLogCollectorDriver driver)
{
execute(driver);
driver.endOfLog();
}
// Object Implementation
@Override
public String toString()
{
return name;
}
}