pmd-jdeveloper: Add missing files
This commit is contained in:
1 parent
2cce739814
commit
91c0502178
3 files changed
+256
No files matched your search
@@ -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}));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package net.sourceforge.pmd.jdeveloper;
|
||||
|
||||
public class SettingsException extends Exception {
|
||||
public SettingsException(final String exc) {
|
||||
super(exc);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user