From: Jae G. <jga...@us...> - 2006-11-12 18:21:26
|
Update of /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/actions In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv14407/src/org/epic/perleditor/actions Modified Files: PodCheckerAction.java PerlCriticAction.java Added Files: PerlUserJobAction.java Log Message: - enabled first cut of podChecker functionality - refactored Critic extend to use PerlUserJobAction - grouped critic markers into IMarker severities - pulled up parseInt this time w/ log message and -1 return code (see comment); open to suggestions on how to refactor due to shared functionality btwn SourceCritic and PodChecker Index: PerlCriticAction.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/actions/PerlCriticAction.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- PerlCriticAction.java 31 Oct 2006 20:15:03 -0000 1.1 +++ PerlCriticAction.java 12 Nov 2006 18:21:18 -0000 1.2 @@ -1,15 +1,7 @@ package org.epic.perleditor.actions; -import java.util.HashMap; - -import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; - -import org.eclipse.ui.IFileEditorInput; +import org.eclipse.core.resources.IResource; import org.epic.core.util.MarkerUtilities; @@ -18,13 +10,16 @@ import org.epic.perleditor.editors.util.SourceCritic; import org.epic.perleditor.editors.util.SourceCritic.Violation; +import java.util.HashMap; +import java.util.Map; + /** * Runs Perl::Critic * * @see http://search.cpan.org/dist/Perl-Critic/ */ -public class PerlCriticAction extends PerlEditorAction +public class PerlCriticAction extends PerlUserJobAction { //~ Static fields/initializers @@ -37,65 +32,83 @@ super(editor); } - //~ Methods - - protected void doRun() + /* + * @see org.epic.perleditor.actions.PerlJobAction#createMarkerAttributes(org.epic.core.util.MarkerUtilities, java.lang.Object) + */ + protected Map createMarkerAttributes(MarkerUtilities factory, Object violation) { - // TODO: check if editor is dirty before running - final IFile file = ((IFileEditorInput) getEditor().getEditorInput()).getFile(); - final MarkerUtilities factory = new MarkerUtilities(getLog(), getPluginId()); + Map attributes = new HashMap(); + Violation v = (Violation) violation; - Job job = new Job("Executing Perl::Critic against " + file.getName()) - { - protected IStatus run(IProgressMonitor monitor) - { - // cancelled while sitting in queue - if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } + /* + * XXX: including the violation as part of the message is only temporary + * + * future enhancements should have the pbp info displayed as part of the marker annotation, or + * inside some kind of view that can be spawned to explain the critic warning. + * + * inclusion of a link to safari would be useful as well, but that depends on missing + * Perl::Critic functionality + */ + factory.setMessage(attributes, v.message + " (" + v.pbp + ")"); + factory.setLineNumber(attributes, v.lineNumber); + factory.setSeverity(attributes, getSeverity(v.severity)); - factory.deleteMarkers(getResource(), METRICS_MARKER); - Violation[] violations = SourceCritic.critique(file, getLog()); + attributes.put("pbp", v.pbp); - // check if we were cancelled while the thread was running - if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } + return attributes; + } - for (int i = 0; i < violations.length; i++) - { - createMarker(factory, violations[i]); - } + /* + * @see org.epic.perleditor.actions.PerlJobAction#doJob(org.eclipse.core.resources.IResource) + */ + protected Object[] doJob(IResource resource) + { + return SourceCritic.critique(resource, getLog()); + } - return Status.OK_STATUS; - } - }; + /* + * @see + * org.epic.perleditor.actions.PerlJobAction#getJobTitle(org.eclipse.core.resources.IResource) + */ + protected String getJobTitle(IResource resource) + { + return "Executing Perl::Critic against " + resource.getName(); + } - job.setUser(true); - job.schedule(); + /* + * @see org.epic.perleditor.actions.PerlJobAction#getMarker() + */ + protected String getMarker() + { + return METRICS_MARKER; } + /* + * @see org.epic.perleditor.actions.PerlEditorAction#getPerlEditorActionId() + */ protected String getPerlEditorActionId() { return PerlEditorActionIds.PERL_CRITIC; } - private void createMarker(MarkerUtilities factory, Violation violation) + private int getSeverity(int severity) { - HashMap attributes = new HashMap(); - - /* - * XXX: including the violation as part of the message is only temporary - * - * future enhancements should have the pbp info displayed as part of the marker annotation, - * or inside some kind of view that can be spawned to explain the critic warning. - * - * inclusion of a link to safari would be useful as well, but that depends on missing - * Perl::Critic functionality - */ - factory.setMessage(attributes, violation.message + " (" + violation.pbp + ")"); - factory.setLineNumber(attributes, violation.lineNumber); - factory.setSeverity(attributes, IMarker.SEVERITY_WARNING); - - attributes.put("pbp", violation.pbp); - - factory.createMarker(getResource(), METRICS_MARKER, attributes); + switch (severity) + { + case 3: + case 4: + { + return IMarker.SEVERITY_WARNING; + } + case 5: + { + return IMarker.SEVERITY_ERROR; + } + default: + { + return IMarker.SEVERITY_INFO; + } + } } } --- NEW FILE: PerlUserJobAction.java --- package org.epic.perleditor.actions; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.epic.core.util.MarkerUtilities; import org.epic.perleditor.editors.PerlEditor; import java.util.Collections; import java.util.Map; /** * Abstract base class that provides a workflow to run an editor action in a background user thread * that may be cancelled, and optionally create markers on the resource the action was invoked on. */ public abstract class PerlUserJobAction extends PerlEditorAction { //~ Constructors protected PerlUserJobAction(PerlEditor editor) { super(editor); } //~ Methods /** * Performs the actual job work. * * <p>If markers should be created on the resource, an array of objects containing the marker * data should be returned. The individual objects in the array will be passed into * {@link #createMarkerAttributes(MarkerUtilities, Object)} so the marker attributes can be * created.</p> * * <p>If no markers need to be created, an empty array should be returned.</p> * * @param resource resource the job is performed on * * @return array of objects containing data to create markers or an empty array if no markers * are to be created. */ protected abstract Object[] doJob(IResource resource); /** * @return the job title - the passed IResource object can be used to obtain information (ie: * name) that can be included in the job title */ protected abstract String getJobTitle(IResource resource); /** * Creates the marker attribute map. * * <p>Sub-classes may override if markers need to be created. The <code>set</code> methods in * the <code>MarkerUtilities</code> class should be used to set any atttribute data that will * appear in the Problems view (line number, message, etc).</p> * * <p>The default implementation returns an empty map.</p> * * @param factory * @param violation object containing marker data * * @return marker attribute map */ protected Map createMarkerAttributes(MarkerUtilities factory, Object violation) { return Collections.EMPTY_MAP; } /* * @see org.epic.perleditor.actions.PerlEditorAction#doRun() */ protected final void doRun() { // TODO: check if editor is dirty before running final String marker = getMarker(); final IResource resource = getResource(); final MarkerUtilities factory = new MarkerUtilities(getLog(), getPluginId()); Job job = new Job(getJobTitle(resource)) { protected IStatus run(IProgressMonitor monitor) { // cancelled while sitting in queue if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } factory.deleteMarkers(resource, marker); /* * this should be able to support multiple resources as well in the future - the * loop would just need to include a check against the monitor for cancellation */ Object[] violations = doJob(resource); // check if we were cancelled while the thread was running if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } for (int i = 0; i < violations.length; i++) { Map attributes = createMarkerAttributes(factory, violations[i]); factory.createMarker(resource, marker, attributes); } return Status.OK_STATUS; } }; job.setUser(true); job.schedule(); } /** * @return name of marker to be created - only override if markers are to be created. */ protected String getMarker() { return ""; } } Index: PodCheckerAction.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/actions/PodCheckerAction.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- PodCheckerAction.java 31 Oct 2006 20:16:19 -0000 1.2 +++ PodCheckerAction.java 12 Nov 2006 18:21:18 -0000 1.3 @@ -1,27 +1,94 @@ package org.epic.perleditor.actions; -import org.eclipse.core.resources.IFile; -import org.eclipse.ui.IFileEditorInput; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IResource; + +import org.epic.core.util.MarkerUtilities; + import org.epic.perleditor.editors.PerlEditor; import org.epic.perleditor.editors.PerlEditorActionIds; import org.epic.perleditor.editors.util.PodChecker; +import org.epic.perleditor.editors.util.PodChecker.Violation; -public class PodCheckerAction extends PerlEditorAction +import java.util.HashMap; +import java.util.Map; + + +/** + * Runs Pod::Checker + * + * @see http://search.cpan.org/dist/Pod-Parser/lib/Pod/Checker.pm + */ +public class PodCheckerAction extends PerlUserJobAction { + //~ Static fields/initializers + + private static final String POD_MARKER = "org.epic.perleditor.markers.podChecker"; + + //~ Constructors public PodCheckerAction(PerlEditor editor) { super(editor); } - protected void doRun() + //~ Methods + + /* + * @see + * org.epic.perleditor.actions.PerlJobAction#createMarkerAttributes(org.epic.core.util.MarkerUtilities, + * java.lang.Object) + */ + protected Map createMarkerAttributes(MarkerUtilities factory, Object violation) { - // TODO: check if editor is dirty before running - IFile file = ((IFileEditorInput) getEditor().getEditorInput()).getFile(); + Map attributes = new HashMap(3); + Violation v = (Violation) violation; - PodChecker.podchecker(file, getLog()); + int severity; + if ("error".equalsIgnoreCase(v.severity)) + { + severity = IMarker.SEVERITY_ERROR; + } + else + { + severity = IMarker.SEVERITY_WARNING; + } + + factory.setMessage(attributes, v.message); + factory.setSeverity(attributes, severity); + factory.setLineNumber(attributes, v.lineNumber); + + return attributes; + } + + /* + * @see org.epic.perleditor.actions.PerlJobAction#doJob(org.eclipse.core.resources.IResource) + */ + protected Object[] doJob(IResource resource) + { + return PodChecker.podchecker(resource, getLog()); } + /* + * @see + * org.epic.perleditor.actions.PerlJobAction#getJobTitle(org.eclipse.core.resources.IResource) + */ + protected String getJobTitle(IResource resource) + { + return "Executing Perl::Critic against " + resource.getName(); + } + + /* + * @see org.epic.perleditor.actions.PerlJobAction#getMarker() + */ + protected String getMarker() + { + return POD_MARKER; + } + + /* + * @see org.epic.perleditor.actions.PerlEditorAction#getPerlEditorActionId() + */ protected String getPerlEditorActionId() { return PerlEditorActionIds.POD_CHECKER; |