<< Test coverage report using jacoco | ^ Site index ^ | ^ Tutorial index ^ | Static code analysis report using findbugs >>

This chapter continues from where Creating the workspace definition left us.

Static code analysis report using PMD

First we add the iwant pmd plugin to the project.

~/iwant-tutorial $ $EDITOR "as-iwant-tutorial-developer/i-have/wsdefdef/src/main/java/com/example/wsdefdef/IwantTutorialWorkspaceProvider.java"
package com.example.wsdefdef;
import net.sf.iwant.api.javamodules.JavaSrcModule;
import net.sf.iwant.api.wsdef.IwantWorkspaceProvider;
import net.sf.iwant.api.wsdef.WorkspaceDefinitionContext;
public class IwantTutorialWorkspaceProvider implements IwantWorkspaceProvider {
@Override
public JavaSrcModule workspaceModule(WorkspaceDefinitionContext ctx) {
return JavaSrcModule.with().name("iwant-tutorial-wsdef")
return JavaSrcModule
.with()
.name("iwant-tutorial-wsdef")
.locationUnderWsRoot("as-iwant-tutorial-developer/i-have/wsdef")
.mainJava("src/main/java").mainDeps(ctx.iwantApiModules())
.mainDeps(ctx.wsdefdefModule()).end();
.mainDeps(ctx.wsdefdefModule())
.mainDeps(ctx.iwantPlugin().pmd().withDependencies()).end();
}
@Override
public String workspaceClassname() {
return "com.example.wsdef.IwanttutorialWorkspace";
}
}

We refresh eclipse settings so we can use the plugin in our workspace definition.

~/iwant-tutorial $ as-iwant-tutorial-developer/with/bash/iwant/side-effect/eclipse-settings/effective
(0/1 S~ net.sf.iwant.api.javamodules.JavaClasses iwant-tutorial-wsdefdef-main-classes)
(0/1 D! net.sf.iwant.core.download.SvnExported iwant-plugin-pmd-main-java)
svn exporting (may take a while) https://svn.code.sf.net/p/iwant/code/trunk/optional/iwant-plugin-pmd/src/main/java@796
(0/1 D! net.sf.iwant.core.download.Downloaded ant-1.9.4.jar)
(0/1 D! net.sf.iwant.core.download.Downloaded asm-3.2.jar)
(0/1 D! net.sf.iwant.core.download.Downloaded commons-io-1.3.2.jar)
(0/1 D! net.sf.iwant.core.download.Downloaded jaxen-1.1.4.jar)
(0/1 D! net.sf.iwant.core.download.Downloaded pmd-4.3.jar)
(0/1 D! net.sf.iwant.api.javamodules.JavaClasses iwant-plugin-pmd)
(0/1 D~ net.sf.iwant.api.javamodules.JavaClasses iwant-tutorial-wsdef-main-classes)
(0/1 D! net.sf.iwant.api.core.Concatenated eclipse-settings.bin-refs)
(as-iwant-tutorial-developer/i-have/wsdef)
( .project)
( .classpath)
( .settings/org.eclipse.jdt.core.prefs)
( .settings/org.eclipse.jdt.ui.prefs)
(as-iwant-tutorial-developer/i-have/wsdefdef)
( .project)
( .classpath)
( .settings/org.eclipse.jdt.core.prefs)
( .settings/org.eclipse.jdt.ui.prefs)

After refreshing eclipse we define a module to test PMD on, and define a PMD report target for its main java.

