Skip to content

Commit 8b02f7d

Browse files
committed
Fix NPE when setting a long string to null
1 parent 5596063 commit 8b02f7d

5 files changed

Lines changed: 95 additions & 0 deletions

File tree

modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/runtime/MaxAllowedShortStringVariableLengthTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ public void stringVariable() {
6363
+ task.getId());
6464

6565
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isEqualTo("Test value");
66+
67+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "stringVar");
68+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isNull();
6669
}
6770

6871
@Test
@@ -88,6 +91,9 @@ public void longStringVariable() {
8891
+ task.getId());
8992

9093
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isEqualTo("Test value");
94+
95+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "stringVar");
96+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isNull();
9197
}
9298

9399
}

modules/flowable-cmmn-engine/src/test/java/org/flowable/cmmn/test/runtime/MaxAllowedVariableLengthTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,38 @@ public void stringVariable() {
7171
+ task.getId());
7272

7373
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isEqualTo("Test value");
74+
75+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "stringVar");
76+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isNull();
77+
}
78+
79+
@Test
80+
@CmmnDeployment(resources = "org/flowable/cmmn/test/runtime/oneHumanTaskCase.cmmn")
81+
public void longStringVariable() {
82+
String initialValue = RandomStringUtils.insecure().nextAlphanumeric(4999);
83+
CaseInstance caseInstance = cmmnRuntimeService.createCaseInstanceBuilder()
84+
.caseDefinitionKey("oneHumanTaskCase")
85+
.variable("stringVar", initialValue)
86+
.start();
87+
88+
assertThatThrownBy(() -> cmmnRuntimeService.setVariable(caseInstance.getId(), "stringVar", RandomStringUtils.insecure().nextAlphanumeric(5001)))
89+
.isInstanceOf(FlowableIllegalArgumentException.class)
90+
.hasMessage(
91+
"The length of the longString value exceeds the maximum allowed length of 5000 characters. Current length: 5001, for variable: stringVar in scope cmmn with id "
92+
+ caseInstance.getId());
93+
94+
Task task = cmmnTaskService.createTaskQuery().caseInstanceId(caseInstance.getId()).singleResult();
95+
assertThat(task).isNotNull();
96+
assertThatThrownBy(() -> cmmnTaskService.setVariableLocal(task.getId(), "stringVar", RandomStringUtils.insecure().nextAlphanumeric(5001)))
97+
.isInstanceOf(FlowableIllegalArgumentException.class)
98+
.hasMessage(
99+
"The length of the longString value exceeds the maximum allowed length of 5000 characters. Current length: 5001, for variable: stringVar in scope task with id "
100+
+ task.getId());
101+
102+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isEqualTo(initialValue);
103+
104+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "stringVar");
105+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "stringVar")).isNull();
74106
}
75107

76108
@Test
@@ -101,6 +133,9 @@ public void jsonVariable() {
101133

102134
assertThatJson(cmmnRuntimeService.getVariable(caseInstance.getId(), "jsonVar"))
103135
.isEqualTo("{ name: 'John Doe' }");
136+
137+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "jsonVar");
138+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "jsonVar")).isNull();
104139
}
105140

106141
@Test
@@ -130,6 +165,9 @@ public void bytesVariable() {
130165
.asInstanceOf(BYTE_ARRAY)
131166
.asString(StandardCharsets.UTF_8)
132167
.isEqualTo("Test");
168+
169+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "bytesVar");
170+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "bytesVar")).isNull();
133171
}
134172

135173
@Test
@@ -155,6 +193,9 @@ public void serializableVariable() {
155193

156194
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "serializableVar"))
157195
.isInstanceOfSatisfying(Customer.class, customer -> assertThat(customer.name).isEqualTo("Test"));
196+
197+
cmmnRuntimeService.removeVariable(caseInstance.getId(), "serializableVar");
198+
assertThat(cmmnRuntimeService.getVariable(caseInstance.getId(), "serializableVar")).isNull();
158199
}
159200

160201
protected static class Customer implements Serializable {

modules/flowable-engine/src/test/java/org/flowable/engine/test/variable/MaxAllowedShortStringVariableLengthTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ void stringVariable() {
6363
+ task.getId());
6464

6565
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isEqualTo("Test value");
66+
67+
runtimeService.removeVariable(processInstance.getId(), "stringVar");
68+
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isNull();
6669
}
6770

