package com.linkedin.parseq;
import com.linkedin.parseq.internal.IdGenerator;
import com.linkedin.parseq.trace.ShallowTraceBuilder;
/**
* FusionTraceContext encapsulates information necessary to generate trace
* of fusion tasks.
*
* This is internal class and it should not be extended or used outside ParSeq.
* It may change or be removed at any time in a backwards incompatible way.
*
* @author Jaroslaw Odzga (jodzga@linkedin.com)
*/
class FusionTraceContext {
/* Task that initiated propagation */
private final ShallowTraceBuilder _propagationInitiator;
/* Context of a parent task, it will be different than propagationInitiator if fusion is applied on async task */
private final Context _parent;
/* Surrogate trace is a trace of last transformation in a chain - outermost propagator */
private ShallowTraceBuilder _surrogate;
/* Description of the last transformation in the chain */
private final String _desc;
public FusionTraceContext(Context parent, ShallowTraceBuilder propagationInitiator, String desc) {
_parent = parent;
_propagationInitiator = propagationInitiator;
_desc = desc;
}
public ShallowTraceBuilder getPropagationInitiator() {
return _propagationInitiator;
}
public Context getParent() {
return _parent;
}
public ShallowTraceBuilder getSurrogate() {
return _surrogate;
}
public void createSurrogate() {
if (_surrogate == null) {
_surrogate = new ShallowTraceBuilder(IdGenerator.getNextId());
_surrogate.setName(_desc);
ShallowTraceBuilder parentShallowTraceBuilder = _parent.getShallowTraceBuilder();
_surrogate.setHidden(parentShallowTraceBuilder.getHidden());
_surrogate.setSystemHidden(parentShallowTraceBuilder.getSystemHidden());
parentShallowTraceBuilder.setName("fused").setSystemHidden(true);
}
}
}