~/iwant-tutorial $ $EDITOR "as-iwant-tutorial-developer/i-have/wsdef/src/main/java/com/example/wsdef/IwanttutorialWorkspace.java"
package com.example.wsdef;
import java.util.Arrays;
import java.util.List;
import net.sf.iwant.api.core.HelloTarget;
import net.sf.iwant.api.javamodules.JavaSrcModule;
import net.sf.iwant.api.model.SideEffect;
import net.sf.iwant.api.model.Target;
import net.sf.iwant.api.wsdef.IwantWorkspace;
import net.sf.iwant.api.wsdef.SideEffectDefinitionContext;
import net.sf.iwant.eclipsesettings.EclipseSettings;
import net.sf.iwant.plugin.pmd.PmdReport;
public class IwanttutorialWorkspace implements IwantWorkspace {
@Override
public List<? extends Target> targets() {
return Arrays.asList(new HelloTarget("hello", "hello from iwant\n"));
return Arrays.asList(new HelloTarget("hello", "hello from iwant\n"),
mainJavaPmdReportOf(pmdfodder()));
}
@Override
public List<? extends SideEffect> sideEffects(
SideEffectDefinitionContext ctx) {
return Arrays
.asList(EclipseSettings
.with()
.name("eclipse-settings")
.modules(ctx.wsdefdefJavaModule(),
ctx.wsdefJavaModule()).end());
return Arrays.asList(EclipseSettings.with().name("eclipse-settings")
.modules(ctx.wsdefdefJavaModule(), ctx.wsdefJavaModule())
.modules(pmdfodder()).end());
}
private static Target mainJavaPmdReportOf(JavaSrcModule mod) {
return PmdReport.with().name(mod.name() + "-main-java-pmd-report")
.from(mod.mainJavasAsPaths()).end();
}
private static JavaSrcModule pmdfodder() {
return JavaSrcModule.with().name("example-pmdfodder").mainJava("src")
.end();
}
}

Another eclipse settings refresh to create the new eclipse project.

~/iwant-tutorial $ as-iwant-tutorial-developer/with/bash/iwant/side-effect/eclipse-settings/effective
(0/1 S~ net.sf.iwant.api.javamodules.JavaClasses iwant-tutorial-wsdef-main-classes)
(example-pmdfodder)
( .project)
( .classpath)
( .settings/org.eclipse.jdt.core.prefs)
( .settings/org.eclipse.jdt.ui.prefs)
(as-iwant-tutorial-developer/i-have/wsdef)
( .project)
( .classpath)
( .settings/org.eclipse.jdt.core.prefs)
( .settings/org.eclipse.jdt.ui.prefs)
(as-iwant-tutorial-developer/i-have/wsdefdef)
( .project)
( .classpath)
( .settings/org.eclipse.jdt.core.prefs)
( .settings/org.eclipse.jdt.ui.prefs)

After importing the new project into eclipse we create some code with an PMD issue in it.

~/iwant-tutorial $ mkdir -p example-pmdfodder/src/com/example/pmdfodder
~/iwant-tutorial $ $EDITOR "example-pmdfodder/src/com/example/pmdfodder/PmdFodder.java"
package com.example.pmdfodder;
public class PmdFodder {
public void DiscouragedMethodName() {
// PMD shall complain about this method name
}
}

Now we can analyze the code.

~/iwant-tutorial $ as-iwant-tutorial-developer/with/bash/iwant/list-of/targets
hello
example-pmdfodder-main-java-pmd-report
Output asserted
~/iwant-tutorial $ as-iwant-tutorial-developer/with/bash/iwant/target/example-pmdfodder-main-java-pmd-report/as-path | xargs ls
(0/1 D! net.sf.iwant.plugin.pmd.PmdReport example-pmdfodder-main-java-pmd-report)
Running PMD on [example-pmdfodder/src]
example-pmdfodder-main-java-pmd-report.html
example-pmdfodder-main-java-pmd-report.txt
example-pmdfodder-main-java-pmd-report.xml
ruleset.xml
~/iwant-tutorial $ cat as-iwant-tutorial-developer/.i-cached/target/example-pmdfodder-main-java-pmd-report/example-pmdfodder-main-java-pmd-report.txt

com/example/pmdfodder/PmdFodder.java:5 Method names should not start with capital letters
Output asserted
~/iwant-tutorial $ cat as-iwant-tutorial-developer/.i-cached/target/example-pmdfodder-main-java-pmd-report/example-pmdfodder-main-java-pmd-report.xml | wc -l
8
Output asserted
<< Test coverage report using jacoco | ^ Site index ^ | ^ Tutorial index ^ | Static code analysis report using findbugs >>