package rocks.inspectit.ui.rcp.editor.tree.input; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.eclipse.jface.viewers.ViewerFilter; import rocks.inspectit.shared.all.cmr.model.MethodIdent; import rocks.inspectit.shared.all.cmr.service.ICachedDataService; import rocks.inspectit.shared.all.communication.DefaultData; import rocks.inspectit.shared.all.communication.data.ExceptionSensorData; import rocks.inspectit.shared.all.communication.data.InvocationSequenceData; import rocks.inspectit.shared.all.communication.data.SqlStatementData; import rocks.inspectit.shared.all.communication.data.TimerData; import rocks.inspectit.shared.all.tracing.data.Span; import rocks.inspectit.shared.cs.communication.data.InvocationSequenceDataHelper; import rocks.inspectit.ui.rcp.editor.inputdefinition.InputDefinition; import rocks.inspectit.ui.rcp.editor.inputdefinition.extra.InputDefinitionExtrasMarkerFactory; import rocks.inspectit.ui.rcp.editor.preferences.PreferenceId; import rocks.inspectit.ui.rcp.formatter.TextFormatter; import rocks.inspectit.ui.rcp.util.ElementOccurrenceCount; import rocks.inspectit.ui.rcp.util.OccurrenceFinderFactory; /** * Extension of the {@link InvocDetailInputController} adapted to serve as an input for a * {@link rocks.inspectit.ui.rcp.editor.tree.SteppingTreeSubView}. * * @author Ivan Senic * */ public class SteppingInvocDetailInputController extends InvocDetailInputController implements SteppingTreeInputController { /** * The ID of this subview / controller. */ public static final String ID = "inspectit.subview.tree.steppinginvocdetail"; /** * List of the objects that are possible to locate in the tree. */ private List<Object> steppingObjectsList; /** * Global data access service. */ private ICachedDataService cachedDataService; /** * Is stepping control be initially visible. */ private boolean initVisible; /** * Constructor that defines if the stepping control is visible or not. * * @param initVisible * Should stepping control be initially visible. */ public SteppingInvocDetailInputController(boolean initVisible) { this.initVisible = initVisible; } /** * {@inheritDoc} */ @Override public void setInputDefinition(InputDefinition inputDefinition) { super.setInputDefinition(inputDefinition); steppingObjectsList = new ArrayList<>(); if (inputDefinition.hasInputDefinitionExtra(InputDefinitionExtrasMarkerFactory.NAVIGATION_STEPPING_EXTRAS_MARKER)) { List<DefaultData> steppingObj = inputDefinition.getInputDefinitionExtra(InputDefinitionExtrasMarkerFactory.NAVIGATION_STEPPING_EXTRAS_MARKER).getSteppingTemplateList(); if (null != steppingObj) { for (DefaultData object : steppingObj) { addObjectToSteppingObjectList(object); } } } cachedDataService = inputDefinition.getRepositoryDefinition().getCachedDataService(); } /** * {@inheritDoc} */ @Override public Set<PreferenceId> getPreferenceIds() { Set<PreferenceId> preferences = super.getPreferenceIds(); preferences.add(PreferenceId.STEPPABLE_CONTROL); return preferences; } /** * {@inheritDoc} */ @Override public List<Object> getSteppingObjectList() { return steppingObjectsList; } /** * {@inheritDoc} */ @Override public void addObjectToSteppingObjectList(Object template) { if (!steppingObjectsList.contains(template)) { steppingObjectsList.add(template); } } /** * {@inheritDoc} */ @Override public boolean initSteppingControlVisible() { return initVisible; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public ElementOccurrenceCount countOccurrences(Object element, ViewerFilter[] filters) { List<Object> input = (List<Object>) getTreeInput(); if ((input != null) && !input.isEmpty()) { InvocationSequenceData invocation = (InvocationSequenceData) input.get(0); return OccurrenceFinderFactory.getOccurrenceCount(invocation, element, filters); } return ElementOccurrenceCount.emptyElement(); } /** * {@inheritDoc} */ @Override public boolean isElementOccurrenceReachable(Object element, int occurance, ViewerFilter[] filters) { Object object = getElement(element, occurance, filters); if (null != object) { return true; } return false; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public Object getElement(Object template, int occurance, ViewerFilter[] filters) { List<Object> input = (List<Object>) getTreeInput(); if ((input != null) && !input.isEmpty()) { InvocationSequenceData invocation = (InvocationSequenceData) input.get(0); InvocationSequenceData found = OccurrenceFinderFactory.getOccurrence(invocation, template, occurance, filters); if (InvocationSequenceDataHelper.hasSpanIdent(found) && (template instanceof Span)) { return spanService.get(found.getSpanIdent()); } else { return found; } } return null; } /** * {@inheritDoc} */ @Override public String getElementTextualRepresentation(Object object) { if (object instanceof SqlStatementData) { SqlStatementData sqlData = (SqlStatementData) object; if (0 == sqlData.getId()) { return "SQL: " + sqlData.getSql() + " [All]"; } else { return "SQL: " + sqlData.getSql() + " [Single]"; } } else if (object instanceof TimerData) { TimerData timerData = (TimerData) object; MethodIdent methodIdent = cachedDataService.getMethodIdentForId(timerData.getMethodIdent()); if (0 == timerData.getId()) { return TextFormatter.getMethodString(methodIdent) + " [All]"; } else { return TextFormatter.getMethodString(methodIdent) + " [Single]"; } } else if (object instanceof ExceptionSensorData) { ExceptionSensorData exData = (ExceptionSensorData) object; if (0 == exData.getId()) { return "Exception: " + exData.getThrowableType() + " [All]"; } else { return "Exception: " + exData.getThrowableType() + " [Single]"; } } else if (object instanceof InvocationSequenceData) { InvocationSequenceData invocationSequenceData = (InvocationSequenceData) object; MethodIdent methodIdent = cachedDataService.getMethodIdentForId(invocationSequenceData.getMethodIdent()); if (0 == invocationSequenceData.getId()) { return TextFormatter.getMethodString(methodIdent) + " [All]"; } else { return TextFormatter.getMethodString(methodIdent) + " [Single]"; } } else if (object instanceof Span) { return TextFormatter.getSpanDetailsFull((Span) object, cachedDataService).toString(); } return ""; } }