Skip to content

Commit 51c7631

Browse files
Merge branch 'main' of github.com:flowable/flowable-engine
2 parents afcbcac + 3c0bf9c commit 51c7631

File tree

8 files changed

+255
-2
lines changed

8 files changed

+255
-2
lines changed

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

+68
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.List;
2929
import java.util.Map;
3030
import java.util.Set;
31+
import java.util.UUID;
3132
import java.util.stream.Collectors;
3233
import java.util.stream.Stream;
3334

@@ -1726,6 +1727,73 @@ public void testQueryLocalDateTimeVariable() throws Exception {
17261727
Assertions.assertThat(caseInstance).isNull();
17271728
}
17281729

1730+
@Test
1731+
public void testQueryUUIDVariable() throws Exception {
1732+
Map<String, Object> vars = new HashMap<>();
1733+
UUID someUUID = UUID.randomUUID();
1734+
vars.put("uuidVar", someUUID);
1735+
1736+
CaseInstance caseInstance1 = cmmnRuntimeService.createCaseInstanceBuilder()
1737+
.caseDefinitionKey("oneTaskCase")
1738+
.variables(vars)
1739+
.start();
1740+
1741+
UUID someUUID2 = UUID.randomUUID();
1742+
vars = new HashMap<>();
1743+
vars.put("uuidVar", someUUID);
1744+
vars.put("uuidVar2", someUUID2);
1745+
CaseInstance caseInstance2 = cmmnRuntimeService.createCaseInstanceBuilder()
1746+
.caseDefinitionKey("oneTaskCase")
1747+
.variables(vars)
1748+
.start();
1749+
1750+
UUID someUUID3 = UUID.randomUUID();
1751+
vars = new HashMap<>();
1752+
vars.put("uuidVar", someUUID3);
1753+
CaseInstance caseInstance3 = cmmnRuntimeService.createCaseInstanceBuilder()
1754+
.caseDefinitionKey("oneTaskCase")
1755+
.variables(vars)
1756+
.start();
1757+
1758+
// Query on single uuid variable, should result in 2 matches
1759+
CaseInstanceQuery query = cmmnRuntimeService.createCaseInstanceQuery().variableValueEquals("uuidVar", someUUID);
1760+
List<CaseInstance> caseInstances = query.list();
1761+
Assertions.assertThat(caseInstances).hasSize(2);
1762+
1763+
// Query on two uuid variables, should result in single value
1764+
query = cmmnRuntimeService.createCaseInstanceQuery().variableValueEquals("uuidVar", someUUID)
1765+
.variableValueEquals("uuidVar2", someUUID2);
1766+
CaseInstance caseInstance = query.singleResult();
1767+
Assertions.assertThat(caseInstance).isNotNull();
1768+
Assertions.assertThat(caseInstance.getId()).isEqualTo(caseInstance2.getId());
1769+
1770+
UUID unexistingUUID = UUID.randomUUID();
1771+
// Query with unexisting variable value
1772+
caseInstance = cmmnRuntimeService.createCaseInstanceQuery().variableValueEquals("uuidVar", unexistingUUID).singleResult();
1773+
Assertions.assertThat(caseInstance).isNull();
1774+
1775+
// Test NOT_EQUALS
1776+
caseInstance = cmmnRuntimeService.createCaseInstanceQuery().variableValueNotEquals("uuidVar", someUUID).singleResult();
1777+
Assertions.assertThat(caseInstance).isNotNull();
1778+
Assertions.assertThat(caseInstance.getId()).isEqualTo(caseInstance3.getId());
1779+
1780+
// Test value-only matching
1781+
caseInstance = cmmnRuntimeService.createCaseInstanceQuery().variableValueEquals(someUUID3).singleResult();
1782+
Assertions.assertThat(caseInstance).isNotNull();
1783+
Assertions.assertThat(caseInstance.getId()).isEqualTo(caseInstance3.getId());
1784+
1785+
caseInstances = cmmnRuntimeService.createCaseInstanceQuery().variableValueEquals(someUUID).list();
1786+
Assertions.assertThat(caseInstances)
1787+
.extracting(CaseInstance::getId)
1788+
.containsExactlyInAnyOrder(
1789+
caseInstance1.getId(),
1790+
caseInstance2.getId()
1791+
);
1792+
1793+
caseInstance = cmmnRuntimeService.createCaseInstanceQuery().variableValueEquals(unexistingUUID).singleResult();
1794+
Assertions.assertThat(caseInstance).isNull();
1795+
}
1796+
17291797
@Test
17301798
public void testLocalization() {
17311799
CaseInstance createdCase = cmmnRuntimeService.createCaseInstanceBuilder()

modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/CmmnRestResponseFactory.java

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.flowable.common.rest.variable.RestVariableConverter;
6969
import org.flowable.common.rest.variable.ShortRestVariableConverter;
7070
import org.flowable.common.rest.variable.StringRestVariableConverter;
71+
import org.flowable.common.rest.variable.UUIDRestVariableConverter;
7172
import org.flowable.dmn.api.DmnDecision;
7273
import org.flowable.eventsubscription.api.EventSubscription;
7374
import org.flowable.form.api.FormDefinition;
@@ -1093,6 +1094,7 @@ protected void initializeVariableConverters() {
10931094
variableConverters.add(new InstantRestVariableConverter());
10941095
variableConverters.add(new LocalDateRestVariableConverter());
10951096
variableConverters.add(new LocalDateTimeRestVariableConverter());
1097+
variableConverters.add(new UUIDRestVariableConverter());
10961098
variableConverters.add(new JsonObjectRestVariableConverter(objectMapper));
10971099
}
10981100

modules/flowable-cmmn-rest/src/test/java/org/flowable/cmmn/rest/service/api/runtime/CaseInstanceVariableResourceTest.java

+58
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Collections;
2828
import java.util.HashMap;
2929
import java.util.Map;
30+
import java.util.UUID;
3031

3132
import org.apache.commons.io.IOUtils;
3233
import org.apache.http.HttpStatus;
@@ -162,6 +163,30 @@ public void testGetCaseInstanceLocalDateTimeVariable() throws Exception {
162163
+ "}");
163164
}
164165

