From 52a150e946c8e99acdef114af1f0ba19b90ce2a7 Mon Sep 17 00:00:00 2001
From: Daniel Rainer <daniel.m.rainer@student.uibk.ac.at>
Date: Mon, 7 Mar 2022 17:19:54 +0100
Subject: [PATCH] Add PMD as java linter to pipeline

---
 .gitlab-ci.yml | 17 ++++++++++++++
 pmd_rules.xml  | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)
 create mode 100644 pmd_rules.xml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 96593b6b6..f3fc63232 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,10 +12,27 @@ stages:
   - package
   - release
   - deploy
+
 before_script:
   - export NG_CLI_ANALYTICS="false"
   - export MAVEN_USER_HOME=`pwd`/.maven
 
+pmd:
+  stage: lint
+  allow_failure: true
+  when: always
+  before_script:
+    - 'export VERSION="6.40.0"'
+    - 'wget "https://github.com/pmd/pmd/releases/download/pmd_releases%2F$VERSION/pmd-bin-$VERSION.zip"'
+    - 'unzip "pmd-bin-$VERSION.zip"'
+  script:
+    - '"pmd-bin-$VERSION/bin/run.sh" pmd -d src/main/java -f textcolor -R pmd_rules.xml 2>&1 | tee pmd.log'
+  needs: []
+  artifacts:
+    when: on_failure
+    paths:
+      - pmd.log
+
 checkstyle:
   stage: lint
   script:
diff --git a/pmd_rules.xml b/pmd_rules.xml
new file mode 100644
index 000000000..49cc155ac
--- /dev/null
+++ b/pmd_rules.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+
+<ruleset name="Custom Rules"
+    xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
+
+    <description>
+        Rules for the PMD linter
+    </description>
+
+    <rule ref="category/java/bestpractices.xml">
+        <exclude name="GuardLogStatement"/>
+        <exclude name="UseVarargs"/>
+    </rule>
+    <rule ref="category/java/codestyle.xml">
+        <exclude name="AtLeastOneConstructor"/>
+        <exclude name="OnlyOneReturn"/>
+        <exclude name="ShortClassName"/>
+        <exclude name="UselessParentheses"/>
+        <!-- does not work properly with annotation imports -->
+        <exclude name="UnnecessaryImport"/>
+
+        <!-- should be included, removed to find other lints -->
+        <exclude name="MethodArgumentCouldBeFinal"/>
+        <exclude name="LocalVariableCouldBeFinal"/>
+        <exclude name="FieldNamingConventions"/>
+        <exclude name="ShortVariable"/>
+        <exclude name="LongVariable"/>
+        <exclude name="UseUnderscoresInNumericLiterals"/>
+        <exclude name="CommentDefaultAccessModifier"/>
+        <exclude name="BooleanGetMethodName"/>
+    </rule>
+    <rule ref="category/java/design.xml">
+        <exclude name="LawOfDemeter"/>
+        <exclude name="DataClass"/>
+        <exclude name="ExcessiveImports"/>
+        <!-- seems to be broken in its default config -->
+        <exclude name="LoosePackageCoupling"/>
+    </rule>
+    <rule ref="category/java/documentation.xml">
+        <exclude name="CommentSize"/>
+        <exclude name="CommentRequired"/>
+        <exclude name="UncommentedEmptyConstructor"/>
+    </rule>
+    <rule ref="category/java/errorprone.xml">
+        <exclude name="BeanMembersShouldSerialize"/>
+        <exclude name="AvoidLiteralsInIfCondition"/>
+    </rule>
+    <rule ref="category/java/multithreading.xml"></rule>
+    <rule ref="category/java/performance.xml">
+        <exclude name="RedundantFieldInitializer"/>
+        <exclude name="TooFewBranchesForASwitchStatement"/>
+        <exclude name="AvoidInstantiatingObjectsInLoops"/>
+        <exclude name="AvoidFileStream"/>
+    </rule>
+    <rule ref="category/java/security.xml"></rule>
+
+</ruleset>
+
-- 
GitLab