New report preferences page. Only saves active selections at the moment, all other settings are read-only.

git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@7298 51baf565-9d33-0410-a72c-fc3788e3496d
This commit is contained in:
Brian Remedios
2011-09-21 04:58:53 +00:00
parent 9b4713f1ad
commit 59bff0eea0
11 changed files with 652 additions and 36 deletions

@ -1,20 +1,22 @@
Change log for the PMD Eclipse plugin
v4.0.0 - xxx 2010?
v4.0.0 - xxx 2011?
. New integrated AST View and XPath test area
. New rule creation wizard
. New report setup panel
. User-definable rule violation markers
Highest priority markers also decorate folders & projects (selectable)
. Colour syntax highlighting in code viewers/editors
. Overhauled rule preferences screen
. Allows users to group/edit rules by multiple criteria
. New ability to enable/disable rules without removing them
. allows users to group/edit rules by multiple criteria
. new ability to enable/disable rules without removing them from rulesets
. larger editors for the various fields
. support for non-Java languages
. group editing of filter exclusion rules
. highlighting of non-default property values
. Color-tagged expressions in shown in rule table
. colour-tagged expressions in shown in rule table
. new property editors are fully type-aware
. misconfigured rules are highlighted
. Huge code cleanup
. Several usability fixes for the Dataflow view
. Updated to use latest SWT widgets wherever possible

@ -19,12 +19,6 @@ bin.includes = META-INF/,\
plugin_ru.properties,\
plugin_tr.properties,\
schema/,\
CHANGELOG.txt,\
CREDITS.txt,\
LICENSE.txt,\
PATTERNS LIBRARY LICENSE.txt,\
RELNOTES.txt,\
TODO.txt,\
about.ini,\
toc.xml,\
welcome.xml,\

@ -13,18 +13,19 @@ plugin.name = PMD Plug-in
plugin.provider = PMD Project
preferences.pmd = PMD
preferences.rulesets = Rules Configuration
preferences.rulesets = Rule Configuration
preferences.cpd = CPD Preferences
preferences.report = Reports
properties.pmd = PMD
menu.pmd = PMD
action.checkcpd = Find Suspect Cut And Paste...
action.checkpmd = Check Code With PMD
action.clearpmd = Clear PMD Violations
action.checkpmd = Check Code
action.clearpmd = Clear Violations
action.clearall = Clear All PMD Violations
action.ast = Generate Abstract Syntax Tree
action.clearreviews = Clear violations reviews
action.generatereport = Generate reports
action.clearreviews = Clear Violation Reviews
action.generatereport = Generate Reports
action.showdataflow = Show Method Dataflow
view.category = PMD
@ -33,5 +34,4 @@ view.violation = PMD Violations
view.outline = Violations Outline
view.overview = Violations Overview
view.dataflowview = Dataflow View
view.cpd = CPD View
view.cpd2 = CPD View2
view.cpd = CPD View

@ -190,6 +190,14 @@
class="net.sourceforge.pmd.eclipse.ui.preferences.CPDPreferencePage"
id="net.sourceforge.pmd.eclipse.ui.preferences.cpdPreferencePage">
</page>
<page
name="%preferences.report"
category="net.sourceforge.pmd.eclipse.ui.preferences.generalPreferencesPage"
class="net.sourceforge.pmd.eclipse.ui.reports.ReportPreferencesPage"
id="net.sourceforge.pmd.eclipse.ui.preferences.reportsPreferencePage">
</page>
</extension>
<extension

