package rocks.inspectit.ui.rcp.ci.handler; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.progress.IProgressConstants; import rocks.inspectit.shared.cs.ci.business.impl.ApplicationDefinition; import rocks.inspectit.ui.rcp.InspectIT; import rocks.inspectit.ui.rcp.InspectITImages; import rocks.inspectit.ui.rcp.provider.IApplicationProvider; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition; import rocks.inspectit.ui.rcp.repository.CmrRepositoryDefinition.OnlineStatus; /** * Move {@link ApplicationDefinition} handler. * * @author Alexander Wert * */ public class MoveApplicationHandler extends AbstractHandler implements IHandler { /** * Key of the direction parameter. */ private static final String DIRECTION_PARAMETER = "rocks.inspectit.ui.rcp.ci.moveApplication.direction"; /** * Direction parameter value UP. */ private static final String DIRECTION_UP = "up"; /** * Direction parameter value DOWN. */ private static final String DIRECTION_DOWN = "down"; /** * {@inheritDoc} */ @Override public Object execute(final ExecutionEvent event) throws ExecutionException { final String direction = event.getParameter(DIRECTION_PARAMETER); if (null == direction) { return null; } final StructuredSelection selection = (StructuredSelection) HandlerUtil.getCurrentSelection(event); if (selection.isEmpty()) { return null; } Job moveApplicationJob = new Job("Move Application Job") { @Override protected IStatus run(IProgressMonitor monitor) { List<Status> statuses = new ArrayList<>(); Object selected = selection.getFirstElement(); if (selected instanceof IApplicationProvider) { IApplicationProvider applicationProvider = (IApplicationProvider) selected; ApplicationDefinition application = applicationProvider.getApplication(); CmrRepositoryDefinition repositoryDefinition = applicationProvider.getCmrRepositoryDefinition(); try { if (repositoryDefinition.getOnlineStatus() != OnlineStatus.OFFLINE) { int oldIndex = applicationProvider.getIndexInParentList(); int newIndex = 0; if (DIRECTION_UP.equals(direction)) { newIndex = oldIndex - 1; } else if (DIRECTION_DOWN.equals(direction)) { newIndex = oldIndex + 1; } else { throw new RuntimeException("Invalid direction parameter for application moving!"); } if (newIndex < 0 || newIndex >= applicationProvider.getParentList().size() - 1) { throw new RuntimeException("Invalid index parameter for application moving!"); } application = repositoryDefinition.getConfigurationInterfaceService().moveApplicationDefinition(application, newIndex); InspectIT.getDefault().getInspectITConfigurationInterfaceManager().applicationMoved(application, oldIndex, newIndex, repositoryDefinition); } else { statuses.add(new Status(IStatus.ERROR, InspectIT.ID, "Error moving application " + application.getApplicationName() + " from the CMR. Repository is offline!")); } } catch (Exception e) { statuses.add(new Status(IStatus.ERROR, InspectIT.ID, "Error moving application.", e)); } } if (CollectionUtils.isNotEmpty(statuses)) { if (1 == statuses.size()) { return statuses.iterator().next(); } else { return new MultiStatus(InspectIT.ID, IStatus.OK, statuses.toArray(new Status[statuses.size()]), "Moving application failed.", null); } } else { return Status.OK_STATUS; } } }; moveApplicationJob.setUser(true); moveApplicationJob.setProperty(IProgressConstants.ICON_PROPERTY, InspectIT.getDefault().getImageDescriptor(InspectITImages.IMG_APPLICATION)); moveApplicationJob.schedule(); return null; } }