package rocks.inspectit.ui.rcp.ci.dialog;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ListDialog;
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.ExceptionSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.MethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.TimerMethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.factory.ConfigurationDefaultsFactory;
import rocks.inspectit.shared.cs.ci.sensor.ISensorConfig;
import rocks.inspectit.shared.cs.ci.sensor.exception.IExceptionSensorConfig;
import rocks.inspectit.shared.cs.ci.sensor.method.IMethodSensorConfig;
import rocks.inspectit.shared.cs.ci.sensor.method.impl.HttpSensorConfig;
import rocks.inspectit.shared.cs.ci.sensor.method.impl.InvocationSequenceSensorConfig;
import rocks.inspectit.shared.cs.ci.sensor.method.impl.TimerSensorConfig;
import rocks.inspectit.ui.rcp.formatter.ImageFormatter;
import rocks.inspectit.ui.rcp.formatter.TextFormatter;
/**
* Dialog for the selecting the sensor type for the sensor assignment.
*
* @author Ivan Senic
*
*/
public class SensorAssignmentSelectionDialog extends ListDialog {
/**
* Default dialog title.
*/
private static final String DIALOG_TITLE = "Select Sensor Type";
/**
* Default dialog message.
*/
private static final String DIALOG_MESSAGE = "Select sensor type to use in the assignment";
/**
* Default constructor.
*
* @param parentShell
* Shell
*/
public SensorAssignmentSelectionDialog(Shell parentShell) {
super(parentShell);
setTitle(DIALOG_TITLE);
setMessage(DIALOG_MESSAGE);
setBlockOnOpen(true);
setContentProvider(new ArrayContentProvider());
setLabelProvider(new SensorConfigLabelProvider());
setInput(getInput(false));
}
/**
* {@inheritDoc}
*/
@Override
protected Control createDialogArea(Composite container) {
Composite parent = (Composite) super.createDialogArea(container);
final Button showAdvancedButton = new Button(parent, SWT.CHECK);
showAdvancedButton.setText("Show advanced sensor types");
showAdvancedButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
getTableViewer().setInput(getInput(showAdvancedButton.getSelection()));
getTableViewer().refresh();
}
});
return parent;
}
/**
* Creates input for the dialog.
*
* @param showAdvanced
* If advanced types of {@link IMethodSensorConfig}s should be included in the input.
* @return Input for dialog.
*/
private static Object getInput(boolean showAdvanced) {
List<IMethodSensorConfig> input = new ArrayList<>();
for (IMethodSensorConfig sensorConfig : ConfigurationDefaultsFactory.getAvailableMethodSensorConfigs()) {
if (sensorConfig instanceof InvocationSequenceSensorConfig) {
// skip invocation sensor, as we don't want to allow direct configuration on the UI
continue;
}
if (showAdvanced || !sensorConfig.isAdvanced()) {
input.add(sensorConfig);
}
}
input.add(ConfigurationDefaultsFactory.getDefaultExceptionSensorConfig());
Collections.sort(input, new Comparator<IMethodSensorConfig>() {
@Override
public int compare(IMethodSensorConfig s1, IMethodSensorConfig s2) {
int result = Boolean.compare(s1.isAdvanced(), s2.isAdvanced());
if (result != 0) {
return result;
}
return s1.getName().compareTo(s2.getName());
}
});
return input;
}
/**
* @return Returns empty sensor assignment with set sensor type as result of dialog selection.
*/
@SuppressWarnings("unchecked")
public AbstractClassSensorAssignment<?> getSensorAssignment() {
Object[] result = getResult();
if (ArrayUtils.isNotEmpty(result)) {
ISensorConfig sensorConfig = (ISensorConfig) result[0];
if (sensorConfig instanceof IExceptionSensorConfig) {
return new ExceptionSensorAssignment();
} else if (sensorConfig instanceof TimerSensorConfig) {
return new TimerMethodSensorAssignment();
} else if (sensorConfig instanceof HttpSensorConfig) {
return new ChartingMethodSensorAssignment((Class<? extends IMethodSensorConfig>) sensorConfig.getClass());
} else if (sensorConfig instanceof IMethodSensorConfig) {
return new MethodSensorAssignment((Class<? extends IMethodSensorConfig>) sensorConfig.getClass());
}
}
return null;
}
/**
* Simple {@link LabelProvider} for the dialog.
*
* @author Ivan Senic
*
*/
private static class SensorConfigLabelProvider extends LabelProvider {
/**
* {@inheritDoc}
*/
@Override
public String getText(Object element) {
return TextFormatter.getSensorConfigName((ISensorConfig) element);
}
/**
* {@inheritDoc}
*/
@Override
public Image getImage(Object element) {
return ImageFormatter.getSensorConfigImage((ISensorConfig) element);
}
}
}