Skip to content

Commit 4d3d6d1

Browse files
committed
Add command context class with additional information store and allow to transform it in various phases
1 parent effdf74 commit 4d3d6d1

File tree

162 files changed

+8954
-2894
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

162 files changed

+8954
-2894
lines changed

buildSrc/src/main/kotlin/net/kautler/tests.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,8 @@ pitest {
491491
detectInlinedCode(true)
492492
timestampedReports(false)
493493
features(listOf("-FLOGCALL"))
494-
timeoutFactor(2.toBigDecimal())
495-
timeoutConstInMillis(SECONDS.toMillis(15).toInt())
494+
timeoutFactor(3.toBigDecimal())
495+
timeoutConstInMillis(SECONDS.toMillis(30).toInt())
496496
excludedClasses(setOf(
497497
"net.kautler.command.usage.UsageBaseVisitor",
498498
"net.kautler.command.usage.UsageLexer",

buildSrc/src/main/kotlin/net/kautler/versions.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ val versions by extra(mapOf(
5555
"jacoco" to "0.8.5",
5656
"pitest" to "1.4.10",
5757
"pmd" to "6.18.0",
58-
"sb-contrib" to "7.4.6",
58+
"sb-contrib" to "7.4.7",
5959
"spotbugs" to "3.1.12",
6060

6161
// test versions

config/codenarc/codenarc.groovy

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,12 @@ ruleset {
3232
ComparisonOfTwoConstants
3333
ComparisonWithSelf {
3434
doNotApplyToClassNames = [
35-
'net.kautler.command.api.AliasAndParameterStringTest',
35+
'net.kautler.command.api.CommandContextBuilderTest',
36+
'net.kautler.command.api.CommandContextTest',
37+
'net.kautler.command.api.parameter.ParameterParseExceptionTest',
38+
'net.kautler.command.api.restriction.RestrictionChainElementTest',
3639
'net.kautler.command.parameter.ParametersImplTest',
40+
'net.kautler.command.restriction.RestrictionLookupTest',
3741
'net.kautler.command.util.lazy.LazyReferenceByFunctionTest',
3842
'net.kautler.command.util.lazy.LazyReferenceBySupplierTest',
3943
'net.kautler.command.util.lazy.LazyReferenceTest'
@@ -304,8 +308,12 @@ ruleset {
304308
ExplicitCallToDivMethod
305309
ExplicitCallToEqualsMethod {
306310
doNotApplyToClassNames = [
307-
'net.kautler.command.api.AliasAndParameterStringTest',
311+
'net.kautler.command.api.CommandContextBuilderTest',
312+
'net.kautler.command.api.CommandContextTest',
313+
'net.kautler.command.api.parameter.ParameterParseExceptionTest',
314+
'net.kautler.command.api.restriction.RestrictionChainElementTest',
308315
'net.kautler.command.parameter.ParametersImplTest',
316+
'net.kautler.command.restriction.RestrictionLookupTest',
309317
'net.kautler.command.util.lazy.LazyReferenceByFunctionTest',
310318
'net.kautler.command.util.lazy.LazyReferenceBySupplierTest',
311319
'net.kautler.command.util.lazy.LazyReferenceTest'
@@ -430,17 +438,20 @@ ruleset {
430438

431439
// rulesets/size.xml
432440
//AbcMetric // Requires the GMetrics jar
433-
ClassSize {
434-
maxLines = 1500
435-
}
441+
//ClassSize
436442
//CrapMetric // Requires the GMetrics jar and a Cobertura coverage file
437443
//CyclomaticComplexity // Requires the GMetrics jar
438444
//MethodCount
439445
//MethodSize
440446
NestedBlockDepth {
441447
maxNestedBlockDepth = 6
442448
}
443-
ParameterCount
449+
ParameterCount {
450+
doNotApplyToClassNames = [
451+
'net.kautler.command.integ.test.javacord.CommandContextTransformerIntegTest',
452+
'net.kautler.command.integ.test.jda.CommandContextTransformerIntegTest'
453+
].join(', ')
454+
}
444455

445456
// rulesets/unnecessary.xml
446457
AddEmptyString
@@ -466,7 +477,9 @@ ruleset {
466477
UnnecessaryFinalOnPrivateMethod
467478
UnnecessaryFloatInstantiation
468479
UnnecessaryGString
469-
UnnecessaryGetter
480+
UnnecessaryGetter {
481+
ignoreMethodNames = 'isEmpty'
482+
}
470483
UnnecessaryIfStatement
471484
UnnecessaryInstanceOfCheck
472485
UnnecessaryInstantiationToGetClass

config/pmd/pmd.xml

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,18 @@
9393
<property name="constantPattern" value="[a-z][a-zA-Z0-9]*|[A-Z][A-Z_0-9]*"/>
9494
</properties>
9595
</rule>
96+
<rule ref="category/java/codestyle.xml/LinguisticNaming">
97+
<properties>
98+
<property name="violationSuppressXPath">
99+
<value>
100+
.[
101+
((@MethodName = 'setAdditionalData')
102+
and ancestor::ClassOrInterfaceDeclaration[typeIsExactly('net.kautler.command.api.CommandContext')])
103+
]
104+
</value>
105+
</property>
106+
</properties>
107+
</rule>
96108
<rule ref="category/java/codestyle.xml/LongVariable">
97109
<properties>
98110
<property name="minimum" value="45"/>
@@ -159,17 +171,6 @@
159171
<property name="maxmethods" value="15"/>
160172
</properties>
161173
</rule>
162-
<rule ref="category/java/design.xml/UseObjectForClearerAPI">
163-
<properties>
164-
<property name="violationSuppressXPath">
165-
<value>
166-
.[
167-
ancestor::ClassOrInterfaceDeclaration[typeIs('net.kautler.command.api.parameter.ParameterConverter')]
168-
]
169-
</value>
170-
</property>
171-
</properties>
172-
</rule>
173174
<rule ref="category/java/documentation.xml"/>
174175
<rule ref="category/java/documentation.xml/CommentSize">
175176
<properties>
@@ -216,6 +217,18 @@
216217
</property>
217218
</properties>
218219
</rule>
220+
<rule ref="category/java/errorprone.xml/AvoidLosingExceptionInformation">
221+
<properties>
222+
<property name="violationSuppressXPath">
223+
<value>
224+
.[
225+
ancestor::ClassOrInterfaceDeclaration[typeIsExactly('net.kautler.test.spock.EagerExceptionRenderer')]
226+
and @Image = 'spockAssertionError.toString'
227+
]
228+
</value>
229+
</property>
230+
</properties>
231+
</rule>
219232
<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
220233
<properties>
221234
<!-- false positives -->
@@ -233,8 +246,6 @@
233246
\QFound 'DU'-anomaly for variable 'usageTree' (lines '\E.* |
234247
\QFound 'DU'-anomaly for variable 'seen' (lines '\E.* |
235248
\QFound 'DD'-anomaly for variable 'distance' (lines '\E.* |
236-
\QFound 'DD'-anomaly for variable 'aliasAndParameterString' (lines '\E.* |
237-
\QFound 'DU'-anomaly for variable 'parameterString' (lines '\E.* |
238249
\QFound 'DU'-anomaly for variable 'channelId' (lines '\E.* |
239250
\QFound 'DU'-anomaly for variable 'roleId' (lines '\E.* |
240251
\QFound 'DU'-anomaly for variable 'userId' (lines '\E.*

config/spotbugs/spotbugs-exclude.xml

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,6 @@
3232
</Or>
3333
</Match>
3434

35-
<Match>
36-
<Class name="net.kautler.command.api.CommandHandler"/>
37-
<Field name="injectedAliasAndParameterStringTransformer" type="javax.enterprise.inject.Instance"/>
38-
<Method name="~lambda\$determineAliasAndParameterStringTransformer\$\d++" params="" returns="net.kautler.command.api.AliasAndParameterStringTransformer"/>
39-
<Bug pattern="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"/>
40-
</Match>
41-
4235
<!-- work-around for https://github.com/spotbugs/spotbugs/issues/947 -->
4336
<Match>
4437
<Or>
@@ -58,8 +51,7 @@
5851
<Or>
5952
<Method name="setAvailableRestrictions" params="javax.enterprise.inject.Instance" returns="void"/>
6053
<Method name="setCommands" params="javax.enterprise.inject.Instance" returns="void"/>
61-
<Method name="setCustomPrefixProvider" params="javax.enterprise.inject.Instance" returns="void"/>
62-
<Method name="setAliasAndParameterStringTransformer" params="javax.enterprise.inject.Instance" returns="void"/>
54+
<Method name="setCommandContextTransformers" params="javax.enterprise.inject.Instance" returns="void"/>
6355
</Or>
6456
</And>
6557
<And>
@@ -72,7 +64,7 @@
7264

7365
<Match>
7466
<Class name="net.kautler.command.parameter.parser.BaseParameterParser"/>
75-
<Method name="parse" params="net.kautler.command.api.Command, java.lang.String, java.lang.String, java.lang.String, java.util.function.BiFunction" returns="net.kautler.command.api.parameter.Parameters"/>
67+
<Method name="parse" params="net.kautler.command.api.CommandContext, java.util.function.BiFunction" returns="net.kautler.command.api.parameter.Parameters"/>
7668
<Bug pattern="VA_FORMAT_STRING_USES_NEWLINE"/>
7769
</Match>
7870

@@ -108,10 +100,21 @@
108100
</Match>
109101

110102
<Match>
111-
<Class name="net.kautler.command.util.lazy.LazyReference"/>
112103
<Or>
113-
<Method name="equals" params="java.lang.Object" returns="boolean"/>
114-
<Method name="isSet" params="" returns="boolean"/>
104+
<And>
105+
<Class name="net.kautler.command.util.lazy.LazyReference"/>
106+
<Or>
107+
<Method name="equals" params="java.lang.Object" returns="boolean"/>
108+
<Method name="isSet" params="" returns="boolean"/>
109+
</Or>
110+
</And>
111+
<And>
112+
<Class name="net.kautler.command.api.CommandContext"/>
113+
<Or>
114+
<Method name="getAdditionalData" params="java.lang.String" returns="java.util.Optional"/>
115+
<Method name="getAdditionalData" params="java.lang.String, java.lang.Object" returns="java.lang.Object"/>
116+
</Or>
117+
</And>
115118
</Or>
116119
<Bug pattern="OPM_OVERLY_PERMISSIVE_METHOD"/>
117120
</Match>
@@ -144,15 +147,32 @@
144147

145148
<!-- work-around for https://github.com/mebigfatguy/fb-contrib/issues/384 -->
146149
<Match>
147-
<Class name="net.kautler.command.parameter.ParametersImpl"/>
148-
<Method name="get" params="java.lang.String, java.util.function.Supplier" returns="java.lang.Object"/>
150+
<Or>
151+
<And>
152+
<Class name="net.kautler.command.api.CommandContext"/>
153+
<Method name="getAdditionalData" params="java.lang.String, java.util.function.Supplier" returns="java.lang.Object"/>
154+
</And>
155+
<And>
156+
<Class name="net.kautler.command.parameter.ParametersImpl"/>
157+
<Method name="get" params="java.lang.String, java.util.function.Supplier" returns="java.lang.Object"/>
158+
</And>
159+
</Or>
149160
<Bug pattern="OI_OPTIONAL_ISSUES_USES_ORELSEGET_WITH_NULL"/>
150161
</Match>
151162

152163
<!-- work-around for https://github.com/mebigfatguy/fb-contrib/issues/385 -->
153164
<Match>
154165
<Class name="net.kautler.command.parameter.converter.javacord.UserMentionConverterJavacord"/>
155-
<Method name="convert" params="java.lang.String, java.lang.String, net.kautler.command.api.Command, org.javacord.api.entity.message.Message, java.lang.String, java.lang.String, java.lang.String" returns="org.javacord.api.entity.user.User"/>
166+
<Method name="convert" params="java.lang.String, java.lang.String, net.kautler.command.api.CommandContext" returns="org.javacord.api.entity.user.User"/>
156167
<Bug pattern="AI_ANNOTATION_ISSUES_NEEDS_NULLABLE"/>
157168
</Match>
169+
170+
<Match>
171+
<Class name="net.kautler.test.spock.EagerExceptionRenderer"/>
172+
<Method name="~lambda\$(?:visitSpec|null)\$\d++" params="org.spockframework.runtime.extension.IMethodInvocation" returns="void"/>
173+
<Or>
174+
<Bug pattern="NPMC_NON_PRODUCTIVE_METHOD_CALL"/>
175+
<Bug pattern="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT"/>
176+
</Or>
177+
</Match>
158178
</FindBugsFilter>

examples/simplePingBotJavacord/src/main/java/net/kautler/command/example/ping/PingCommand.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019 Björn Kautler
2+
* Copyright 2020 Björn Kautler
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
1717
package net.kautler.command.example.ping;
1818

1919
import net.kautler.command.api.Command;
20+
import net.kautler.command.api.CommandContext;
2021
import org.apache.logging.log4j.Logger;
2122
import org.javacord.api.entity.message.Message;
2223

@@ -29,10 +30,15 @@ public class PingCommand implements Command<Message> {
2930
private Logger logger;
3031

3132
@Override
32-
public void execute(Message incomingMessage, String prefix, String usedAlias, String parameterString) {
33-
incomingMessage
33+
public void execute(CommandContext<? extends Message> commandContext) {
34+
commandContext
35+
.getMessage()
3436
.getChannel()
35-
.sendMessage("pong: " + parameterString)
37+
.sendMessage(commandContext
38+
.getParameterString()
39+
.filter(parameterString -> !parameterString.isEmpty())
40+
.map(parameterString -> "pong: " + parameterString)
41+
.orElse("pong"))
3642
.whenComplete((sentMessage, throwable) -> {
3743
if (throwable != null) {
3844
logger.error("Exception while executing ping command", throwable);

examples/simplePingBotJda/src/main/java/net/kautler/command/example/ping/PingCommand.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019 Björn Kautler
2+
* Copyright 2020 Björn Kautler
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
1818

1919
import net.dv8tion.jda.api.entities.Message;
2020
import net.kautler.command.api.Command;
21+
import net.kautler.command.api.CommandContext;
2122
import org.apache.logging.log4j.Logger;
2223

2324
import javax.enterprise.context.ApplicationScoped;
@@ -29,10 +30,15 @@ public class PingCommand implements Command<Message> {
2930
private Logger logger;
3031

3132
@Override
32-
public void execute(Message incomingMessage, String prefix, String usedAlias, String parameterString) {
33-
incomingMessage
33+
public void execute(CommandContext<? extends Message> commandContext) {
34+
commandContext
35+
.getMessage()
3436
.getChannel()
35-
.sendMessage("pong: " + parameterString)
37+
.sendMessage(commandContext
38+
.getParameterString()
39+
.filter(parameterString -> !parameterString.isEmpty())
40+
.map(parameterString -> "pong: " + parameterString)
41+
.orElse("pong"))
3642
.queue(null, throwable -> logger.error("Exception while executing ping command", throwable));
3743
}
3844
}

0 commit comments

Comments
 (0)