6871
@Test
@@ -88,6 +91,9 @@ void longStringVariable() {
8891
+ task.getId());
8992

9093
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isEqualTo("Test value");
94+
95+
runtimeService.removeVariable(processInstance.getId(), "stringVar");
96+
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isNull();
9197
}
9298

9399
}

modules/flowable-engine/src/test/java/org/flowable/engine/test/variable/MaxAllowedVariableLengthTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,38 @@ void stringVariable() {
6969
+ task.getId());
7070

7171
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isEqualTo("Test value");
72+
73+
runtimeService.removeVariable(processInstance.getId(), "stringVar");
74+
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isNull();
75+
}
76+
77+
@Test
78+
@Deployment(resources = "org/flowable/engine/test/api/oneTaskProcess.bpmn20.xml")
79+
void longStringVariable() {
80+
String initialValue = RandomStringUtils.insecure().nextAlphanumeric(4999);
81+
ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
82+
.processDefinitionKey("oneTaskProcess")
83+
.variable("stringVar", initialValue)
84+
.start();
85+
86+
assertThatThrownBy(() -> runtimeService.setVariable(processInstance.getId(), "stringVar", RandomStringUtils.insecure().nextAlphanumeric(5001)))
87+
.isInstanceOf(FlowableIllegalArgumentException.class)
88+
.hasMessage(
89+
"The length of the longString value exceeds the maximum allowed length of 5000 characters. Current length: 5001, for variable: stringVar in scope bpmn with id "
90+
+ processInstance.getId());
91+
92+
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
93+
assertThat(task).isNotNull();
94+
assertThatThrownBy(() -> taskService.setVariableLocal(task.getId(), "stringVar", RandomStringUtils.insecure().nextAlphanumeric(5001)))
95+
.isInstanceOf(FlowableIllegalArgumentException.class)
96+
.hasMessage(
97+
"The length of the longString value exceeds the maximum allowed length of 5000 characters. Current length: 5001, for variable: stringVar in scope task with id "
98+
+ task.getId());
99+
100+
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isEqualTo(initialValue);
101+
102+
runtimeService.removeVariable(processInstance.getId(), "stringVar");
103+
assertThat(runtimeService.getVariable(processInstance.getId(), "stringVar")).isNull();
72104
}
73105

74106
@Test
@@ -99,6 +131,9 @@ void jsonVariable() {
99131

100132
assertThatJson(runtimeService.getVariable(processInstance.getId(), "jsonVar"))
101133
.isEqualTo("{ name: 'John Doe' }");
134+
135+
runtimeService.removeVariable(processInstance.getId(), "jsonVar");
136+
assertThat(runtimeService.getVariable(processInstance.getId(), "jsonVar")).isNull();
102137
}
103138

104139
@Test
@@ -127,6 +162,9 @@ void bytesVariable() {
127162
assertThat(runtimeService.getVariable(processInstance.getId(), "bytesVar", byte[].class))
128163
.asString(StandardCharsets.UTF_8)
129164
.isEqualTo("Test");
165+
166+
runtimeService.removeVariable(processInstance.getId(), "bytesVar");
167+
assertThat(runtimeService.getVariable(processInstance.getId(), "bytesVar")).isNull();
130168
}
131169

132170
@Test
@@ -152,6 +190,9 @@ void serializableVariable() {
152190

153191
assertThat(runtimeService.getVariable(processInstance.getId(), "serializableVar"))
154192
.isInstanceOfSatisfying(Customer.class, customer -> assertThat(customer.name).isEqualTo("Test"));
193+
194+
runtimeService.removeVariable(processInstance.getId(), "serializableVar");
195+
assertThat(runtimeService.getVariable(processInstance.getId(), "serializableVar")).isNull();
155196
}
156197

157198
protected static class Customer implements Serializable {

modules/flowable-variable-service/src/main/java/org/flowable/variable/service/impl/types/LongStringType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public void setValue(Object value, ValueFields valueFields) {
4343
if (value == null) {
4444
valueFields.setCachedValue(null);
4545
valueFields.setBytes(null);
46+
return;
4647
}
4748
String textValue = (String) value;
4849
lengthVerifier.verifyLength(textValue.length(), valueFields, this);

0 commit comments

Comments
 (0)