166+
@CmmnDeployment(resources = { "org/flowable/cmmn/rest/service/api/repository/oneHumanTaskCase.cmmn" })
167+
public void testGetCaseInstanceUUIDVariable() throws Exception {
168+
169+
CaseInstance caseInstance = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase").start();
170+
UUID someUUID = UUID.fromString("26da81fb-18a6-4c19-b7b4-6877a568bfe1");
171+
runtimeService.setVariable(caseInstance.getId(), "variable", someUUID);
172+
173+
CloseableHttpResponse response = executeRequest(
174+
new HttpGet(SERVER_URL_PREFIX + CmmnRestUrls.createRelativeResourceUrl(CmmnRestUrls.URL_CASE_INSTANCE_VARIABLE,
175+
caseInstance.getId(), "variable")), HttpStatus.SC_OK);
176+
177+
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
178+
179+
closeResponse(response);
180+
assertThat(responseNode).isNotNull();
181+
assertThatJson(responseNode)
182+
.when(Option.IGNORING_EXTRA_FIELDS)
183+
.isEqualTo("{"
184+
+ " name: 'variable',"
185+
+ " type: 'uuid',"
186+
+ " value: '" + someUUID + "'"
187+
+ "}");
188+
}
189+
165190
/**
166191
* Test getting a case instance variable data. GET cmmn-runtime/case-instances/{caseInstanceId}/variables/{variableName}
167192
*/
@@ -427,4 +452,37 @@ public void testUpdateBinaryCaseVariable() throws Exception {
427452
assertThat(variableValue).isInstanceOf(byte[].class);
428453
assertThat(new String((byte[]) variableValue)).isEqualTo("This is binary content");
429454
}
455+
456+
@CmmnDeployment(resources = { "org/flowable/cmmn/rest/service/api/repository/oneHumanTaskCase.cmmn" })
457+
public void testUpdateUUIDCaseVariable() throws Exception {
458+
459+
UUID someUUID = UUID.fromString("87b859b2-d0c7-4845-93c2-e96ef69115b5");
460+
UUID someUUID2 = UUID.fromString("b2233abf-f84f-426f-b978-0d249b90cc45");
461+
CaseInstance caseInstance = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase")
462+
.variables(Collections.singletonMap("overlappingVariable", (Object) "caseValue")).start();
463+
runtimeService.setVariable(caseInstance.getId(), "uuidVariable", someUUID);
464+
465+
// Update variable
466+
ObjectNode requestNode = objectMapper.createObjectNode();
467+
requestNode.put("name", "uuidVariable");
468+
requestNode.put("value", someUUID2.toString());
469+
requestNode.put("type", "uuid");
470+
471+
HttpPut httpPut = new HttpPut(
472+
SERVER_URL_PREFIX + CmmnRestUrls.createRelativeResourceUrl(CmmnRestUrls.URL_CASE_INSTANCE_VARIABLE, caseInstance.getId(), "uuidVariable"));
473+
httpPut.setEntity(new StringEntity(requestNode.toString()));
474+
CloseableHttpResponse response = executeRequest(httpPut, HttpStatus.SC_OK);
475+
476+
assertThat(runtimeService.getVariable(caseInstance.getId(), "uuidVariable")).isEqualTo(someUUID2);
477+
478+
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
479+
closeResponse(response);
480+
assertThat(responseNode).isNotNull();
481+
assertThatJson(responseNode)
482+
.when(Option.IGNORING_EXTRA_FIELDS)
483+
.isEqualTo("{"
484+
+ " scope: 'global',"
485+
+ " value: 'b2233abf-f84f-426f-b978-0d249b90cc45'"
486+
+ "}");
487+
}
430488
}

