/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.ui.internal.explorer;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import javax.inject.Inject;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.State;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.handlers.HandlerUtil;
import org.jboss.tools.windup.model.domain.ModelService;
import org.jboss.tools.windup.runtime.WindupRmiClient;
import org.jboss.tools.windup.ui.WindupUIPlugin;
import org.jboss.tools.windup.ui.internal.explorer.IssueExplorer.IssueExplorerService;
import org.jboss.tools.windup.ui.internal.explorer.IssueExplorerContentProvider.TreeNode;
import org.jboss.tools.windup.ui.internal.issues.IssueDetailsView;
import org.jboss.tools.windup.ui.internal.services.IssueGroupService;
import org.jboss.tools.windup.ui.internal.services.MarkerService;
import org.jboss.tools.windup.windup.ConfigurationElement;
import org.jboss.tools.windup.windup.Hint;
import org.jboss.tools.windup.windup.Issue;
import org.jboss.tools.windup.windup.QuickFix;
import com.google.common.collect.Lists;
/**
* Handlers used by the Issue Explorer.
*/
public class IssueExplorerHandlers {
public abstract static class GroupBy extends AbstractHandler {
@Inject protected IssueGroupService groupService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
update(!HandlerUtil.toggleCommandState(event.getCommand()));
return null;
}
protected abstract void update(boolean enabled);
}
public static class OpenReportHandler extends AbstractHandler {
@Inject private EPartService partService;
@Inject private MarkerService markerService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
TreeNode node = (TreeNode)selection.getFirstElement();
if (node instanceof MarkerNode) {
IMarker marker = ((MarkerNode) node).getMarker();
Issue issue = markerService.find(marker);
String reportLocation = issue.getGeneratedReportLocation();
if (reportLocation != null) {
IssueExplorer.updateReportView(reportLocation, true, partService);
}
}
return null;
}
}
public static class GroupBySeverity extends GroupBy {
@Override
protected void update(boolean enabled) {
groupService.setGroupBySeverity(enabled);
}
}
public static class GroupByRule extends GroupBy {
@Override
protected void update(boolean enabled) {
groupService.setGroupByRule(enabled);
}
}
public static class GroupByProjectHierarchy extends GroupBy {
@Inject private ICommandService commandService;
@Override
protected void update(boolean enabled) {
groupService.setGroupByHierachy(enabled);
if (enabled) {
Command c = commandService.getCommand(IssueConstants.GROUP_BY_FILE_CMD);
State s = c.getState(IssueConstants.TOGGLE_STATE_ID);
s.setValue(true);
commandService.refreshElements(c.getId(), null);
groupService.setGroupByFile(true, false);
}
}
}
public static class GroupByFile extends GroupBy {
@Override
protected void update(boolean enabled) {
groupService.setGroupByFile(enabled, true);
}
}
public static class ExpandIssuesHandler extends AbstractHandler {
@Inject private IEclipseContext context;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
context.get(IssueExplorerService.class).expandAll();
return null;
}
}
public static class DeleteAllIssuesHandler extends AbstractHandler {
@Inject private MarkerService markerService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
markerService.clear();
return null;
}
}
private abstract static class AbstractIssueHandler extends AbstractHandler {
@Inject protected IEventBroker broker;
@Inject protected WindupRmiClient windupClient;
@Inject protected EPartService partService;
@Inject protected QuickfixService quickfixService;
protected MarkerNode getMarkerNode (ExecutionEvent event) {
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
return (MarkerNode)selection.getFirstElement();
}
protected IssueExplorer getIssueExplorer() {
return (IssueExplorer)partService.findPart(IssueExplorer.VIEW_ID).getObject();
}
}
public static class MarkIssueFixedHandler extends AbstractIssueHandler {
@Inject private MarkerService markerService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
for (Object selected : ((StructuredSelection)selection).toList()) {
markerService.setFixed(((MarkerNode)selected).getIssue());
}
return null;
}
}
public static class ViewIssueDetailsHandler extends AbstractIssueHandler {
@Inject private EPartService partService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
MarkerNode node = getMarkerNode(event);
MPart part = partService.showPart(IssueDetailsView.ID, PartState.ACTIVATE);
IssueDetailsView view = (IssueDetailsView)part.getObject();
view.showIssueDetails(node.getMarker());
return null;
}
}
public static class RefreshIssuesHandler extends AbstractIssueHandler {
@Inject private ModelService modelService;
@Inject private MarkerService markerService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
ConfigurationElement configuration = modelService.getRecentConfiguration();
if (configuration != null) {
markerService.generateMarkersForConfiguration(configuration);
// https://issues.jboss.org/browse/WINDUP-1361
Display.getDefault().asyncExec(() -> {
IssueExplorer explorer = (IssueExplorer)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(IssueExplorer.VIEW_ID);
if (explorer != null) {
explorer.buildTree();
}
});
}
return null;
}
}
public static class PreviewQuickFixHandler extends AbstractIssueHandler {
@Inject private QuickfixService quickfixService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
MarkerNode node = getMarkerNode(event);
Hint hint = (Hint)node.getIssue();
quickfixService.previewQuickFix(hint, node.getMarker());
return null;
}
}
public static class IssueQuickFixHandler extends AbstractIssueHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor)
throws CoreException, InvocationTargetException, InterruptedException {
for (Object selected : ((StructuredSelection)selection).toList()) {
MarkerNode node = (MarkerNode)selected;
for (QuickFix quickfix : node.getIssue().getQuickFixes()) {
quickfixService.applyQuickFix(quickfix);
}
}
}
};
try {
new ProgressMonitorDialog(Display.getDefault().getActiveShell()).run(false, false, op);
} catch (InvocationTargetException | InterruptedException e) {
WindupUIPlugin.log(e);
}
return null;
}
}
public static class DeleteIssueHandler extends AbstractIssueHandler {
@Inject private ModelService modelService;
@Inject private MarkerService markerService;
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
for (Object selected : ((StructuredSelection)selection).toList()) {
MarkerNode node = (MarkerNode)selected;
modelService.deleteIssue(node.getIssue());
markerService.delete(node.getMarker(), node.getIssue());
}
return null;
}
}
public static class QuickFixAllHandler extends AbstractIssueHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
TreeSelection selection = (TreeSelection) HandlerUtil.getCurrentSelection(event);
List<MarkerNode> fixableNodes = Lists.newArrayList();
for (Object selected : ((StructuredSelection)selection).toList()) {
TreeNode node = (TreeNode)selected;
IssueExplorerHandlers.collectQuickFixableNodes(node, fixableNodes);
}
for (MarkerNode node : fixableNodes) {
Hint hint = (Hint)node.getIssue();
WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor)
throws CoreException, InvocationTargetException, InterruptedException {
for (QuickFix quickfix : hint.getQuickFixes()) {
quickfixService.applyQuickFix(quickfix);
}
}
};
try {
new ProgressMonitorDialog(Display.getDefault().getActiveShell()).run(false, false, op);
} catch (InvocationTargetException | InterruptedException e) {
WindupUIPlugin.log(e);
}
}
return null;
}
}
private static void collectQuickFixableNodes(TreeNode node, List<MarkerNode> nodes) {
for (TreeNode child : node.getChildren()) {
if (child instanceof MarkerNode) {
MarkerNode childNode = (MarkerNode)child;
Issue issue = childNode.getIssue();
if (QuickfixService.isIssueFixable(issue)) {
nodes.add(childNode);
}
}
else {
collectQuickFixableNodes(child, nodes);
}
}
}
}