diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java index 8f033cb2e8..624dcf9620 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/DetectCutAndPasteCmd.java @@ -54,6 +54,7 @@ import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; import net.sourceforge.pmd.eclipse.runtime.properties.IProjectProperties; import net.sourceforge.pmd.eclipse.runtime.properties.PropertiesException; import net.sourceforge.pmd.eclipse.util.IOUtil; +import net.sourceforge.pmd.util.StringUtil; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; @@ -71,10 +72,6 @@ import org.eclipse.ui.IPropertyListener; */ public class DetectCutAndPasteCmd extends AbstractProjectCommand { - private static final long serialVersionUID = 1L; - - private static final Logger log = Logger.getLogger(DetectCutAndPasteCmd.class); - private Language language; private int minTileSize; private Renderer renderer; @@ -82,28 +79,41 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { private boolean createReport; private List listeners; + private static final long serialVersionUID = 1L; + private static final Logger log = Logger.getLogger(DetectCutAndPasteCmd.class); + /** * Default Constructor */ public DetectCutAndPasteCmd() { super("DetectCutAndPaste", "Detect Cut & paste for a project"); - this.setOutputProperties(true); - this.setReadOnly(false); - this.setTerminated(false); - this.listeners = new ArrayList(); + setOutputProperties(true); + setReadOnly(false); + setTerminated(false); + listeners = new ArrayList(); } + private void notifyListeners(final CPD cpd) { + // trigger event propertyChanged for all listeners + Display.getDefault().asyncExec(new Runnable() { + public void run() { + for (IPropertyListener listener : listeners) { + listener.propertyChanged(cpd.getMatches(), PMDRuntimeConstants.PROPERTY_CPD); + } + } + }); + } + /** * @see name.herlin.command.AbstractProcessableCommand#execute() */ @Override public void execute() throws CommandException { try { - // find the files - List files = findFiles(); + List files = findCandidateFiles(); - if (files.size() == 0) { + if (files.isEmpty()) { logInfo("No files found for specified language."); } else { logInfo("Found " + files.size() + " files for the specified language. Performing CPD."); @@ -112,24 +122,13 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { beginTask("Finding suspect Cut And Paste", getStepCount()*2); if (!isCanceled()) { - // detect cut and paste final CPD cpd = detectCutAndPaste(files); if (!isCanceled()) { - // if the command was not canceled if (createReport) { - // create the report optionally - this.renderReport(cpd.getMatches()); + renderReport(cpd.getMatches()); } - - // trigger event propertyChanged for all listeners - Display.getDefault().asyncExec(new Runnable() { - public void run() { - for (IPropertyListener listener : listeners) { - listener.propertyChanged(cpd.getMatches(), PMDRuntimeConstants.PROPERTY_CPD); - } - } - }); + notifyListeners(cpd); } } } catch (CoreException e) { @@ -171,7 +170,7 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { * @param tilesize The tilesize to set. */ public void setMinTileSize(final int tilesize) { - this.minTileSize = tilesize; + minTileSize = tilesize; } /** @@ -203,6 +202,10 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { listeners.add(listener); } + private boolean canRenderReport() { + return renderer != null && StringUtil.isNotEmpty(reportName); + } + /** * @see name.herlin.command.Command#isReadyToExecute() */ @@ -211,7 +214,7 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { return super.isReadyToExecute() && language != null && (!createReport // need a renderer and reportName if a report should be created - || renderer != null && reportName != null); + || canRenderReport()); } /** @@ -221,7 +224,7 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { * @throws PropertiesException * @throws CoreException */ - private List findFiles() throws PropertiesException, CoreException { + private List findCandidateFiles() throws PropertiesException, CoreException { final IProjectProperties properties = projectProperties(); final CPDVisitor visitor = new CPDVisitor(); visitor.setWorkingSet(properties.getProjectWorkingSet()); @@ -291,10 +294,10 @@ public class DetectCutAndPasteCmd extends AbstractProjectCommand { final IFile reportFile = folder.getFile(reportName); contentsStream = new ByteArrayInputStream(reportString.getBytes()); if (reportFile.exists()) { - log.debug(" Overwritting the report file"); + log.debug(" Overwriting report file"); reportFile.setContents(contentsStream, true, false, getMonitor()); } else { - log.debug(" Creating the report file"); + log.debug(" Creating report file"); reportFile.create(contentsStream, true, getMonitor()); } reportFile.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); diff --git a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmd.java b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportsCmd.java similarity index 80% rename from pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmd.java rename to pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportsCmd.java index b0c982f474..9aa3d889d7 100644 --- a/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportCmd.java +++ b/pmd-eclipse-plugin/plugins/net.sourceforge.pmd.eclipse.plugin/src/net/sourceforge/pmd/eclipse/runtime/cmd/RenderReportsCmd.java @@ -51,6 +51,7 @@ import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; import net.sourceforge.pmd.eclipse.runtime.builder.MarkerUtil; import net.sourceforge.pmd.eclipse.util.IOUtil; import net.sourceforge.pmd.renderers.Renderer; +import net.sourceforge.pmd.util.StringUtil; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; @@ -70,11 +71,11 @@ import org.eclipse.jdt.core.JavaCore; * @author Philippe Herlin * */ -public class RenderReportCmd extends AbstractProjectCommand { +public class RenderReportsCmd extends AbstractProjectCommand { private static final long serialVersionUID = 1L; - private static final Logger log = Logger.getLogger(RenderReportCmd.class); + private static final Logger log = Logger.getLogger(RenderReportsCmd.class); /** * Table containing the renderers indexed by the file name. @@ -84,12 +85,12 @@ public class RenderReportCmd extends AbstractProjectCommand { /** * Default Constructor */ - public RenderReportCmd() { - super("RenderReport", "Produce a HTML report for a project"); + public RenderReportsCmd() { + super("RenderReport", "Produce reports for a project"); - this.setOutputProperties(false); - this.setReadOnly(false); - this.setTerminated(false); + setOutputProperties(false); + setReadOnly(false); + setTerminated(false); } /** @@ -102,12 +103,54 @@ public class RenderReportCmd extends AbstractProjectCommand { renderers.put(reportFile, renderer); } + /** + * + * @param report + * @param folder + * @param reportName + * @param renderer + * @throws IOException + * @throws CoreException + */ + private void render(Report report, IFolder folder, String reportName, Renderer renderer) throws IOException, CoreException { + + StringWriter writer = new StringWriter(); + String reportString = null; + + try { + renderer.setWriter(writer); + renderer.start(); + renderer.renderFileReport(report); + renderer.end(); + + reportString = writer.toString(); + } finally { + IOUtil.closeQuietly(writer); + } + + if (StringUtil.isEmpty(reportString)) { + log.debug("Missing content for report: " + reportName); + return; + } + + log.debug(" Creating the report file"); + final IFile reportFile = folder.getFile(reportName); + final InputStream contentsStream = new ByteArrayInputStream(reportString.getBytes()); + if (reportFile.exists()) { + reportFile.setContents(contentsStream, true, false, getMonitor()); + } else { + reportFile.create(contentsStream, true, getMonitor()); + } + reportFile.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); + contentsStream.close(); + } + /** * @see name.herlin.command.AbstractProcessableCommand#execute() */ @Override public void execute() throws CommandException { - StringWriter writer = null; + try { log.debug("Starting RenderReport command"); log.debug(" Create a report object"); @@ -120,28 +163,10 @@ public class RenderReportCmd extends AbstractProjectCommand { } for (Map.Entry entry: renderers.entrySet()) { - final String reportName = entry.getKey(); - final Renderer renderer = entry.getValue(); - + String reportName = entry.getKey(); + Renderer renderer = entry.getValue(); log.debug(" Render the report"); - writer = new StringWriter(); - renderer.setWriter(writer); - renderer.start(); - renderer.renderFileReport(report); - renderer.end(); - - String reportString = writer.toString(); - - log.debug(" Creating the report file"); - final IFile reportFile = folder.getFile(reportName); - final InputStream contentsStream = new ByteArrayInputStream(reportString.getBytes()); - if (reportFile.exists()) { - reportFile.setContents(contentsStream, true, false, getMonitor()); - } else { - reportFile.create(contentsStream, true, getMonitor()); - } - reportFile.refreshLocal(IResource.DEPTH_INFINITE, getMonitor()); - contentsStream.close(); + render(report, folder, reportName, renderer); } } catch (CoreException e) { log.debug("Core Exception: " + e.getMessage(), e); @@ -149,8 +174,7 @@ public class RenderReportCmd extends AbstractProjectCommand { } catch (IOException e) { log.debug("Core Exception: " + e.getMessage(), e); throw new CommandException(e); - } finally { - IOUtil.closeQuietly(writer); + } finally { log.debug("End of RenderReport command"); setTerminated(true); }