package rocks.inspectit.ui.rcp.ci.widget; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import rocks.inspectit.shared.cs.ci.assignment.AbstractClassSensorAssignment; import rocks.inspectit.shared.cs.ci.assignment.impl.ChartingMethodSensorAssignment; import rocks.inspectit.shared.cs.ci.assignment.impl.MethodSensorAssignment; import rocks.inspectit.shared.cs.ci.assignment.impl.TimerMethodSensorAssignment; import rocks.inspectit.shared.cs.ci.context.AbstractContextCapture; import rocks.inspectit.shared.cs.ci.context.impl.FieldContextCapture; import rocks.inspectit.shared.cs.ci.context.impl.ParameterContextCapture; import rocks.inspectit.shared.cs.ci.context.impl.ReturnContextCapture; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.InspectITImages; import rocks.inspectit.ui.rcp.ci.form.part.SensorAssignmentMasterBlock; import rocks.inspectit.ui.rcp.editor.tooltip.ColumnAwareToolTipSupport; import rocks.inspectit.ui.rcp.editor.viewers.ImageFixStyledCellIndexLabelProvider; import rocks.inspectit.ui.rcp.formatter.ImageFormatter; import rocks.inspectit.ui.rcp.formatter.TextFormatter; import rocks.inspectit.ui.rcp.viewer.ReferenceElementComparer; /** * Table provider for the tab folder containing the sensor assignments. * * @author Ivan Senic * */ public class SensorAssignmentTableProvider { /** * Viewer used to display the data. */ private TableViewer tableViewer; /** * Constructor. Table can be retrieved by calling {@link #getTableViewer()}. * * @param masterBlock * Master block containing this table. * @param parent * Parent composite */ public SensorAssignmentTableProvider(SensorAssignmentMasterBlock masterBlock, Composite parent) { init(parent, masterBlock); } /** * Initializes the table. * * @param parent * Parent composite * @param selectionChangedListener * selection change listener to report events to or <code>null</code> for no * reporting */ private void init(Composite parent, ISelectionChangedListener selectionChangedListener) { // Table Table table = new Table(parent, SWT.MULTI | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); table.setHeaderVisible(true); table.setLinesVisible(true); tableViewer = new TableViewer(table); tableViewer.setUseHashlookup(false); tableViewer.setComparer(ReferenceElementComparer.INSTANCE); createColumns(tableViewer); tableViewer.setContentProvider(getContentProvider()); tableViewer.setLabelProvider(getLabelProvider()); ColumnAwareToolTipSupport.enableFor(tableViewer); if (null != selectionChangedListener) { tableViewer.addSelectionChangedListener(selectionChangedListener); } } /** * Gets {@link #tableViewer}. * * @return {@link #tableViewer} */ public TableViewer getTableViewer() { return tableViewer; } /** * Sets the input for the table in the tab item. * * @param assignments * Assignments as input. */ public void setInput(List<AbstractClassSensorAssignment<?>> assignments) { tableViewer.setInput(assignments); tableViewer.setSelection(StructuredSelection.EMPTY); } /** * Creates columns for Table. * * @param tableViewer * Table viewer to create columns for. */ private void createColumns(TableViewer tableViewer) { TableViewerColumn classColumn = new TableViewerColumn(tableViewer, SWT.NONE); classColumn.getColumn().setResizable(true); classColumn.getColumn().setWidth(350); classColumn.getColumn().setText("Class"); classColumn.getColumn().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_CLASS)); classColumn.getColumn().setToolTipText("Fully qualified name of the class or interface."); TableViewerColumn methodColumn = new TableViewerColumn(tableViewer, SWT.NONE); methodColumn.getColumn().setResizable(true); methodColumn.getColumn().setWidth(450); methodColumn.getColumn().setText("Method"); methodColumn.getColumn().setImage(InspectIT.getDefault().getImage(InspectITImages.IMG_METHOD_PUBLIC)); methodColumn.getColumn().setToolTipText("Method name with parameters. Note that constructors are displayed as '<init>' methods."); TableViewerColumn optionsColumn = new TableViewerColumn(tableViewer, SWT.NONE); optionsColumn.getColumn().setResizable(true); optionsColumn.getColumn().setWidth(200); optionsColumn.getColumn().setText("Options"); optionsColumn.getColumn().setToolTipText("Additional options that are defined for the sensor assignment."); } /** * @return {@link IContentProvider} */ private IContentProvider getContentProvider() { return new ArrayContentProvider(); } /** * @return {@link IBaseLabelProvider} or null if each column has one set correctly. */ private IBaseLabelProvider getLabelProvider() { return new ImageFixStyledCellIndexLabelProvider() { /** * The resource manager is used for the images etc. */ private final LocalResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources()); /** * Empty styled string. */ private final StyledString empty = new StyledString(""); /** * {@inheritDoc} */ @Override protected StyledString getStyledText(Object element, int index) { if ((0 == index) && (element instanceof AbstractClassSensorAssignment<?>)) { AbstractClassSensorAssignment<?> assignment = (AbstractClassSensorAssignment<?>) element; if (null != assignment.getClassName()) { return new StyledString(assignment.getClassName()); } } else if ((1 == index) && (element instanceof MethodSensorAssignment)) { MethodSensorAssignment assignment = (MethodSensorAssignment) element; return new StyledString(TextFormatter.getMethodWithParameters(assignment)); } return empty; } /** * {@inheritDoc} */ @Override protected Image getColumnImage(Object element, int index) { // first column have images only if ((0 == index) && (element instanceof AbstractClassSensorAssignment)) { AbstractClassSensorAssignment<?> assignment = (AbstractClassSensorAssignment<?>) element; if (assignment.isSuperclass()) { return InspectIT.getDefault().getImage(InspectITImages.IMG_SUPERCLASS); } else if (assignment.isInterf()) { return InspectIT.getDefault().getImage(InspectITImages.IMG_INTERFACE); } else { return InspectIT.getDefault().getImage(InspectITImages.IMG_CLASS); } } else if ((1 == index) && (element instanceof MethodSensorAssignment)) { MethodSensorAssignment assignment = (MethodSensorAssignment) element; return ImageFormatter.getMethodVisibilityImage(resourceManager, assignment); } else if ((2 == index) && (element instanceof AbstractClassSensorAssignment)) { AbstractClassSensorAssignment<?> assignment = (AbstractClassSensorAssignment<?>) element; return ImageFormatter.getSensorAssignmentOptionsImage(resourceManager, assignment); } return super.getColumnImage(element, index); } /** * {@inheritDoc} */ @Override public String getToolTipText(Object element, int index) { if ((0 == index) && (element instanceof AbstractClassSensorAssignment)) { AbstractClassSensorAssignment<?> assignment = (AbstractClassSensorAssignment<?>) element; if (assignment.isSuperclass()) { return "Superclass instrumentation"; } else if (assignment.isInterf()) { return "Interface instrumentation"; } } else if ((1 == index) && (element instanceof MethodSensorAssignment)) { MethodSensorAssignment assignment = (MethodSensorAssignment) element; StringBuilder stringBuilder = new StringBuilder("Method visibility:"); if (assignment.isPublicModifier()) { stringBuilder.append(" public,"); } if (assignment.isProtectedModifier()) { stringBuilder.append(" protected,"); } if (assignment.isDefaultModifier()) { stringBuilder.append(" default,"); } if (assignment.isPrivateModifier()) { stringBuilder.append(" private,"); } return stringBuilder.deleteCharAt(stringBuilder.length() - 1).toString(); } else if (2 == index) { StringBuilder stringBuilder = new StringBuilder(); if (element instanceof AbstractClassSensorAssignment) { AbstractClassSensorAssignment<?> assignment = (AbstractClassSensorAssignment<?>) element; if (StringUtils.isNotEmpty(assignment.getAnnotation())) { stringBuilder.append("Annotation filtering = " + assignment.getAnnotation() + "\n"); } } if (element instanceof ChartingMethodSensorAssignment) { ChartingMethodSensorAssignment assignment = (ChartingMethodSensorAssignment) element; if (assignment.isCharting()) { stringBuilder.append("Charting = ON\n"); } } if (element instanceof TimerMethodSensorAssignment) { TimerMethodSensorAssignment assignment = (TimerMethodSensorAssignment) element; if (assignment.isStartsInvocation()) { stringBuilder.append("Starts invocation = ON\n"); } if (CollectionUtils.isNotEmpty(assignment.getContextCaptures())) { for (AbstractContextCapture contextCapture : assignment.getContextCaptures()) { if (contextCapture instanceof ReturnContextCapture) { stringBuilder.append("Capture return value"); } else if (contextCapture instanceof ParameterContextCapture) { stringBuilder.append("Capture parameter (index " + ((ParameterContextCapture) contextCapture).getIndex() + ")"); } else if (contextCapture instanceof FieldContextCapture) { stringBuilder.append("Capture field (named '" + ((FieldContextCapture) contextCapture).getFieldName() + "')"); } stringBuilder.append(" as '" + contextCapture.getDisplayName() + "'"); if (CollectionUtils.isNotEmpty(contextCapture.getPaths())) { stringBuilder.append(" and follow path "); for (String path : contextCapture.getPaths()) { stringBuilder.append(" -> "); stringBuilder.append(path); } } stringBuilder.append('\n'); } } } if (stringBuilder.length() > 0) { return stringBuilder.substring(0, stringBuilder.length() - 1); } } return super.getToolTipText(element, index); } /** * {@inheritDoc} */ @Override public void dispose() { resourceManager.dispose(); super.dispose(); } }; } }