diff --git a/docs/pages/pmd/rules/apex/performance.md b/docs/pages/pmd/rules/apex/performance.md
index 6cf6388106..5b87cd8cc2 100644
--- a/docs/pages/pmd/rules/apex/performance.md
+++ b/docs/pages/pmd/rules/apex/performance.md
@@ -79,3 +79,40 @@ public class Something {
```
+
+## AvoidDirectAccessTriggerMap
+
+**Since:** PMD 6.0.0
+
+**Priority:** Medium (3)
+
+Avoid directly accessing Trigger.old and Trigger.new as it can lead to a bug. Triggers should be bulkified and iterate through the map to handle the actions for each item separately.
+
+```
+//ArrayLoadExpression/TriggerVariableExpression
+```
+
+**Example(s):**
+```
+trigger AccountTrigger on Account (before insert, before update) {
+ Account a = Trigger.new[0]; //Bad: Accessing the trigger array directly is not recommended.
+
+ foreach ( Account a : Trigger.new ){
+ //Good: Iterate through the trigger.new array instead.
+ }
+}
+```
+
+**This rule has the following properties:**
+
+|Name|Default Value|Description|
+|----|-------------|-----------|
+|cc_categories|[Style]|Code Climate Categories|
+|cc_remediation_points_multiplier|1|Code Climate Remediation Points multiplier|
+|cc_block_highlighting|false|Code Climate Block Highlighting|
+
+**Use this rule by referencing it:**
+``` xml
+
+```
+
diff --git a/pmd-apex/src/main/resources/rulesets/apex/performance.xml b/pmd-apex/src/main/resources/rulesets/apex/performance.xml
index 89e47f739c..a9bf247bc1 100644
--- a/pmd-apex/src/main/resources/rulesets/apex/performance.xml
+++ b/pmd-apex/src/main/resources/rulesets/apex/performance.xml
@@ -50,6 +50,38 @@ public class Something {
}
}
}
+]]>
+
+
+
+
+
+Avoid directly accessing Trigger.old and Trigger.new as it can lead to a bug. Triggers should be bulkified and iterate through the map to handle the actions for each item separately.
+
+ 3
+
+
+
+
+
+
+
+
+
+
diff --git a/pmd-apex/src/main/resources/rulesets/apex/ruleset.xml b/pmd-apex/src/main/resources/rulesets/apex/ruleset.xml
index 768ecd8994..583081b964 100644
--- a/pmd-apex/src/main/resources/rulesets/apex/ruleset.xml
+++ b/pmd-apex/src/main/resources/rulesets/apex/ruleset.xml
@@ -113,6 +113,15 @@
+
+ 3
+
+
+
+
+
+
+
3
diff --git a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/performance/PerformanceRulesTest.java b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/performance/PerformanceRulesTest.java
index c89531d091..a64b338a5a 100644
--- a/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/performance/PerformanceRulesTest.java
+++ b/pmd-apex/src/test/java/net/sourceforge/pmd/lang/apex/rule/performance/PerformanceRulesTest.java
@@ -14,5 +14,6 @@ public class PerformanceRulesTest extends SimpleAggregatorTst {
public void setUp() {
addRule(RULESET, "AvoidSoqlInLoops");
addRule(RULESET, "AvoidDmlStatementsInLoops");
+ addRule(RULESET, "AvoidDirectAccessTriggerMap");
}
}
diff --git a/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/performance/xml/AvoidDirectAccessTriggerMap.xml b/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/performance/xml/AvoidDirectAccessTriggerMap.xml
new file mode 100644
index 0000000000..5a9287532a
--- /dev/null
+++ b/pmd-apex/src/test/resources/net/sourceforge/pmd/lang/apex/rule/performance/xml/AvoidDirectAccessTriggerMap.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ Directly accessing the Trigger.old map.
+ 1
+
+
+
+
+ Looping through map, best practice
+ 0
+
+
+
+