package rocks.inspectit.ui.rcp.handlers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import rocks.inspectit.shared.cs.communication.data.cmr.Alert;
import rocks.inspectit.ui.rcp.InspectIT;
import rocks.inspectit.ui.rcp.dialog.AlertSelectionDialog;
import rocks.inspectit.ui.rcp.editor.inputdefinition.EditorPropertiesData;
import rocks.inspectit.ui.rcp.editor.inputdefinition.InputDefinition;
import rocks.inspectit.ui.rcp.editor.inputdefinition.InputDefinition.IdDefinition;
import rocks.inspectit.ui.rcp.editor.inputdefinition.extra.AlertInputDefinitionExtra;
import rocks.inspectit.ui.rcp.editor.inputdefinition.extra.InputDefinitionExtrasMarkerFactory;
import rocks.inspectit.ui.rcp.editor.root.FormRootEditor;
import rocks.inspectit.ui.rcp.editor.root.RootEditorInput;
import rocks.inspectit.ui.rcp.formatter.ImageFormatter;
import rocks.inspectit.ui.rcp.formatter.TextFormatter;
import rocks.inspectit.ui.rcp.model.SensorTypeEnum;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition;
import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus;
/**
* Handler to open alert view.
*
* @author Alexander Wert
*
*/
public class OpenAlertHandler extends AbstractHandler {
/**
* {@inheritDoc}
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection selection = HandlerUtil.getCurrentSelection(event);
CmrRepositoryDefinition cmrRepositoryDefinition = null;
if (!selection.isEmpty() && (selection instanceof StructuredSelection)) {
Iterator<?> iterator = ((StructuredSelection) selection).iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
if (object instanceof CmrRepositoryDefinition) {
cmrRepositoryDefinition = (CmrRepositoryDefinition) object;
break;
}
}
}
List<CmrRepositoryDefinition> onlineCMRs = new ArrayList<>();
for (CmrRepositoryDefinition cmr : InspectIT.getDefault().getCmrRepositoryManager().getCmrRepositoryDefinitions()) {
if (cmr.getOnlineStatus().equals(OnlineStatus.ONLINE)) {
onlineCMRs.add(cmr);
}
}
if (onlineCMRs.isEmpty()) {
throw new ExecutionException("Cannot open alert view for alert: No CMR is online!");
}
AlertSelectionDialog dialog = new AlertSelectionDialog(HandlerUtil.getActiveShell(event), cmrRepositoryDefinition, onlineCMRs);
if (Dialog.OK == dialog.open()) {
InputDefinition inputDefinition = createInputDefinition(dialog.getCmrRepositoryDefinition(), dialog.getAlert());
// Get the view
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
// open the view if the input definition is set
if (null != inputDefinition) {
RootEditorInput input = new RootEditorInput(inputDefinition);
try {
page.openEditor(input, FormRootEditor.ID);
} catch (PartInitException e) {
throw new ExecutionException("Exception occurred trying to open the editor.", e);
}
}
}
return null;
}
/**
* Creates {@link InputDefinition} for Alert-Invocations view.
*
* @param cmrRepository
* CMR Repository definition.
* @param alert
* The alert.
* @return The {@link InputDefinition} instance.
*/
private InputDefinition createInputDefinition(CmrRepositoryDefinition cmrRepository, Alert alert) {
InputDefinition inputDefinition = new InputDefinition();
inputDefinition.setRepositoryDefinition(cmrRepository);
AlertInputDefinitionExtra alertInputExtra = new AlertInputDefinitionExtra();
alertInputExtra.setAlert(alert);
inputDefinition.addInputDefinitonExtra(InputDefinitionExtrasMarkerFactory.ALERT_EXTRAS_MARKER, alertInputExtra);
inputDefinition.setId(SensorTypeEnum.ALERT_INVOCATION);
EditorPropertiesData editorPropertiesData = new EditorPropertiesData();
editorPropertiesData.setSensorImage(SensorTypeEnum.ALERT_INVOCATION.getImage());
editorPropertiesData.setSensorName("Alert Invocation Sequences");
editorPropertiesData.setViewImage(ImageFormatter.getAlertImage(alert));
editorPropertiesData.setViewName(TextFormatter.getAlertDescription(alert));
inputDefinition.setEditorPropertiesData(editorPropertiesData);
IdDefinition idDefinition = new IdDefinition();
idDefinition.setPlatformId(0);
inputDefinition.setIdDefinition(idDefinition);
return inputDefinition;
}
}