diff --git a/pmd-jbuilder/PMDOpenTool.jpx b/pmd-jbuilder/PMDOpenTool.jpx new file mode 100644 index 0000000000..60cc0157ed --- /dev/null +++ b/pmd-jbuilder/PMDOpenTool.jpx @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pmd-jbuilder/PMDOpenTool.jpx.local b/pmd-jbuilder/PMDOpenTool.jpx.local new file mode 100644 index 0000000000..81d9d610be --- /dev/null +++ b/pmd-jbuilder/PMDOpenTool.jpx.local @@ -0,0 +1,33 @@ +build.menu.1[0]=com.borland.jbuilder.build.ProjectBuilder$ProjectBuildAction;make +build.menu.2[0]=com.borland.jbuilder.build.ProjectBuilder$ProjectBuildAction;rebuild +debug.NoTracingClasses.1[0]=23 com.borland.datastore.*1 1 -1 +debug.NoTracingClasses.10[0]=7 javax.*1 1 -1 +debug.NoTracingClasses.11[0]=5 sun.*1 1 -1 +debug.NoTracingClasses.12[0]=23 com.borland.appclient.*1 1 -1 +debug.NoTracingClasses.13[0]=21 com.borland.console.*1 1 -1 +debug.NoTracingClasses.14[0]=17 com.borland.ejb.*1 1 -1 +debug.NoTracingClasses.15[0]=24 com.borland.enterprise.*1 1 -1 +debug.NoTracingClasses.16[0]=18 com.borland.jafa.*1 1 -1 +debug.NoTracingClasses.17[0]=17 com.borland.jss.*1 1 -1 +debug.NoTracingClasses.18[0]=24 com.borland.management.*1 1 -1 +debug.NoTracingClasses.19[0]=23 com.borland.primetime.*1 1 -1 +debug.NoTracingClasses.2[0]=21 com.borland.dbswing.*1 1 -1 +debug.NoTracingClasses.20[0]=22 com.borland.security.*1 1 -1 +debug.NoTracingClasses.21[0]=18 com.borland.util.*1 1 -1 +debug.NoTracingClasses.22[0]=17 com.borland.xml.*1 1 -1 +debug.NoTracingClasses.23[0]=13 com.inprise.*1 1 -1 +debug.NoTracingClasses.24[0]=15 com.visigenic.*1 1 -1 +debug.NoTracingClasses.25[0]=9 org.omg.*1 1 -1 +debug.NoTracingClasses.3[0]=16 com.borland.dx.*1 1 -1 +debug.NoTracingClasses.4[0]=16 com.borland.jb.*1 1 -1 +debug.NoTracingClasses.5[0]=18 com.borland.jbcl.*1 1 -1 +debug.NoTracingClasses.6[0]=30 com.borland.jbuilder.runtime.*1 1 -1 +debug.NoTracingClasses.7[0]=17 com.borland.sql.*1 1 -1 +debug.NoTracingClasses.8[0]=9 com.sun.*1 1 -1 +debug.NoTracingClasses.9[0]=6 java.*1 1 -1 +history.files.active[0]=C%|/JBuilder7/lib/ext/PMDOpenTool.jar +history.files.open.1[0]=C%|/JBuilder7/lib/ext/PMDOpenTool.jar +history.files.open.2[0]=src/net/sourceforge/pmd/jbuilder/PMDOpenTool.java,F;0,0 +sys.Author[0]=David Craine +sys.DefaultPackage[0]=pmdopentool +wizard.package.package_history.1[0]=pmdopentool diff --git a/pmd-jbuilder/classes.opentools b/pmd-jbuilder/classes.opentools new file mode 100644 index 0000000000..d627dcd65a --- /dev/null +++ b/pmd-jbuilder/classes.opentools @@ -0,0 +1 @@ +OpenTools-UI: pmdopentool.PMDOpenTool diff --git a/pmd-jbuilder/lib/PMDOpenTool.jar b/pmd-jbuilder/lib/PMDOpenTool.jar new file mode 100644 index 0000000000..c57ad16374 Binary files /dev/null and b/pmd-jbuilder/lib/PMDOpenTool.jar differ diff --git a/pmd-jbuilder/lib/pmd-0.3.jar b/pmd-jbuilder/lib/pmd-0.3.jar new file mode 100644 index 0000000000..47806e1c2f Binary files /dev/null and b/pmd-jbuilder/lib/pmd-0.3.jar differ diff --git a/pmd-jbuilder/src/net/sourceforge/pmd/jbuilder/PMDOpenTool.java b/pmd-jbuilder/src/net/sourceforge/pmd/jbuilder/PMDOpenTool.java new file mode 100644 index 0000000000..cfc22c5fbc --- /dev/null +++ b/pmd-jbuilder/src/net/sourceforge/pmd/jbuilder/PMDOpenTool.java @@ -0,0 +1,194 @@ +package net.sourceforge.pmd.jbuilder; + +import java.io.*; +import java.util.*; + +import javax.swing.text.*; + +import com.borland.jbuilder.*; +import com.borland.jbuilder.node.*; +import com.borland.primetime.*; +import com.borland.primetime.ide.*; +import com.borland.primetime.node.*; +import com.borland.primetime.viewer.*; +import net.sourceforge.pmd.*; +import net.sourceforge.pmd.reports.*; +import com.borland.primetime.actions.DelegateHandler; +import com.borland.primetime.actions.DelegateAction; +import javax.swing.Action; +import com.borland.primetime.editor.LineMark; +import com.borland.primetime.editor.EditorPane; +import com.borland.primetime.editor.EditorManager; +import com.borland.primetime.editor.MasterStyleContext; +import java.awt.Color; + + +/** + *

Title: JBuilder OpenTool for PMD

+ *

Description: Provides an environemnACTION_PMDCheckt for using the PMD aplication from within JBuilder

+ *

Copyright: Copyright (c) 2002

+ *

Company: InfoEther

+ * @author David Craine + * @version 1.0 + */ + +public class PMDOpenTool { + static MessageCategory msgCat = new MessageCategory("PMD Results"); + + + + public PMDOpenTool() { + int i; + int a; + } + + public static void initOpenTool(byte majorVersion, byte minorVersion) { + if (majorVersion == PrimeTime.CURRENT_MAJOR_VERSION) { + JBuilderMenu.GROUP_Tools.add(ACTION_PMDCheck); + registerWithContentManager(); + } + } + + /** + * Registers an "PMD Checker" action with the ContentManager (Tabs) + * The action will not be visible if multiple nodes are selected + */ + private static void registerWithContentManager() + { + ContextActionProvider cap = new ContextActionProvider() + { + public Action getContextAction(Browser browser, Node[] nodes) + { + return ACTION_PMDCheck; + } + }; + + ContentManager.registerContextActionProvider(cap); + } + + public static Report instanceCheck(String text) { + + PMD pmd = new PMD(); + + ReportFactory rf = new ReportFactory(); + RuleContext ctx = new RuleContext(); + RuleSetFactory ruleSetFactory = new RuleSetFactory(); + RuleSet rules = ruleSetFactory.createRuleSet(pmd.getClass().getClassLoader().getResourceAsStream("rulesets/unusedcode.xml")); + + ctx.setReport(rf.createReport("xml")); + ctx.setSourceCodeFilename("this"); + try { + // TODO switch to use StringReader once PMD 0.4 gets released + pmd.processFile(new StringBufferInputStream(text), rules, ctx); + return ctx.getReport(); + + } catch (FileNotFoundException fnfe) { + fnfe.printStackTrace(); + } + return null; + + } + + public static /*final*/ BrowserAction ACTION_PMDCheck = + + // A new action with short menu string, mnemonic, and long menu string + new BrowserAction("PMD Checker", 'P', "Displays PMD statistics about a Java File") { + + // The function called when the menu is selected + public void actionPerformed(Browser browser) { + Node node = Browser.getActiveBrowser().getActiveNode(); + if (node instanceof JavaFileNode) { + TextNodeViewer viewer = (TextNodeViewer)Browser.getActiveBrowser().getViewerOfType(node, TextNodeViewer.class); + if (viewer != null) { + Document doc = viewer.getEditor().getDocument(); + try { + Report rpt = instanceCheck(doc.getText(0, doc.getLength())); + Browser.getActiveBrowser().getMessageView().clearMessages(msgCat);//clear the message window + if (rpt == null) { + Browser.getActiveBrowser().getMessageView().addMessage(msgCat, "Error Processing File"); + } + else if (rpt.size() == 0) { + Browser.getActiveBrowser().getMessageView().addMessage(msgCat, "No violations detexted."); + } + else { + for (Iterator i = rpt.iterator(); i.hasNext(); ) { + RuleViolation rv = (RuleViolation)i.next(); + PMDMessage pmdMsg = new PMDMessage(rv.getDescription() + " at line " + rv.getLine(), rv.getLine(), (JavaFileNode)node); + Browser.getActiveBrowser().getMessageView().addMessage(msgCat, pmdMsg);//add the result message + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + + } + } + + } + }; + /** + * Main method for testing purposes + * @param args standard arguments + */ + public static void main(String[] args) { + Report ret = PMDOpenTool.instanceCheck("package abc; \npublic class foo {\npublic void bar() {int i;}\n}"); + System.out.println("PMD: " + ret); + } + +} +class PMDMessage extends Message { + + final LineMark MARK = new HighlightMark(); + JavaFileNode javaNode; + int line=0; + int column=0; + + public PMDMessage(String msg, int line, JavaFileNode node) { + super(msg); + this.line = line; + this.javaNode = node; + + } + public void selectAction(Browser browser) { + displayResult(browser, false); + } + + public void messageAction(Browser browser) { + displayResult(browser, true); + } + + private void displayResult(Browser browser, boolean requestFocus) { + try { + if (requestFocus || browser.isOpenNode(javaNode)) { + browser.setActiveNode(javaNode, requestFocus); + TextNodeViewer viewer = (TextNodeViewer)browser.getViewerOfType(javaNode, TextNodeViewer.class); + browser.setActiveViewer(javaNode, viewer, requestFocus); + EditorPane editor = viewer.getEditor(); + editor.gotoPosition(line, column, false, EditorPane.CENTER_IF_NEAR_EDGE); + if (requestFocus) + editor.requestFocus(); + else + editor.setTemporaryMark(line, MARK); + } + } + catch (Exception ex) { + ex.printStackTrace(); + } + } +} + +class HighlightMark extends LineMark { + static Style highlightStyle; + static { + StyleContext context = EditorManager.getStyleContext(); + highlightStyle = context.addStyle("line_highlight", null); + highlightStyle.addAttribute(MasterStyleContext.DISPLAY_NAME, "Line highlight"); + StyleConstants.setBackground(highlightStyle, Color.yellow); + StyleConstants.setForeground(highlightStyle, Color.black); + } + + public HighlightMark() { + super(highlightStyle); + } +}