/*
* Contributions to FindBugs
* Copyright (C) 2008, Andrei Loskutov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package de.tobject.findbugs.view.explorer;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.ui.IWorkingSet;
import de.tobject.findbugs.FindbugsPlugin;
import de.tobject.findbugs.reporter.MarkerUtil;
import edu.umd.cs.findbugs.BugCategory;
import edu.umd.cs.findbugs.BugCode;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugPattern;
import edu.umd.cs.findbugs.DetectorFactoryCollection;
import edu.umd.cs.findbugs.Plugin;
import edu.umd.cs.findbugs.core.Priorities;
import edu.umd.cs.findbugs.findbugsmarker.FindBugsMarker;
/**
* Type of the bug groups, shown inside the bug explorer
*
* @author Andrei
*/
public enum GroupType {
Workspace(false, MarkerMapper.NO_MAPPING),
WorkingSet(false, MarkerMapper.NO_MAPPING),
DetectorPlugin(true, new MarkerMapper<Plugin>() {
@Override
Plugin getIdentifier(IMarker marker) {
return MarkerUtil.findDetectorPluginFor(marker);
}
@Override
String getShortDescription(Object id) {
return ((Plugin) id).getProvider();
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "plugin id: " + marker.getAttribute(FindBugsMarker.DETECTOR_PLUGIN_ID);
}
}),
Project(true, new MarkerMapper<IProject>() {
@Override
IProject getIdentifier(IMarker marker) {
return marker.getResource().getProject();
}
@Override
String getShortDescription(Object id) {
return ((IProject) id).getName();
}
@Override
String getDebugDescription(IMarker marker) {
return "project of resource: " + marker.getResource();
}
}),
Package(true, new MarkerMapper<IPackageFragment>() {
@Override
IPackageFragment getIdentifier(IMarker marker) {
IJavaElement javaElement = MarkerUtil.findJavaElementForMarker(marker);
if (javaElement == null) {
javaElement = JavaCore.create(marker.getResource());
}
if (javaElement != null) {
return (IPackageFragment) javaElement.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
}
return null;
}
@Override
String getShortDescription(Object id) {
String name = ((IPackageFragment) id).getElementName();
if (name == null || name.length() == 0) {
name = "default package";
}
return name;
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "package of element with unique Java id: " + marker.getAttribute(FindBugsMarker.UNIQUE_JAVA_ID);
}
}),
Class(true, new MarkerMapper<IJavaElement>() {
@Override
IJavaElement getIdentifier(IMarker marker) {
IJavaElement javaElement = MarkerUtil.findJavaElementForMarker(marker);
if (javaElement != null) {
return javaElement;
}
return JavaCore.create(marker.getResource());
}
@Override
String getShortDescription(Object id) {
return ((IJavaElement) id).getElementName();
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "class of element with unique Java id: " + marker.getAttribute(FindBugsMarker.UNIQUE_JAVA_ID);
}
}),
Priority(true, new MarkerMapper<Integer>() {
@Override
Integer getIdentifier(IMarker marker) {
try {
Object attribute = marker.getAttribute(IMarker.PRIORITY);
if (attribute instanceof Integer) {
Integer prio = (Integer) attribute;
switch (prio.intValue()) {
case IMarker.PRIORITY_HIGH:
return Integer.valueOf(Priorities.HIGH_PRIORITY);
case IMarker.PRIORITY_NORMAL:
return Integer.valueOf(Priorities.NORMAL_PRIORITY);
default:
return Integer.valueOf(Priorities.LOW_PRIORITY);
}
}
} catch (CoreException e) {
FindbugsPlugin.getDefault().logException(e, "Missing priority attribute in marker");
}
BugInstance bug = MarkerUtil.findBugInstanceForMarker(marker);
return bug == null ? null : Integer.valueOf(bug.getPriority());
}
@Override
String getShortDescription(Object id) {
return FindBugsMarker.Priority.label(((Integer) id).intValue()).name() + " priority";
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "priority: " + marker.getAttribute(IMarker.PRIORITY);
}
}),
Category(true, new MarkerMapper<BugCategory>() {
@Override
BugCategory getIdentifier(IMarker marker) {
BugInstance bug = MarkerUtil.findBugInstanceForMarker(marker);
if (bug == null) {
return null;
}
return DetectorFactoryCollection.instance().getBugCategory(bug.getBugPattern().getCategory());
}
@Override
String getShortDescription(Object id) {
return ((BugCategory) id).getShortDescription();
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "category of: " + marker.getAttribute(FindBugsMarker.UNIQUE_ID);
}
}),
PatternType(true, new MarkerMapper<BugCode>() {
@Override
BugCode getIdentifier(IMarker marker) {
BugCode code = MarkerUtil.findBugCodeForMarker(marker);
if (code == null) {
// can happen only if project was analysed with older plugin
// version then 1.3.8
BugInstance bug = MarkerUtil.findBugInstanceForMarker(marker);
if (bug == null) {
return null;
}
return DetectorFactoryCollection.instance().getBugCode(bug.getAbbrev());
}
return code;
}
@Override
String getShortDescription(Object id) {
return ((BugCode) id).getDescription();
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "pattern type: " + marker.getAttribute(FindBugsMarker.PATTERN_TYPE);
}
}),
Pattern(true, new MarkerMapper<BugPattern>() {
@Override
BugPattern getIdentifier(IMarker marker) {
return MarkerUtil.findBugPatternForMarker(marker);
}
@Override
String getShortDescription(Object id) {
return ((BugPattern) id).getShortDescription();
}
@Override
String getDebugDescription(IMarker marker) throws CoreException {
return "pattern: " + marker.getAttribute(FindBugsMarker.BUG_TYPE);
}
}),
Marker(false, MarkerMapper.NO_MAPPING),
Undefined(false, MarkerMapper.NO_MAPPING);
private final boolean visible;
private final MarkerMapper<?> mapper;
private GroupType(boolean visible, MarkerMapper<?> mapper) {
this.visible = visible;
this.mapper = mapper;
if (mapper != MarkerMapper.NO_MAPPING) {
mapper.setType(this);
}
}
public boolean isVisible() {
return visible;
}
/**
* @return may return {@link MarkerMapper#NO_MAPPING}, if there is no
* mapping possible for current group type
*/
MarkerMapper<?> getMapper() {
return mapper;
}
public static List<GroupType> getVisible() {
List<GroupType> visible = new ArrayList<GroupType>();
GroupType[] values = values();
for (GroupType type : values) {
if (type.isVisible()) {
visible.add(type);
}
}
return visible;
}
public static GroupType getType(Object element) {
if (element instanceof BugGroup) {
return ((BugGroup) element).getType();
}
if (element instanceof IMarker) {
return GroupType.Marker;
}
if (element instanceof IProject) {
return GroupType.Project;
}
if (element instanceof IWorkingSet) {
return GroupType.WorkingSet;
}
if (element instanceof IWorkspaceRoot) {
return GroupType.Workspace;
}
if (element instanceof IPackageFragment) {
return GroupType.Package;
}
if (element instanceof IJavaElement) {
return GroupType.Class;
}
if (element instanceof BugCode) {
return GroupType.PatternType;
}
if (element instanceof BugPattern) {
return GroupType.Pattern;
}
if (element instanceof BugCategory) {
return GroupType.Category;
}
if (element instanceof Integer) {
return GroupType.Priority;
}
return GroupType.Undefined;
}
}