@ -65,6 +65,7 @@ public interface IPreferences {
String LOG_FILENAME_DEFAULT = "pmd-eclipse.log";
Level LOG_LEVEL = Level.WARN;
String ACTIVE_RULES = "";
String ACTIVE_RENDERERS = "";
boolean boolFor(String prefId);
@ -74,6 +75,8 @@ public interface IPreferences {
void isActive(String ruleName, boolean flag);
boolean isActiveRenderer(String rendererName);
Set<String> getActiveRuleNames();
void setActiveRuleNames(Set<String> ruleNames);
@ -192,6 +195,16 @@ public interface IPreferences {
// later...
/**
*
*/
Set<String> activeReportRenderers();
/**
*
* @param names
*/
void activeReportRenderers(Set<String> names);
/**
* Synchronize the preferences with the preferences store

@ -71,6 +71,7 @@ class PreferencesImpl implements IPreferences {
private String logFileName;
private Level logLevel;
private Set<String> activeRuleNames = new HashSet<String>();
private Set<String> activeRendererNames = new HashSet<String>();
private Map<RulePriority, PriorityDescriptor> uiDescriptorsByPriority = new HashMap<RulePriority, PriorityDescriptor>(5);
@ -230,6 +231,10 @@ class PreferencesImpl implements IPreferences {
return activeRuleNames.contains(ruleName);
}
public boolean isActiveRenderer(String rendererName) {
return activeRendererNames.contains(rendererName);
}
public void isActive(String ruleName, boolean flag) {
if (flag) {
activeRuleNames.add(ruleName);
@ -262,4 +267,12 @@ class PreferencesImpl implements IPreferences {
useCustomPriorityNames = flag;
}
public Set<String> activeReportRenderers() {
return activeRendererNames;
}
public void activeReportRenderers(Set<String> names) {
activeRendererNames = names;
}
}

@ -107,6 +107,7 @@ class PreferencesManagerImpl implements IPreferencesManager {
private static final String LOG_FILENAME = PMDPlugin.PLUGIN_ID + ".log_filename";
private static final String LOG_LEVEL = PMDPlugin.PLUGIN_ID + ".log_level";
private static final String ACTIVE_RULES = PMDPlugin.PLUGIN_ID + ".active_rules";
private static final String ACTIVE_RENDERERS = PMDPlugin.PLUGIN_ID + ".active_renderers";
private static final String OLD_PREFERENCE_PREFIX = "net.sourceforge.pmd.runtime";
private static final String OLD_PREFERENCE_LOCATION = "/.metadata/.plugins/org.eclipse.core.runtime/.settings/net.sourceforge.pmd.runtime.prefs";
@ -166,6 +167,7 @@ class PreferencesManagerImpl implements IPreferencesManager {
loadLogFileName();
loadLogLevel();
loadActiveRules();
loadActiveReportRenderers();
loadRulePriorityDescriptors();
return preferences;
@ -226,6 +228,7 @@ class PreferencesManagerImpl implements IPreferencesManager {
storeLogFileName();
storeLogLevel();
storeActiveRules();
storeActiveReportRenderers();
storePriorityDescriptors();
}
@ -304,6 +307,11 @@ class PreferencesManagerImpl implements IPreferencesManager {
preferences.setActiveRuleNames(asStringSet(loadPreferencesStore.getString(ACTIVE_RULES), ","));
}
private void loadActiveReportRenderers() {
loadPreferencesStore.setDefault(ACTIVE_RENDERERS, IPreferences.ACTIVE_RENDERERS);
preferences.activeReportRenderers(asStringSet(loadPreferencesStore.getString(ACTIVE_RENDERERS), ","));
}
private void loadRulePriorityDescriptors() {
for (Map.Entry<RulePriority, String> entry : StoreKeysByPriority.entrySet()) {
@ -344,6 +352,10 @@ class PreferencesManagerImpl implements IPreferencesManager {
storePreferencesStore.setValue(ACTIVE_RULES, asDelimitedString(preferences.getActiveRuleNames(), ","));
}
private void storeActiveReportRenderers() {
storePreferencesStore.setValue(ACTIVE_RENDERERS, asDelimitedString(preferences.activeReportRenderers(), ","));
}
private void storeProjectBuildPathEnabled() {
storePreferencesStore.setValue(PROJECT_BUILD_PATH_ENABLED, preferences.isProjectBuildPathEnabled());
}

@ -1,16 +1,10 @@
package net.sourceforge.pmd.eclipse.ui.actions;
import java.util.Properties;
import name.herlin.command.CommandException;
import net.sourceforge.pmd.eclipse.runtime.cmd.RenderReportsCmd;
import net.sourceforge.pmd.eclipse.ui.PMDUiConstants;
import net.sourceforge.pmd.eclipse.ui.nls.StringKeys;
import net.sourceforge.pmd.renderers.CSVRenderer;
import net.sourceforge.pmd.renderers.HTMLRenderer;
import net.sourceforge.pmd.renderers.TextRenderer;
import net.sourceforge.pmd.renderers.VBHTMLRenderer;
import net.sourceforge.pmd.renderers.XMLRenderer;
import net.sourceforge.pmd.eclipse.ui.reports.ReportManager;
import net.sourceforge.pmd.renderers.Renderer;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
@ -25,12 +19,21 @@ import org.eclipse.jface.viewers.IStructuredSelection;
* Generate a HTML report on the current project.
*
* @author Philippe Herlin
*
* @author Brian Remedios
*/
public class GenerateReportAction extends AbstractUIAction {
private static final Logger log = Logger.getLogger(GenerateReportAction.class);
private static final String DefaultReportName = "pmd-report";
private void registerRenderers(RenderReportsCmd cmd) {
for (Renderer renderer : ReportManager.instance.activeRenderers()) {
cmd.registerRenderer(renderer, DefaultReportName + "." + renderer.defaultFileExtension());
}
}
/**
* @see org.eclipse.ui.IActionDelegate#run(IAction)
*/
@ -44,15 +47,7 @@ public class GenerateReportAction extends AbstractUIAction {
final RenderReportsCmd cmd = new RenderReportsCmd();
cmd.setProject(project);
cmd.setUserInitiated(true);
// FIXME PMD 5.0
Properties props = new Properties();
cmd.registerRenderer(new HTMLRenderer(props), PMDUiConstants.HTML_REPORT_NAME);
cmd.registerRenderer(new CSVRenderer(props), PMDUiConstants.CSV_REPORT_NAME);
cmd.registerRenderer(new XMLRenderer(props), PMDUiConstants.XML_REPORT_NAME);
cmd.registerRenderer(new TextRenderer(props), PMDUiConstants.TXT_REPORT_NAME);
cmd.registerRenderer(new VBHTMLRenderer(props), PMDUiConstants.VBHTML_REPORT_NAME);
registerRenderers(cmd);
cmd.performExecute();
}
} catch (CommandException e) {
@ -73,7 +68,7 @@ public class GenerateReportAction extends AbstractUIAction {
* @param selection
* @return
*/
private IProject getProject(final IStructuredSelection selection) {
private static IProject getProject(final IStructuredSelection selection) {
IProject project = null;
final Object object = selection.getFirstElement();
if (object != null && object instanceof IAdaptable) {

@ -0,0 +1,38 @@
package net.sourceforge.pmd.eclipse.ui.reports;
import net.sourceforge.pmd.eclipse.ui.ItemColumnDescriptor;
import net.sourceforge.pmd.eclipse.ui.ItemFieldAccessor;
import net.sourceforge.pmd.eclipse.ui.ItemFieldAccessorAdapter;
import net.sourceforge.pmd.renderers.Renderer;
import org.eclipse.swt.SWT;
/**
*
* @author Brian Remedios
*/
public interface ReportColumnUI {
ItemFieldAccessor<String, Renderer> nameAcc = new ItemFieldAccessorAdapter<String, Renderer>(null) {
public String valueFor(Renderer renderer) { return renderer.getName(); }
};
ItemFieldAccessor<String, Renderer> descriptionAcc = new ItemFieldAccessorAdapter<String, Renderer>(null) {
public String valueFor(Renderer renderer) { return renderer.getDescription(); }
};
ItemFieldAccessor<Boolean, Renderer> showSuppressedAcc = new ItemFieldAccessorAdapter<Boolean, Renderer>(null) {
public Boolean valueFor(Renderer renderer) { return renderer.isShowSuppressedViolations(); }
};
ItemFieldAccessor<String, Renderer> propertiesAcc = new ItemFieldAccessorAdapter<String, Renderer>(null) {
public String valueFor(Renderer renderer) { return ReportManager.asString(renderer.getPropertyDefinitions()); }
};
ItemColumnDescriptor<String, Renderer> name = new ItemColumnDescriptor<String, Renderer>("", "Name", SWT.LEFT, 55, true, nameAcc);
ItemColumnDescriptor<String, Renderer> description = new ItemColumnDescriptor<String, Renderer>("", "Format", SWT.LEFT, 99, true, descriptionAcc);
ItemColumnDescriptor<Boolean, Renderer> suppressed = new ItemColumnDescriptor<Boolean, Renderer>("", "Show suppressed", SWT.LEFT, 40, true, showSuppressedAcc);
ItemColumnDescriptor<String, Renderer> properties = new ItemColumnDescriptor<String, Renderer>("", "Properties", SWT.LEFT, 99, true, propertiesAcc);
ItemColumnDescriptor[] VisibleColumns = new ItemColumnDescriptor[] { name, suppressed, properties };
}

@ -0,0 +1,87 @@
package net.sourceforge.pmd.eclipse.ui.reports;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import net.sourceforge.pmd.eclipse.plugin.PMDPlugin;
import net.sourceforge.pmd.eclipse.runtime.preferences.IPreferences;
import net.sourceforge.pmd.renderers.CSVRenderer;
import net.sourceforge.pmd.renderers.HTMLRenderer;
import net.sourceforge.pmd.renderers.Renderer;
import net.sourceforge.pmd.renderers.TextRenderer;
import net.sourceforge.pmd.renderers.VBHTMLRenderer;
import net.sourceforge.pmd.renderers.XMLRenderer;
/**
*
* @author Brian Remedios
*/
public class ReportManager {
private final Renderer[] allRenderers;
public static final ReportManager instance = new ReportManager();
private ReportManager() {
allRenderers = knownRenderers();
}
public Renderer[] allRenderers() { return allRenderers; }
private Renderer[] knownRenderers() {
Properties props = new Properties();
return new Renderer[] {
new HTMLRenderer(props),
new CSVRenderer(props),
new XMLRenderer(props),
new TextRenderer(props),
new VBHTMLRenderer(props)
};
}
// public Renderer[] availableRenderers2() {
//
// List<Renderer> renderers = new ArrayList<Renderer>();
//
// for (String reportName : RendererFactory.REPORT_FORMAT_TO_RENDERER.keySet()) {
// renderers.add(
// RendererFactory.createRenderer(reportName, new Properties())
// );
// }
//
// return renderers.toArray(new Renderer[renderers.size()]);
// }
public List<Renderer> activeRenderers() {
List<Renderer> actives = new ArrayList<Renderer>();
IPreferences prefs = PMDPlugin.getDefault().loadPreferences();
for (Renderer renderer : allRenderers) {
if (prefs.isActiveRenderer(renderer.getName())) actives.add(renderer);
}
return actives;
}
public static String asString(Map<String, String> propertyDefinitions) {
if (propertyDefinitions.isEmpty()) return "";
StringBuilder sb = new StringBuilder();
String[] keys = propertyDefinitions.keySet().toArray(new String[propertyDefinitions.size()]);
sb.append(keys[0]).append(": ").append(propertyDefinitions.get(keys[0]));
for (int i=1; i<keys.length; i++) {
sb.append(", ").append(keys[i]).append(": ").append(propertyDefinitions.get(keys[i]));
}
return sb.toString();
}
}