/*******************************************************************************
* 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.rmi.RemoteException;
import javax.inject.Inject;
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.xtext.util.Pair;
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.IssueExplorerContentProvider.ReportNode;
import org.jboss.tools.windup.ui.internal.explorer.IssueExplorerContentProvider.TreeNode;
import org.jboss.tools.windup.ui.internal.rules.xml.XMLRulesetModelUtil;
import org.jboss.tools.windup.ui.internal.services.IssueGroupService;
import org.jboss.tools.windup.windup.Issue;
import org.jboss.windup.tooling.ExecutionBuilder;
import org.w3c.dom.Node;
/**
* Property testers for the Issue Explorer.
*/
public class IssueExplorerPropertyTesters {
public static final String QUICKFIX = "hasQuickFix"; //$NON-NLS-1$
public static final String FIXED = "isFixed"; //$NON-NLS-1$
public static final String HIERARCHY = "isGroupByHierarchy"; //$NON-NLS-1$
public static final String IS_GROUP = "isGroupNode"; //$NON-NLS-1$
public static final String HAS_REPORT = "hasReport"; //$NON-NLS-1$
public static final String HAS_RULE_DEFINITION = "hasRuleDefinition"; //$NON-NLS-1$
public static class QuickFixPropertyTester extends PropertyTester {
@Inject private IssueGroupService groupService;
@Override
public boolean test(Object element, String property, Object[] args, Object expectedValue) {
if (QUICKFIX.equals(property)) {
if (element instanceof MarkerNode) {
MarkerNode node = (MarkerNode)element;
if (node.getIssue().isStale()) {
return false;
}
return ((MarkerNode)element).hasQuickFix();
}
}
else if (FIXED.equals(property)) {
if (element instanceof MarkerNode) {
return !((MarkerNode)element).isFixed();
}
}
else if (HIERARCHY.equals(property)) {
return groupService.isGroupByHierarchy();
}
return false;
}
}
public static class GroupPropertyTester extends PropertyTester {
@Override
public boolean test(Object element, String property, Object[] args, Object expectedValue) {
if (IS_GROUP.equals(property)) {
if (element instanceof TreeNode && !(element instanceof MarkerNode) && !(element instanceof ReportNode)) {
return containsQuickFix((TreeNode)element);
}
}
return false;
}
}
private static boolean containsQuickFix(TreeNode node) {
for (TreeNode child : node.getChildren()) {
if (child instanceof MarkerNode) {
Issue issue = ((MarkerNode)child).getIssue();
if (QuickfixService.isIssueFixable(issue)) {
return true;
}
}
else {
if (containsQuickFix(child)) {
return true;
}
}
}
return false;
}
public static class ReportPropertyTester extends PropertyTester {
@Override
public boolean test(Object element, String property, Object[] args, Object expectedValue) {
if (HAS_REPORT.equals(property)) {
if (element instanceof MarkerNode) {
MarkerNode node = (MarkerNode)element;
Issue issue = node.getIssue();
if (issue.getGeneratedReportLocation() != null) {
return true;
}
}
}
return false;
}
}
public static class RuleDefinitionPropertyTester extends PropertyTester {
@Inject private ModelService modelService;
@Inject private WindupRmiClient windupClient;
@Override
public boolean test(Object element, String property, Object[] args, Object expectedValue) {
if (HAS_RULE_DEFINITION.equals(property)) {
if (element instanceof MarkerNode) {
MarkerNode node = (MarkerNode)element;
Issue issue = node.getIssue();
String ruleId = issue.getRuleId();
if (windupClient.isWindupServerRunning()) {
ExecutionBuilder executionBuilder = windupClient.getExecutionBuilder();
try {
Pair<Object, Node> pair = XMLRulesetModelUtil.findRuleProvider(
ruleId, executionBuilder.getSystemRuleProviderRegistry(), modelService);
if (pair != null) {
return true;
}
} catch (RemoteException e) {
WindupUIPlugin.log(e);
}
}
}
}
return false;
}
}
}