diff --git a/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/CpdViolationPage.java b/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/CpdViolationPage.java new file mode 100644 index 0000000000..69f6869c13 --- /dev/null +++ b/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/CpdViolationPage.java @@ -0,0 +1,87 @@ +package net.sourceforge.pmd.jdeveloper; + +import java.awt.Component; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreeSelectionModel; + +import net.sourceforge.pmd.cpd.Match; +import net.sourceforge.pmd.cpd.TokenEntry; + +import oracle.ide.ceditor.CodeEditor; +import oracle.ide.editor.EditorManager; +import oracle.ide.layout.ViewId; +import oracle.ide.log.AbstractLogPage; +import oracle.ide.model.Node; + + +public class CpdViolationPage extends AbstractLogPage implements TreeSelectionListener { + + private final transient JScrollPane scrollPane; + private final transient JTree tree; + private final transient DefaultMutableTreeNode top; + public final transient Map cpdFileToNodeMap = + new HashMap(); // whew, this is kludgey + + public CpdViolationPage() { + super(new ViewId("CpdPage", CpdAddin.CPD_TITLE), null, false); + top = new DefaultMutableTreeNode("CPD"); + tree = new JTree(top); + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + tree.addTreeSelectionListener(this); + scrollPane = new JScrollPane(tree); + } + + public void valueChanged(final TreeSelectionEvent event) { + final DefaultMutableTreeNode node = + (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); + if (node != null && node.isLeaf()) { + final CpdViolationWrapper nodeInfo = + (CpdViolationWrapper)node.getUserObject(); + EditorManager.getEditorManager().openDefaultEditorInFrame(nodeInfo.file.getURL()); + ((CodeEditor)EditorManager.getEditorManager().getCurrentEditor()).gotoLine(nodeInfo.mark.getBeginLine(), + 0, + false); + } + } + + public void add(final Match match) { + final Node file1 = + (Node)cpdFileToNodeMap.get(match.getFirstMark().getTokenSrcID()); + final DefaultMutableTreeNode matchNode = + new DefaultMutableTreeNode(file1.getShortLabel() + " contains a " + + match.getLineCount() + + " line block of duplicated code", true); + top.add(matchNode); + for (final Iterator i = match.iterator(); i.hasNext(); ) { + final TokenEntry mark = (TokenEntry)i.next(); + final Node file = (Node)cpdFileToNodeMap.get(mark.getTokenSrcID()); + final DefaultMutableTreeNode markTreeNode = + new DefaultMutableTreeNode(new CpdViolationWrapper(mark, file, + file.getShortLabel() + + " has some at line " + + mark.getBeginLine()), + false); + matchNode.add(markTreeNode); + } + } + + public Component getGUI() { + return scrollPane; + } + + public void clearAll() { + top.removeAllChildren(); + tree.repaint(); + scrollPane.repaint(); + //tree.removeSelectionPath(new TreePath(new Object[] {top})); + } +} diff --git a/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/PmdCommand.java b/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/PmdCommand.java new file mode 100644 index 0000000000..df697adb64 --- /dev/null +++ b/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/PmdCommand.java @@ -0,0 +1,162 @@ +package net.sourceforge.pmd.jdeveloper; + +import java.io.IOException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.swing.JOptionPane; + +import net.sourceforge.pmd.PMD; +import net.sourceforge.pmd.PMDConfiguration; +import net.sourceforge.pmd.PMDException; +import net.sourceforge.pmd.Report; +import net.sourceforge.pmd.RuleContext; +import net.sourceforge.pmd.RuleSetNotFoundException; +import net.sourceforge.pmd.RuleSets; +import net.sourceforge.pmd.RuleViolation; +import net.sourceforge.pmd.SourceCodeProcessor; + +import oracle.ide.Context; +import oracle.ide.Ide; +import oracle.ide.ceditor.CodeEditor; +import oracle.ide.controller.Command; +import oracle.ide.extension.RegisteredByExtension; +import oracle.ide.log.LogManager; +import oracle.ide.log.LogPage; +import oracle.ide.log.LogWindow; +import oracle.ide.model.DataContainer; +import oracle.ide.model.Element; +import oracle.ide.model.Node; +import oracle.ide.model.Project; +import oracle.ide.model.RelativeDirectoryContextFolder; +import oracle.ide.model.Workspace; + +import oracle.jdeveloper.compiler.IdeLog; +import oracle.jdeveloper.compiler.IdeStorage; +import oracle.jdeveloper.model.JavaSourceNode; + + +@RegisteredByExtension("net.sourceforge.pmd.jdeveloper") +public class PmdCommand extends Command { + + public static final int RUN_PMD_CMD_ID = Ide.findCmdID("net.sourceforge.pmd.jdeveloper.CheckPmd"); + private transient Map pmdFileToNodeMap = new HashMap(); // whew, this is kludgey + + public PmdCommand() { + super(RUN_PMD_CMD_ID); + } + + @Override + public int doit() { + if (!PmdAddin.added) { + addLogPage(); + } + runPmd(context); + return OK; + } + + private void runPmd(final Context context) { + try { + pmdFileToNodeMap.clear(); + final PMD pmd = new PMD(); + // TODO ? Version.setJavaVersion(context, pmd); + + final PmdSelectedRules rules = new PmdSelectedRules(PmdSettingsPanel.createSettingsStorage()); + final RuleContext ctx = new RuleContext(); + ctx.setReport(new Report()); + // Util.logMessage(context.getElement().getLongLabel()); + if (context.getElement() instanceof RelativeDirectoryContextFolder) { + final RelativeDirectoryContextFolder folder = (RelativeDirectoryContextFolder)context.getElement(); + checkTree(folder.getChildren(), pmd, rules, ctx); + render(ctx); + } else if (context.getElement() instanceof Workspace) { + final Workspace workspace = (Workspace)context.getElement(); + checkTree(workspace.getChildren(), pmd, rules, ctx); + render(ctx); + } else if (context.getElement() instanceof Project) { + final Project project = (Project)context.getElement(); + checkTree(project.getChildren(), pmd, rules, ctx); + render(ctx); + } else if (context.getElement() instanceof JavaSourceNode || context.getView() instanceof CodeEditor) { + final Node candidate = context.getNode(); + processFile(rules, ctx, candidate); + render(ctx); + } + } catch (IOException e) { + Util.logMessage(e.getStackTrace()); + Util.showError(e, PmdAddin.PMD_TITLE); + } catch (PMDException e) { + Util.logMessage(e.getStackTrace()); + Util.showError(e, PmdAddin.PMD_TITLE); + } catch (RuleSetNotFoundException e) { + Util.logMessage(e.getStackTrace()); + Util.showError(e, PmdAddin.PMD_TITLE); + } + } + + private void processFile(final PmdSelectedRules rules, final RuleContext ctx, + final Node candidate) throws net.sourceforge.pmd.PMDException, java.io.IOException { + pmdFileToNodeMap.put(candidate.getLongLabel(), candidate); + ctx.setSourceCodeFilename(candidate.getLongLabel()); + SourceCodeProcessor scp = new SourceCodeProcessor(new PMDConfiguration()); + RuleSets rss = new RuleSets(); + rss.addRuleSet(rules.getSelectedRules()); + scp.processSourceCode(candidate.getInputStream(), rss, ctx); + } + + private void addLogPage() { + LogManager.getLogManager().addPage(PmdAddin.pmdViolationPage); + LogManager.getLogManager().showLog(); + PmdAddin.added = true; + } + + private void checkTree(final Iterator iter, final PMD pmd, final PmdSelectedRules rules, + final RuleContext ctx) throws IOException, PMDException { + while (iter.hasNext()) { + final Object obj = iter.next(); + final Element el = (Element)obj; + DataContainer dataContainer; + // Util.logMessage(el.getLongLabel() + ":: " + obj.getClass().getName()); + try { + dataContainer = ((DataContainer)obj); + Iterator children = dataContainer.getChildren(); + if (!children.equals(null)) { + checkTree(children, pmd, rules, ctx); + } + } catch (ClassCastException e) { + if ((obj instanceof JavaSourceNode)) { + final JavaSourceNode candidate = (JavaSourceNode)obj; + processFile(rules, ctx, candidate); + } else { + continue; + } + } + } + } + + private void render(final RuleContext ctx) { + PmdAddin.pmdViolationPage.show(); + PmdAddin.pmdViolationPage.clearAll(); + if (ctx.getReport().isEmpty()) { + JOptionPane.showMessageDialog(null, "No problems found", PmdAddin.PMD_TITLE, + JOptionPane.INFORMATION_MESSAGE); + final LogPage page = LogManager.getLogManager().getMsgPage(); + if (page instanceof LogWindow) { + ((LogWindow)page).show(); + } + } else { + final List list = new ArrayList(); + for (final Iterator i = ctx.getReport().iterator(); i.hasNext(); ) { + final RuleViolation viol = (RuleViolation)i.next(); + final Node node = (Node)pmdFileToNodeMap.get(viol.getFilename()); + list.add(new IdeLog.Message(Ide.getActiveWorkspace(), Ide.getActiveProject(), new IdeStorage(node), + viol.getDescription(), 2, viol.getBeginLine(), viol.getBeginColumn())); + } + PmdAddin.pmdViolationPage.add(list); + } + } +} diff --git a/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/SettingsException.java b/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/SettingsException.java new file mode 100644 index 0000000000..38a1ab59c7 --- /dev/null +++ b/pmd-jdeveloper.12.1.2/src/net/sourceforge/pmd/jdeveloper/SettingsException.java @@ -0,0 +1,7 @@ +package net.sourceforge.pmd.jdeveloper; + +public class SettingsException extends Exception { + public SettingsException(final String exc) { + super(exc); + } +}