modules/flowable-cmmn-rest/src/test/java/org/flowable/cmmn/rest/service/api/runtime/TaskVariablesCollectionResourceTest.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.HashMap;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.UUID;
2829

2930
import org.apache.http.HttpStatus;
3031
import org.apache.http.client.methods.CloseableHttpResponse;
@@ -71,6 +72,7 @@ public void testGetTaskVariables() throws Exception {
7172
caseVariables.put("dateProcVar", cal.getTime());
7273
caseVariables.put("byteArrayProcVar", "Some raw bytes".getBytes());
7374
caseVariables.put("overlappingVariable", "case-value");
75+
caseVariables.put("uuidVar", UUID.fromString("a053505c-43c9-479f-ae01-5352ce559786"));
7476
CaseInstance caseInstance = runtimeService.createCaseInstanceBuilder().caseDefinitionKey("oneHumanTaskCase").variables(caseVariables).start();
7577

7678
// Set local task variables, including one that has the same name as one
@@ -86,6 +88,7 @@ public void testGetTaskVariables() throws Exception {
8688
taskVariables.put("dateTaskVar", cal.getTime());
8789
taskVariables.put("byteArrayTaskVar", "Some raw bytes".getBytes());
8890
taskVariables.put("overlappingVariable", "task-value");
91+
taskVariables.put("uuidVar", UUID.fromString("a053505c-43c9-479f-ae01-5352ce559786"));
8992
taskService.setVariablesLocal(task.getId(), taskVariables);
9093

9194
// Request all variables (no scope provides) which include global an local
@@ -97,7 +100,7 @@ public void testGetTaskVariables() throws Exception {
97100
closeResponse(response);
98101
assertThat(responseNode).isNotNull();
99102
assertThat(responseNode.isArray()).isTrue();
100-
assertThat(responseNode).hasSize(17);
103+
assertThat(responseNode).hasSize(18);
101104

102105
// Overlapping variable should contain task-value AND be defined as "local"
103106
assertThatJson(responseNode)
@@ -148,6 +151,9 @@ public void testGetTaskVariables() throws Exception {
148151
+ " },"
149152
+ " {"
150153
+ " scope: 'local'"
154+
+ " },"
155+
+ " {"
156+
+ " scope: 'local'"
151157
+ " }"
152158
+ "]");
153159

@@ -160,7 +166,7 @@ public void testGetTaskVariables() throws Exception {
160166
closeResponse(response);
161167
assertThat(responseNode).isNotNull();
162168
assertThat(responseNode.isArray()).isTrue();
163-
assertThat(responseNode).hasSize(9);
169+
assertThat(responseNode).hasSize(10);
164170
assertThatJson(responseNode)
165171
.when(Option.IGNORING_EXTRA_FIELDS, Option.IGNORING_ARRAY_ORDER, Option.IGNORING_EXTRA_ARRAY_ITEMS)
166172
.isEqualTo("["
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* Licensed under the Apache License, Version 2.0 (the "License");
2+
* you may not use this file except in compliance with the License.
3+
* You may obtain a copy of the License at
4+
*
5+
* http://www.apache.org/licenses/LICENSE-2.0
6+
*
7+
* Unless required by applicable law or agreed to in writing, software
8+
* distributed under the License is distributed on an "AS IS" BASIS,
9+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
* See the License for the specific language governing permissions and
11+
* limitations under the License.
12+
*/
13+
14+
package org.flowable.common.rest.variable;
15+
16+
import java.util.UUID;
17+
18+
import org.flowable.common.engine.api.FlowableIllegalArgumentException;
19+
20+
public class UUIDRestVariableConverter implements RestVariableConverter {
21+
22+
@Override
23+
public String getRestTypeName() {
24+
return "uuid";
25+
}
26+
27+
@Override
28+
public Class<?> getVariableType() {
29+
return UUID.class;
30+
}
31+
32+
@Override
33+
public Object getVariableValue(EngineRestVariable result) {
34+
if (result.getValue() != null) {
35+
if (!(result.getValue() instanceof String)) {
36+
throw new FlowableIllegalArgumentException("Converter can only convert Strings");
37+
}
38+
return UUID.fromString((String) result.getValue());
39+
}
40+
return null;
41+
}
42+
43+
@Override
44+
public void convertVariableValue(Object variableValue, EngineRestVariable result) {
45+
if (variableValue != null) {
46+
if (!(variableValue instanceof UUID)) {
47+
throw new FlowableIllegalArgumentException("Converter can only convert UUIDs");
48+
}
49+
result.setValue(((UUID)variableValue).toString());
50+
} else {
51+
result.setValue(null);
52+
}
53+
}
54+
55+
}

modules/flowable-dmn-rest/src/main/java/org/flowable/dmn/rest/service/api/DmnRestResponseFactory.java

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.flowable.common.rest.variable.RestVariableConverter;
3030
import org.flowable.common.rest.variable.ShortRestVariableConverter;
3131
import org.flowable.common.rest.variable.StringRestVariableConverter;
32+
import org.flowable.common.rest.variable.UUIDRestVariableConverter;
3233
import org.flowable.dmn.api.DecisionExecutionAuditContainer;
3334
import org.flowable.dmn.api.DecisionServiceExecutionAuditContainer;
3435
import org.flowable.dmn.api.DmnDecision;
@@ -302,6 +303,7 @@ protected void initializeVariableConverters() {
302303
variableConverters.add(new InstantRestVariableConverter());
303304
variableConverters.add(new LocalDateRestVariableConverter());
304305
variableConverters.add(new LocalDateTimeRestVariableConverter());
306+
variableConverters.add(new UUIDRestVariableConverter());
305307
}
306308

307309
protected DmnRestUrlBuilder createUrlBuilder() {

modules/flowable-rest/src/main/java/org/flowable/rest/service/api/RestResponseFactory.java

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.flowable.common.rest.variable.RestVariableConverter;
3939
import org.flowable.common.rest.variable.ShortRestVariableConverter;
4040
import org.flowable.common.rest.variable.StringRestVariableConverter;
41+
import org.flowable.common.rest.variable.UUIDRestVariableConverter;
4142
import org.flowable.dmn.api.DmnDecision;
4243
import org.flowable.engine.form.FormData;
4344
import org.flowable.engine.form.FormProperty;
@@ -1528,6 +1529,7 @@ protected void initializeVariableConverters() {
15281529
variableConverters.add(new LocalDateRestVariableConverter());
15291530
variableConverters.add(new LocalDateTimeRestVariableConverter());
15301531
variableConverters.add(new JsonObjectRestVariableConverter(objectMapper));
1532+
variableConverters.add(new UUIDRestVariableConverter());
15311533
}
15321534

15331535
protected String formatUrl(String serverRootUrl, String[] fragments, Object... arguments) {

modules/flowable-rest/src/test/java/org/flowable/rest/service/api/runtime/ProcessInstanceVariableResourceTest.java

+60
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.Collections;
2828
import java.util.HashMap;
2929
import java.util.Map;
30+
import java.util.UUID;
3031

3132
import org.apache.commons.io.IOUtils;
3233
import org.apache.http.HttpStatus;
@@ -178,6 +179,31 @@ public void testGetProcessInstanceLocalDateTimeVariable() throws Exception {
178179
+ "}");
179180
}
180181

182+
@Test
183+
@Deployment(resources = { "org/flowable/rest/service/api/runtime/ProcessInstanceVariableResourceTest.testProcess.bpmn20.xml" })
184+
public void testGetProcessInstanceUUIDVariable() throws Exception {
185+
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
186+
UUID someUUID = UUID.fromString("239969dd-3310-4068-b558-e4cbce5650ea");
187+
runtimeService.setVariable(processInstance.getId(), "variable", someUUID);
188+
189+
CloseableHttpResponse response = executeRequest(
190+
new HttpGet(
191+
SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_VARIABLE, processInstance.getId(), "variable")),
192+
HttpStatus.SC_OK);
193+
194+
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
195+
196+
closeResponse(response);
197+
assertThat(responseNode).isNotNull();
198+
assertThatJson(responseNode)
199+
.when(Option.IGNORING_EXTRA_FIELDS)
200+
.isEqualTo("{"
201+
+ " name: 'variable',"
202+
+ " type: 'uuid',"
203+
+ " value: '" + someUUID + "'"
204+
+ "}");
205+
}
206+
181207
/**
182208
* Test getting a process instance variable data. GET runtime/process-instances/{processInstanceId}/variables/{variableName}
183209
*/
@@ -415,6 +441,40 @@ public void testUpdateLocalDateTimeProcessVariable() throws Exception {
415441
+ "}");
416442
}
417443

444+
@Test
445+
@Deployment(resources = { "org/flowable/rest/service/api/runtime/ProcessInstanceVariableResourceTest.testProcess.bpmn20.xml" })
446+
public void testUpdateUUIDProcessVariable() throws Exception {
447+
UUID someUUID = UUID.fromString("239969dd-3310-4068-b558-e4cbce5650ea");
448+
UUID someUUID2 = UUID.fromString("c5b16e77-0c15-4d7b-ac12-15352af76355");
449+
ProcessInstance processInstance = runtimeService
450+
.startProcessInstanceByKey("oneTaskProcess", Collections.singletonMap("overlappingVariable", (Object) "processValue"));
451+
runtimeService.setVariable(processInstance.getId(), "uuidVariable", someUUID);
452+
453+
// Update variable
454+
ObjectNode requestNode = objectMapper.createObjectNode();
455+
requestNode.put("name", "uuidVariable");
456+
requestNode.put("value", someUUID2.toString());
457+
requestNode.put("type", "uuid");
458+
459+
HttpPut httpPut = new HttpPut(
460+
SERVER_URL_PREFIX + RestUrls.createRelativeResourceUrl(RestUrls.URL_PROCESS_INSTANCE_VARIABLE, processInstance.getId(), "uuidVariable"));
461+
httpPut.setEntity(new StringEntity(requestNode.toString()));
462+
CloseableHttpResponse response = executeRequest(httpPut, HttpStatus.SC_OK);
463+
464+
assertThat(runtimeService.getVariable(processInstance.getId(), "uuidVariable"))
465+
.isEqualTo(someUUID2);
466+
467+
JsonNode responseNode = objectMapper.readTree(response.getEntity().getContent());
468+
closeResponse(response);
469+
assertThat(responseNode).isNotNull();
470+
assertThatJson(responseNode)
471+
.when(Option.IGNORING_EXTRA_FIELDS)
472+
.isEqualTo("{"
473+
+ " scope: null,"
474+
+ " value: 'c5b16e77-0c15-4d7b-ac12-15352af76355'"
475+
+ "}");
476+
}
477+
418478
/**
419479
* Test updating a single process variable using a binary stream. PUT runtime/process-instances/{processInstanceId}/variables/{variableName}
420480
*/

0 commit comments

Comments
 (0)