Skip to content

Commit 773b964

Browse files
Fix usage of clock in dmn engine start and end time for audit
1 parent c89e38c commit 773b964

File tree

8 files changed

+96
-63
lines changed

8 files changed

+96
-63
lines changed

modules/flowable-dmn-api/src/main/java/org/flowable/dmn/api/DecisionExecutionAuditContainer.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ public class DecisionExecutionAuditContainer {
5454
public DecisionExecutionAuditContainer() {
5555
}
5656

57-
public DecisionExecutionAuditContainer(String decisionKey, String decisionName, int decisionVersion, Boolean strictMode, Map<String, Object> inputVariables) {
58-
this.startTime = new Date();
57+
public DecisionExecutionAuditContainer(String decisionKey, String decisionName, int decisionVersion,
58+
Boolean strictMode, Map<String, Object> inputVariables, Date startTime) {
59+
60+
this.startTime = startTime;
5961
this.decisionKey = decisionKey;
6062
this.decisionName = decisionName;
6163
this.decisionVersion = decisionVersion;
@@ -66,9 +68,9 @@ public DecisionExecutionAuditContainer(String decisionKey, String decisionName,
6668
}
6769

6870
public DecisionExecutionAuditContainer(String decisionKey, String decisionName, int decisionVersion, HitPolicy hitPolicy,
69-
Boolean strictMode, Map<String, Object> inputVariables) {
71+
Boolean strictMode, Map<String, Object> inputVariables, Date startTime) {
7072

71-
this.startTime = new Date();
73+
this.startTime = startTime;
7274
this.decisionKey = decisionKey;
7375
this.decisionName = decisionName;
7476
this.decisionVersion = decisionVersion;
@@ -109,8 +111,8 @@ protected Map<String, String> getVariablesTypeMap(Map<String, Object> variableVa
109111
return variablesTypesMap;
110112
}
111113

112-
public void stopAudit() {
113-
endTime = new Date();
114+
public void stopAudit(Date endTime) {
115+
this.endTime = endTime;
114116
}
115117

116118
public void addRuleEntry(DecisionRule rule) {

modules/flowable-dmn-api/src/main/java/org/flowable/dmn/api/DecisionServiceExecutionAuditContainer.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313
package org.flowable.dmn.api;
1414

15+
import java.util.Date;
1516
import java.util.HashMap;
1617
import java.util.LinkedHashMap;
1718
import java.util.List;
@@ -25,8 +26,10 @@ public class DecisionServiceExecutionAuditContainer extends DecisionExecutionAud
2526
public DecisionServiceExecutionAuditContainer() {
2627
}
2728

28-
public DecisionServiceExecutionAuditContainer(String id, String name, int decisionVersion, boolean strictMode, Map<String, Object> variables) {
29-
super(id, name, decisionVersion, strictMode, variables);
29+
public DecisionServiceExecutionAuditContainer(String id, String name, int decisionVersion, boolean strictMode,
30+
Map<String, Object> variables, Date startTime) {
31+
32+
super(id, name, decisionVersion, strictMode, variables, startTime);
3033
}
3134

3235
public Map<String, List<Map<String, Object>>> getDecisionServiceResult() {

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/DmnEngineConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ public Map<String, AbstractHitPolicy> getDefaultHitPolicyBehaviors() {
609609
/////////////////////////////////////////////////////////////
610610
public void initRuleEngineExecutor() {
611611
if (ruleEngineExecutor == null) {
612-
ruleEngineExecutor = new RuleEngineExecutorImpl(hitPolicyBehaviors, expressionManager, objectMapper);
612+
ruleEngineExecutor = new RuleEngineExecutorImpl(hitPolicyBehaviors, expressionManager, objectMapper, this);
613613

614614
} else {
615615
if (ruleEngineExecutor.getExpressionManager() == null) {

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/RuleEngineExecutor.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
* @author Yvo Swillens
2727
*/
2828
public interface RuleEngineExecutor {
29+
2930
DecisionExecutionAuditContainer execute(Decision decision, ExecuteDecisionContext executeDecisionInfo);
3031

3132
Map<String, AbstractHitPolicy> getHitPolicyBehaviors();

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/DmnDecisionServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ protected Map<String, List<Map<String, Object>>> composeDecisionServiceResult(Ex
239239
protected DecisionExecutionAuditContainer persistDecisionAudit(ExecuteDecisionContext executeDecisionContext) {
240240
DecisionExecutionAuditContainer decisionExecution = executeDecisionContext.getDecisionExecution();
241241

242-
decisionExecution.stopAudit();
242+
decisionExecution.stopAudit(configuration.getClock().getCurrentTime());
243243

244244
commandExecutor.execute(new PersistHistoricDecisionExecutionCmd(executeDecisionContext));
245245

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/RuleEngineExecutorImpl.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.flowable.common.engine.impl.el.ExpressionManager;
2222
import org.flowable.dmn.api.DecisionExecutionAuditContainer;
2323
import org.flowable.dmn.api.ExecuteDecisionContext;
24+
import org.flowable.dmn.engine.DmnEngineConfiguration;
2425
import org.flowable.dmn.engine.RuleEngineExecutor;
2526
import org.flowable.dmn.engine.impl.el.ELExecutionContext;
2627
import org.flowable.dmn.engine.impl.el.ELExecutionContextBuilder;
@@ -53,11 +54,15 @@ public class RuleEngineExecutorImpl implements RuleEngineExecutor {
5354
protected Map<String, AbstractHitPolicy> hitPolicyBehaviors;
5455
protected ExpressionManager expressionManager;
5556
protected ObjectMapper objectMapper;
57+
protected DmnEngineConfiguration dmnEngineConfiguration;
5658

57-
public RuleEngineExecutorImpl(Map<String, AbstractHitPolicy> hitPolicyBehaviors, ExpressionManager expressionManager, ObjectMapper objectMapper) {
59+
public RuleEngineExecutorImpl(Map<String, AbstractHitPolicy> hitPolicyBehaviors, ExpressionManager expressionManager,
60+
ObjectMapper objectMapper, DmnEngineConfiguration dmnEngineConfiguration) {
61+
5862
this.hitPolicyBehaviors = hitPolicyBehaviors;
5963
this.expressionManager = expressionManager;
6064
this.objectMapper = objectMapper;
65+
this.dmnEngineConfiguration = dmnEngineConfiguration;
6166
}
6267

6368
/**
@@ -95,7 +100,7 @@ public DecisionExecutionAuditContainer execute(Decision decision, ExecuteDecisio
95100

96101
} finally {
97102
// end audit trail
98-
executionContext.getAuditContainer().stopAudit();
103+
executionContext.getAuditContainer().stopAudit(dmnEngineConfiguration.getClock().getCurrentTime());
99104
}
100105

101106
return executionContext.getAuditContainer();

modules/flowable-dmn-engine/src/main/java/org/flowable/dmn/engine/impl/audit/DecisionExecutionAuditUtil.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
*/
1313
package org.flowable.dmn.engine.impl.audit;
1414

15+
import org.flowable.common.engine.impl.runtime.Clock;
1516
import org.flowable.dmn.api.DecisionExecutionAuditContainer;
1617
import org.flowable.dmn.api.DecisionServiceExecutionAuditContainer;
1718
import org.flowable.dmn.api.ExecuteDecisionContext;
19+
import org.flowable.dmn.engine.DmnEngineConfiguration;
1820
import org.flowable.dmn.engine.impl.util.CommandContextUtil;
1921
import org.flowable.dmn.model.Decision;
2022
import org.flowable.dmn.model.DecisionService;
@@ -35,9 +37,11 @@ public static DecisionServiceExecutionAuditContainer initializeDecisionServiceEx
3537
LOGGER.error("decision service does not contain key");
3638
throw new IllegalArgumentException("decision does not contain decision key");
3739
}
40+
41+
DmnEngineConfiguration dmnEngineConfiguration = CommandContextUtil.getDmnEngineConfiguration();
3842

3943
return new DecisionServiceExecutionAuditContainer(decisionService.getId(), decisionService.getName(), executeDecisionInfo.getDecisionVersion(),
40-
CommandContextUtil.getDmnEngineConfiguration().isStrictMode(), executeDecisionInfo.getVariables());
44+
dmnEngineConfiguration.isStrictMode(), executeDecisionInfo.getVariables(), dmnEngineConfiguration.getClock().getCurrentTime());
4145
}
4246

4347
public static DecisionExecutionAuditContainer initializeDecisionExecutionAudit(Decision decision, ExecuteDecisionContext executeDecisionInfo) {
@@ -53,8 +57,11 @@ public static DecisionExecutionAuditContainer initializeDecisionExecutionAudit(D
5357
LOGGER.error("decision table does not contain a hit policy");
5458
throw new IllegalArgumentException("decision table does not contain a hit policy");
5559
}
60+
61+
Clock clock = CommandContextUtil.getDmnEngineConfiguration().getClock();
5662

5763
return new DecisionExecutionAuditContainer(decision.getId(), decision.getName(), executeDecisionInfo.getDecisionVersion(),
58-
decisionTable.getHitPolicy(), CommandContextUtil.getDmnEngineConfiguration().isStrictMode(), executeDecisionInfo.getVariables());
64+
decisionTable.getHitPolicy(), CommandContextUtil.getDmnEngineConfiguration().isStrictMode(),
65+
executeDecisionInfo.getVariables(), clock.getCurrentTime());
5966
}
6067
}

modules/flowable-dmn-engine/src/test/java/org/flowable/dmn/engine/test/deployment/DeploymentTest.java

Lines changed: 64 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import static org.assertj.core.api.Assertions.assertThat;
1616

1717
import java.io.InputStream;
18+
import java.util.Calendar;
19+
import java.util.GregorianCalendar;
1820
import java.util.List;
1921

2022
import org.flowable.dmn.api.DecisionExecutionAuditContainer;
@@ -271,55 +273,68 @@ public void multipleSameDeployments() throws Exception {
271273

272274
@Test
273275
public void multipleDeployments() throws Exception {
274-
repositoryService.createDeployment()
275-
.name("deploymentA")
276-
.addClasspathResource("org/flowable/dmn/engine/test/deployment/simple.dmn")
277-
.enableDuplicateFiltering()
278-
.deploy();
279-
280-
org.flowable.dmn.api.DmnDeployment deployment = repositoryService.createDeploymentQuery()
281-
.deploymentName("deploymentA")
282-
.singleResult();
283-
assertThat(deployment).isNotNull();
284-
285-
List<DmnDecision> decisions = repositoryService.createDecisionQuery()
286-
.decisionKey("decision")
287-
.list();
288-
assertThat(decisions).hasSize(1);
289-
290-
repositoryService.createDeployment()
291-
.name("deploymentA")
292-
.addClasspathResource("org/flowable/dmn/engine/test/deployment/simple2.dmn")
293-
.enableDuplicateFiltering()
294-
.deploy();
295-
296-
List<org.flowable.dmn.api.DmnDeployment> deployments = repositoryService.createDeploymentQuery()
297-
.deploymentName("deploymentA")
298-
.list();
299-
assertThat(deployments).hasSize(2);
300-
301-
decisions = repositoryService.createDecisionQuery()
302-
.decisionKey("anotherDecision")
303-
.list();
304-
assertThat(decisions).hasSize(1);
305-
306-
repositoryService.createDeployment()
307-
.name("deploymentA")
308-
.addClasspathResource("org/flowable/dmn/engine/test/deployment/simple2.dmn")
309-
.enableDuplicateFiltering()
310-
.deploy();
311-
312-
deployments = repositoryService.createDeploymentQuery()
313-
.deploymentName("deploymentA")
314-
.list();
315-
assertThat(deployments).hasSize(2);
316-
317-
decisions = repositoryService.createDecisionQuery()
318-
.decisionKey("anotherDecision")
319-
.list();
320-
assertThat(decisions).hasSize(1);
321-
322-
deleteDeployments();
276+
try {
277+
repositoryService.createDeployment()
278+
.name("deploymentA")
279+
.addClasspathResource("org/flowable/dmn/engine/test/deployment/simple.dmn")
280+
.enableDuplicateFiltering()
281+
.deploy();
282+
283+
org.flowable.dmn.api.DmnDeployment deployment = repositoryService.createDeploymentQuery()
284+
.deploymentName("deploymentA")
285+
.singleResult();
286+
assertThat(deployment).isNotNull();
287+
288+
List<DmnDecision> decisions = repositoryService.createDecisionQuery()
289+
.decisionKey("decision")
290+
.list();
291+
assertThat(decisions).hasSize(1);
292+
293+
Calendar deployCal = new GregorianCalendar();
294+
deployCal.add(Calendar.DATE, 2);
295+
dmnEngineConfiguration.getClock().setCurrentTime(deployCal.getTime());
296+
297+
repositoryService.createDeployment()
298+
.name("deploymentA")
299+
.addClasspathResource("org/flowable/dmn/engine/test/deployment/simple2.dmn")
300+
.enableDuplicateFiltering()
301+
.deploy();
302+
303+
List<org.flowable.dmn.api.DmnDeployment> deployments = repositoryService.createDeploymentQuery()
304+
.deploymentName("deploymentA")
305+
.list();
306+
assertThat(deployments).hasSize(2);
307+
308+
decisions = repositoryService.createDecisionQuery()
309+
.decisionKey("anotherDecision")
310+
.list();
311+
assertThat(decisions).hasSize(1);
312+
313+
deployCal = new GregorianCalendar();
314+
deployCal.add(Calendar.DATE, 4);
315+
dmnEngineConfiguration.getClock().setCurrentTime(deployCal.getTime());
316+
317+
repositoryService.createDeployment()
318+
.name("deploymentA")
319+
.addClasspathResource("org/flowable/dmn/engine/test/deployment/simple2.dmn")
320+
.enableDuplicateFiltering()
321+
.deploy();
322+
323+
deployments = repositoryService.createDeploymentQuery()
324+
.deploymentName("deploymentA")
325+
.list();
326+
assertThat(deployments).hasSize(2);
327+
328+
decisions = repositoryService.createDecisionQuery()
329+
.decisionKey("anotherDecision")
330+
.list();
331+
assertThat(decisions).hasSize(1);
332+
333+
deleteDeployments();
334+
335+
} finally {
336+
dmnEngineConfiguration.getClock().reset();
337+
}
323338
}
324339

325340
@Test

0 commit comments

Comments
 (0)