From 2680a4286650e052d4d82b66eb52d31708d6a948 Mon Sep 17 00:00:00 2001 From: RahulKumar1606 <126051097+RahulKumar1606@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:45:21 +0530 Subject: [PATCH 01/24] AAE-18428 Fix Swagger API suggest to use the HAL-JSON format (#1306) --- .../RuntimeBundleSwaggerConfig.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/src/main/java/org/activiti/cloud/starter/rb/configuration/RuntimeBundleSwaggerConfig.java b/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/src/main/java/org/activiti/cloud/starter/rb/configuration/RuntimeBundleSwaggerConfig.java index d4ba407696..9085eaab36 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/src/main/java/org/activiti/cloud/starter/rb/configuration/RuntimeBundleSwaggerConfig.java +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/src/main/java/org/activiti/cloud/starter/rb/configuration/RuntimeBundleSwaggerConfig.java @@ -15,6 +15,8 @@ */ package org.activiti.cloud.starter.rb.configuration; +import io.swagger.v3.oas.models.media.Content; +import io.swagger.v3.oas.models.media.MediaType; import org.activiti.api.process.model.payloads.CreateProcessInstancePayload; import org.activiti.api.process.model.payloads.RemoveProcessVariablesPayload; import org.activiti.api.process.model.payloads.SetProcessVariablesPayload; @@ -32,12 +34,15 @@ import org.activiti.api.task.model.payloads.UpdateTaskVariablePayload; import org.activiti.cloud.common.swagger.springdoc.BaseOpenApiBuilder; import org.activiti.cloud.common.swagger.springdoc.SwaggerDocUtils; +import org.springdoc.core.customizers.OpenApiCustomizer; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.hateoas.MediaTypes; +import org.springframework.http.HttpStatus; @Configuration public class RuntimeBundleSwaggerConfig implements InitializingBean { @@ -52,9 +57,34 @@ public GroupedOpenApi runtimeBundleApi(@Value("${activiti.cloud.swagger.rb-base- .addOpenApiCustomizer(openApi -> openApi.addExtension(BaseOpenApiBuilder.SERVICE_URL_PREFIX, swaggerBasePath) ) + .addOpenApiCustomizer(openApiCustomizer()) .build(); } + public OpenApiCustomizer openApiCustomizer() { + return openAPI -> + openAPI + .getPaths() + .values() + .stream() + .flatMap(val -> val.readOperations().stream()) + .flatMap(operation -> operation.getResponses().entrySet().stream()) + .filter(entry -> entry.getKey().matches(String.valueOf(HttpStatus.OK.value()))) + .forEach(entry -> { + Content contents = entry.getValue().getContent(); + String applicationHal = MediaTypes.HAL_JSON_VALUE; + String applicationJson = org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + if ( + contents != null && + contents.containsKey(applicationHal) && + contents.containsKey(applicationJson) + ) { + MediaType applicationHalValue = contents.remove(applicationHal); + contents.put(applicationHal, applicationHalValue); + } + }); + } + @Override public void afterPropertiesSet() throws Exception { SwaggerDocUtils.replaceWithClass(StartProcessPayload.class, PayloadApiModels.StartProcessPayloadApiModel.class); From 3af66fb14db43f9bdf952da6a819dbbb2ff47f12 Mon Sep 17 00:00:00 2001 From: Tommaso D'Alessandro Date: Mon, 29 Apr 2024 18:27:32 +0200 Subject: [PATCH 02/24] AAE-21097 Implement permission-based authorization (#1427) * AAE-21097 add permission getter on Jwt adapter, implement conversion to granted authority and include permissions in auth flow * AAE-21097 add AuthorizationConfigurerIT, fix omitted methods logic * AAE-21097 fix tests * AAE-21097 add license header * AAE-21097 remove unused import * AAE-21097 CustomAuthorizationManager implemented with different authority types for role and permission * AAE-21097 move CustomAuthorizationManager * AAE-21097 license header --- .../keycloak/KeycloakResourceJwtAdapter.java | 16 +- .../KeycloakResourceJwtAdapterTest.java | 24 +++ .../AuthorizationConfigurer.java | 80 +++++--- .../AuthorizationProperties.java | 9 + .../CustomAuthorizationManager.java | 60 ++++++ .../common/security/jwt/JwtAdapter.java | 5 + .../jwt/JwtGrantedAuthorityConverter.java | 11 +- .../AuthorizationConfigurerIT.java | 176 +++++++++++++++++ .../AuthorizationConfigurerTest.java | 181 ++++++++++++++---- .../AuthorizationPropertiesTest.java | 16 +- .../AuthorizationTestController.java | 111 +++++++++++ .../SecurityTestConfiguration.java | 95 +++++++++ 12 files changed, 702 insertions(+), 82 deletions(-) create mode 100644 activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/CustomAuthorizationManager.java create mode 100644 activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java create mode 100644 activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java create mode 100644 activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/SecurityTestConfiguration.java diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java index 821134387d..81cc8362b4 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java @@ -38,7 +38,12 @@ public Jwt getJwt() { @Override public List getRoles() { - return getFromClient(resourceId, jwt); + return getFromClient(resourceId, "roles", jwt); + } + + @Override + public List getPermissions() { + return getFromClient(resourceId, "permissions", jwt); } @Override @@ -55,17 +60,14 @@ public String getUserName() { return jwt.getClaim("preferred_username"); } - private List getFromClient(String clientId, Jwt jwt) { + private List getFromClient(String clientId, String key, Jwt jwt) { if (jwt.hasClaim("resource_access")) { Map resourceAccess = jwt.getClaim("resource_access"); if (resourceAccess.get(clientId) != null) { - return getRoles((Map) resourceAccess.get(clientId)); + Map resource = (Map) resourceAccess.get(clientId); + return (List) resource.get(key); } } return Collections.emptyList(); } - - private List getRoles(Map getRolesParent) { - return (List) getRolesParent.get("roles"); - } } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java index eac15a1a0e..6cf11a98aa 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java @@ -72,4 +72,28 @@ public void shouldReturnRoles() { assertThat(keycloakResourceJwtAdapter.getRoles()).hasSize(2).containsExactly("roleA", "roleB"); } + + @Test + public void shouldNotThrowAnyExceptionWhenPermissionsIsNull() { + Map permissionsParent = JSONObjectUtils.newJSONObject(); + permissionsParent.put("permissions", null); + when(jwt.hasClaim("resource_access")).thenReturn(true); + when(jwt.getClaim("resource_access")).thenReturn(permissionsParent); + + assertDoesNotThrow(() -> keycloakResourceJwtAdapter.getPermissions()); + } + + @Test + public void shouldReturnPermissions() { + Map client = JSONObjectUtils.newJSONObject(); + Map permissions = JSONObjectUtils.newJSONObject(); + permissions.put("permissions", List.of("permissionA", "permissionB")); + client.put("app", permissions); + when(jwt.hasClaim("resource_access")).thenReturn(true); + when(jwt.getClaim("resource_access")).thenReturn(client); + + assertThat(keycloakResourceJwtAdapter.getPermissions()) + .hasSize(2) + .containsExactly("permissionA", "permissionB"); + } } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java index cf1d578a93..d0ccc2ea68 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java @@ -15,7 +15,6 @@ */ package org.activiti.cloud.security.authorization; -import static java.util.function.Predicate.not; import static org.springframework.security.config.Customizer.withDefaults; import jakarta.annotation.PostConstruct; @@ -35,12 +34,15 @@ import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; +import org.springframework.security.web.access.intercept.RequestAuthorizationContext; import org.springframework.stereotype.Component; /** * This class aims to define authorizations on a REST API using a configuration like below: *

- * authorizations.security-constraints[0].authRoles[0]=ACTIVITI_USER authorizations.security-constraints[0].securityCollections[0].patterns[0]=/v1/* authorizations.security-constraints[1].authRoles[0]=ACTIVITI_ADMIN + * authorizations.security-constraints[0].authRoles[0]=ACTIVITI_USER + * authorizations.security-constraints[0].securityCollections[0].patterns[0]=/v1/* + * authorizations.security-constraints[1].authRoles[0]=ACTIVITI_ADMIN * authorizations.security-constraints[1].securityCollections[0].patterns[0]=/admin/* *

* This configuration schema is similar to the security constraint configurations used by other systems like Keycloak. @@ -51,6 +53,7 @@ public class AuthorizationConfigurer { private static final Logger LOGGER = LoggerFactory.getLogger(AuthorizationConfigurer.class); private final AuthorizationProperties authorizationProperties; + private final Environment environment; @Autowired @@ -61,7 +64,7 @@ public AuthorizationConfigurer(AuthorizationProperties authorizationProperties, @PostConstruct public void checkKeycloakConfig() { - //if there is a Keycloak security constraint defined it could be configuration issue + // if there is a Keycloak security constraint defined it could be configuration issue String securityConstraintProperty = environment.getProperty( "keycloak.security-constraints[0].securityCollections[0].patterns[0]" ); @@ -78,15 +81,14 @@ public void configure(HttpSecurity http) throws Exception { ); List publicUrls = new ArrayList<>(); for (SecurityConstraint securityConstraint : orderedSecurityConstraints) { - String[] roles = securityConstraint.getAuthRoles(); - if (roles.length == 0) { + if (!hasRoleOrPermissionConstraint(securityConstraint)) { List patterns = Arrays .stream(securityConstraint.getSecurityCollections()) .flatMap(s -> Arrays.stream(getPatterns(s.getPatterns()))) .toList(); publicUrls.addAll(patterns); } - configureAuthorization(http, roles, securityConstraint.getSecurityCollections()); + configureAuthorization(http, securityConstraint); } if (!publicUrls.isEmpty()) { LOGGER.debug("Disabling CSRF protection for public URLs: {}", publicUrls); @@ -95,43 +97,62 @@ public void configure(HttpSecurity http) throws Exception { http.anonymous(withDefaults()); } - private void configureAuthorization(HttpSecurity http, String[] roles, SecurityCollection[] securityCollection) - throws Exception { - boolean rolesNotEmpty = isNotEmpty(roles); + private void configureAuthorization(HttpSecurity http, SecurityConstraint securityConstraint) throws Exception { Consumer.AuthorizedUrl> authorizedUrlConsumer; - if (rolesNotEmpty) { - authorizedUrlConsumer = a -> a.hasAnyRole(roles); + if (hasRoleOrPermissionConstraint(securityConstraint)) { + authorizedUrlConsumer = + a -> + a.access( + new CustomAuthorizationManager( + securityConstraint.getAuthRoles(), + securityConstraint.getAuthPermissions() + ) + ); } else { - authorizedUrlConsumer = a -> a.permitAll(); + authorizedUrlConsumer = AuthorizeHttpRequestsConfigurer.AuthorizedUrl::permitAll; } - buildAntMatchers(http, securityCollection, authorizedUrlConsumer); + buildAntMatchers(http, securityConstraint.getSecurityCollections(), authorizedUrlConsumer); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Setting access {} to {}", securityCollection, rolesNotEmpty ? roles : "anonymous"); + LOGGER.debug( + "Setting access {} to {}", + securityConstraint.getSecurityCollections(), + hasRoleOrPermissionConstraint(securityConstraint) + ? Stream + .concat( + Arrays.stream(securityConstraint.getAuthRoles()), + Arrays.stream(securityConstraint.getAuthPermissions()) + ) + .collect(Collectors.joining(", ")) + : "anonymous" + ); } } private void buildAntMatchers( HttpSecurity http, SecurityCollection[] securityCollections, - Consumer.AuthorizedUrl> f + Consumer.AuthorizedUrl> urlConsumer ) throws Exception { for (SecurityCollection securityCollection : securityCollections) { String[] patterns = getPatterns(securityCollection.getPatterns()); - if (isNotEmpty(securityCollection.getOmittedMethods())) { - List methods = getAllowedMethods(securityCollection.getOmittedMethods()); - for (HttpMethod method : methods) { - http.authorizeHttpRequests(spec -> f.accept(spec.requestMatchers(method, patterns))); + List omittedMethods = Arrays + .stream(securityCollection.getOmittedMethods()) + .map(HttpMethod::valueOf) + .toList(); + + for (HttpMethod method : HttpMethod.values()) { + if (omittedMethods.contains(method)) { + http.authorizeHttpRequests(spec -> spec.requestMatchers(method, patterns).denyAll()); + } else { + http.authorizeHttpRequests(spec -> urlConsumer.accept(spec.requestMatchers(method, patterns))); } - } else { - http.authorizeHttpRequests(spec -> f.accept(spec.requestMatchers(patterns))); } } } /** - * If a security constraint hasn't any roles it means that it can accessible from anyone. It must be the first one - * in order to avoid being overridden by other rules. The order is reversed because in order - * to mimic the security-constraint behaviour. + * If a security constraint hasn't any roles it means that it can be accessed from anyone. It must be the first one + * in order to avoid being overridden by other rules. The order is reversed to mimic the security-constraint behaviour. * * @param securityConstraints * @return @@ -141,7 +162,7 @@ private List getOrderedList(List securit Collections.reverse(reversed); List result = new ArrayList<>(); reversed.forEach(securityConstraint -> { - if (isNotEmpty(securityConstraint.getAuthRoles())) { + if (hasRoleOrPermissionConstraint(securityConstraint)) { result.add(securityConstraint); } else { result.add(0, securityConstraint); @@ -157,12 +178,11 @@ private String[] getPatterns(String[] patterns) { .toArray(String[]::new); } - private List getAllowedMethods(String[] omittedMethods) { - List httpMethods = Stream.of(omittedMethods).map(HttpMethod::valueOf).toList(); - return Stream.of(HttpMethod.values()).filter(not(httpMethods::contains)).collect(Collectors.toList()); - } - private boolean isNotEmpty(String[] array) { return array != null && array.length > 0; } + + private boolean hasRoleOrPermissionConstraint(SecurityConstraint securityConstraint) { + return isNotEmpty(securityConstraint.getAuthRoles()) || isNotEmpty(securityConstraint.getAuthPermissions()); + } } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationProperties.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationProperties.java index 6a3a910258..6ce9f10591 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationProperties.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationProperties.java @@ -39,6 +39,7 @@ public void setSecurityConstraints(List securityConstraints) public static class SecurityConstraint { private String[] authRoles = new String[] {}; + private String[] authPermissions = new String[] {}; private SecurityCollection[] securityCollections = new SecurityCollection[] {}; public String[] getAuthRoles() { @@ -56,6 +57,14 @@ public SecurityCollection[] getSecurityCollections() { public void setSecurityCollections(SecurityCollection[] securityCollections) { this.securityCollections = securityCollections; } + + public String[] getAuthPermissions() { + return authPermissions; + } + + public void setAuthPermissions(String[] authPermissions) { + this.authPermissions = authPermissions; + } } @ConfigurationProperties diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/CustomAuthorizationManager.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/CustomAuthorizationManager.java new file mode 100644 index 0000000000..6f1bafa584 --- /dev/null +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/CustomAuthorizationManager.java @@ -0,0 +1,60 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.cloud.security.authorization; + +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationManager; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; + +public class CustomAuthorizationManager + implements AuthorizationManager { + + public static final String ROLE_PREFIX = "ROLE_"; + public static final String PERMISSION_PREFIX = "PERMISSION_"; + + private final Set authoritiesWithAccess; + + public CustomAuthorizationManager(String[] roles, String[] permissions) { + this.authoritiesWithAccess = + Stream + .concat( + Stream.of(roles).map(role -> ROLE_PREFIX + role), + Stream.of(permissions).map(permission -> PERMISSION_PREFIX + permission) + ) + .collect(Collectors.toSet()); + } + + @Override + public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext object) { + return new AuthorizationDecision( + authentication + .get() + .getAuthorities() + .stream() + .map(GrantedAuthority::getAuthority) + .anyMatch(authoritiesWithAccess::contains) + ); + } + + public Set getAuthoritiesWithAccess() { + return authoritiesWithAccess; + } +} diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtAdapter.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtAdapter.java index 31f47b653f..90c6830650 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtAdapter.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtAdapter.java @@ -15,6 +15,7 @@ */ package org.activiti.cloud.services.common.security.jwt; +import java.util.Collections; import java.util.List; import org.springframework.security.oauth2.jwt.Jwt; @@ -26,4 +27,8 @@ public interface JwtAdapter { List getRoles(); List getGroups(); + + default List getPermissions() { + return Collections.emptyList(); + } } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtGrantedAuthorityConverter.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtGrantedAuthorityConverter.java index 95b6650e0f..2d0c93416a 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtGrantedAuthorityConverter.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/services/common/security/jwt/JwtGrantedAuthorityConverter.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collection; +import org.activiti.cloud.security.authorization.CustomAuthorizationManager; import org.springframework.core.convert.converter.Converter; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -24,7 +25,6 @@ public class JwtGrantedAuthorityConverter implements Converter> { - private final String authorityPrefix = "ROLE_"; private final JwtAccessTokenProvider jwtAccessTokenProvider; public JwtGrantedAuthorityConverter(JwtAccessTokenProvider jwtAccessTokenProvider) { @@ -34,8 +34,13 @@ public JwtGrantedAuthorityConverter(JwtAccessTokenProvider jwtAccessTokenProvide @Override public Collection convert(Jwt jwt) { Collection grantedAuthorities = new ArrayList<>(); - for (String authority : jwtAccessTokenProvider.accessToken(jwt).getRoles()) { - grantedAuthorities.add(new SimpleGrantedAuthority(this.authorityPrefix + authority)); + for (String role : jwtAccessTokenProvider.accessToken(jwt).getRoles()) { + grantedAuthorities.add(new SimpleGrantedAuthority(CustomAuthorizationManager.ROLE_PREFIX + role)); + } + for (String permission : jwtAccessTokenProvider.accessToken(jwt).getPermissions()) { + grantedAuthorities.add( + new SimpleGrantedAuthority(CustomAuthorizationManager.PERMISSION_PREFIX + permission) + ); } return grantedAuthorities; } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java new file mode 100644 index 0000000000..73e87947f7 --- /dev/null +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java @@ -0,0 +1,176 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.cloud.security.authorization; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.Collections; +import java.util.List; +import org.activiti.cloud.services.common.security.jwt.JwtAdapter; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +@SpringBootTest( + classes = { AuthorizationTestController.class, SecurityTestConfiguration.class }, + properties = { + "authorizations.security-constraints[0].authRoles[0]=DUMMY_ROLE", + "authorizations.security-constraints[0].securityCollections[0].patterns[0]=/role/*", + "authorizations.security-constraints[1].authPermissions[0]=DUMMY_PERMISSION", + "authorizations.security-constraints[1].securityCollections[0].patterns[0]=/permission/*", + "authorizations.security-constraints[2].securityCollections[0].patterns[0]=/public/*", + "authorizations.security-constraints[3].authPermissions[0]=DUMMY_PERMISSION", + "authorizations.security-constraints[3].securityCollections[0].patterns[0]=/dummy-endpoint/*", + "authorizations.security-constraints[3].securityCollections[0].omittedMethods[0]=POST", + } +) +@EnableWebMvc +@AutoConfigureMockMvc +public class AuthorizationConfigurerIT { + + public static final String DUMMY_BEARER = "Bearer dummy"; + public static final String AUTH_HEADER_NAME = "Authorization"; + + @Autowired + private WebApplicationContext webApplicationContext; + + @Autowired + private JwtAdapter jwtAdapterMock; + + @Autowired + private JwtDecoder jwtDecoderMock; + + private DefaultMockMvcBuilder mockMvcBuilder; + + @BeforeEach + void setUp() { + mockMvcBuilder = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()); + } + + @Test + void should_returnOk_whenEndpointIsPublic() throws Exception { + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isOk()).build(); + mockMvc.perform(get(AuthorizationTestController.PUBLIC_GET)); + mockMvc.perform(post(AuthorizationTestController.PUBLIC_POST)); + mockMvc.perform(put(AuthorizationTestController.PUBLIC_PUT)); + mockMvc.perform(delete(AuthorizationTestController.PUBLIC_DELETE)); + } + + @Test + void should_denyAccess_whenAuthHeaderIsNotPresent() throws Exception { + MockMvc mockMvc = mockMvcBuilder.build(); + mockMvc.perform(get(AuthorizationTestController.ROLE_GET)).andExpect(status().isUnauthorized()); + mockMvc.perform(get(AuthorizationTestController.PERMISSION_GET)).andExpect(status().isUnauthorized()); + mockMvc.perform(post(AuthorizationTestController.PERMISSION_POST)).andExpect(status().isForbidden()); + mockMvc.perform(post(AuthorizationTestController.ROLE_POST)).andExpect(status().isForbidden()); + mockMvc.perform(put(AuthorizationTestController.ROLE_PUT)).andExpect(status().isForbidden()); + mockMvc.perform(delete(AuthorizationTestController.ROLE_DELETE)).andExpect(status().isForbidden()); + mockMvc.perform(put(AuthorizationTestController.PERMISSION_PUT)).andExpect(status().isForbidden()); + mockMvc.perform(delete(AuthorizationTestController.PERMISSION_DELETE)).andExpect(status().isForbidden()); + } + + @Test + void should_return401_whenJwtIsInvalid() throws Exception { + when(jwtDecoderMock.decode(any())).thenThrow(new InvalidBearerTokenException("")); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isUnauthorized()).build(); + performRoleRestrictedRequests(mockMvc); + performPermissionRestrictedRequests(mockMvc); + } + + @Test + void should_return403_whenJwtContainsNoRoles() throws Exception { + when(jwtAdapterMock.getRoles()).thenReturn(Collections.emptyList()); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isForbidden()).build(); + performRoleRestrictedRequests(mockMvc); + } + + @Test + void should_return403_whenJwtContainsWrongRole() throws Exception { + when(jwtAdapterMock.getRoles()).thenReturn(List.of("WRONG_ROLE")); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isForbidden()).build(); + performRoleRestrictedRequests(mockMvc); + } + + @Test + void should_return200_whenJwtContainsCorrectRole() throws Exception { + when(jwtAdapterMock.getRoles()).thenReturn(List.of("DUMMY_ROLE")); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isOk()).build(); + performRoleRestrictedRequests(mockMvc); + } + + @Test + void should_return403_whenJwtContainsNoPermissions() throws Exception { + when(jwtAdapterMock.getPermissions()).thenReturn(Collections.emptyList()); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isForbidden()).build(); + performPermissionRestrictedRequests(mockMvc); + } + + @Test + void should_return403_whenJwtContainsWrongPermission() throws Exception { + when(jwtAdapterMock.getPermissions()).thenReturn(List.of("WRONG_PERMISSION")); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isForbidden()).build(); + performPermissionRestrictedRequests(mockMvc); + } + + @Test + void should_return200_whenJwtContainsCorrectPermission() throws Exception { + when(jwtAdapterMock.getPermissions()).thenReturn(List.of("DUMMY_PERMISSION")); + MockMvc mockMvc = mockMvcBuilder.alwaysExpect(status().isOk()).build(); + performPermissionRestrictedRequests(mockMvc); + } + + @Test + void should_return405_whenJwtContainsCorrectPermissionButMethodIsOmitted() throws Exception { + MockMvc mockMvc = mockMvcBuilder.build(); + when(jwtAdapterMock.getPermissions()).thenReturn(List.of("DUMMY_PERMISSION")); + mockMvc + .perform(get(AuthorizationTestController.DUMMY_ENDPOINT).header(AUTH_HEADER_NAME, DUMMY_BEARER)) + .andExpect(status().isOk()); + mockMvc + .perform(post(AuthorizationTestController.DUMMY_ENDPOINT).header(AUTH_HEADER_NAME, DUMMY_BEARER)) + .andExpect(status().isForbidden()); + } + + private void performRoleRestrictedRequests(MockMvc mockMvc) throws Exception { + mockMvc.perform(get(AuthorizationTestController.ROLE_GET).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + mockMvc.perform(post(AuthorizationTestController.ROLE_POST).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + mockMvc.perform(put(AuthorizationTestController.ROLE_PUT).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + mockMvc.perform(delete(AuthorizationTestController.ROLE_DELETE).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + } + + private void performPermissionRestrictedRequests(MockMvc mockMvc) throws Exception { + mockMvc.perform(get(AuthorizationTestController.PERMISSION_GET).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + mockMvc.perform(post(AuthorizationTestController.PERMISSION_POST).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + mockMvc.perform(put(AuthorizationTestController.PERMISSION_PUT).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + mockMvc.perform(delete(AuthorizationTestController.PERMISSION_DELETE).header(AUTH_HEADER_NAME, DUMMY_BEARER)); + } +} diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java index a3133becee..68ffd55daa 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java @@ -18,15 +18,12 @@ import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.when; -import static org.springframework.http.HttpMethod.GET; -import static org.springframework.http.HttpMethod.HEAD; -import static org.springframework.http.HttpMethod.OPTIONS; -import static org.springframework.http.HttpMethod.PATCH; -import static org.springframework.http.HttpMethod.TRACE; +import java.util.List; import org.activiti.cloud.security.authorization.AuthorizationProperties.SecurityCollection; import org.activiti.cloud.security.authorization.AuthorizationProperties.SecurityConstraint; import org.junit.jupiter.api.Test; @@ -40,7 +37,9 @@ import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; +import org.springframework.security.web.access.intercept.RequestAuthorizationContext; +@SuppressWarnings("unchecked") @ExtendWith(MockitoExtension.class) class AuthorizationConfigurerTest { @@ -59,61 +58,142 @@ class AuthorizationConfigurerTest { @Captor private ArgumentCaptor requestMatchers; + @Captor + private ArgumentCaptor> argumentCaptor; + @Test public void should_configureAuth_when_everythingIsAuthenticated() throws Exception { AuthorizationProperties authorizationProperties = new AuthorizationProperties(); - authorizationProperties.setSecurityConstraints( - asList( - createSecurityConstraint(new String[] { "ROLE_1", "ROLE_2" }, new String[] { "/a", "/b" }), - createSecurityConstraint(new String[] { "ROLE_3" }, new String[] { "/c" }) - ) + List securityConstraints = asList( + createSecurityConstraintWithRolesAndPatterns( + new String[] { "ROLE_1", "ROLE_2" }, + new String[] { "/a", "/b" } + ), + createSecurityConstraintWithRolesAndPatterns(new String[] { "ROLE_3" }, new String[] { "/c" }) ); + authorizationProperties.setSecurityConstraints(securityConstraints); AuthorizationConfigurer authorizationConfigurer = new AuthorizationConfigurer(authorizationProperties, null); when(http.authorizeHttpRequests(authorizeHttpRequestsCustomizer.capture())).thenReturn(http); - when(authorizeRequests.requestMatchers(requestMatchers.capture())).thenReturn(authorizedUrl); + doReturn(authorizedUrl).when(authorizeRequests).requestMatchers(any(HttpMethod.class), any(String[].class)); authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(2); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()) + .hasSize(HttpMethod.values().length * securityConstraints.size()); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); - inOrder.verify(authorizeRequests).requestMatchers(eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_3")); + for (HttpMethod method : HttpMethod.values()) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_3") + ); + } - inOrder.verify(authorizeRequests).requestMatchers(eq("/a"), eq("/b")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_1"), eq("ROLE_2")); + for (HttpMethod method : HttpMethod.values()) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/a", "/b" })); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()) + .containsExactlyInAnyOrder("ROLE_ROLE_1", "ROLE_ROLE_2") + ); + } + } + + @Test + public void should_configureAuth_usingPermissions_when_everythingIsAuthenticated() throws Exception { + AuthorizationProperties authorizationProperties = new AuthorizationProperties(); + List securityConstraints = asList( + createSecurityConstraintWithPermissionsAndPatterns( + new String[] { "PERMISSION_1", "PERMISSION_2" }, + new String[] { "/a", "/b" } + ), + createSecurityConstraintWithPermissionsAndPatterns(new String[] { "PERMISSION_3" }, new String[] { "/c" }) + ); + authorizationProperties.setSecurityConstraints(securityConstraints); + AuthorizationConfigurer authorizationConfigurer = new AuthorizationConfigurer(authorizationProperties, null); + + when(http.authorizeHttpRequests(authorizeHttpRequestsCustomizer.capture())).thenReturn(http); + when(authorizeRequests.requestMatchers(any(HttpMethod.class), any(String[].class))).thenReturn(authorizedUrl); + + authorizationConfigurer.configure(http); + + assertThat(authorizeHttpRequestsCustomizer.getAllValues()) + .hasSize(HttpMethod.values().length * securityConstraints.size()); + + authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); + + InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); + + for (HttpMethod method : HttpMethod.values()) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/c" })); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()) + .containsExactlyInAnyOrder("PERMISSION_PERMISSION_3") + ); + } + + for (HttpMethod method : HttpMethod.values()) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/a", "/b" })); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()) + .containsExactlyInAnyOrder("PERMISSION_PERMISSION_1", "PERMISSION_PERMISSION_2") + ); + } } @Test public void should_configureAuth_when_aURLiSPublic() throws Exception { AuthorizationProperties authorizationProperties = new AuthorizationProperties(); - authorizationProperties.setSecurityConstraints( - asList( - createSecurityConstraint(new String[] { "ROLE_3" }, new String[] { "/c" }), - createSecurityConstraint(new String[] {}, new String[] { "/d" }) - ) + List securityConstraints = asList( + createSecurityConstraintWithRolesAndPatterns(new String[] { "ROLE_3" }, new String[] { "/c" }), + createSecurityConstraintWithRolesAndPatterns(new String[] {}, new String[] { "/d" }) ); + authorizationProperties.setSecurityConstraints(securityConstraints); AuthorizationConfigurer authorizationConfigurer = new AuthorizationConfigurer(authorizationProperties, null); when(http.authorizeHttpRequests(authorizeHttpRequestsCustomizer.capture())).thenReturn(http); - when(authorizeRequests.requestMatchers(requestMatchers.capture())).thenReturn(authorizedUrl); + when(authorizeRequests.requestMatchers(any(HttpMethod.class), any(String[].class))).thenReturn(authorizedUrl); authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(2); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()) + .hasSize(HttpMethod.values().length * securityConstraints.size()); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); //URLs with permitAll must be defined first in order to avoid being overridden - inOrder.verify(authorizeRequests).requestMatchers(eq("/d")); - inOrder.verify(authorizedUrl).permitAll(); + for (HttpMethod method : HttpMethod.values()) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/d" })); + inOrder.verify(authorizedUrl).permitAll(); + } - inOrder.verify(authorizeRequests).requestMatchers(eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_3")); + for (HttpMethod method : HttpMethod.values()) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/c" })); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_3") + ); + } } @Test @@ -123,6 +203,7 @@ public void should_configureAuth_when_everythingIsAuthenticatedMethods() throws asList( createSecurityConstraint( new String[] { "ROLE_1" }, + new String[] {}, new String[] { "/c" }, new String[] { "POST", "DELETE", "PUT" } ) @@ -135,30 +216,48 @@ public void should_configureAuth_when_everythingIsAuthenticatedMethods() throws authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(5); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(HttpMethod.values().length); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); - inOrder.verify(authorizeRequests).requestMatchers(eq(GET), eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_1")); - inOrder.verify(authorizeRequests).requestMatchers(eq(HEAD), eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_1")); - inOrder.verify(authorizeRequests).requestMatchers(eq(PATCH), eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_1")); - inOrder.verify(authorizeRequests).requestMatchers(eq(OPTIONS), eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_1")); - inOrder.verify(authorizeRequests).requestMatchers(eq(TRACE), eq("/c")); - inOrder.verify(authorizedUrl).hasAnyRole(eq("ROLE_1")); + for (HttpMethod method : HttpMethod.values()) { + if (!asList("POST", "DELETE", "PUT").contains(method.name())) { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") + ); + } else { + inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq("/c")); + inOrder.verify(authorizedUrl).denyAll(); + } + } + } + + private SecurityConstraint createSecurityConstraintWithRolesAndPatterns(String[] roles, String[] patterns) { + return createSecurityConstraint(roles, new String[] {}, patterns, new String[] {}); } - private SecurityConstraint createSecurityConstraint(String[] roles, String[] patterns) { - return createSecurityConstraint(roles, patterns, new String[] {}); + private SecurityConstraint createSecurityConstraintWithPermissionsAndPatterns( + String[] permissions, + String[] patterns + ) { + return createSecurityConstraint(new String[] {}, permissions, patterns, new String[] {}); } - private SecurityConstraint createSecurityConstraint(String[] roles, String[] patterns, String[] omittedMethods) { + private SecurityConstraint createSecurityConstraint( + String[] roles, + String[] permissions, + String[] patterns, + String[] omittedMethods + ) { SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setAuthRoles(roles); + securityConstraint.setAuthPermissions(permissions); SecurityCollection securityCollection = new SecurityCollection(); securityCollection.setPatterns(patterns); securityCollection.setOmittedMethods(omittedMethods); diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationPropertiesTest.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationPropertiesTest.java index d130c35ea1..8aa2f485ad 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationPropertiesTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationPropertiesTest.java @@ -34,6 +34,9 @@ "authorizations.security-constraints[0].securityCollections[1].patterns[0]=/v1/def/*", "authorizations.security-constraints[1].authRoles[0]=ACTIVITI_DEVOPS", "authorizations.security-constraints[1].securityCollections[0].patterns[0]=/v1/ghi/*", + "authorizations.security-constraints[2].authPermissions[0]=permissionA", + "authorizations.security-constraints[2].auth-permissions[1]=permissionB", + "authorizations.security-constraints[2].securityCollections[0].patterns[0]=/v1/jkl/*", }, classes = { AuthorizationProperties.class } ) @@ -45,7 +48,7 @@ class AuthorizationPropertiesTest { @Test public void configurationLoadTest() { - assertEquals(2, authorizationProperties.getSecurityConstraints().size()); + assertEquals(3, authorizationProperties.getSecurityConstraints().size()); assertEquals(2, authorizationProperties.getSecurityConstraints().get(0).getAuthRoles().length); assertEquals("ACTIVITI_USER", authorizationProperties.getSecurityConstraints().get(0).getAuthRoles()[0]); assertEquals("ACTIVITI_ADMIN", authorizationProperties.getSecurityConstraints().get(0).getAuthRoles()[1]); @@ -80,5 +83,16 @@ public void configurationLoadTest() { "/v1/ghi/*", authorizationProperties.getSecurityConstraints().get(1).getSecurityCollections()[0].getPatterns()[0] ); + assertEquals("permissionA", authorizationProperties.getSecurityConstraints().get(2).getAuthPermissions()[0]); + assertEquals("permissionB", authorizationProperties.getSecurityConstraints().get(2).getAuthPermissions()[1]); + assertEquals(1, authorizationProperties.getSecurityConstraints().get(2).getSecurityCollections().length); + assertEquals( + 1, + authorizationProperties.getSecurityConstraints().get(2).getSecurityCollections()[0].getPatterns().length + ); + assertEquals( + "/v1/jkl/*", + authorizationProperties.getSecurityConstraints().get(2).getSecurityCollections()[0].getPatterns()[0] + ); } } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java new file mode 100644 index 0000000000..2f96949a44 --- /dev/null +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java @@ -0,0 +1,111 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.cloud.security.authorization; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class AuthorizationTestController { + + public static final String PUBLIC_GET = "/public/get"; + public static final String PUBLIC_POST = "/public/post"; + public static final String PUBLIC_PUT = "/public/put"; + public static final String PUBLIC_DELETE = "/public/delete"; + public static final String ROLE_GET = "/role/get"; + public static final String ROLE_POST = "/role/post"; + public static final String ROLE_PUT = "/role/put"; + public static final String ROLE_DELETE = "/role/delete"; + public static final String PERMISSION_GET = "/permission/get"; + public static final String PERMISSION_POST = "/permission/post"; + public static final String PERMISSION_PUT = "/permission/put"; + public static final String PERMISSION_DELETE = "/permission/delete"; + public static final String DUMMY_ENDPOINT = "/dummy-endpoint"; + + @GetMapping(PUBLIC_GET) + public ResponseEntity publicGet() { + return ResponseEntity.ok().build(); + } + + @PostMapping(PUBLIC_POST) + public ResponseEntity publicPost() { + return ResponseEntity.ok().build(); + } + + @PutMapping(PUBLIC_PUT) + public ResponseEntity publicPut() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping(PUBLIC_DELETE) + public ResponseEntity publicDelete() { + return ResponseEntity.ok().build(); + } + + @GetMapping(ROLE_GET) + public ResponseEntity roleGet() { + return ResponseEntity.ok().build(); + } + + @PostMapping(ROLE_POST) + public ResponseEntity rolePost() { + return ResponseEntity.ok().build(); + } + + @PutMapping(ROLE_PUT) + public ResponseEntity rolePut() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping(ROLE_DELETE) + public ResponseEntity roleDelete() { + return ResponseEntity.ok().build(); + } + + @GetMapping(PERMISSION_GET) + public ResponseEntity permissionGet() { + return ResponseEntity.ok().build(); + } + + @PostMapping(PERMISSION_POST) + public ResponseEntity permissionPost() { + return ResponseEntity.ok().build(); + } + + @PutMapping(PERMISSION_PUT) + public ResponseEntity permissionPut() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping(PERMISSION_DELETE) + public ResponseEntity permissionDelete() { + return ResponseEntity.ok().build(); + } + + @GetMapping(DUMMY_ENDPOINT) + public ResponseEntity dummyEndpointGet() { + return ResponseEntity.ok().build(); + } + + @PostMapping(DUMMY_ENDPOINT) + public ResponseEntity dummyEndpointPost() { + return ResponseEntity.ok().build(); + } +} diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/SecurityTestConfiguration.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/SecurityTestConfiguration.java new file mode 100644 index 0000000000..91b5b904a1 --- /dev/null +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/SecurityTestConfiguration.java @@ -0,0 +1,95 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.cloud.security.authorization; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import org.activiti.cloud.services.common.security.config.CommonJwtAuthenticationConverterConfiguration; +import org.activiti.cloud.services.common.security.config.CommonSecurityAutoConfiguration; +import org.activiti.cloud.services.common.security.jwt.JwtAccessTokenProvider; +import org.activiti.cloud.services.common.security.jwt.JwtAdapter; +import org.activiti.cloud.services.common.security.jwt.JwtGrantedAuthorityConverter; +import org.activiti.cloud.services.common.security.jwt.JwtUserInfoUriAuthenticationConverter; +import org.activiti.cloud.services.common.security.jwt.OAuth2UserServiceCacheable; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtDecoder; + +@EnableWebSecurity +@SpringBootConfiguration +@Import({ CommonSecurityAutoConfiguration.class, CommonJwtAuthenticationConverterConfiguration.class }) +@EnableConfigurationProperties(value = AuthorizationProperties.class) +public class SecurityTestConfiguration { + + @Bean + public ClientRegistrationRepository clientRegistrationRepository() { + return mock(ClientRegistrationRepository.class); + } + + @Bean + public JwtAdapter jwtAdapter() { + return mock(JwtAdapter.class); + } + + @Bean + public JwtAccessTokenProvider jwtAccessTokenProvider(JwtAdapter jwtAdapter) { + return new JwtAccessTokenProvider(jwt -> jwtAdapter); + } + + @Bean + public Jwt jwt() { + return mock(Jwt.class); + } + + @Bean + public JwtDecoder jwtDecoder(Jwt jwt) { + JwtDecoder jwtDecoder = mock(JwtDecoder.class); + when(jwtDecoder.decode(any())).thenReturn(jwt); + return jwtDecoder; + } + + @Bean + public JwtGrantedAuthorityConverter jwtGrantedAuthorityConverter(JwtAccessTokenProvider jwtAccessTokenProvider) { + return new JwtGrantedAuthorityConverter(jwtAccessTokenProvider); + } + + @Bean + public Converter jwtAuthenticationConverter( + JwtGrantedAuthorityConverter jwtGrantedAuthorityConverter, + ClientRegistrationRepository clientRegistrationRepository, + OAuth2UserServiceCacheable oAuth2UserServiceCacheable + ) { + JwtUserInfoUriAuthenticationConverter converter = new JwtUserInfoUriAuthenticationConverter( + jwtGrantedAuthorityConverter, + clientRegistrationRepository.findByRegistrationId("keycloak"), + oAuth2UserServiceCacheable + ); + JwtUserInfoUriAuthenticationConverter spy = spy(converter); + doReturn("test").when(spy).getPrincipalClaimName(any(Jwt.class)); + return spy; + } +} From 9e5732912a9ce4a1a99a6756f4444317d0e8972d Mon Sep 17 00:00:00 2001 From: Tommaso D'Alessandro Date: Tue, 30 Apr 2024 12:19:09 +0200 Subject: [PATCH 03/24] AAE-22123 Fix NPE when getting permissions (#1431) * AAE-22123 added key check in KeycloakResourceJwtAdapter * AAE-22123 change test --- .../security/keycloak/KeycloakResourceJwtAdapter.java | 6 ++++-- .../security/keycloak/KeycloakResourceJwtAdapterTest.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java index 81cc8362b4..753602f9cc 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/main/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapter.java @@ -63,9 +63,11 @@ public String getUserName() { private List getFromClient(String clientId, String key, Jwt jwt) { if (jwt.hasClaim("resource_access")) { Map resourceAccess = jwt.getClaim("resource_access"); - if (resourceAccess.get(clientId) != null) { + if (resourceAccess.containsKey(clientId)) { Map resource = (Map) resourceAccess.get(clientId); - return (List) resource.get(key); + if (resource.containsKey(key)) { + return (List) resource.get(key); + } } } return Collections.emptyList(); diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java index 6cf11a98aa..10e7645731 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/src/test/java/org/activiti/cloud/services/common/security/keycloak/KeycloakResourceJwtAdapterTest.java @@ -74,13 +74,13 @@ public void shouldReturnRoles() { } @Test - public void shouldNotThrowAnyExceptionWhenPermissionsIsNull() { + public void shouldReturnEmptyListWhenPermissionsIsNull() { Map permissionsParent = JSONObjectUtils.newJSONObject(); permissionsParent.put("permissions", null); when(jwt.hasClaim("resource_access")).thenReturn(true); when(jwt.getClaim("resource_access")).thenReturn(permissionsParent); - assertDoesNotThrow(() -> keycloakResourceJwtAdapter.getPermissions()); + assertThat(keycloakResourceJwtAdapter.getPermissions()).isEmpty(); } @Test From 16ecbeb9332c00cc01c032a250af7a37f2058f09 Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Thu, 2 May 2024 12:22:03 +0200 Subject: [PATCH 04/24] chore(deps): upgrade Activiti/Activiti to version 8.5.0-alpha.2 (#1432) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index 718eff6ba4..236867c7ec 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.5.0-alpha.1 + 8.5.0-alpha.2 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index ba700f2395..8c6641556a 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.5.0-alpha.1 + 8.5.0-alpha.2 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index dd58770bbb..3aeb63f1e5 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.5.0-alpha.1 + 8.5.0-alpha.2 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index 73410eb605..8e3abe68d1 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.5.0-alpha.1 + 8.5.0-alpha.2 1.9.4 1.10 2.6 From 26445f783ca8244a9c4a6582aa14079584e44633 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 10:25:38 +0000 Subject: [PATCH 05/24] build(deps): bump github/codeql-action from 3.23.1 to 3.25.3 (#1429) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.23.1 to 3.25.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0b21cf2492b6b02c465a3e5d7c473717ad7721ba...d39d31e687223d841ef683f52467bd88e9b21c14) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 455e44ac52..0b20367bb4 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -62,7 +62,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@0b21cf2492b6b02c465a3e5d7c473717ad7721ba # v3.23.1 + uses: github/codeql-action/init@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -98,6 +98,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@0b21cf2492b6b02c465a3e5d7c473717ad7721ba # v3.23.1 + uses: github/codeql-action/analyze@d39d31e687223d841ef683f52467bd88e9b21c14 # v3.25.3 with: category: "/language:${{matrix.language}}" From 973879f4f456f06005c5ef1d7c9f841660578825 Mon Sep 17 00:00:00 2001 From: Tommaso D'Alessandro Date: Thu, 2 May 2024 16:59:36 +0200 Subject: [PATCH 06/24] AAE-22123 Fix omitted methods (#1433) * AAE-22123 fix omitted methods management * AAE-22123 fix omitted methods management and tests --- .../AuthorizationConfigurer.java | 20 +- .../AuthorizationConfigurerIT.java | 61 ++++- .../AuthorizationConfigurerTest.java | 228 ++++++++++-------- .../AuthorizationTestController.java | 44 +++- 4 files changed, 231 insertions(+), 122 deletions(-) diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java index d0ccc2ea68..204ae6d019 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/main/java/org/activiti/cloud/security/authorization/AuthorizationConfigurer.java @@ -15,6 +15,7 @@ */ package org.activiti.cloud.security.authorization; +import static java.util.function.Predicate.not; import static org.springframework.security.config.Customizer.withDefaults; import jakarta.annotation.PostConstruct; @@ -135,21 +136,22 @@ private void buildAntMatchers( ) throws Exception { for (SecurityCollection securityCollection : securityCollections) { String[] patterns = getPatterns(securityCollection.getPatterns()); - List omittedMethods = Arrays - .stream(securityCollection.getOmittedMethods()) - .map(HttpMethod::valueOf) - .toList(); - - for (HttpMethod method : HttpMethod.values()) { - if (omittedMethods.contains(method)) { - http.authorizeHttpRequests(spec -> spec.requestMatchers(method, patterns).denyAll()); - } else { + if (isNotEmpty(securityCollection.getOmittedMethods())) { + List methods = getAllowedMethods(securityCollection.getOmittedMethods()); + for (HttpMethod method : methods) { http.authorizeHttpRequests(spec -> urlConsumer.accept(spec.requestMatchers(method, patterns))); } + } else { + http.authorizeHttpRequests(spec -> urlConsumer.accept(spec.requestMatchers(patterns))); } } } + private List getAllowedMethods(String[] omittedMethods) { + List httpMethods = Stream.of(omittedMethods).map(HttpMethod::valueOf).toList(); + return Stream.of(HttpMethod.values()).filter(not(httpMethods::contains)).collect(Collectors.toList()); + } + /** * If a security constraint hasn't any roles it means that it can be accessed from anyone. It must be the first one * in order to avoid being overridden by other rules. The order is reversed to mimic the security-constraint behaviour. diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java index 73e87947f7..e20e0116ce 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerIT.java @@ -48,9 +48,14 @@ "authorizations.security-constraints[1].authPermissions[0]=DUMMY_PERMISSION", "authorizations.security-constraints[1].securityCollections[0].patterns[0]=/permission/*", "authorizations.security-constraints[2].securityCollections[0].patterns[0]=/public/*", - "authorizations.security-constraints[3].authPermissions[0]=DUMMY_PERMISSION", - "authorizations.security-constraints[3].securityCollections[0].patterns[0]=/dummy-endpoint/*", - "authorizations.security-constraints[3].securityCollections[0].omittedMethods[0]=POST", + "authorizations.security-constraints[3].authRoles[0]=DUMMY_ROLE", + "authorizations.security-constraints[3].authRoles[1]=OTHER_DUMMY_ROLE", + "authorizations.security-constraints[3].securityCollections[0].patterns[0]=/role/dummy-endpoint/*", + "authorizations.security-constraints[3].securityCollections[0].omittedMethods[0]=DELETE", + "authorizations.security-constraints[4].authPermissions[0]=DUMMY_PERMISSION", + "authorizations.security-constraints[4].authPermissions[1]=OTHER_DUMMY_PERMISSION", + "authorizations.security-constraints[4].securityCollections[0].patterns[0]=/permission/dummy-endpoint/*", + "authorizations.security-constraints[4].securityCollections[0].omittedMethods[0]=DELETE", } ) @EnableWebMvc @@ -149,14 +154,58 @@ void should_return200_whenJwtContainsCorrectPermission() throws Exception { } @Test - void should_return405_whenJwtContainsCorrectPermissionButMethodIsOmitted() throws Exception { + void should_Allow_RestrictedEndpoint_WhenMethodIsGet() throws Exception { + MockMvc mockMvc = mockMvcBuilder.build(); + when(jwtAdapterMock.getPermissions()).thenReturn(List.of("OTHER_DUMMY_PERMISSION")); + when(jwtAdapterMock.getRoles()).thenReturn(List.of("OTHER_DUMMY_ROLE")); + mockMvc + .perform( + get(AuthorizationTestController.PERMISSION_DUMMY_ENDPOINT_RESTRICTED) + .header(AUTH_HEADER_NAME, DUMMY_BEARER) + ) + .andExpect(status().isOk()); + mockMvc + .perform( + get(AuthorizationTestController.ROLE_DUMMY_ENDPOINT_RESTRICTED).header(AUTH_HEADER_NAME, DUMMY_BEARER) + ) + .andExpect(status().isOk()); + } + + @Test + void should_AllowDeleteMethod_OnlyWhenPermissionIsDefinedByHigherPriorityRule() throws Exception { MockMvc mockMvc = mockMvcBuilder.build(); when(jwtAdapterMock.getPermissions()).thenReturn(List.of("DUMMY_PERMISSION")); mockMvc - .perform(get(AuthorizationTestController.DUMMY_ENDPOINT).header(AUTH_HEADER_NAME, DUMMY_BEARER)) + .perform( + delete(AuthorizationTestController.PERMISSION_DUMMY_ENDPOINT_RESTRICTED) + .header(AUTH_HEADER_NAME, DUMMY_BEARER) + ) + .andExpect(status().isOk()); + when(jwtAdapterMock.getPermissions()).thenReturn(List.of("OTHER_DUMMY_PERMISSION")); + mockMvc + .perform( + delete(AuthorizationTestController.PERMISSION_DUMMY_ENDPOINT_RESTRICTED) + .header(AUTH_HEADER_NAME, DUMMY_BEARER) + ) + .andExpect(status().isForbidden()); + } + + @Test + void should_AllowDeleteMethod_OnlyWhenRoleIsDefinedByHigherPriorityRule() throws Exception { + MockMvc mockMvc = mockMvcBuilder.build(); + when(jwtAdapterMock.getRoles()).thenReturn(List.of("DUMMY_ROLE")); + mockMvc + .perform( + delete(AuthorizationTestController.ROLE_DUMMY_ENDPOINT_RESTRICTED) + .header(AUTH_HEADER_NAME, DUMMY_BEARER) + ) .andExpect(status().isOk()); + when(jwtAdapterMock.getRoles()).thenReturn(List.of("OTHER_DUMMY_ROLE")); mockMvc - .perform(post(AuthorizationTestController.DUMMY_ENDPOINT).header(AUTH_HEADER_NAME, DUMMY_BEARER)) + .perform( + delete(AuthorizationTestController.ROLE_DUMMY_ENDPOINT_RESTRICTED) + .header(AUTH_HEADER_NAME, DUMMY_BEARER) + ) .andExpect(status().isForbidden()); } diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java index 68ffd55daa..91f1aa3684 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationConfigurerTest.java @@ -22,8 +22,12 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.when; +import static org.springframework.http.HttpMethod.GET; +import static org.springframework.http.HttpMethod.HEAD; +import static org.springframework.http.HttpMethod.OPTIONS; +import static org.springframework.http.HttpMethod.PATCH; +import static org.springframework.http.HttpMethod.TRACE; -import java.util.List; import org.activiti.cloud.security.authorization.AuthorizationProperties.SecurityCollection; import org.activiti.cloud.security.authorization.AuthorizationProperties.SecurityConstraint; import org.junit.jupiter.api.Test; @@ -64,136 +68,132 @@ class AuthorizationConfigurerTest { @Test public void should_configureAuth_when_everythingIsAuthenticated() throws Exception { AuthorizationProperties authorizationProperties = new AuthorizationProperties(); - List securityConstraints = asList( - createSecurityConstraintWithRolesAndPatterns( - new String[] { "ROLE_1", "ROLE_2" }, - new String[] { "/a", "/b" } - ), - createSecurityConstraintWithRolesAndPatterns(new String[] { "ROLE_3" }, new String[] { "/c" }) + authorizationProperties.setSecurityConstraints( + asList( + createSecurityConstraintWithRolesAndPatterns( + new String[] { "ROLE_1", "ROLE_2" }, + new String[] { "/a", "/b" } + ), + createSecurityConstraintWithRolesAndPatterns(new String[] { "ROLE_3" }, new String[] { "/c" }) + ) ); - authorizationProperties.setSecurityConstraints(securityConstraints); AuthorizationConfigurer authorizationConfigurer = new AuthorizationConfigurer(authorizationProperties, null); when(http.authorizeHttpRequests(authorizeHttpRequestsCustomizer.capture())).thenReturn(http); - doReturn(authorizedUrl).when(authorizeRequests).requestMatchers(any(HttpMethod.class), any(String[].class)); + doReturn(authorizedUrl).when(authorizeRequests).requestMatchers(any(String[].class)); authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()) - .hasSize(HttpMethod.values().length * securityConstraints.size()); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(2); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); - for (HttpMethod method : HttpMethod.values()) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq("/c")); - inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()) - .isInstanceOfSatisfying( - CustomAuthorizationManager.class, - manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_3") - ); - } - - for (HttpMethod method : HttpMethod.values()) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/a", "/b" })); - inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()) - .isInstanceOfSatisfying( - CustomAuthorizationManager.class, - manager -> - assertThat(manager.getAuthoritiesWithAccess()) - .containsExactlyInAnyOrder("ROLE_ROLE_1", "ROLE_ROLE_2") - ); - } + inOrder.verify(authorizeRequests).requestMatchers(requestMatchers.capture()); + assertThat(requestMatchers.getValue()).containsExactlyInAnyOrder("/c"); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_3") + ); + + inOrder.verify(authorizeRequests).requestMatchers(requestMatchers.capture()); + assertThat(requestMatchers.getValue()).containsExactlyInAnyOrder("/a", "/b"); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()) + .containsExactlyInAnyOrder("ROLE_ROLE_1", "ROLE_ROLE_2") + ); } @Test public void should_configureAuth_usingPermissions_when_everythingIsAuthenticated() throws Exception { AuthorizationProperties authorizationProperties = new AuthorizationProperties(); - List securityConstraints = asList( - createSecurityConstraintWithPermissionsAndPatterns( - new String[] { "PERMISSION_1", "PERMISSION_2" }, - new String[] { "/a", "/b" } - ), - createSecurityConstraintWithPermissionsAndPatterns(new String[] { "PERMISSION_3" }, new String[] { "/c" }) + authorizationProperties.setSecurityConstraints( + asList( + createSecurityConstraintWithPermissionsAndPatterns( + new String[] { "PERMISSION_1", "PERMISSION_2" }, + new String[] { "/a", "/b" } + ), + createSecurityConstraintWithPermissionsAndPatterns( + new String[] { "PERMISSION_3" }, + new String[] { "/c" } + ) + ) ); - authorizationProperties.setSecurityConstraints(securityConstraints); AuthorizationConfigurer authorizationConfigurer = new AuthorizationConfigurer(authorizationProperties, null); when(http.authorizeHttpRequests(authorizeHttpRequestsCustomizer.capture())).thenReturn(http); - when(authorizeRequests.requestMatchers(any(HttpMethod.class), any(String[].class))).thenReturn(authorizedUrl); + when(authorizeRequests.requestMatchers(any(String[].class))).thenReturn(authorizedUrl); authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()) - .hasSize(HttpMethod.values().length * securityConstraints.size()); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(2); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); - for (HttpMethod method : HttpMethod.values()) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/c" })); - inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()) - .isInstanceOfSatisfying( - CustomAuthorizationManager.class, - manager -> - assertThat(manager.getAuthoritiesWithAccess()) - .containsExactlyInAnyOrder("PERMISSION_PERMISSION_3") - ); - } - - for (HttpMethod method : HttpMethod.values()) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/a", "/b" })); - inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()) - .isInstanceOfSatisfying( - CustomAuthorizationManager.class, - manager -> - assertThat(manager.getAuthoritiesWithAccess()) - .containsExactlyInAnyOrder("PERMISSION_PERMISSION_1", "PERMISSION_PERMISSION_2") - ); - } + inOrder.verify(authorizeRequests).requestMatchers(requestMatchers.capture()); + assertThat(requestMatchers.getValue()).containsExactlyInAnyOrder("/c"); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("PERMISSION_PERMISSION_3") + ); + + inOrder.verify(authorizeRequests).requestMatchers(requestMatchers.capture()); + assertThat(requestMatchers.getValue()).containsExactlyInAnyOrder("/a", "/b"); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> + assertThat(manager.getAuthoritiesWithAccess()) + .containsExactlyInAnyOrder("PERMISSION_PERMISSION_1", "PERMISSION_PERMISSION_2") + ); } @Test public void should_configureAuth_when_aURLiSPublic() throws Exception { AuthorizationProperties authorizationProperties = new AuthorizationProperties(); - List securityConstraints = asList( - createSecurityConstraintWithRolesAndPatterns(new String[] { "ROLE_3" }, new String[] { "/c" }), - createSecurityConstraintWithRolesAndPatterns(new String[] {}, new String[] { "/d" }) + authorizationProperties.setSecurityConstraints( + asList( + createSecurityConstraintWithRolesAndPatterns(new String[] { "ROLE_3" }, new String[] { "/c" }), + createSecurityConstraintWithRolesAndPatterns(new String[] {}, new String[] { "/d" }) + ) ); - authorizationProperties.setSecurityConstraints(securityConstraints); AuthorizationConfigurer authorizationConfigurer = new AuthorizationConfigurer(authorizationProperties, null); when(http.authorizeHttpRequests(authorizeHttpRequestsCustomizer.capture())).thenReturn(http); - when(authorizeRequests.requestMatchers(any(HttpMethod.class), any(String[].class))).thenReturn(authorizedUrl); + when(authorizeRequests.requestMatchers(any(String[].class))).thenReturn(authorizedUrl); authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()) - .hasSize(HttpMethod.values().length * securityConstraints.size()); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(2); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); //URLs with permitAll must be defined first in order to avoid being overridden - for (HttpMethod method : HttpMethod.values()) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/d" })); - inOrder.verify(authorizedUrl).permitAll(); - } - - for (HttpMethod method : HttpMethod.values()) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq(new String[] { "/c" })); - inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()) - .isInstanceOfSatisfying( - CustomAuthorizationManager.class, - manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_3") - ); - } + inOrder.verify(authorizeRequests).requestMatchers(requestMatchers.capture()); + assertThat(requestMatchers.getValue()).containsExactlyInAnyOrder("/d"); + inOrder.verify(authorizedUrl).permitAll(); + + inOrder.verify(authorizeRequests).requestMatchers(requestMatchers.capture()); + assertThat(requestMatchers.getValue()).containsExactlyInAnyOrder("/c"); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_3") + ); } @Test @@ -216,26 +216,50 @@ public void should_configureAuth_when_everythingIsAuthenticatedMethods() throws authorizationConfigurer.configure(http); - assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(HttpMethod.values().length); + assertThat(authorizeHttpRequestsCustomizer.getAllValues()).hasSize(5); authorizeHttpRequestsCustomizer.getAllValues().forEach($ -> $.customize(authorizeRequests)); InOrder inOrder = inOrder(authorizeRequests, authorizedUrl); - for (HttpMethod method : HttpMethod.values()) { - if (!asList("POST", "DELETE", "PUT").contains(method.name())) { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq("/c")); - inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); - assertThat(argumentCaptor.getValue()) - .isInstanceOfSatisfying( - CustomAuthorizationManager.class, - manager -> - assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") - ); - } else { - inOrder.verify(authorizeRequests).requestMatchers(eq(method), eq("/c")); - inOrder.verify(authorizedUrl).denyAll(); - } - } + inOrder.verify(authorizeRequests).requestMatchers(eq(GET), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") + ); + + inOrder.verify(authorizeRequests).requestMatchers(eq(HEAD), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") + ); + + inOrder.verify(authorizeRequests).requestMatchers(eq(PATCH), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") + ); + + inOrder.verify(authorizeRequests).requestMatchers(eq(OPTIONS), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") + ); + + inOrder.verify(authorizeRequests).requestMatchers(eq(TRACE), eq("/c")); + inOrder.verify(authorizedUrl).access(argumentCaptor.capture()); + assertThat(argumentCaptor.getValue()) + .isInstanceOfSatisfying( + CustomAuthorizationManager.class, + manager -> assertThat(manager.getAuthoritiesWithAccess()).containsExactlyInAnyOrder("ROLE_ROLE_1") + ); } private SecurityConstraint createSecurityConstraintWithRolesAndPatterns(String[] roles, String[] patterns) { diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java index 2f96949a44..0cfffbfc48 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/src/test/java/org/activiti/cloud/security/authorization/AuthorizationTestController.java @@ -18,6 +18,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RestController; @@ -37,7 +38,10 @@ public class AuthorizationTestController { public static final String PERMISSION_POST = "/permission/post"; public static final String PERMISSION_PUT = "/permission/put"; public static final String PERMISSION_DELETE = "/permission/delete"; - public static final String DUMMY_ENDPOINT = "/dummy-endpoint"; + public static final String ROLE_DUMMY_ENDPOINT = "/role/dummy-endpoint"; + public static final String PERMISSION_DUMMY_ENDPOINT = "/permission/dummy-endpoint"; + public static final String ROLE_DUMMY_ENDPOINT_RESTRICTED = ROLE_DUMMY_ENDPOINT + "/restricted"; + public static final String PERMISSION_DUMMY_ENDPOINT_RESTRICTED = PERMISSION_DUMMY_ENDPOINT + "/restricted"; @GetMapping(PUBLIC_GET) public ResponseEntity publicGet() { @@ -99,13 +103,43 @@ public ResponseEntity permissionDelete() { return ResponseEntity.ok().build(); } - @GetMapping(DUMMY_ENDPOINT) - public ResponseEntity dummyEndpointGet() { + @GetMapping(ROLE_DUMMY_ENDPOINT) + public ResponseEntity roleDummyEndpointGet() { return ResponseEntity.ok().build(); } - @PostMapping(DUMMY_ENDPOINT) - public ResponseEntity dummyEndpointPost() { + @DeleteMapping(ROLE_DUMMY_ENDPOINT) + public ResponseEntity roleDummyEndpointDelete() { + return ResponseEntity.ok().build(); + } + + @GetMapping(PERMISSION_DUMMY_ENDPOINT) + public ResponseEntity permissionDummyEndpointGet() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping(PERMISSION_DUMMY_ENDPOINT) + public ResponseEntity permissionDummyEndpointDelete() { + return ResponseEntity.ok().build(); + } + + @GetMapping(ROLE_DUMMY_ENDPOINT_RESTRICTED) + public ResponseEntity roleDummyEndpointRestrictedGet() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping(ROLE_DUMMY_ENDPOINT_RESTRICTED) + public ResponseEntity roleDummyEndpointRestrictedDelete() { + return ResponseEntity.ok().build(); + } + + @GetMapping(PERMISSION_DUMMY_ENDPOINT_RESTRICTED) + public ResponseEntity permissionDummyEndpointRestrictedGet() { + return ResponseEntity.ok().build(); + } + + @DeleteMapping(PERMISSION_DUMMY_ENDPOINT_RESTRICTED) + public ResponseEntity permissionDummyEndpointRestrictedDelete() { return ResponseEntity.ok().build(); } } From 000623610a82c8a87e9488754ca062bed71233c5 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Thu, 9 May 2024 22:57:03 -0700 Subject: [PATCH 07/24] AAE-22485 Update graphql-jpa-query.version to 1.2.5 (#1438) --- activiti-cloud-notifications-graphql-service/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activiti-cloud-notifications-graphql-service/pom.xml b/activiti-cloud-notifications-graphql-service/pom.xml index 43dc006673..cd0794ccb0 100644 --- a/activiti-cloud-notifications-graphql-service/pom.xml +++ b/activiti-cloud-notifications-graphql-service/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud Notifications GraphQL Service :: Parent pom - 1.2.4 + 1.2.5 From 19eefc3ae234aaefc1be1648648ff4c33bb8ec55 Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Fri, 10 May 2024 10:40:42 +0200 Subject: [PATCH 08/24] chore(deps): upgrade Activiti/Activiti to version 8.5.0-alpha.3 (#1439) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index 236867c7ec..5d6e4eebdf 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.5.0-alpha.2 + 8.5.0-alpha.3 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index 8c6641556a..c42dc25a96 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.5.0-alpha.2 + 8.5.0-alpha.3 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index 3aeb63f1e5..cf966bc47c 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.5.0-alpha.2 + 8.5.0-alpha.3 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index 8e3abe68d1..1a0ed9189b 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.5.0-alpha.2 + 8.5.0-alpha.3 1.9.4 1.10 2.6 From 1527e48e24f86d0b07a60bfedffb878c20c9a6ff Mon Sep 17 00:00:00 2001 From: Federico D'Ulizia Date: Mon, 13 May 2024 17:30:18 +0200 Subject: [PATCH 09/24] AAE-22469 Add new index in the Audit-event table (#1437) --- .../liquibase/changelog/12-alter.pg.schema.7.17.0.sql | 3 +++ .../src/main/resources/config/audit/liquibase/master.xml | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/changelog/12-alter.pg.schema.7.17.0.sql diff --git a/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/changelog/12-alter.pg.schema.7.17.0.sql b/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/changelog/12-alter.pg.schema.7.17.0.sql new file mode 100644 index 0000000000..7665fc4514 --- /dev/null +++ b/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/changelog/12-alter.pg.schema.7.17.0.sql @@ -0,0 +1,3 @@ +CREATE INDEX CONCURRENTLY IF NOT EXISTS audit_event_process_instance_id_idx ON audit_event (process_instance_id); +CREATE INDEX CONCURRENTLY IF NOT EXISTS audit_event_app_name_idx ON audit_event (app_name); +CREATE INDEX CONCURRENTLY IF NOT EXISTS audit_event_event_type_idx ON audit_event (event_type); diff --git a/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/master.xml b/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/master.xml index ce0c33bc4e..401aa326a4 100644 --- a/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/master.xml +++ b/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/src/main/resources/config/audit/liquibase/master.xml @@ -214,4 +214,12 @@ splitStatements="true" stripComments="true"/> + + + From 9a2274c25e5b5ae0b07892df4bd2830c3142f3d6 Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Thu, 16 May 2024 09:12:44 +0200 Subject: [PATCH 10/24] chore(deps): upgrade Activiti/Activiti to version 8.5.0-alpha.4 (#1442) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index 5d6e4eebdf..417197f888 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.5.0-alpha.3 + 8.5.0-alpha.4 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index c42dc25a96..565c40a454 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.5.0-alpha.3 + 8.5.0-alpha.4 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index cf966bc47c..1c217a97e6 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.5.0-alpha.3 + 8.5.0-alpha.4 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index 1a0ed9189b..4b1a3cf13a 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.5.0-alpha.3 + 8.5.0-alpha.4 1.9.4 1.10 2.6 From 70b36ecad07fb73c312f2e5dbfee123338511c59 Mon Sep 17 00:00:00 2001 From: Tommaso D'Alessandro Date: Thu, 16 May 2024 09:34:49 +0200 Subject: [PATCH 11/24] AAE-22075 Fix "detaching an uninitialized collection" logs and improve task search query performance (#1441) * AAE-22075 Wip initial commit * WIP * AAE-22075 Wip fixed failing test * AAE-22075 reproduce error. ("spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true", if set to false, exception is raised) * AAE-22075 reproduce exact situation of issue * AAE-22075 tentative with DSL filters * Revert "AAE-22075 tentative with DSL filters" This reverts commit 6a148ac4187d6741f50bab7dee0582655beb3fb8. * AAE-22075 test with entity graph * AAE-18428 Fix Swagger API suggest to use the HAL-JSON format (#1306) * AAE-21097 Implement permission-based authorization (#1427) * AAE-21097 add permission getter on Jwt adapter, implement conversion to granted authority and include permissions in auth flow * AAE-21097 add AuthorizationConfigurerIT, fix omitted methods logic * AAE-21097 fix tests * AAE-21097 add license header * AAE-21097 remove unused import * AAE-21097 CustomAuthorizationManager implemented with different authority types for role and permission * AAE-21097 move CustomAuthorizationManager * AAE-21097 license header * AAE-22123 Fix NPE when getting permissions (#1431) * AAE-22123 added key check in KeycloakResourceJwtAdapter * AAE-22123 change test * chore(deps): upgrade Activiti/Activiti to version 8.5.0-alpha.2 (#1432) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> * build(deps): bump github/codeql-action from 3.23.1 to 3.25.3 (#1429) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3.23.1 to 3.25.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0b21cf2492b6b02c465a3e5d7c473717ad7721ba...d39d31e687223d841ef683f52467bd88e9b21c14) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * AAE-22123 Fix omitted methods (#1433) * AAE-22123 fix omitted methods management * AAE-22123 fix omitted methods management and tests * AAE-22075 perform single queries on join table after select on task table * Revert "AAE-22075 perform single queries on join table after select on task table" This reverts commit 3e3576395b42ba2eb61b370864797512b8e4bce6. * AAE-22075 use jpaquery and fluentyquery * AAE-22075 reduced number of queries, applied sorting parameters * AAE-22075 fix sorting * AAE-22075 fix sorting * AAE-22075 fix * AAE-22075 remove unused imports * AAE-22075 remove sql logs from test * AAE-22075 fix import * AAE-22075 added tests * AAE-22075 refactoring --------- Signed-off-by: dependabot[bot] Co-authored-by: Akhilesh Pamidimarthi Co-authored-by: jesty Co-authored-by: RahulKumar1606 <126051097+RahulKumar1606@users.noreply.github.com> Co-authored-by: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../repository/CustomizedTaskRepository.java | 3 + .../CustomizedTaskRepositoryImpl.java | 50 ++ .../query/rest/TaskControllerHelper.java | 43 +- .../query/rest/TaskControllerHelperIT.java | 495 ++++++++++++++++++ 4 files changed, 585 insertions(+), 6 deletions(-) create mode 100644 activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskControllerHelperIT.java diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepository.java b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepository.java index f044260663..27ed68bed1 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepository.java +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepository.java @@ -16,6 +16,7 @@ package org.activiti.cloud.services.query.app.repository; import com.querydsl.core.types.Predicate; +import java.util.List; import org.activiti.cloud.services.query.model.TaskEntity; import org.activiti.cloud.services.query.model.VariableValue; import org.springframework.data.domain.Page; @@ -29,6 +30,8 @@ Page findByVariableNameAndValue( Pageable pageable ); + Page findWithProcessVariables(List variableKeys, Predicate predicate, Pageable pageable); + Iterable findInProcessInstanceScope(Predicate predicate); Page findInProcessInstanceScope(Predicate predicate, Pageable pageable); diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepositoryImpl.java b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepositoryImpl.java index 78827d081f..fc1be66061 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepositoryImpl.java +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/src/main/java/org/activiti/cloud/services/query/app/repository/CustomizedTaskRepositoryImpl.java @@ -16,6 +16,7 @@ package org.activiti.cloud.services.query.app.repository; import com.querydsl.core.types.Predicate; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPQLQuery; import com.querydsl.jpa.impl.JPAQuery; @@ -23,6 +24,7 @@ import jakarta.persistence.EntityManager; import java.util.List; import org.activiti.cloud.services.query.model.QProcessInstanceEntity; +import org.activiti.cloud.services.query.model.QProcessVariableEntity; import org.activiti.cloud.services.query.model.QTaskEntity; import org.activiti.cloud.services.query.model.QTaskVariableEntity; import org.activiti.cloud.services.query.model.TaskEntity; @@ -90,6 +92,54 @@ public Page findByVariableNameAndValue( ); } + @Override + public Page findWithProcessVariables( + List variableKeys, + Predicate predicate, + Pageable pageable + ) { + Assert.notNull(variableKeys, "keys must not be null!"); + Assert.notNull(predicate, "Predicate must not be null!"); + Assert.notNull(pageable, "Pageable must not be null!"); + + EntityManager entityManager = getEntityManager(); + Querydsl querydsl = getQuerydsl(); + JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); + + QTaskEntity taskEntity = QTaskEntity.taskEntity; + QProcessVariableEntity processVariableEntity = QProcessVariableEntity.processVariableEntity; + + JPAQuery taskIdsQuery = queryFactory.query().select(taskEntity.id).from(taskEntity).where(predicate); + + long totalElements = taskIdsQuery.fetchCount(); + + List taskIds = querydsl.applyPagination(pageable, taskIdsQuery).fetch(); + + BooleanExpression processVariableFilter = processVariableEntity.processDefinitionKey + .concat("/") + .concat(processVariableEntity.name) + .in(variableKeys); + + JPQLQuery tasksQuery = queryFactory + .query() + .select(taskEntity) + .from(taskEntity) + .where(taskEntity.id.in(taskIds)) + .leftJoin(taskEntity.processVariables, processVariableEntity) + .where(processVariableEntity.isNull().or(processVariableFilter)) + .fetchJoin() + .leftJoin(taskEntity.taskCandidateGroups) + .fetchJoin() + .leftJoin(taskEntity.taskCandidateUsers) + .fetchJoin(); + + return PageableExecutionUtils.getPage( + querydsl.applySorting(pageable.getSort(), tasksQuery).fetch(), + pageable, + () -> totalElements + ); + } + @Override public Iterable findInProcessInstanceScope(Predicate predicate) { QTaskEntity taskEntity = QTaskEntity.taskEntity; diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/TaskControllerHelper.java b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/TaskControllerHelper.java index 982a4c8b0c..0197d11b9b 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/TaskControllerHelper.java +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/TaskControllerHelper.java @@ -19,7 +19,6 @@ import com.querydsl.core.types.Predicate; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; -import jakarta.transaction.Transactional; import java.util.List; import org.activiti.cloud.alfresco.data.domain.AlfrescoPagedModelAssembler; import org.activiti.cloud.api.task.model.QueryCloudTask; @@ -36,13 +35,18 @@ import org.springframework.data.domain.Pageable; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.PagedModel; +import org.springframework.transaction.annotation.Transactional; public class TaskControllerHelper { private final TaskRepository taskRepository; + private final AlfrescoPagedModelAssembler pagedCollectionModelAssembler; + private final QueryDslPredicateAggregator predicateAggregator; + private final TaskRepresentationModelAssembler taskRepresentationModelAssembler; + private final TaskLookupRestrictionService taskLookupRestrictionService; @PersistenceContext @@ -72,7 +76,7 @@ public PagedModel> findAll( return pagedCollectionModelAssembler.toModel(pageable, page, taskRepresentationModelAssembler); } - @Transactional + @Transactional(readOnly = true) public PagedModel> findAllWithProcessVariables( Predicate predicate, VariableSearch variableSearch, @@ -80,9 +84,13 @@ public PagedModel> findAllWithProcessVariables( List filters, List processVariableKeys ) { - addProcessVariablesFilter(processVariableKeys); - Page page = findPage(predicate, variableSearch, pageable, filters); - initializeProcessVariables(page); + Page page = findPageWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); return pagedCollectionModelAssembler.toModel(pageable, page, taskRepresentationModelAssembler); } @@ -91,6 +99,7 @@ public PagedModel> findAllByInvolvedUserQuery(Predic return pagedCollectionModelAssembler.toModel(pageable, page, taskRepresentationModelAssembler); } + @Transactional(readOnly = true) public PagedModel> findAllFromBody( Predicate predicate, VariableSearch variableSearch, @@ -105,7 +114,7 @@ public PagedModel> findAllFromBody( } } - @Transactional + @Transactional(readOnly = true) public PagedModel> findAllByInvolvedUserQueryWithProcessVariables( Predicate predicate, List processVariableKeys, @@ -159,4 +168,26 @@ private Page findPage( } return page; } + + private Page findPageWithProcessVariables( + Predicate predicate, + VariableSearch variableSearch, + Pageable pageable, + List filters, + List processVariableKeys + ) { + Predicate extendedPredicate = predicateAggregator.applyFilters(predicate, filters); + + if (variableSearch.isSet()) { + addProcessVariablesFilter(processVariableKeys); + return taskRepository.findByVariableNameAndValue( + variableSearch.getName(), + variableSearch.getValue(), + extendedPredicate, + pageable + ); + } else { + return taskRepository.findWithProcessVariables(processVariableKeys, extendedPredicate, pageable); + } + } } diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskControllerHelperIT.java b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskControllerHelperIT.java new file mode 100644 index 0000000000..dd5b82a806 --- /dev/null +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskControllerHelperIT.java @@ -0,0 +1,495 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.cloud.services.query.rest; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.querydsl.core.types.Predicate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.IntStream; +import org.activiti.cloud.api.task.model.QueryCloudTask; +import org.activiti.cloud.services.query.app.repository.ProcessInstanceRepository; +import org.activiti.cloud.services.query.app.repository.TaskCandidateGroupRepository; +import org.activiti.cloud.services.query.app.repository.TaskCandidateUserRepository; +import org.activiti.cloud.services.query.app.repository.TaskRepository; +import org.activiti.cloud.services.query.app.repository.TaskVariableRepository; +import org.activiti.cloud.services.query.app.repository.VariableRepository; +import org.activiti.cloud.services.query.model.ProcessInstanceEntity; +import org.activiti.cloud.services.query.model.ProcessVariableEntity; +import org.activiti.cloud.services.query.model.TaskCandidateGroupEntity; +import org.activiti.cloud.services.query.model.TaskCandidateUserEntity; +import org.activiti.cloud.services.query.model.TaskEntity; +import org.activiti.cloud.services.query.rest.predicate.QueryDslPredicateFilter; +import org.activiti.cloud.services.query.rest.predicate.RootTasksFilter; +import org.activiti.cloud.services.query.rest.predicate.StandAloneTaskFilter; +import org.jetbrains.annotations.NotNull; +import org.joda.time.LocalDateTime; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.hateoas.EntityModel; +import org.springframework.hateoas.PagedModel; +import org.springframework.test.context.TestPropertySource; + +@SpringBootTest( + properties = { + "spring.main.banner-mode=off", + "spring.jpa.properties.hibernate.enable_lazy_load_no_trans=false", + "logging.level.org.hibernate.collection.spi=warn", + } +) +@TestPropertySource("classpath:application-test.properties") +@EnableAutoConfiguration +public class TaskControllerHelperIT { + + @Autowired + TaskControllerHelper taskControllerHelper; + + @Autowired + TaskRepository taskRepository; + + @Autowired + TaskVariableRepository taskVariableRepository; + + @Autowired + private ProcessInstanceRepository processInstanceRepository; + + @Autowired + private VariableRepository variableRepository; + + @Autowired + private TaskCandidateGroupRepository taskCandidateGroupRepository; + + @Autowired + private TaskCandidateUserRepository taskCandidateUserRepository; + + @BeforeEach + public void setUp() { + taskRepository.deleteAll(); + taskVariableRepository.deleteAll(); + processInstanceRepository.deleteAll(); + variableRepository.deleteAll(); + taskCandidateGroupRepository.deleteAll(); + taskCandidateUserRepository.deleteAll(); + } + + @Test + public void should_returnTasks_withProcessVariablesByKeys() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + List taskEntities = createTasks(variables, processInstanceEntity); + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(false), new StandAloneTaskFilter(false)); + List processVariableKeys = IntStream + .range(0, variables.size()) + .filter(i -> i % 2 == 0) + .mapToObj(i -> processInstanceEntity.getProcessDefinitionKey() + "/name" + i) + .toList(); + + int pageSize = 30; + Pageable pageable = PageRequest.of(0, pageSize, Sort.by("createdDate").descending()); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()) + .extracting(QueryCloudTask::getId) + .containsExactly( + taskEntities.reversed().stream().limit(pageSize).map(TaskEntity::getId).toArray(String[]::new) + ); + + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()) + .allSatisfy(task -> + assertThat(task.getProcessVariables()) + .extracting("name") + .containsExactlyInAnyOrder( + IntStream.range(0, variables.size()).filter(i -> i % 2 == 0).mapToObj(i -> "name" + i).toArray() + ) + ); + } + + @Test + public void should_return_PaginatedTasks_WithProcessVariables() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + List taskEntities = createTasks(variables, processInstanceEntity); + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(false), new StandAloneTaskFilter(false)); + List processVariableKeys = variables + .stream() + .map(v -> processInstanceEntity.getProcessDefinitionKey() + "/" + v.getName()) + .toList(); + + Pageable pageable = PageRequest.of(0, 30, Sort.by("createdDate").descending()); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(pageable.getPageSize()); + assertThat(response.getPreviousLink()).isEmpty(); + assertThat(response.getNextLink()).isPresent(); + + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()) + .extracting(QueryCloudTask::getId) + .containsExactly( + taskEntities + .reversed() + .stream() + .limit(pageable.getPageSize()) + .map(TaskEntity::getId) + .toArray(String[]::new) + ); + + pageable = PageRequest.of(1, 30, Sort.by("createdDate").descending()); + + response = + taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(pageable.getPageSize()); + assertThat(response.getPreviousLink()).isPresent(); + assertThat(response.getNextLink()).isPresent(); + + pageable = PageRequest.of(3, 30, Sort.by("createdDate").descending()); + + response = + taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(taskEntities.size() - pageable.getPageSize() * 3); + assertThat(response.getPreviousLink()).isPresent(); + assertThat(response.getNextLink()).isEmpty(); + } + + @Test + void should_returnTask_evenIfItHashNoMatchingProcessVariables() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + + TaskEntity taskEntity = new TaskEntity(); + String taskId = "task_id"; + taskEntity.setId(taskId); + taskEntity.setCreatedDate(new Date()); + TaskCandidateGroupEntity groupCand = new TaskCandidateGroupEntity(taskId, "group"); + taskEntity.setTaskCandidateGroups(Set.of(groupCand)); + TaskCandidateUserEntity usrCand = new TaskCandidateUserEntity(taskId, "user"); + taskEntity.setTaskCandidateUsers(Set.of(usrCand)); + taskEntity.setProcessVariables(Collections.emptySet()); + taskEntity.setProcessInstance(processInstanceEntity); + taskEntity.setProcessInstanceId(processInstanceEntity.getId()); + taskCandidateGroupRepository.save(groupCand); + taskCandidateUserRepository.save(usrCand); + taskRepository.save(taskEntity); + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(false), new StandAloneTaskFilter(false)); + + int pageSize = 30; + Pageable pageable = PageRequest.of(0, pageSize, Sort.by("createdDate").descending()); + + List processVariableKeys = variables + .stream() + .map(v -> processInstanceEntity.getProcessDefinitionKey() + "/" + v.getName()) + .toList(); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(1); + + assertThat(response.getContent().stream().toList().getFirst().getContent().getProcessVariables()).isEmpty(); + } + + @Test + void should_returnOnlyStandaloneTasks_whenStandAloneFilterIsTrue() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + List tasksWithProcessInstance = createTasks(variables, processInstanceEntity); + List standaloneTasks = createStandaloneTasks(); + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(false), new StandAloneTaskFilter(true)); + + int pageSize = 1000; + Pageable pageable = PageRequest.of(0, pageSize, Sort.by("createdDate").descending()); + + List processVariableKeys = variables + .stream() + .map(v -> processInstanceEntity.getProcessDefinitionKey() + "/" + v.getName()) + .toList(); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(standaloneTasks.size()); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()).containsAll(standaloneTasks); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()) + .doesNotContainAnyElementsOf(tasksWithProcessInstance); + } + + @Test + void should_returnAllTasks_whenStandAloneFilterIsFalse() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + List tasksWithProcessInstance = createTasks(variables, processInstanceEntity); + List standaloneTasks = createStandaloneTasks(); + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(false), new StandAloneTaskFilter(false)); + + int pageSize = 1000; + Pageable pageable = PageRequest.of(0, pageSize, Sort.by("createdDate").descending()); + + List processVariableKeys = variables + .stream() + .map(v -> processInstanceEntity.getProcessDefinitionKey() + "/" + v.getName()) + .toList(); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(standaloneTasks.size() + tasksWithProcessInstance.size()); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()).containsAll(standaloneTasks); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()) + .containsAll(tasksWithProcessInstance); + } + + @Test + void should_returnOnlyRootTasks_whenRootTaskFilterIsTrue() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + List rootTasks = createTasks(variables, processInstanceEntity); + + List childTasks = new ArrayList<>(); + + for (int i = 0; i < 10; i++) { + TaskEntity childTask = new TaskEntity(); + String taskId = "child" + i; + childTask.setId(taskId); + childTask.setCreatedDate(new Date()); + childTask.setProcessInstance(processInstanceEntity); + childTask.setProcessInstanceId(processInstanceEntity.getId()); + childTask.setParentTaskId(rootTasks.get(i).getId()); + childTasks.add(childTask); + taskRepository.save(childTask); + } + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(true), new StandAloneTaskFilter(false)); + + int pageSize = 1000; + Pageable pageable = PageRequest.of(0, pageSize, Sort.by("createdDate").descending()); + + List processVariableKeys = variables + .stream() + .map(v -> processInstanceEntity.getProcessDefinitionKey() + "/" + v.getName()) + .toList(); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(rootTasks.size()); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()).containsAll(rootTasks); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()) + .doesNotContainAnyElementsOf(childTasks); + } + + @Test + void should_returnRootTasksAndChildTasks_whenRootTaskFilterIsFalse() { + ProcessInstanceEntity processInstanceEntity = createProcessInstance(); + Set variables = createProcessVariables(processInstanceEntity); + List rootTasks = createTasks(variables, processInstanceEntity); + + List childTasks = new ArrayList<>(); + + for (int i = 0; i < 10; i++) { + TaskEntity childTask = new TaskEntity(); + String taskId = "child" + i; + childTask.setId(taskId); + childTask.setCreatedDate(new Date()); + childTask.setProcessInstance(processInstanceEntity); + childTask.setProcessInstanceId(processInstanceEntity.getId()); + childTask.setParentTaskId(rootTasks.get(i).getId()); + childTasks.add(childTask); + taskRepository.save(childTask); + } + + Predicate predicate = null; + VariableSearch variableSearch = new VariableSearch(null, null, null); + + List filters = List.of(new RootTasksFilter(false), new StandAloneTaskFilter(false)); + + int pageSize = 1000; + Pageable pageable = PageRequest.of(0, pageSize, Sort.by("createdDate").descending()); + + List processVariableKeys = variables + .stream() + .map(v -> processInstanceEntity.getProcessDefinitionKey() + "/" + v.getName()) + .toList(); + + PagedModel> response = taskControllerHelper.findAllWithProcessVariables( + predicate, + variableSearch, + pageable, + filters, + processVariableKeys + ); + + assertThat(response.getContent()).hasSize(rootTasks.size() + childTasks.size()); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()).containsAll(rootTasks); + assertThat(response.getContent().stream().map(EntityModel::getContent).toList()).containsAll(childTasks); + } + + @NotNull + private List createTasks( + Set variables, + ProcessInstanceEntity processInstanceEntity + ) { + List taskEntities = new ArrayList<>(); + + LocalDateTime start = LocalDateTime.fromDateFields(new Date()); + for (int i = 0; i < 100; i++) { + TaskEntity taskEntity = new TaskEntity(); + String taskId = "id" + i; + taskEntity.setId(taskId); + taskEntity.setCreatedDate(start.plusSeconds(i).toDate()); + TaskCandidateGroupEntity groupCand = new TaskCandidateGroupEntity(taskId, "group" + i); + taskEntity.setTaskCandidateGroups(Set.of(groupCand)); + TaskCandidateUserEntity usrCand = new TaskCandidateUserEntity(taskId, "user" + i); + taskEntity.setTaskCandidateUsers(Set.of(usrCand)); + taskEntity.setProcessVariables(variables); + taskEntity.setProcessInstance(processInstanceEntity); + taskEntity.setProcessInstanceId(processInstanceEntity.getId()); + taskEntities.add(taskEntity); + taskCandidateGroupRepository.save(groupCand); + taskCandidateUserRepository.save(usrCand); + taskRepository.save(taskEntity); + } + return taskEntities; + } + + @NotNull + private List createStandaloneTasks() { + List taskEntities = new ArrayList<>(); + + LocalDateTime start = LocalDateTime.fromDateFields(new Date()); + for (int i = 0; i < 10; i++) { + TaskEntity taskEntity = new TaskEntity(); + String taskId = "standalone" + i; + taskEntity.setId(taskId); + taskEntity.setCreatedDate(start.plusSeconds(i).toDate()); + taskEntities.add(taskEntity); + taskRepository.save(taskEntity); + } + return taskEntities; + } + + @NotNull + private Set createProcessVariables(ProcessInstanceEntity processInstanceEntity) { + Set variables = new HashSet<>(); + + for (int i = 0; i < 8; i++) { + ProcessVariableEntity processVariableEntity = new ProcessVariableEntity(); + processVariableEntity.setName("name" + i); + processVariableEntity.setValue("id"); + processVariableEntity.setProcessInstanceId(processInstanceEntity.getId()); + processVariableEntity.setProcessDefinitionKey(processInstanceEntity.getProcessDefinitionKey()); + processVariableEntity.setProcessInstance(processInstanceEntity); + variables.add(processVariableEntity); + } + variableRepository.saveAll(variables); + processInstanceEntity.setVariables(variables); + processInstanceRepository.save(processInstanceEntity); + return variables; + } + + @NotNull + private ProcessInstanceEntity createProcessInstance() { + ProcessInstanceEntity processInstanceEntity = new ProcessInstanceEntity(); + processInstanceEntity.setId("processInstanceId"); + processInstanceEntity.setName("name"); + processInstanceEntity.setInitiator("initiator"); + processInstanceEntity.setProcessDefinitionName("test"); + processInstanceEntity.setProcessDefinitionKey("processDefinitionKey"); + processInstanceEntity.setServiceName("test"); + processInstanceRepository.save(processInstanceEntity); + return processInstanceEntity; + } +} From f68c014ce665c8e1ebbe67d911b5dc437ea7ea2b Mon Sep 17 00:00:00 2001 From: Federico D'Ulizia Date: Mon, 20 May 2024 10:58:17 +0200 Subject: [PATCH 12/24] AAE-22648 Upgrade spring-boot version to fix vulnerability (#1444) AAE-22648 upgrade spring boot version to fix vulnerability --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8a832f43c3..a4ff2fa9fc 100644 --- a/pom.xml +++ b/pom.xml @@ -195,7 +195,7 @@ activiti-cloud 2020 - 3.2.4 + 3.2.5 ${project.build.directory}/generated-test-sources/assertions From 9bd84ff226f1dbfc35b5cbbe3e4c0324061654d6 Mon Sep 17 00:00:00 2001 From: alfresco-build Date: Wed, 22 May 2024 08:24:19 +0000 Subject: [PATCH 13/24] Update to version 8.6.0-SNAPSHOT [skip ci] --- .../identity-adapter-acceptance-tests/pom.xml | 2 +- .../multiple-runtime-acceptance-tests/pom.xml | 2 +- activiti-cloud-acceptance-scenarios/pom.xml | 2 +- .../runtime-acceptance-tests/pom.xml | 2 +- .../security-policies-acceptance-tests/pom.xml | 2 +- .../activiti-cloud-acceptance-tests-core/pom.xml | 2 +- .../activiti-cloud-acceptance-tests-dependencies/pom.xml | 2 +- .../activiti-cloud-acceptance-tests-shared/pom.xml | 2 +- activiti-cloud-acceptance-tests/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-dependencies/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-events/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-model-shared-impl/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-model-shared/pom.xml | 2 +- .../activiti-cloud-api-process-model-impl/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-process-model/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-task-model-impl/pom.xml | 2 +- activiti-cloud-api/activiti-cloud-api-task-model/pom.xml | 2 +- activiti-cloud-api/pom.xml | 2 +- .../activiti-cloud-audit-dependencies/pom.xml | 2 +- .../activiti-cloud-services-audit-api/pom.xml | 2 +- .../activiti-cloud-services-audit-jpa/pom.xml | 2 +- .../activiti-cloud-services-audit-liquibase/pom.xml | 2 +- .../activiti-cloud-services-audit-model/pom.xml | 2 +- .../activiti-cloud-starter-audit/pom.xml | 2 +- activiti-cloud-audit-service/pom.xml | 2 +- .../activiti-cloud-build-dependencies-parent/pom.xml | 2 +- activiti-cloud-build/pom.xml | 2 +- .../activiti-cloud-connectors-dependencies/pom.xml | 2 +- .../activiti-cloud-starter-connector/pom.xml | 2 +- activiti-cloud-connectors/pom.xml | 2 +- activiti-cloud-dependencies/dependencies/pom.xml | 2 +- activiti-cloud-dependencies/pom.xml | 2 +- activiti-cloud-examples/activiti-cloud-identity-adapter/pom.xml | 2 +- activiti-cloud-examples/activiti-cloud-query/liquibase/pom.xml | 2 +- activiti-cloud-examples/activiti-cloud-query/pom.xml | 2 +- activiti-cloud-examples/activiti-cloud-query/starter/pom.xml | 2 +- activiti-cloud-examples/example-cloud-connector/pom.xml | 2 +- activiti-cloud-examples/example-cloud-connector/starter/pom.xml | 2 +- activiti-cloud-examples/example-runtime-bundle/pom.xml | 2 +- activiti-cloud-examples/example-runtime-bundle/starter/pom.xml | 2 +- activiti-cloud-examples/pom.xml | 2 +- activiti-cloud-messages-service/dependencies/pom.xml | 2 +- activiti-cloud-messages-service/integration-tests/pom.xml | 2 +- activiti-cloud-messages-service/pom.xml | 2 +- activiti-cloud-messages-service/services/core/pom.xml | 2 +- activiti-cloud-messages-service/services/pom.xml | 2 +- activiti-cloud-messages-service/services/tests/pom.xml | 2 +- activiti-cloud-messages-service/starters/hazelcast/pom.xml | 2 +- activiti-cloud-messages-service/starters/jdbc/pom.xml | 2 +- activiti-cloud-messages-service/starters/pom.xml | 2 +- activiti-cloud-messages-service/starters/redis/pom.xml | 2 +- .../dependencies/pom.xml | 2 +- activiti-cloud-notifications-graphql-service/pom.xml | 2 +- .../services/api/pom.xml | 2 +- .../services/events/pom.xml | 2 +- .../services/graphiql/pom.xml | 2 +- .../services/jpa-query/pom.xml | 2 +- activiti-cloud-notifications-graphql-service/services/pom.xml | 2 +- .../services/schema/pom.xml | 2 +- .../services/security/pom.xml | 2 +- .../services/subscriptions/pom.xml | 2 +- .../services/web/pom.xml | 2 +- .../services/ws/pom.xml | 2 +- activiti-cloud-notifications-graphql-service/starter/pom.xml | 2 +- .../activiti-cloud-query-dependencies/pom.xml | 2 +- .../activiti-cloud-services-query-liquibase/pom.xml | 2 +- .../activiti-cloud-services-query-model/pom.xml | 2 +- .../activiti-cloud-services-query-repo/pom.xml | 2 +- .../activiti-cloud-services-query-rest/pom.xml | 2 +- .../activiti-cloud-services-query/pom.xml | 2 +- .../activiti-cloud-starter-query/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- .../activiti-cloud-runtime-bundle-dependencies/pom.xml | 2 +- .../activiti-cloud-runtime-bundle-rest-client/pom.xml | 2 +- .../activiti-cloud-services-api/pom.xml | 2 +- .../activiti-cloud-services-connectors/pom.xml | 2 +- .../activiti-cloud-services-core/pom.xml | 2 +- .../activiti-cloud-services-events/pom.xml | 2 +- .../activiti-cloud-services-identity-basic/pom.xml | 2 +- .../activiti-cloud-services-job-executor/pom.xml | 2 +- .../activiti-cloud-services-rest-api/pom.xml | 2 +- .../activiti-cloud-services-rest-impl/pom.xml | 2 +- .../activiti-cloud-services-subscriptions/pom.xml | 2 +- .../messages-events/pom.xml | 2 +- .../activiti-cloud-services-runtime-bundle/pom.xml | 2 +- .../activiti-cloud-starter-runtime-bundle-it/pom.xml | 2 +- .../activiti-cloud-starter-runtime-bundle/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- .../activiti-cloud-service-common-config/pom.xml | 2 +- .../activiti-cloud-service-common-dependencies/pom.xml | 2 +- .../activiti-cloud-service-common-liquibase/pom.xml | 2 +- .../activiti-cloud-service-error-handlers/pom.xml | 2 +- .../activiti-cloud-service-messaging-config/pom.xml | 2 +- .../activiti-cloud-service-messaging-starter/pom.xml | 2 +- .../activiti-cloud-services-auditable/pom.xml | 2 +- .../activiti-cloud-services-common-identity-keycloak/pom.xml | 2 +- .../activiti-cloud-services-common-security-keycloak/pom.xml | 2 +- .../activiti-cloud-services-common-security/pom.xml | 2 +- .../activiti-cloud-services-common-util/pom.xml | 2 +- .../activiti-cloud-services-dbp-rest/pom.xml | 2 +- .../activiti-cloud-services-logging/pom.xml | 2 +- .../activiti-cloud-services-metadata/pom.xml | 2 +- .../activiti-cloud-services-monitoring/pom.xml | 2 +- .../activiti-cloud-services-swagger/pom.xml | 2 +- .../activiti-cloud-services-test-containers/pom.xml | 2 +- .../activiti-cloud-services-test-security/pom.xml | 2 +- .../activiti-cloud-services-test/pom.xml | 2 +- .../activiti-cloud-services-tracing/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- pom.xml | 2 +- 110 files changed, 110 insertions(+), 110 deletions(-) diff --git a/activiti-cloud-acceptance-scenarios/identity-adapter-acceptance-tests/pom.xml b/activiti-cloud-acceptance-scenarios/identity-adapter-acceptance-tests/pom.xml index d0a5a986e2..f8245e4be5 100644 --- a/activiti-cloud-acceptance-scenarios/identity-adapter-acceptance-tests/pom.xml +++ b/activiti-cloud-acceptance-scenarios/identity-adapter-acceptance-tests/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-acceptance-scenarios-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT identity-adapter-acceptance-tests Activiti Cloud :: Acceptance Scenarios Identity Adapter diff --git a/activiti-cloud-acceptance-scenarios/multiple-runtime-acceptance-tests/pom.xml b/activiti-cloud-acceptance-scenarios/multiple-runtime-acceptance-tests/pom.xml index 11a432e0bb..8ce29e3268 100644 --- a/activiti-cloud-acceptance-scenarios/multiple-runtime-acceptance-tests/pom.xml +++ b/activiti-cloud-acceptance-scenarios/multiple-runtime-acceptance-tests/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-acceptance-scenarios-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT multiple-runtime-acceptance-tests Activiti Cloud :: Acceptance Scenarios Multi-Runtime diff --git a/activiti-cloud-acceptance-scenarios/pom.xml b/activiti-cloud-acceptance-scenarios/pom.xml index b657cdf2f0..f61f9b74da 100644 --- a/activiti-cloud-acceptance-scenarios/pom.xml +++ b/activiti-cloud-acceptance-scenarios/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-acceptance-scenarios-parent diff --git a/activiti-cloud-acceptance-scenarios/runtime-acceptance-tests/pom.xml b/activiti-cloud-acceptance-scenarios/runtime-acceptance-tests/pom.xml index 4b1ea8321c..8aee6105e3 100644 --- a/activiti-cloud-acceptance-scenarios/runtime-acceptance-tests/pom.xml +++ b/activiti-cloud-acceptance-scenarios/runtime-acceptance-tests/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-acceptance-scenarios-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT runtime-acceptance-tests Activiti Cloud :: Acceptance Scenarios Runtime diff --git a/activiti-cloud-acceptance-scenarios/security-policies-acceptance-tests/pom.xml b/activiti-cloud-acceptance-scenarios/security-policies-acceptance-tests/pom.xml index 8576ec1f3e..42e3d3b6f4 100644 --- a/activiti-cloud-acceptance-scenarios/security-policies-acceptance-tests/pom.xml +++ b/activiti-cloud-acceptance-scenarios/security-policies-acceptance-tests/pom.xml @@ -4,7 +4,7 @@ org.activiti.cloud activiti-cloud-acceptance-scenarios-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT 4.0.0 security-policies-acceptance-tests diff --git a/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-core/pom.xml b/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-core/pom.xml index 1436472b10..735e596031 100644 --- a/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-core/pom.xml +++ b/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-core/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-acceptance-tests-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-acceptance-tests-dependencies activiti-cloud-acceptance-tests-core diff --git a/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-dependencies/pom.xml b/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-dependencies/pom.xml index 251ce5aaea..779ae8bff5 100755 --- a/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-dependencies/pom.xml +++ b/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-acceptance-tests-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-acceptance-tests-dependencies pom diff --git a/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-shared/pom.xml b/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-shared/pom.xml index a127c4bf92..978da79469 100644 --- a/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-shared/pom.xml +++ b/activiti-cloud-acceptance-tests/activiti-cloud-acceptance-tests-shared/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-acceptance-tests-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-acceptance-tests-dependencies activiti-cloud-acceptance-tests-shared diff --git a/activiti-cloud-acceptance-tests/pom.xml b/activiti-cloud-acceptance-tests/pom.xml index c2ace41728..f5a327f01d 100644 --- a/activiti-cloud-acceptance-tests/pom.xml +++ b/activiti-cloud-acceptance-tests/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-acceptance-tests-parent diff --git a/activiti-cloud-api/activiti-cloud-api-dependencies/pom.xml b/activiti-cloud-api/activiti-cloud-api-dependencies/pom.xml index 9db0682ac3..440343b302 100755 --- a/activiti-cloud-api/activiti-cloud-api-dependencies/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-api-dependencies pom diff --git a/activiti-cloud-api/activiti-cloud-api-events/pom.xml b/activiti-cloud-api/activiti-cloud-api-events/pom.xml index c89e99fa92..597cf554b2 100644 --- a/activiti-cloud-api/activiti-cloud-api-events/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-events/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-events diff --git a/activiti-cloud-api/activiti-cloud-api-model-shared-impl/pom.xml b/activiti-cloud-api/activiti-cloud-api-model-shared-impl/pom.xml index 0bd19dfeca..edd82c32b6 100644 --- a/activiti-cloud-api/activiti-cloud-api-model-shared-impl/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-model-shared-impl/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-model-shared-impl diff --git a/activiti-cloud-api/activiti-cloud-api-model-shared/pom.xml b/activiti-cloud-api/activiti-cloud-api-model-shared/pom.xml index c594fc750f..75a6ac7bab 100644 --- a/activiti-cloud-api/activiti-cloud-api-model-shared/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-model-shared/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-model-shared diff --git a/activiti-cloud-api/activiti-cloud-api-process-model-impl/pom.xml b/activiti-cloud-api/activiti-cloud-api-process-model-impl/pom.xml index 1615cff668..895ce329f8 100644 --- a/activiti-cloud-api/activiti-cloud-api-process-model-impl/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-process-model-impl/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-process-model-impl diff --git a/activiti-cloud-api/activiti-cloud-api-process-model/pom.xml b/activiti-cloud-api/activiti-cloud-api-process-model/pom.xml index 259373096e..4df31489eb 100644 --- a/activiti-cloud-api/activiti-cloud-api-process-model/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-process-model/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-process-model diff --git a/activiti-cloud-api/activiti-cloud-api-task-model-impl/pom.xml b/activiti-cloud-api/activiti-cloud-api-task-model-impl/pom.xml index 52a171114a..ead6c58cf5 100644 --- a/activiti-cloud-api/activiti-cloud-api-task-model-impl/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-task-model-impl/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-task-model-impl diff --git a/activiti-cloud-api/activiti-cloud-api-task-model/pom.xml b/activiti-cloud-api/activiti-cloud-api-task-model/pom.xml index e20474afb7..d59d82062f 100644 --- a/activiti-cloud-api/activiti-cloud-api-task-model/pom.xml +++ b/activiti-cloud-api/activiti-cloud-api-task-model/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-api-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-api-dependencies activiti-cloud-api-task-model diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index 417197f888..2dca397091 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-api diff --git a/activiti-cloud-audit-service/activiti-cloud-audit-dependencies/pom.xml b/activiti-cloud-audit-service/activiti-cloud-audit-dependencies/pom.xml index 15edf5440f..a78153b18d 100755 --- a/activiti-cloud-audit-service/activiti-cloud-audit-dependencies/pom.xml +++ b/activiti-cloud-audit-service/activiti-cloud-audit-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-audit-service-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-audit-dependencies pom diff --git a/activiti-cloud-audit-service/activiti-cloud-services-audit-api/pom.xml b/activiti-cloud-audit-service/activiti-cloud-services-audit-api/pom.xml index a114695531..4b512c7e0b 100644 --- a/activiti-cloud-audit-service/activiti-cloud-services-audit-api/pom.xml +++ b/activiti-cloud-audit-service/activiti-cloud-services-audit-api/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-audit-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-audit-dependencies activiti-cloud-services-audit-api diff --git a/activiti-cloud-audit-service/activiti-cloud-services-audit-jpa/pom.xml b/activiti-cloud-audit-service/activiti-cloud-services-audit-jpa/pom.xml index addea68878..3966a0333d 100644 --- a/activiti-cloud-audit-service/activiti-cloud-services-audit-jpa/pom.xml +++ b/activiti-cloud-audit-service/activiti-cloud-services-audit-jpa/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-audit-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-audit-dependencies activiti-cloud-services-audit-jpa diff --git a/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/pom.xml b/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/pom.xml index bf7a7a40b2..7deeeb000b 100644 --- a/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/pom.xml +++ b/activiti-cloud-audit-service/activiti-cloud-services-audit-liquibase/pom.xml @@ -3,7 +3,7 @@ org.activiti.cloud activiti-cloud-audit-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-audit-dependencies activiti-cloud-services-audit-liquibase diff --git a/activiti-cloud-audit-service/activiti-cloud-services-audit-model/pom.xml b/activiti-cloud-audit-service/activiti-cloud-services-audit-model/pom.xml index f05a169e58..072455d76d 100644 --- a/activiti-cloud-audit-service/activiti-cloud-services-audit-model/pom.xml +++ b/activiti-cloud-audit-service/activiti-cloud-services-audit-model/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-audit-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-audit-dependencies diff --git a/activiti-cloud-audit-service/activiti-cloud-starter-audit/pom.xml b/activiti-cloud-audit-service/activiti-cloud-starter-audit/pom.xml index c896110425..625d68e0b6 100644 --- a/activiti-cloud-audit-service/activiti-cloud-starter-audit/pom.xml +++ b/activiti-cloud-audit-service/activiti-cloud-starter-audit/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-audit-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-audit-dependencies activiti-cloud-starter-audit diff --git a/activiti-cloud-audit-service/pom.xml b/activiti-cloud-audit-service/pom.xml index 68efb8188d..c589d21db1 100644 --- a/activiti-cloud-audit-service/pom.xml +++ b/activiti-cloud-audit-service/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-audit-service-parent diff --git a/activiti-cloud-build/activiti-cloud-build-dependencies-parent/pom.xml b/activiti-cloud-build/activiti-cloud-build-dependencies-parent/pom.xml index 1170f5fa63..108f693e8f 100644 --- a/activiti-cloud-build/activiti-cloud-build-dependencies-parent/pom.xml +++ b/activiti-cloud-build/activiti-cloud-build-dependencies-parent/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-build-dependencies-parent pom diff --git a/activiti-cloud-build/pom.xml b/activiti-cloud-build/pom.xml index c2917a993d..9d56e3288e 100644 --- a/activiti-cloud-build/pom.xml +++ b/activiti-cloud-build/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-mono-aggregator - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-build-parent pom diff --git a/activiti-cloud-connectors/activiti-cloud-connectors-dependencies/pom.xml b/activiti-cloud-connectors/activiti-cloud-connectors-dependencies/pom.xml index 6bf7e7bdc7..b1213acf3e 100755 --- a/activiti-cloud-connectors/activiti-cloud-connectors-dependencies/pom.xml +++ b/activiti-cloud-connectors/activiti-cloud-connectors-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-connectors-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-connectors-dependencies pom diff --git a/activiti-cloud-connectors/activiti-cloud-starter-connector/pom.xml b/activiti-cloud-connectors/activiti-cloud-starter-connector/pom.xml index 1c0214218a..8e749707a5 100644 --- a/activiti-cloud-connectors/activiti-cloud-starter-connector/pom.xml +++ b/activiti-cloud-connectors/activiti-cloud-starter-connector/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-connectors-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-connectors-dependencies activiti-cloud-starter-connector diff --git a/activiti-cloud-connectors/pom.xml b/activiti-cloud-connectors/pom.xml index 08cb4fe126..1149fe8160 100644 --- a/activiti-cloud-connectors/pom.xml +++ b/activiti-cloud-connectors/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-connectors-parent diff --git a/activiti-cloud-dependencies/dependencies/pom.xml b/activiti-cloud-dependencies/dependencies/pom.xml index 5e6c8f3368..c1553a5c0d 100644 --- a/activiti-cloud-dependencies/dependencies/pom.xml +++ b/activiti-cloud-dependencies/dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-dependencies-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-dependencies pom diff --git a/activiti-cloud-dependencies/pom.xml b/activiti-cloud-dependencies/pom.xml index 2d35824695..28d31e4df7 100644 --- a/activiti-cloud-dependencies/pom.xml +++ b/activiti-cloud-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-dependencies-parent diff --git a/activiti-cloud-examples/activiti-cloud-identity-adapter/pom.xml b/activiti-cloud-examples/activiti-cloud-identity-adapter/pom.xml index b5b74bf23c..aeded48869 100644 --- a/activiti-cloud-examples/activiti-cloud-identity-adapter/pom.xml +++ b/activiti-cloud-examples/activiti-cloud-identity-adapter/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-examples - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-identity-adapter Activiti Cloud :: Identity Adapter diff --git a/activiti-cloud-examples/activiti-cloud-query/liquibase/pom.xml b/activiti-cloud-examples/activiti-cloud-query/liquibase/pom.xml index 16ca4ed1da..71c687f17a 100644 --- a/activiti-cloud-examples/activiti-cloud-query/liquibase/pom.xml +++ b/activiti-cloud-examples/activiti-cloud-query/liquibase/pom.xml @@ -3,7 +3,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../../../activiti-cloud-build/pom.xml activiti-cloud-query-liquibase diff --git a/activiti-cloud-examples/activiti-cloud-query/pom.xml b/activiti-cloud-examples/activiti-cloud-query/pom.xml index 616f02ad89..d250071f49 100644 --- a/activiti-cloud-examples/activiti-cloud-query/pom.xml +++ b/activiti-cloud-examples/activiti-cloud-query/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-examples - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-query Activiti Cloud :: Query diff --git a/activiti-cloud-examples/activiti-cloud-query/starter/pom.xml b/activiti-cloud-examples/activiti-cloud-query/starter/pom.xml index da6d9a782f..29c4981d0e 100644 --- a/activiti-cloud-examples/activiti-cloud-query/starter/pom.xml +++ b/activiti-cloud-examples/activiti-cloud-query/starter/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-query org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT 4.0.0 diff --git a/activiti-cloud-examples/example-cloud-connector/pom.xml b/activiti-cloud-examples/example-cloud-connector/pom.xml index 8290004500..2211e9ec64 100644 --- a/activiti-cloud-examples/example-cloud-connector/pom.xml +++ b/activiti-cloud-examples/example-cloud-connector/pom.xml @@ -9,7 +9,7 @@ org.activiti.cloud activiti-cloud-examples - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT example-cloud-connector Activiti Cloud :: Example Cloud Connector diff --git a/activiti-cloud-examples/example-cloud-connector/starter/pom.xml b/activiti-cloud-examples/example-cloud-connector/starter/pom.xml index 8901d5aef2..1ca4cf8a16 100644 --- a/activiti-cloud-examples/example-cloud-connector/starter/pom.xml +++ b/activiti-cloud-examples/example-cloud-connector/starter/pom.xml @@ -5,7 +5,7 @@ example-cloud-connector org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT 4.0.0 diff --git a/activiti-cloud-examples/example-runtime-bundle/pom.xml b/activiti-cloud-examples/example-runtime-bundle/pom.xml index 0b85e77e9a..39d46fda37 100644 --- a/activiti-cloud-examples/example-runtime-bundle/pom.xml +++ b/activiti-cloud-examples/example-runtime-bundle/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-examples - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT example-runtime-bundle Activiti Cloud :: Runtime Bundle diff --git a/activiti-cloud-examples/example-runtime-bundle/starter/pom.xml b/activiti-cloud-examples/example-runtime-bundle/starter/pom.xml index 79fcb0dda2..2f183c79b9 100644 --- a/activiti-cloud-examples/example-runtime-bundle/starter/pom.xml +++ b/activiti-cloud-examples/example-runtime-bundle/starter/pom.xml @@ -5,7 +5,7 @@ example-runtime-bundle org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT 4.0.0 diff --git a/activiti-cloud-examples/pom.xml b/activiti-cloud-examples/pom.xml index 106a14c7d6..b7c7284d92 100644 --- a/activiti-cloud-examples/pom.xml +++ b/activiti-cloud-examples/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-examples diff --git a/activiti-cloud-messages-service/dependencies/pom.xml b/activiti-cloud-messages-service/dependencies/pom.xml index 90be10abc1..734b4a9a4e 100644 --- a/activiti-cloud-messages-service/dependencies/pom.xml +++ b/activiti-cloud-messages-service/dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-messages-service-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-messages-dependencies pom diff --git a/activiti-cloud-messages-service/integration-tests/pom.xml b/activiti-cloud-messages-service/integration-tests/pom.xml index 355eb5a92e..335f27908a 100644 --- a/activiti-cloud-messages-service/integration-tests/pom.xml +++ b/activiti-cloud-messages-service/integration-tests/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-messages-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../dependencies activiti-cloud-messages-integration-tests diff --git a/activiti-cloud-messages-service/pom.xml b/activiti-cloud-messages-service/pom.xml index 54bbfd30be..5a591d5c4d 100644 --- a/activiti-cloud-messages-service/pom.xml +++ b/activiti-cloud-messages-service/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-messages-service-parent diff --git a/activiti-cloud-messages-service/services/core/pom.xml b/activiti-cloud-messages-service/services/core/pom.xml index 6b6ccc0b5d..a5d2e67c13 100644 --- a/activiti-cloud-messages-service/services/core/pom.xml +++ b/activiti-cloud-messages-service/services/core/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-messages - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT Activiti Cloud Services :: Messages Core activiti-cloud-services-messages-core diff --git a/activiti-cloud-messages-service/services/pom.xml b/activiti-cloud-messages-service/services/pom.xml index e747b072d5..a3402a8975 100644 --- a/activiti-cloud-messages-service/services/pom.xml +++ b/activiti-cloud-messages-service/services/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-messages-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../dependencies activiti-cloud-services-messages diff --git a/activiti-cloud-messages-service/services/tests/pom.xml b/activiti-cloud-messages-service/services/tests/pom.xml index 933e8c8218..516dced931 100644 --- a/activiti-cloud-messages-service/services/tests/pom.xml +++ b/activiti-cloud-messages-service/services/tests/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-messages - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-messages-tests diff --git a/activiti-cloud-messages-service/starters/hazelcast/pom.xml b/activiti-cloud-messages-service/starters/hazelcast/pom.xml index 1e49811286..e6fc2bb0f8 100644 --- a/activiti-cloud-messages-service/starters/hazelcast/pom.xml +++ b/activiti-cloud-messages-service/starters/hazelcast/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-starters-messages - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-starter-messages-hazelcast Activiti Cloud Starter :: Messages Hazelcast diff --git a/activiti-cloud-messages-service/starters/jdbc/pom.xml b/activiti-cloud-messages-service/starters/jdbc/pom.xml index f25e511372..00100a5010 100644 --- a/activiti-cloud-messages-service/starters/jdbc/pom.xml +++ b/activiti-cloud-messages-service/starters/jdbc/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-starters-messages - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-starter-messages-jdbc Activiti Cloud Starter :: Messages JDBC diff --git a/activiti-cloud-messages-service/starters/pom.xml b/activiti-cloud-messages-service/starters/pom.xml index 3d07712893..aadb4d8f6f 100644 --- a/activiti-cloud-messages-service/starters/pom.xml +++ b/activiti-cloud-messages-service/starters/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-messages-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../dependencies activiti-cloud-starters-messages diff --git a/activiti-cloud-messages-service/starters/redis/pom.xml b/activiti-cloud-messages-service/starters/redis/pom.xml index 6a918cf31f..ab2f1aaddb 100644 --- a/activiti-cloud-messages-service/starters/redis/pom.xml +++ b/activiti-cloud-messages-service/starters/redis/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-starters-messages - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-starter-messages-redis Activiti Cloud Starter :: Messages Redis diff --git a/activiti-cloud-notifications-graphql-service/dependencies/pom.xml b/activiti-cloud-notifications-graphql-service/dependencies/pom.xml index 0ac9062147..98ead20b64 100644 --- a/activiti-cloud-notifications-graphql-service/dependencies/pom.xml +++ b/activiti-cloud-notifications-graphql-service/dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-notifications-service-graphql-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT Activiti Cloud Notifications :: GraphQL Dependencies (Bill Of Materials) activiti-cloud-notifications-graphql-dependencies diff --git a/activiti-cloud-notifications-graphql-service/pom.xml b/activiti-cloud-notifications-graphql-service/pom.xml index cd0794ccb0..fc8395dce7 100644 --- a/activiti-cloud-notifications-graphql-service/pom.xml +++ b/activiti-cloud-notifications-graphql-service/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-notifications-service-graphql-parent diff --git a/activiti-cloud-notifications-graphql-service/services/api/pom.xml b/activiti-cloud-notifications-graphql-service/services/api/pom.xml index 5080b06cf7..81897cea7b 100644 --- a/activiti-cloud-notifications-graphql-service/services/api/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/api/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-api Activiti Cloud Notifications :: Services :: GraphQL Api diff --git a/activiti-cloud-notifications-graphql-service/services/events/pom.xml b/activiti-cloud-notifications-graphql-service/services/events/pom.xml index 049a945fc3..6ea50d2436 100644 --- a/activiti-cloud-notifications-graphql-service/services/events/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/events/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-events Activiti Cloud Notifications :: Services :: GraphQL Events diff --git a/activiti-cloud-notifications-graphql-service/services/graphiql/pom.xml b/activiti-cloud-notifications-graphql-service/services/graphiql/pom.xml index 95c2227f23..23f6ba3958 100644 --- a/activiti-cloud-notifications-graphql-service/services/graphiql/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/graphiql/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-graphiql Activiti Cloud Notifications :: Services :: GraphiQL Client diff --git a/activiti-cloud-notifications-graphql-service/services/jpa-query/pom.xml b/activiti-cloud-notifications-graphql-service/services/jpa-query/pom.xml index cda41f2f25..252034f2fe 100644 --- a/activiti-cloud-notifications-graphql-service/services/jpa-query/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/jpa-query/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-jpa-query Activiti Cloud Notifications :: Services :: GraphQL Jpa Query diff --git a/activiti-cloud-notifications-graphql-service/services/pom.xml b/activiti-cloud-notifications-graphql-service/services/pom.xml index e7560e4bf6..c76a6700e7 100644 --- a/activiti-cloud-notifications-graphql-service/services/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-notifications-graphql-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../dependencies activiti-cloud-services-notifications-graphql diff --git a/activiti-cloud-notifications-graphql-service/services/schema/pom.xml b/activiti-cloud-notifications-graphql-service/services/schema/pom.xml index 3650aada60..7cfed5380d 100644 --- a/activiti-cloud-notifications-graphql-service/services/schema/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/schema/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-schema Activiti Cloud Notifications :: Services :: GraphQL Schema diff --git a/activiti-cloud-notifications-graphql-service/services/security/pom.xml b/activiti-cloud-notifications-graphql-service/services/security/pom.xml index c94fd8e7bf..631b18c6b4 100644 --- a/activiti-cloud-notifications-graphql-service/services/security/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/security/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-security Activiti Cloud Notifications :: Services :: GraphQL Security diff --git a/activiti-cloud-notifications-graphql-service/services/subscriptions/pom.xml b/activiti-cloud-notifications-graphql-service/services/subscriptions/pom.xml index e90ed8a126..fb650d5b6a 100644 --- a/activiti-cloud-notifications-graphql-service/services/subscriptions/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/subscriptions/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-subscriptions Activiti Cloud Notifications :: Services :: GraphQL Subscriptions diff --git a/activiti-cloud-notifications-graphql-service/services/web/pom.xml b/activiti-cloud-notifications-graphql-service/services/web/pom.xml index bbbb4cfa51..a9567d6b7c 100644 --- a/activiti-cloud-notifications-graphql-service/services/web/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/web/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-web Activiti Cloud Notifications :: Services :: GraphQL Web diff --git a/activiti-cloud-notifications-graphql-service/services/ws/pom.xml b/activiti-cloud-notifications-graphql-service/services/ws/pom.xml index 232a1f70f4..58826b8416 100644 --- a/activiti-cloud-notifications-graphql-service/services/ws/pom.xml +++ b/activiti-cloud-notifications-graphql-service/services/ws/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-services-notifications-graphql - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-notifications-graphql-ws Activiti Cloud Notifications :: Services :: GraphQL WebSockets diff --git a/activiti-cloud-notifications-graphql-service/starter/pom.xml b/activiti-cloud-notifications-graphql-service/starter/pom.xml index 9fd4577b0b..0b3fc18d92 100644 --- a/activiti-cloud-notifications-graphql-service/starter/pom.xml +++ b/activiti-cloud-notifications-graphql-service/starter/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-notifications-graphql-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../dependencies activiti-cloud-starter-notifications-graphql diff --git a/activiti-cloud-query-service/activiti-cloud-query-dependencies/pom.xml b/activiti-cloud-query-service/activiti-cloud-query-dependencies/pom.xml index e7a25eb328..b9fb1f39e2 100755 --- a/activiti-cloud-query-service/activiti-cloud-query-dependencies/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-query-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-query-service-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-query-dependencies pom diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/pom.xml b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/pom.xml index 6708900d98..212c3004bc 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/pom.xml @@ -3,7 +3,7 @@ org.activiti.cloud activiti-cloud-services-query - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-query-liquibase diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-model/pom.xml b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-model/pom.xml index 7a1c97ccf1..65283826aa 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-model/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-model/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-query - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-query-model Activiti Cloud Query :: Services :: Query Model diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/pom.xml b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/pom.xml index b6b19c354a..fb5fa49ddc 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-repo/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-query - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-query-repo Activiti Cloud Query :: Services :: Query Repo diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/pom.xml b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/pom.xml index 9277a91850..2c94886ff1 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/pom.xml @@ -4,7 +4,7 @@ org.activiti.cloud activiti-cloud-services-query - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT 4.0.0 activiti-cloud-services-query-rest diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/pom.xml b/activiti-cloud-query-service/activiti-cloud-services-query/pom.xml index be3eb44838..3e3bfb0a82 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-query-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-query-dependencies activiti-cloud-services-query diff --git a/activiti-cloud-query-service/activiti-cloud-starter-query/pom.xml b/activiti-cloud-query-service/activiti-cloud-starter-query/pom.xml index 4838ad1fa4..741850150e 100644 --- a/activiti-cloud-query-service/activiti-cloud-starter-query/pom.xml +++ b/activiti-cloud-query-service/activiti-cloud-starter-query/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-query-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-query-dependencies activiti-cloud-starter-query diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index 565c40a454..4eb6b87783 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-query-service-parent diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-runtime-bundle-dependencies/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-runtime-bundle-dependencies/pom.xml index 701e7e8157..85ebaee6b3 100755 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-runtime-bundle-dependencies/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-runtime-bundle-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-runtime-bundle-service-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-runtime-bundle-dependencies pom diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-runtime-bundle-rest-client/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-runtime-bundle-rest-client/pom.xml index 0482dcc0f2..ac12c12035 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-runtime-bundle-rest-client/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-runtime-bundle-rest-client/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-services-runtime-bundle org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-runtime-bundle-rest-client Activiti Cloud Services :: REST API Clients diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-api/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-api/pom.xml index 2092580cef..cb00c4ec65 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-api/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-api/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-api Activiti Cloud Services :: APIs diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-connectors/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-connectors/pom.xml index a9f04e34b3..cf2d4df85e 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-connectors/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-connectors/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-connectors Activiti Cloud Services :: Connectors diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-core/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-core/pom.xml index bf6d72f8ac..5e68ddf80a 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-core/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-core/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-core Activiti Cloud Services :: Core diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-events/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-events/pom.xml index 2ad5541317..9745b5bda8 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-events/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-events/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-events Activiti Cloud Services :: Events diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-identity-basic/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-identity-basic/pom.xml index 844b2fc641..1a235841f8 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-identity-basic/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-identity-basic/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-identity-basic Activiti Cloud Services :: Identity Basic Integration diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-job-executor/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-job-executor/pom.xml index b4fc3359bd..5af4c46e62 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-job-executor/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-job-executor/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-job-executor diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-api/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-api/pom.xml index 23f8ae1df9..3fe3e19d4c 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-api/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-api/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-rest-api Activiti Cloud Services :: REST APIs diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-impl/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-impl/pom.xml index 16a85df6f1..49cd902c41 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-impl/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-rest-impl/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-rest-impl Activiti Cloud Services :: REST Impl diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-subscriptions/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-subscriptions/pom.xml index 409356ff8c..b9ed62f8ff 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-subscriptions/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/activiti-cloud-services-subscriptions/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-subscriptions Activiti Cloud Services :: Subscriptions diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/messages-events/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/messages-events/pom.xml index c4da4f643e..7392839f1c 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/messages-events/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/messages-events/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-services-runtime-bundle - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-services-messages-events diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/pom.xml index 8e53bb83db..53213aef88 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-services-runtime-bundle/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-runtime-bundle-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-runtime-bundle-dependencies activiti-cloud-services-runtime-bundle diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle-it/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle-it/pom.xml index c298d11c3f..b3a1ea08cb 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle-it/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle-it/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-runtime-bundle-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-runtime-bundle-dependencies activiti-cloud-starter-runtime-bundle-it diff --git a/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/pom.xml b/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/pom.xml index cf374969a2..9928a44e24 100644 --- a/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/pom.xml +++ b/activiti-cloud-runtime-bundle-service/activiti-cloud-starter-runtime-bundle/pom.xml @@ -6,7 +6,7 @@ org.activiti.cloud activiti-cloud-runtime-bundle-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-runtime-bundle-dependencies activiti-cloud-starter-runtime-bundle diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index 1c217a97e6..3e77139a68 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-runtime-bundle-service-parent diff --git a/activiti-cloud-service-common/activiti-cloud-service-common-config/pom.xml b/activiti-cloud-service-common/activiti-cloud-service-common-config/pom.xml index bce7f1dcbc..5467720847 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-common-config/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-service-common-config/pom.xml @@ -4,7 +4,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies 4.0.0 diff --git a/activiti-cloud-service-common/activiti-cloud-service-common-dependencies/pom.xml b/activiti-cloud-service-common/activiti-cloud-service-common-dependencies/pom.xml index 569d88bf18..a3a4d1157c 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-common-dependencies/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-service-common-dependencies/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-service-common-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT activiti-cloud-service-common-dependencies pom diff --git a/activiti-cloud-service-common/activiti-cloud-service-common-liquibase/pom.xml b/activiti-cloud-service-common/activiti-cloud-service-common-liquibase/pom.xml index b1760b3984..fab5805a29 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-common-liquibase/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-service-common-liquibase/pom.xml @@ -3,7 +3,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-service-common-liquibase diff --git a/activiti-cloud-service-common/activiti-cloud-service-error-handlers/pom.xml b/activiti-cloud-service-common/activiti-cloud-service-error-handlers/pom.xml index e0c8c5b171..f018740e5d 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-error-handlers/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-service-error-handlers/pom.xml @@ -4,7 +4,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies 4.0.0 diff --git a/activiti-cloud-service-common/activiti-cloud-service-messaging-config/pom.xml b/activiti-cloud-service-common/activiti-cloud-service-messaging-config/pom.xml index a4e598fdf0..0a277c7d63 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-messaging-config/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-service-messaging-config/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies 4.0.0 diff --git a/activiti-cloud-service-common/activiti-cloud-service-messaging-starter/pom.xml b/activiti-cloud-service-common/activiti-cloud-service-messaging-starter/pom.xml index 10a5843464..71843b4a24 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-messaging-starter/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-service-messaging-starter/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies 4.0.0 diff --git a/activiti-cloud-service-common/activiti-cloud-services-auditable/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-auditable/pom.xml index 77bf186a69..fa04796ee9 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-auditable/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-auditable/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-auditable diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-identity-keycloak/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-common-identity-keycloak/pom.xml index a70a204a98..92c5d8a379 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-identity-keycloak/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-common-identity-keycloak/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-service-common-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-common-identity-keycloak diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/pom.xml index bae38b4c4a..67f64b1de9 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security-keycloak/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-common-security-keycloak diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-security/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-common-security/pom.xml index 3c49ded0c9..c2386d117a 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-security/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-common-security/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-common-security diff --git a/activiti-cloud-service-common/activiti-cloud-services-common-util/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-common-util/pom.xml index 2fd8c90bcb..0ae52f7cc7 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-common-util/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-common-util/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-common-util diff --git a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/pom.xml index 2c25aa6985..b2f193d13f 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-dbp-rest diff --git a/activiti-cloud-service-common/activiti-cloud-services-logging/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-logging/pom.xml index 8737b60414..bf315b4b5d 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-logging/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-logging/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-logging diff --git a/activiti-cloud-service-common/activiti-cloud-services-metadata/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-metadata/pom.xml index 347b2501f1..88d7cb2183 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-metadata/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-metadata/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-metadata diff --git a/activiti-cloud-service-common/activiti-cloud-services-monitoring/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-monitoring/pom.xml index 65f4190c2b..06e1f91fd5 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-monitoring/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-monitoring/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-monitoring diff --git a/activiti-cloud-service-common/activiti-cloud-services-swagger/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-swagger/pom.xml index 2ea0167395..c996ef608f 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-swagger/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-swagger/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-swagger diff --git a/activiti-cloud-service-common/activiti-cloud-services-test-containers/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-test-containers/pom.xml index c8149dcd48..c3119ae418 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-test-containers/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-test-containers/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-service-common-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-test-containers diff --git a/activiti-cloud-service-common/activiti-cloud-services-test-security/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-test-security/pom.xml index 20c6ed527b..8f7eb44af0 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-test-security/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-test-security/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-test-security diff --git a/activiti-cloud-service-common/activiti-cloud-services-test/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-test/pom.xml index ff317973b8..b16249b5ec 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-test/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-test/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-service-common-dependencies - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-test diff --git a/activiti-cloud-service-common/activiti-cloud-services-tracing/pom.xml b/activiti-cloud-service-common/activiti-cloud-services-tracing/pom.xml index 93c2f2725a..c4a0181389 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-tracing/pom.xml +++ b/activiti-cloud-service-common/activiti-cloud-services-tracing/pom.xml @@ -5,7 +5,7 @@ activiti-cloud-service-common-dependencies org.activiti.cloud - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-service-common-dependencies activiti-cloud-services-tracing diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index 4b1a3cf13a..e1c5de980e 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -5,7 +5,7 @@ org.activiti.cloud activiti-cloud-build-parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT ../activiti-cloud-build activiti-cloud-service-common-parent diff --git a/pom.xml b/pom.xml index a4ff2fa9fc..e6d0d7623d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ activiti-cloud-mono-aggregator pom Activiti Cloud Mono :: Parent - 8.5.0-SNAPSHOT + 8.6.0-SNAPSHOT Activiti Cloud Mono :: Aggregator http://activiti.org 2017 From 2a7f7bf64765de34c1c803496d4768ca6de78bfa Mon Sep 17 00:00:00 2001 From: Davide Cerbo Date: Thu, 23 May 2024 18:10:32 +0200 Subject: [PATCH 14/24] AAE-22650 add an index on task name (#1445) --- .../22-alter.oracle.schema.8.5.0.sql | 17 ++++++++++++++++ .../changelog/22-alter.pg.schema.8.5.0.sql | 17 ++++++++++++++++ .../config/query/liquibase/master.xml | 20 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.oracle.schema.8.5.0.sql create mode 100644 activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.pg.schema.8.5.0.sql diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.oracle.schema.8.5.0.sql b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.oracle.schema.8.5.0.sql new file mode 100644 index 0000000000..921550ba3f --- /dev/null +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.oracle.schema.8.5.0.sql @@ -0,0 +1,17 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_name_idx ON task (name); diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.pg.schema.8.5.0.sql b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.pg.schema.8.5.0.sql new file mode 100644 index 0000000000..b396748f68 --- /dev/null +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/22-alter.pg.schema.8.5.0.sql @@ -0,0 +1,17 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +CREATE INDEX IF NOT EXISTS task_name_idx ON task (name); diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml index 6d455eb884..7e553c3582 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml @@ -442,4 +442,24 @@ stripComments="true"/> + + + + + + + + From b4fce71c7321f62cf13b80bf72cb6d6e122a8111 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Mon, 27 May 2024 06:27:13 -0700 Subject: [PATCH 15/24] AAE-22508 Add capability to query aggregated data in GraphQL queries (#1450) * update graphql-jpa-query.version to 1.2.6 * enable aggregate Graphql query feature * Add integration tests --- .../pom.xml | 2 +- ...ctivitiGraphQLSchemaAutoConfiguration.java | 20 +++- .../starter/ActivitiGraphQLStarterIT.java | 103 ++++++++++++++++++ .../starter/src/test/resources/data.sql | 4 + 4 files changed, 126 insertions(+), 3 deletions(-) diff --git a/activiti-cloud-notifications-graphql-service/pom.xml b/activiti-cloud-notifications-graphql-service/pom.xml index fc8395dce7..394db3a701 100644 --- a/activiti-cloud-notifications-graphql-service/pom.xml +++ b/activiti-cloud-notifications-graphql-service/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud Notifications GraphQL Service :: Parent pom - 1.2.5 + 1.2.6 diff --git a/activiti-cloud-notifications-graphql-service/services/jpa-query/src/main/java/org/activiti/cloud/services/notifications/graphql/jpa/query/ActivitiGraphQLSchemaAutoConfiguration.java b/activiti-cloud-notifications-graphql-service/services/jpa-query/src/main/java/org/activiti/cloud/services/notifications/graphql/jpa/query/ActivitiGraphQLSchemaAutoConfiguration.java index 0b0f7ae738..32926008f3 100644 --- a/activiti-cloud-notifications-graphql-service/services/jpa-query/src/main/java/org/activiti/cloud/services/notifications/graphql/jpa/query/ActivitiGraphQLSchemaAutoConfiguration.java +++ b/activiti-cloud-notifications-graphql-service/services/jpa-query/src/main/java/org/activiti/cloud/services/notifications/graphql/jpa/query/ActivitiGraphQLSchemaAutoConfiguration.java @@ -21,8 +21,10 @@ import com.introproventures.graphql.jpa.query.autoconfigure.GraphQLJPASchemaBuilderCustomizer; import com.introproventures.graphql.jpa.query.schema.JavaScalars; import graphql.GraphQL; +import java.util.Optional; import org.activiti.cloud.services.query.model.ProcessInstanceEntity; import org.activiti.cloud.services.query.model.VariableValue; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -40,18 +42,32 @@ @EnableGraphQLJpaQuerySchema(basePackageClasses = ProcessInstanceEntity.class) public class ActivitiGraphQLSchemaAutoConfiguration { + @Value("${spring.activiti.cloud.services.notifications.graphql.jpa-query.aggregate.enabled:true}") + private boolean isAggregateEnabled; + @Bean GraphQLJPASchemaBuilderCustomizer graphQLJPASchemaBuilderCustomizer() { return builder -> builder .name("Query") .description("Activiti Cloud Query Schema") + .enableAggregate(isAggregateEnabled) .scalar( VariableValue.class, newScalar() .name("VariableValue") - .description("VariableValue type") - .coercing(new JavaScalars.GraphQLObjectCoercing()) + .coercing( + new JavaScalars.GraphQLObjectCoercing() { + public Object serialize(final Object input) { + return Optional + .ofNullable(input) + .filter(VariableValue.class::isInstance) + .map(VariableValue.class::cast) + .map(it -> Optional.ofNullable(it.getValue()).orElse(Optional.empty())) + .orElseGet(() -> super.serialize(input)); + } + } + ) .build() ); } diff --git a/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java b/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java index 034ea8b896..ceb7dfacaf 100644 --- a/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java +++ b/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java @@ -1418,6 +1418,109 @@ public void testGraphqlArguments() { assertThat("{Tasks={select=[{id=1, assignee=assignee, priority=5}]}}").isEqualTo(result.getData().toString()); } + @Test + public void testGraphqlAggregateTaskVariablesQuery() { + GraphQLQueryRequest query = new GraphQLQueryRequest( + """ + query { + TaskVariables( + # Apply filter criteria + where: {name: {IN: ["variable1", "variable2", "variable3"]}} + ) { + aggregate { + # count by variables + variables: count + # Count by associated tasks + groupByVariableName: group { + name: by(field: name) + count + } + groupByTaskStatus: task { + status: by(field: status) + count + } + # Count by associated tasks + groupByTaskAssignee: task { + assignee: by(field: assignee) + count + } + } + } + } + """ + ); + + ResponseEntity entity = rest.postForEntity( + GRAPHQL_URL, + new HttpEntity<>(query, authHeaders), + GraphQLQueryResult.class + ); + + assertThat(entity.getStatusCode()).describedAs(entity.toString()).isEqualTo(HttpStatus.OK); + + GraphQLQueryResult result = entity.getBody(); + + assertThat(result).isNotNull(); + assertThat(result.getErrors()).isNull(); + + var expected = + "{TaskVariables={aggregate={variables=3, groupByVariableName=[{name=variable1, count=1}, {name=variable2, count=1}, {name=variable3, count=1}], groupByTaskStatus=[{status=COMPLETED, count=2}, {status=CREATED, count=1}], groupByTaskAssignee=[{assignee=assignee, count=3}]}}}"; + + assertThat(result.getData().toString()).isEqualTo(expected); + } + + @Test + public void testGraphqlAggregateTasksQuery() { + GraphQLQueryRequest query = new GraphQLQueryRequest( + """ + query { + Tasks { + aggregate { + countTasks: count + countProcessVariables: count(of: processVariables) + countTaskVariables: count(of: variables) + countTasksGroupedByStatus: group { + status: by(field: status) + count + } + countProcessVariablesGroupedByTaskName: group { + name: by(field: name) + count(of: processVariables) + } + countTaskProcessVariablesGroupedByVariableNameAndValue: processVariables { + name: by(field: name) + value: by(field: value) + count + } + countTaskVariablesGroupedByVariableName: variables { + name: by(field: name) + count + } + } + } + } + """ + ); + + ResponseEntity entity = rest.postForEntity( + GRAPHQL_URL, + new HttpEntity<>(query, authHeaders), + GraphQLQueryResult.class + ); + + assertThat(entity.getStatusCode()).describedAs(entity.toString()).isEqualTo(HttpStatus.OK); + + GraphQLQueryResult result = entity.getBody(); + + assertThat(result).isNotNull(); + assertThat(result.getErrors()).isNull(); + + var expected = + "{Tasks={aggregate={countTasks=6, countProcessVariables=2, countTaskVariables=6, countTasksGroupedByStatus=[{status=ASSIGNED, count=1}, {status=COMPLETED, count=2}, {status=CREATED, count=3}], countProcessVariablesGroupedByTaskName=[{name=task4, count=1}, {name=task5, count=1}], countTaskProcessVariablesGroupedByVariableNameAndValue=[{name=initiator, value={key=[1, 2, 3, 4, 5]}, count=2}], countTaskVariablesGroupedByVariableName=[{name=variable1, count=1}, {name=variable2, count=1}, {name=variable3, count=1}, {name=variable4, count=1}, {name=variable5, count=1}, {name=variable6, count=1}]}}}"; + + assertThat(result.getData().toString()).isEqualTo(expected); + } + public static StringObjectMapBuilder mapBuilder() { return new StringObjectMapBuilder(); } diff --git a/activiti-cloud-notifications-graphql-service/starter/src/test/resources/data.sql b/activiti-cloud-notifications-graphql-service/starter/src/test/resources/data.sql index f30f5cc3bf..a2a8c569df 100644 --- a/activiti-cloud-notifications-graphql-service/starter/src/test/resources/data.sql +++ b/activiti-cloud-notifications-graphql-service/starter/src/test/resources/data.sql @@ -20,3 +20,7 @@ insert into TASK_VARIABLE (id, create_time, execution_id, last_updated_time, nam (5, CURRENT_TIMESTAMP, 'execution_id', CURRENT_TIMESTAMP, 'variable4', 0, '2', 'map', '{"value": { "key" : "data" }}'), (6, CURRENT_TIMESTAMP, 'execution_id', CURRENT_TIMESTAMP, 'variable5', 1, '4', 'String', '{"value": 1.0}'), (7, CURRENT_TIMESTAMP, 'execution_id', CURRENT_TIMESTAMP, 'variable6', 1, '4', 'list', '{"value": [1,2,3,4,5]}'); + +insert into TASK_PROCESS_VARIABLE (task_id, process_variable_id) values + (4,1), + (5,1); From 4480d532205d01b91c5e0351787bba68e5c3c94e Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Tue, 28 May 2024 20:24:47 +0200 Subject: [PATCH 16/24] chore(deps): upgrade Activiti/Activiti to version 8.6.0-alpha.1 (#1452) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index 2dca397091..90e51f8926 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.5.0-alpha.4 + 8.6.0-alpha.1 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index 4eb6b87783..5ff66a3d26 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.5.0-alpha.4 + 8.6.0-alpha.1 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index 3e77139a68..391cc38bc3 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.5.0-alpha.4 + 8.6.0-alpha.1 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index e1c5de980e..d496e5605b 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.5.0-alpha.4 + 8.6.0-alpha.1 1.9.4 1.10 2.6 From 6bbd5628d2549493ca81c11880578901f58344c2 Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Wed, 29 May 2024 12:11:14 +0200 Subject: [PATCH 17/24] chore(deps): upgrade Activiti/Activiti to version 8.6.0-alpha.2 (#1454) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index 90e51f8926..ef25e3e980 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.6.0-alpha.1 + 8.6.0-alpha.2 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index 5ff66a3d26..3fb9b6b16a 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.6.0-alpha.1 + 8.6.0-alpha.2 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index 391cc38bc3..981f72b265 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.6.0-alpha.1 + 8.6.0-alpha.2 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index d496e5605b..ea3afe3716 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.6.0-alpha.1 + 8.6.0-alpha.2 1.9.4 1.10 2.6 From 021c195ff37770937ba1a14e847887bed2306bca Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Wed, 29 May 2024 08:09:45 -0700 Subject: [PATCH 18/24] AAE-22508 Add inline documentation for aggregated data in GraphQL query shema (#1453) * update graphql-jpa-query.version to 1.2.7 * Update ActivitiGraphQLStarterIT tests --- .../pom.xml | 2 +- .../starter/ActivitiGraphQLStarterIT.java | 40 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/activiti-cloud-notifications-graphql-service/pom.xml b/activiti-cloud-notifications-graphql-service/pom.xml index 394db3a701..bdaa493499 100644 --- a/activiti-cloud-notifications-graphql-service/pom.xml +++ b/activiti-cloud-notifications-graphql-service/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud Notifications GraphQL Service :: Parent pom - 1.2.6 + 1.2.7 diff --git a/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java b/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java index ceb7dfacaf..12ad10b560 100644 --- a/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java +++ b/activiti-cloud-notifications-graphql-service/starter/src/test/java/org/activiti/cloud/notifications/graphql/starter/ActivitiGraphQLStarterIT.java @@ -1435,14 +1435,16 @@ public void testGraphqlAggregateTaskVariablesQuery() { name: by(field: name) count } - groupByTaskStatus: task { - status: by(field: status) - count - } - # Count by associated tasks - groupByTaskAssignee: task { - assignee: by(field: assignee) - count + by { + groupByTaskStatus: task { + status: by(field: status) + count + } + # Count by associated tasks + groupByTaskAssignee: task { + assignee: by(field: assignee) + count + } } } } @@ -1464,7 +1466,7 @@ public void testGraphqlAggregateTaskVariablesQuery() { assertThat(result.getErrors()).isNull(); var expected = - "{TaskVariables={aggregate={variables=3, groupByVariableName=[{name=variable1, count=1}, {name=variable2, count=1}, {name=variable3, count=1}], groupByTaskStatus=[{status=COMPLETED, count=2}, {status=CREATED, count=1}], groupByTaskAssignee=[{assignee=assignee, count=3}]}}}"; + "{TaskVariables={aggregate={variables=3, groupByVariableName=[{name=variable1, count=1}, {name=variable2, count=1}, {name=variable3, count=1}], by={groupByTaskStatus=[{status=COMPLETED, count=2}, {status=CREATED, count=1}], groupByTaskAssignee=[{assignee=assignee, count=3}]}}}}"; assertThat(result.getData().toString()).isEqualTo(expected); } @@ -1487,14 +1489,16 @@ public void testGraphqlAggregateTasksQuery() { name: by(field: name) count(of: processVariables) } - countTaskProcessVariablesGroupedByVariableNameAndValue: processVariables { - name: by(field: name) - value: by(field: value) - count - } - countTaskVariablesGroupedByVariableName: variables { - name: by(field: name) - count + by { + countTaskProcessVariablesGroupedByVariableNameAndValue: processVariables { + name: by(field: name) + value: by(field: value) + count + } + countTaskVariablesGroupedByVariableName: variables { + name: by(field: name) + count + } } } } @@ -1516,7 +1520,7 @@ public void testGraphqlAggregateTasksQuery() { assertThat(result.getErrors()).isNull(); var expected = - "{Tasks={aggregate={countTasks=6, countProcessVariables=2, countTaskVariables=6, countTasksGroupedByStatus=[{status=ASSIGNED, count=1}, {status=COMPLETED, count=2}, {status=CREATED, count=3}], countProcessVariablesGroupedByTaskName=[{name=task4, count=1}, {name=task5, count=1}], countTaskProcessVariablesGroupedByVariableNameAndValue=[{name=initiator, value={key=[1, 2, 3, 4, 5]}, count=2}], countTaskVariablesGroupedByVariableName=[{name=variable1, count=1}, {name=variable2, count=1}, {name=variable3, count=1}, {name=variable4, count=1}, {name=variable5, count=1}, {name=variable6, count=1}]}}}"; + "{Tasks={aggregate={countTasks=6, countProcessVariables=2, countTaskVariables=6, countTasksGroupedByStatus=[{status=ASSIGNED, count=1}, {status=COMPLETED, count=2}, {status=CREATED, count=3}], countProcessVariablesGroupedByTaskName=[{name=task4, count=1}, {name=task5, count=1}], by={countTaskProcessVariablesGroupedByVariableNameAndValue=[{name=initiator, value={key=[1, 2, 3, 4, 5]}, count=2}], countTaskVariablesGroupedByVariableName=[{name=variable1, count=1}, {name=variable2, count=1}, {name=variable3, count=1}, {name=variable4, count=1}, {name=variable5, count=1}, {name=variable6, count=1}]}}}}"; assertThat(result.getData().toString()).isEqualTo(expected); } From 3b6579b63f7bc818204edf470b8fdf7efbbcb121 Mon Sep 17 00:00:00 2001 From: Federico D'Ulizia Date: Tue, 4 Jun 2024 15:28:08 +0200 Subject: [PATCH 19/24] AAE-22912 Add index to improve bulk delete performance (#1457) AAE-22912 add index to improve bulk delete performance --- .../23-alter.oracle.schema.8.6.0.sql | 18 +++++++++++++++++ .../changelog/23-alter.pg.schema.8.6.0.sql | 18 +++++++++++++++++ .../config/query/liquibase/master.xml | 20 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.oracle.schema.8.6.0.sql create mode 100644 activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.pg.schema.8.6.0.sql diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.oracle.schema.8.6.0.sql b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.oracle.schema.8.6.0.sql new file mode 100644 index 0000000000..0b2e706517 --- /dev/null +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.oracle.schema.8.6.0.sql @@ -0,0 +1,18 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_process_variable_task_id_idx ON task_process_variable (task_id); +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_process_variable_process_variable_id_idx ON task_process_variable (process_variable_id); diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.pg.schema.8.6.0.sql b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.pg.schema.8.6.0.sql new file mode 100644 index 0000000000..0b2e706517 --- /dev/null +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/changelog/23-alter.pg.schema.8.6.0.sql @@ -0,0 +1,18 @@ +/* + * Copyright 2017-2020 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_process_variable_task_id_idx ON task_process_variable (task_id); +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_process_variable_process_variable_id_idx ON task_process_variable (process_variable_id); diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml index 7e553c3582..6fabf40243 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-liquibase/src/main/resources/config/query/liquibase/master.xml @@ -462,4 +462,24 @@ stripComments="true"/> + + + + + + + + From cbbe5a2801f1987a9bbb08c1c565daabe51b2398 Mon Sep 17 00:00:00 2001 From: Ruggero Corsaletti Date: Mon, 10 Jun 2024 17:54:53 +0200 Subject: [PATCH 20/24] AAE-22377 Exception if user exceed pagination limit (#1449) * [AAE-22377] Exception if user exceed pagination limit * [AAE-22377] code cleanup * [AAE-22377] test fix * [AAE-22377] code cleanup * Fixed comments on PR and handled 400 return code in the Exception Halndler * Fixed comments on PR and handled 400 return code in the Exception Halndler * code cleanup * Swagget Test fix * Changed default result count to 25 elements when maxItems is not specified * Reverted default result count to 100 elements when maxItems is not specified * Cleanup code and changed size parameter to size * Fixed comments in the PR and Test cleanup * Fixed comments in the PR and Test cleanup * Fixed comments in the PR and Test cleanup * Fixed comments in the PR and Test cleanup * Fixed comments in the PR and Test cleanup * Disabled enabled by default * Disabled enabled by default * Disabled enabled by default --- .../rest/CommonExceptionHandlerQuery.java | 11 + .../query/rest/TaskEntityControllerIT.java | 83 +- .../src/test/resources/swagger-expected.json | 810 +++++++++++++----- .../AlfrescoPageArgumentMethodResolver.java | 28 +- .../config/AlfrescoWebAutoConfiguration.java | 12 +- .../config/alfresco-rest-config.properties | 3 + ...lfrescoPageArgumentMethodResolverTest.java | 15 +- .../AlfrescoWebAutoConfigurationTest.java | 2 +- 8 files changed, 718 insertions(+), 246 deletions(-) diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/CommonExceptionHandlerQuery.java b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/CommonExceptionHandlerQuery.java index 849eebbad6..c9eaafb2e2 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/CommonExceptionHandlerQuery.java +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/main/java/org/activiti/cloud/services/query/rest/CommonExceptionHandlerQuery.java @@ -21,6 +21,7 @@ import org.activiti.core.common.spring.security.policies.ActivitiForbiddenException; import org.springframework.hateoas.EntityModel; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -38,4 +39,14 @@ public EntityModel handleAppException( response.setContentType("application/json"); return EntityModel.of(new ActivitiErrorMessageImpl(HttpStatus.FORBIDDEN.value(), ex.getMessage())); } + + @ExceptionHandler(IllegalStateException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public EntityModel handleAppException( + IllegalStateException ex, + HttpServletResponse response + ) { + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + return EntityModel.of(new ActivitiErrorMessageImpl(HttpStatus.BAD_REQUEST.value(), ex.getMessage())); + } } diff --git a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskEntityControllerIT.java b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskEntityControllerIT.java index 6152bb2a9e..9a91cc0fa0 100644 --- a/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskEntityControllerIT.java +++ b/activiti-cloud-query-service/activiti-cloud-services-query/activiti-cloud-services-query-rest/src/test/java/org/activiti/cloud/services/query/rest/TaskEntityControllerIT.java @@ -24,6 +24,7 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.querydsl.core.types.Predicate; @@ -65,13 +66,21 @@ @WebMvcTest(TaskController.class) @Import( - { QueryRestWebMvcAutoConfiguration.class, CommonModelAutoConfiguration.class, AlfrescoWebAutoConfiguration.class } + { + QueryRestWebMvcAutoConfiguration.class, + CommonModelAutoConfiguration.class, + AlfrescoWebAutoConfiguration.class, + CommonExceptionHandlerQuery.class, + } ) @EnableSpringDataWebSupport @AutoConfigureMockMvc @WithMockUser -@TestPropertySource("classpath:application-test.properties") -public class TaskEntityControllerIT { +@TestPropertySource( + locations = { "classpath:application-test.properties" }, + properties = "activiti.cloud.rest.max-items.enabled=true" +) +class TaskEntityControllerIT { @Autowired private MockMvc mockMvc; @@ -114,7 +123,7 @@ void setUp() { } @Test - public void findAllShouldReturnAllResultsUsingAlfrescoMetadataWhenMediaTypeIsApplicationJson() throws Exception { + void findAllShouldReturnAllResultsUsingAlfrescoMetadataWhenMediaTypeIsApplicationJson() throws Exception { //given AlfrescoPageRequest pageRequest = new AlfrescoPageRequest(11, 10, PageRequest.of(0, 20)); @@ -142,7 +151,7 @@ public void findAllShouldReturnAllResultsUsingAlfrescoMetadataWhenMediaTypeIsApp } @Test - public void findAllShouldReturnAllResultsUsingHalWhenMediaTypeIsApplicationHalJson() throws Exception { + void findAllShouldReturnAllResultsUsingHalWhenMediaTypeIsApplicationHalJson() throws Exception { //given PageRequest pageRequest = PageRequest.of(1, 10); @@ -157,7 +166,7 @@ public void findAllShouldReturnAllResultsUsingHalWhenMediaTypeIsApplicationHalJs } @Test - public void findByIdShouldUseAlfrescoMetadataWhenMediaTypeIsApplicationJson() throws Exception { + void findByIdShouldUseAlfrescoMetadataWhenMediaTypeIsApplicationJson() throws Exception { //given TaskEntity taskEntity = buildDefaultTask(); given(entityFinder.findById(eq(taskRepository), eq(taskEntity.getId()), anyString())).willReturn(taskEntity); @@ -174,7 +183,7 @@ public void findByIdShouldUseAlfrescoMetadataWhenMediaTypeIsApplicationJson() th } @Test - public void should_returnCandidates_when_invokeGetTaskById() throws Exception { + void should_returnCandidates_when_invokeGetTaskById() throws Exception { //given TaskEntity taskEntity = buildDefaultTask(); taskEntity.setTaskCandidateGroups(buildCandidateGroups(taskEntity)); @@ -227,7 +236,7 @@ private Set buildCandidateUsers(TaskEntity taskEntity) } @Test - public void should_returnTaskPermissions_when_invokeGetTaskById() throws Exception { + void should_returnTaskPermissions_when_invokeGetTaskById() throws Exception { //given TaskEntity taskEntity = buildDefaultTask(); taskEntity.setTaskCandidateUsers(buildCandidateUsers(taskEntity)); @@ -250,4 +259,62 @@ public void should_returnTaskPermissions_when_invokeGetTaskById() throws Excepti .ofLength(1) .thatContains(TaskPermissions.VIEW); } + + @Test + void should_returnBadRequest_when_invokeWithPagingParametersExceedingLimits() throws Exception { + //given + AlfrescoPageRequest pageRequest = new AlfrescoPageRequest(1000, 1000, PageRequest.of(0, 1000)); + + given(taskRepository.findAll(any(), eq(pageRequest))) + .willReturn(new PageImpl<>(Collections.singletonList(buildDefaultTask()), pageRequest, 2000)); + + //when + mockMvc + .perform(get("/v1/tasks?skipCount=1000&maxItems=1001").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.entry.message").value("Exceeded max limit of 1000 elements")); + } + + @Test + void should_returnBadRequest_when_invokeWithPageParameterExceedingLimits() throws Exception { + //given + AlfrescoPageRequest pageRequest = new AlfrescoPageRequest(1000, 1000, PageRequest.of(0, 1000)); + + given(taskRepository.findAll(any(), eq(pageRequest))) + .willReturn(new PageImpl<>(Collections.singletonList(buildDefaultTask()), pageRequest, 2000)); + + //when + mockMvc + .perform(get("/v1/tasks?page=0&size=1001").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.entry.message").value("Exceeded max limit of 1000 elements")); + } + + @Test + void should_returnOK_when_invokeWithPagingParametersWithinLimits() throws Exception { + //given + AlfrescoPageRequest pageRequest = new AlfrescoPageRequest(0, 1000, PageRequest.of(0, 20)); + + given(taskRepository.findAll(any(), eq(pageRequest))) + .willReturn(new PageImpl<>(Collections.singletonList(buildDefaultTask()), pageRequest, 1001)); + + //when + mockMvc + .perform(get("/v1/tasks?skipCount=0&maxItems=1000").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + void should_returnOK_when_invokeWithPageParameterWithinLimits() throws Exception { + //given + PageRequest pageRequest = PageRequest.of(0, 1000); + + given(taskRepository.findAll(any(), eq(pageRequest))) + .willReturn(new PageImpl<>(Collections.singletonList(buildDefaultTask()), pageRequest, 1001)); + + //when + mockMvc + .perform(get("/v1/tasks?page=0&size=1000").accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } } diff --git a/activiti-cloud-query-service/activiti-cloud-starter-query/src/test/resources/swagger-expected.json b/activiti-cloud-query-service/activiti-cloud-starter-query/src/test/resources/swagger-expected.json index ac0ade52c4..2c11819e3a 100644 --- a/activiti-cloud-query-service/activiti-cloud-starter-query/src/test/resources/swagger-expected.json +++ b/activiti-cloud-query-service/activiti-cloud-starter-query/src/test/resources/swagger-expected.json @@ -389,6 +389,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -770,6 +780,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -1095,6 +1115,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -1396,6 +1426,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -1690,6 +1730,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -1946,6 +1996,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2354,6 +2414,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2455,6 +2525,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2512,6 +2592,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2569,6 +2659,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2632,6 +2732,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2939,6 +3049,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -2996,6 +3116,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3104,6 +3234,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3204,6 +3344,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3502,6 +3652,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3559,6 +3719,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3696,6 +3866,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3753,6 +3933,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3847,6 +4037,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -3948,6 +4148,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4005,6 +4215,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4062,6 +4282,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4125,6 +4355,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4209,6 +4449,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4266,6 +4516,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4323,6 +4583,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4380,6 +4650,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4488,6 +4768,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4574,6 +4864,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4660,6 +4960,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4717,6 +5027,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4854,6 +5174,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -4911,6 +5241,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -5005,6 +5345,16 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntryResponseContentActivitiErrorMessage" + } + } + } + }, "200": { "description": "OK", "content": { @@ -5109,19 +5459,19 @@ "title": "CloudVariableInstance_ProcessVariables", "type": "object", "properties": { - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5136,14 +5486,14 @@ "type": { "type": "string" }, + "processInstanceId": { + "type": "string" + }, "taskVariable": { "type": "boolean" }, "taskId": { "type": "string" - }, - "processInstanceId": { - "type": "string" } } }, @@ -5231,19 +5581,19 @@ "$ref": "#/components/schemas/CloudVariableInstance_ProcessVariables" } }, - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5273,44 +5623,6 @@ "type": "integer", "format": "int32" }, - "status": { - "type": "string", - "enum": [ - "CREATED", - "ASSIGNED", - "SUSPENDED", - "COMPLETED", - "CANCELLED", - "DELETED" - ] - }, - "description": { - "type": "string" - }, - "businessKey": { - "type": "string" - }, - "completedBy": { - "type": "string" - }, - "createdDate": { - "type": "string", - "format": "date-time" - }, - "dueDate": { - "type": "string", - "format": "date-time" - }, - "assignee": { - "type": "string" - }, - "claimedDate": { - "type": "string", - "format": "date-time" - }, - "formKey": { - "type": "string" - }, "candidateUsers": { "type": "array", "items": { @@ -5323,6 +5635,12 @@ "type": "string" } }, + "processInstanceId": { + "type": "string" + }, + "processDefinitionId": { + "type": "string" + }, "completedDate": { "type": "string", "format": "date-time" @@ -5333,10 +5651,42 @@ "taskDefinitionKey": { "type": "string" }, - "processInstanceId": { + "businessKey": { "type": "string" }, - "processDefinitionId": { + "formKey": { + "type": "string" + }, + "assignee": { + "type": "string" + }, + "claimedDate": { + "type": "string", + "format": "date-time" + }, + "completedBy": { + "type": "string" + }, + "createdDate": { + "type": "string", + "format": "date-time" + }, + "dueDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "enum": [ + "CREATED", + "ASSIGNED", + "SUSPENDED", + "COMPLETED", + "CANCELLED", + "DELETED" + ] + }, + "description": { "type": "string" } } @@ -5345,19 +5695,19 @@ "title": "CloudVariableInstance", "type": "object", "properties": { - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5372,14 +5722,14 @@ "type": { "type": "string" }, + "processInstanceId": { + "type": "string" + }, "taskVariable": { "type": "boolean" }, "taskId": { "type": "string" - }, - "processInstanceId": { - "type": "string" } } }, @@ -5445,19 +5795,19 @@ "title": "CloudVariableInstance_General", "type": "object", "properties": { - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5472,14 +5822,14 @@ "type": { "type": "string" }, + "processInstanceId": { + "type": "string" + }, "taskVariable": { "type": "boolean" }, "taskId": { "type": "string" - }, - "processInstanceId": { - "type": "string" } } }, @@ -5518,19 +5868,19 @@ "$ref": "#/components/schemas/CloudVariableInstance_General" } }, - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5560,44 +5910,6 @@ "type": "integer", "format": "int32" }, - "status": { - "type": "string", - "enum": [ - "CREATED", - "ASSIGNED", - "SUSPENDED", - "COMPLETED", - "CANCELLED", - "DELETED" - ] - }, - "description": { - "type": "string" - }, - "businessKey": { - "type": "string" - }, - "completedBy": { - "type": "string" - }, - "createdDate": { - "type": "string", - "format": "date-time" - }, - "dueDate": { - "type": "string", - "format": "date-time" - }, - "assignee": { - "type": "string" - }, - "claimedDate": { - "type": "string", - "format": "date-time" - }, - "formKey": { - "type": "string" - }, "candidateUsers": { "type": "array", "items": { @@ -5610,6 +5922,12 @@ "type": "string" } }, + "processInstanceId": { + "type": "string" + }, + "processDefinitionId": { + "type": "string" + }, "completedDate": { "type": "string", "format": "date-time" @@ -5620,10 +5938,42 @@ "taskDefinitionKey": { "type": "string" }, - "processInstanceId": { + "businessKey": { "type": "string" }, - "processDefinitionId": { + "formKey": { + "type": "string" + }, + "assignee": { + "type": "string" + }, + "claimedDate": { + "type": "string", + "format": "date-time" + }, + "completedBy": { + "type": "string" + }, + "createdDate": { + "type": "string", + "format": "date-time" + }, + "dueDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "enum": [ + "CREATED", + "ASSIGNED", + "SUSPENDED", + "COMPLETED", + "CANCELLED", + "DELETED" + ] + }, + "description": { "type": "string" } } @@ -5632,19 +5982,19 @@ "title": "CloudProcessInstance_ProcessVariables", "type": "object", "properties": { - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5666,35 +6016,35 @@ "processDefinitionName": { "type": "string" }, - "status": { + "processDefinitionId": { + "type": "string" + }, + "completedDate": { "type": "string", - "enum": [ - "CREATED", - "RUNNING", - "SUSPENDED", - "CANCELLED", - "COMPLETED" - ] + "format": "date-time" }, - "parentId": { + "businessKey": { "type": "string" }, "initiator": { "type": "string" }, - "businessKey": { - "type": "string" - }, "startDate": { "type": "string", "format": "date-time" }, - "completedDate": { - "type": "string", - "format": "date-time" - }, - "processDefinitionId": { + "parentId": { "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "CREATED", + "RUNNING", + "SUSPENDED", + "CANCELLED", + "COMPLETED" + ] } } }, @@ -5735,19 +6085,19 @@ "title": "CloudProcessInstance_General", "type": "object", "properties": { - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5769,35 +6119,35 @@ "processDefinitionName": { "type": "string" }, - "status": { + "processDefinitionId": { + "type": "string" + }, + "completedDate": { "type": "string", - "enum": [ - "CREATED", - "RUNNING", - "SUSPENDED", - "CANCELLED", - "COMPLETED" - ] + "format": "date-time" }, - "parentId": { + "businessKey": { "type": "string" }, "initiator": { "type": "string" }, - "businessKey": { - "type": "string" - }, "startDate": { "type": "string", "format": "date-time" }, - "completedDate": { - "type": "string", - "format": "date-time" - }, - "processDefinitionId": { + "parentId": { "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "CREATED", + "RUNNING", + "SUSPENDED", + "CANCELLED", + "COMPLETED" + ] } } }, @@ -5863,19 +6213,19 @@ "title": "CloudProcessDefinition", "type": "object", "properties": { - "serviceName": { + "serviceFullName": { "type": "string" }, - "appName": { + "serviceVersion": { "type": "string" }, - "serviceType": { + "serviceName": { "type": "string" }, - "serviceFullName": { + "appName": { "type": "string" }, - "serviceVersion": { + "serviceType": { "type": "string" }, "appVersion": { @@ -5894,14 +6244,14 @@ "type": "integer", "format": "int32" }, - "description": { - "type": "string" - }, "formKey": { "type": "string" }, "category": { "type": "string" + }, + "description": { + "type": "string" } } }, @@ -6000,6 +6350,21 @@ "type": "integer", "format": "int32" }, + "completedDate": { + "type": "string", + "format": "date-time" + }, + "cancelledDate": { + "type": "string", + "format": "date-time" + }, + "startedDate": { + "type": "string", + "format": "date-time" + }, + "businessKey": { + "type": "string" + }, "status": { "type": "string", "enum": [ @@ -6009,20 +6374,11 @@ "ERROR" ] }, - "businessKey": { + "serviceFullName": { "type": "string" }, - "startedDate": { - "type": "string", - "format": "date-time" - }, - "completedDate": { - "type": "string", - "format": "date-time" - }, - "cancelledDate": { - "type": "string", - "format": "date-time" + "serviceVersion": { + "type": "string" }, "serviceName": { "type": "string" @@ -6033,25 +6389,16 @@ "serviceType": { "type": "string" }, - "serviceFullName": { - "type": "string" - }, - "serviceVersion": { - "type": "string" - }, "appVersion": { "type": "string" }, - "executionId": { - "type": "string" - }, "activityType": { "type": "string" }, "activityName": { "type": "string" }, - "elementId": { + "executionId": { "type": "string" }, "processInstanceId": { @@ -6059,6 +6406,9 @@ }, "processDefinitionId": { "type": "string" + }, + "elementId": { + "type": "string" } } }, @@ -6102,29 +6452,6 @@ "errorMessage": { "type": "string" }, - "status": { - "type": "string", - "enum": [ - "INTEGRATION_REQUESTED", - "INTEGRATION_RESULT_RECEIVED", - "INTEGRATION_ERROR_RECEIVED" - ] - }, - "errorCode": { - "type": "string" - }, - "requestDate": { - "type": "string", - "format": "date-time" - }, - "resultDate": { - "type": "string", - "format": "date-time" - }, - "errorDate": { - "type": "string", - "format": "date-time" - }, "stackTraceElements": { "type": "array", "items": { @@ -6161,6 +6488,29 @@ "errorClassName": { "type": "string" }, + "requestDate": { + "type": "string", + "format": "date-time" + }, + "resultDate": { + "type": "string", + "format": "date-time" + }, + "errorDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "enum": [ + "INTEGRATION_REQUESTED", + "INTEGRATION_RESULT_RECEIVED", + "INTEGRATION_ERROR_RECEIVED" + ] + }, + "errorCode": { + "type": "string" + }, "id": { "type": "string" }, @@ -6177,22 +6527,10 @@ "parentProcessInstanceId": { "type": "string" }, - "clientId": { - "type": "string" - }, - "clientName": { - "type": "string" - }, - "businessKey": { - "type": "string" - }, - "executionId": { - "type": "string" - }, - "clientType": { + "processInstanceId": { "type": "string" }, - "appVersion": { + "processDefinitionId": { "type": "string" }, "outBoundVariables": { @@ -6210,19 +6548,22 @@ "type": "object" } }, - "processInstanceId": { + "appVersion": { "type": "string" }, - "processDefinitionId": { + "executionId": { "type": "string" }, - "serviceName": { + "businessKey": { "type": "string" }, - "appName": { + "clientType": { "type": "string" }, - "serviceType": { + "clientId": { + "type": "string" + }, + "clientName": { "type": "string" }, "serviceFullName": { @@ -6230,6 +6571,15 @@ }, "serviceVersion": { "type": "string" + }, + "serviceName": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "serviceType": { + "type": "string" } } }, diff --git a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolver.java b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolver.java index ecd2e18af7..15ff3b1798 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolver.java +++ b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolver.java @@ -29,12 +29,19 @@ public class AlfrescoPageArgumentMethodResolver implements PageableArgumentResol private final AlfrescoPageParameterParser pageParameterParser; private final PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver; + private final int maxItemsLimit; + private final boolean maxItemsLimitEnabled; + public AlfrescoPageArgumentMethodResolver( AlfrescoPageParameterParser pageParameterParser, - PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver + PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver, + int maxItemsLimit, + boolean maxItemsLimitEnabled ) { this.pageParameterParser = pageParameterParser; this.pageableHandlerMethodArgumentResolver = pageableHandlerMethodArgumentResolver; + this.maxItemsLimit = maxItemsLimit; + this.maxItemsLimitEnabled = maxItemsLimitEnabled; } @Override @@ -58,7 +65,10 @@ public Pageable resolveArgument( ); AlfrescoQueryParameters alfrescoQueryParameters = pageParameterParser.parseParameters(webRequest); - if ( + + if (isPaginationValueExceedingLimit(alfrescoQueryParameters, basePageable)) { + throw new IllegalStateException("Exceeded max limit of " + maxItemsLimit + " elements"); + } else if ( alfrescoQueryParameters.getSkipCountParameter().isSet() || alfrescoQueryParameters.getMaxItemsParameter().isSet() ) { @@ -71,4 +81,18 @@ public Pageable resolveArgument( return basePageable; } } + + private boolean isPaginationValueExceedingLimit( + AlfrescoQueryParameters alfrescoQueryParameters, + Pageable basePageable + ) { + if (maxItemsLimitEnabled) { + if (alfrescoQueryParameters.getMaxItemsParameter().isSet()) { + return alfrescoQueryParameters.getMaxItemsParameter().getValue() > maxItemsLimit; + } else { + return basePageable.getPageSize() > maxItemsLimit; + } + } + return false; + } } diff --git a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfiguration.java b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfiguration.java index 1d9cf1d765..30fe19aa08 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfiguration.java +++ b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfiguration.java @@ -50,13 +50,19 @@ public class AlfrescoWebAutoConfiguration implements WebMvcConfigurer { private final PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver; private final int defaultPageSize; + private final int maxItemsLimit; + private final boolean maxItemsLimitEnabled; public AlfrescoWebAutoConfiguration( @Lazy PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver, - @Value("${spring.data.rest.default-page-size:100}") int defaultPageSize + @Value("${spring.data.rest.default-page-size:100}") int defaultPageSize, + @Value("${activiti.cloud.rest.max-items}") int maxItemsLimit, + @Value("${activiti.cloud.rest.max-items.enabled}") boolean maxItemsLimitEnabled ) { this.pageableHandlerMethodArgumentResolver = pageableHandlerMethodArgumentResolver; this.defaultPageSize = defaultPageSize; + this.maxItemsLimit = maxItemsLimit; + this.maxItemsLimitEnabled = maxItemsLimitEnabled; } @Override @@ -65,7 +71,9 @@ public void addArgumentResolvers(List resolvers) 0, new AlfrescoPageArgumentMethodResolver( new AlfrescoPageParameterParser(defaultPageSize), - pageableHandlerMethodArgumentResolver + pageableHandlerMethodArgumentResolver, + maxItemsLimit, + maxItemsLimitEnabled ) ); } diff --git a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/resources/config/alfresco-rest-config.properties b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/resources/config/alfresco-rest-config.properties index bcb9197005..18083da80a 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/resources/config/alfresco-rest-config.properties +++ b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/main/resources/config/alfresco-rest-config.properties @@ -1,3 +1,6 @@ spring.data.rest.default-page-size=100 spring.data.rest.default-media-type=application/json spring.hateoas.use-hal-as-default-json-media-type=false + +activiti.cloud.rest.max-items=${MAX_ITEMS_LIMIT:1000} +activiti.cloud.rest.max-items.enabled=${MAX_ITEMS_LIMIT_ENABLED:true} diff --git a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolverTest.java b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolverTest.java index 40c4aa933e..2080225f58 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolverTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/argument/resolver/AlfrescoPageArgumentMethodResolverTest.java @@ -20,11 +20,10 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import java.util.Collections; import org.activiti.test.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.core.MethodParameter; @@ -37,7 +36,6 @@ @ExtendWith(MockitoExtension.class) public class AlfrescoPageArgumentMethodResolverTest { - @InjectMocks private AlfrescoPageArgumentMethodResolver alfrescoPageArgumentMethodResolver; @Mock @@ -46,6 +44,17 @@ public class AlfrescoPageArgumentMethodResolverTest { @Mock private PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver; + @BeforeEach + public void setUp() { + this.alfrescoPageArgumentMethodResolver = + new AlfrescoPageArgumentMethodResolver( + pageParameterParser, + pageableHandlerMethodArgumentResolver, + 1000, + true + ); + } + @Test public void supportsParameterShouldReturnTrueWhenItsAPageable() throws Exception { //given diff --git a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfigurationTest.java b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfigurationTest.java index 345686cb7e..da5e565722 100644 --- a/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfigurationTest.java +++ b/activiti-cloud-service-common/activiti-cloud-services-dbp-rest/src/test/java/org/activiti/cloud/alfresco/config/AlfrescoWebAutoConfigurationTest.java @@ -45,7 +45,7 @@ public class AlfrescoWebAutoConfigurationTest { @BeforeEach public void setUp() { - configurer = new AlfrescoWebAutoConfiguration(pageableHandlerMethodArgumentResolver, 100); + configurer = new AlfrescoWebAutoConfiguration(pageableHandlerMethodArgumentResolver, 100, 1000, true); } @Test From 12b440a4bace3cad62f1c90a04a3a66532d04d31 Mon Sep 17 00:00:00 2001 From: Akhilesh Pamidimarthi <124860722+AkhileshPamidimarthi@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:59:58 +0530 Subject: [PATCH 21/24] AAE-22627 Replaced log.warn to debug (#1461) --- .../config/ActivitiMessagingDestinationTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activiti-cloud-service-common/activiti-cloud-service-messaging-config/src/main/java/org/activiti/cloud/common/messaging/config/ActivitiMessagingDestinationTransformer.java b/activiti-cloud-service-common/activiti-cloud-service-messaging-config/src/main/java/org/activiti/cloud/common/messaging/config/ActivitiMessagingDestinationTransformer.java index b1d2269490..05623c6505 100644 --- a/activiti-cloud-service-common/activiti-cloud-service-messaging-config/src/main/java/org/activiti/cloud/common/messaging/config/ActivitiMessagingDestinationTransformer.java +++ b/activiti-cloud-service-common/activiti-cloud-service-messaging-config/src/main/java/org/activiti/cloud/common/messaging/config/ActivitiMessagingDestinationTransformer.java @@ -59,7 +59,7 @@ public String apply(String source) { .filter(StringUtils::hasText) .orElse(source); - log.warn( + log.debug( "Processing source destination '{}' with prefix '{}' and separator '{} to target name '{}' with scope '{}'", source, prefix, From bcdb3378634ab08b40e7e01855e2e4740d0f8286 Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Thu, 13 Jun 2024 16:26:18 +0200 Subject: [PATCH 22/24] chore(deps): upgrade Activiti/Activiti to version 8.6.0-alpha.3 (#1463) from: https://github.com/Activiti/Activiti Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index ef25e3e980..bf784acd46 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.6.0-alpha.2 + 8.6.0-alpha.3 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index 3fb9b6b16a..2ef5fb7701 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.6.0-alpha.2 + 8.6.0-alpha.3 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index 981f72b265..e547e264a1 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.6.0-alpha.2 + 8.6.0-alpha.3 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index ea3afe3716..4735791c5b 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.6.0-alpha.2 + 8.6.0-alpha.3 1.9.4 1.10 2.6 From 65a6504fea04fea3e731298598d4aa58dce263fa Mon Sep 17 00:00:00 2001 From: Alfresco Build <8039454+alfresco-build@users.noreply.github.com> Date: Mon, 17 Jun 2024 11:07:23 +0200 Subject: [PATCH 23/24] chore(deps): upgrade Activiti/Activiti to version 8.6.0-alpha.5 (#1464) * chore(deps): upgrade Activiti/Activiti to version 8.6.0-alpha.4 from: https://github.com/Activiti/Activiti * chore(deps): upgrade Activiti/Activiti to version 8.6.0-alpha.5 from: https://github.com/Activiti/Activiti --------- Co-authored-by: alfresco-build <> --- activiti-cloud-api/pom.xml | 2 +- activiti-cloud-query-service/pom.xml | 2 +- activiti-cloud-runtime-bundle-service/pom.xml | 2 +- activiti-cloud-service-common/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activiti-cloud-api/pom.xml b/activiti-cloud-api/pom.xml index bf784acd46..039231ff7b 100644 --- a/activiti-cloud-api/pom.xml +++ b/activiti-cloud-api/pom.xml @@ -12,7 +12,7 @@ Activiti Cloud :: Runtime API Parent pom - 8.6.0-alpha.3 + 8.6.0-alpha.5 activiti-cloud-api-dependencies diff --git a/activiti-cloud-query-service/pom.xml b/activiti-cloud-query-service/pom.xml index 2ef5fb7701..0f9bcce08f 100644 --- a/activiti-cloud-query-service/pom.xml +++ b/activiti-cloud-query-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-query - 8.6.0-alpha.3 + 8.6.0-alpha.5 diff --git a/activiti-cloud-runtime-bundle-service/pom.xml b/activiti-cloud-runtime-bundle-service/pom.xml index e547e264a1..0a4ab0ef8b 100644 --- a/activiti-cloud-runtime-bundle-service/pom.xml +++ b/activiti-cloud-runtime-bundle-service/pom.xml @@ -18,7 +18,7 @@ activiti-cloud-starter-runtime-bundle-it - 8.6.0-alpha.3 + 8.6.0-alpha.5 1.5 diff --git a/activiti-cloud-service-common/pom.xml b/activiti-cloud-service-common/pom.xml index 4735791c5b..cc3db8e7b8 100644 --- a/activiti-cloud-service-common/pom.xml +++ b/activiti-cloud-service-common/pom.xml @@ -34,7 +34,7 @@ activiti-cloud-service-messaging-starter - 8.6.0-alpha.3 + 8.6.0-alpha.5 1.9.4 1.10 2.6 From e6153913c038999ee5de4d851236a6ad65f36777 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 10:11:28 +0200 Subject: [PATCH 24/24] build(deps): bump Alfresco/alfresco-build-tools from 5.22.1 to 5.28.3 (#1465) Bumps [Alfresco/alfresco-build-tools](https://github.com/alfresco/alfresco-build-tools) from 5.22.1 to 5.28.3. - [Release notes](https://github.com/alfresco/alfresco-build-tools/releases) - [Commits](https://github.com/alfresco/alfresco-build-tools/compare/a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584...692f336894abea26ff555cdef6e098f415c47286) --- updated-dependencies: - dependency-name: Alfresco/alfresco-build-tools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/create-github-prerelease.yaml | 4 ++-- .github/workflows/main.yml | 16 ++++++++-------- .github/workflows/pr-closed.yaml | 2 +- .../versions-propagation-auto-merge.yml | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/create-github-prerelease.yaml b/.github/workflows/create-github-prerelease.yaml index 02504993e5..4c010af24f 100644 --- a/.github/workflows/create-github-prerelease.yaml +++ b/.github/workflows/create-github-prerelease.yaml @@ -20,13 +20,13 @@ jobs: - run: touch release.yaml - - uses: Alfresco/alfresco-build-tools/.github/actions/update-project-base-tag@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/update-project-base-tag@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: release-descriptor: release.yaml project: activiti tag: ${{ steps.resolve-versions.outputs.activiti-tag }} - - uses: Alfresco/alfresco-build-tools/.github/actions/update-project-base-tag@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/update-project-base-tag@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: release-descriptor: release.yaml project: activitiCloud diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cde26eeae6..328852a7dd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -32,7 +32,7 @@ jobs: - name: Check dependabot build uses: Activiti/Activiti/.github/actions/check-ext-build@4db084fcbb13a288f3b66ac08fc50a5ab7f144ed # 8.0.0-alpha.10 - name: pre-commit - uses: Alfresco/alfresco-build-tools/.github/actions/pre-commit@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + uses: Alfresco/alfresco-build-tools/.github/actions/pre-commit@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: skip_checkout: true - name: Ensure SHA pinned actions @@ -72,7 +72,7 @@ jobs: GITHUB_PR_NUMBER=PR-${{ github.event.pull_request.number }} echo "version=0.0.1-${GITHUB_PR_NUMBER}-SNAPSHOT" >> $GITHUB_OUTPUT - - uses: Alfresco/alfresco-build-tools/.github/actions/update-pom-to-next-pre-release@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/update-pom-to-next-pre-release@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 id: update-pom-to-next-version with: version: ${{ steps.resolve-override-version.outputs.version }} @@ -165,7 +165,7 @@ jobs: version: v3.5.2 - name: Set up rancher - uses: Alfresco/alfresco-build-tools/.github/actions/setup-rancher-cli@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + uses: Alfresco/alfresco-build-tools/.github/actions/setup-rancher-cli@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: url: ${{ secrets.RANCHER2_URL }} access-key: ${{ secrets.RANCHER2_ACCESS_KEY }} @@ -353,7 +353,7 @@ jobs: MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }} MAVEN_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} - - uses: Alfresco/alfresco-build-tools/.github/actions/git-commit-changes@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/git-commit-changes@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: username: ${{ secrets.BOT_GITHUB_USERNAME }} add-options: -u @@ -376,7 +376,7 @@ jobs: DEVELOPMENT_BRANCH: ${{ github.ref_name }} steps: - uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f # v4.1.3 - - uses: Alfresco/alfresco-build-tools/.github/actions/jx-updatebot-pr@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/jx-updatebot-pr@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: version: ${{ needs.build.outputs.version }} auto-merge: 'true' @@ -413,12 +413,12 @@ jobs: yq -i e '.activiti-cloud-connector.image.tag = env(VERSION)' values.yaml yq -i e '.activiti-cloud-identity-adapter.image.tag = env(VERSION)' values.yaml - - uses: Alfresco/alfresco-build-tools/.github/actions/setup-helm-docs@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/setup-helm-docs@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 - name: Update helm docs working-directory: ${{ env.FULL_CHART_DIR}} run: helm-docs - - uses: Alfresco/alfresco-build-tools/.github/actions/git-commit-changes@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/git-commit-changes@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: username: ${{ secrets.BOT_GITHUB_USERNAME }} add-options: -u @@ -441,7 +441,7 @@ jobs: if: always() && failure() && github.event_name == 'push' steps: - name: Slack Notification - uses: Alfresco/alfresco-build-tools/.github/actions/send-slack-notification@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + uses: Alfresco/alfresco-build-tools/.github/actions/send-slack-notification@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: channel-id: 'eng-hxp-studio-activiti-gh-notifs' token: ${{ secrets.SLACK_NOTIFICATION_BOT_TOKEN }} diff --git a/.github/workflows/pr-closed.yaml b/.github/workflows/pr-closed.yaml index 5270132869..190cfec32c 100644 --- a/.github/workflows/pr-closed.yaml +++ b/.github/workflows/pr-closed.yaml @@ -26,7 +26,7 @@ jobs: version: v1.19.6 - name: Set up rancher - uses: Alfresco/alfresco-build-tools/.github/actions/setup-rancher-cli@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + uses: Alfresco/alfresco-build-tools/.github/actions/setup-rancher-cli@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: url: ${{ secrets.RANCHER2_URL }} access-key: ${{ secrets.RANCHER2_ACCESS_KEY }} diff --git a/.github/workflows/versions-propagation-auto-merge.yml b/.github/workflows/versions-propagation-auto-merge.yml index 802ba62ab1..3f5c256706 100644 --- a/.github/workflows/versions-propagation-auto-merge.yml +++ b/.github/workflows/versions-propagation-auto-merge.yml @@ -9,7 +9,7 @@ jobs: versions-propagation-auto-merge: runs-on: ubuntu-latest steps: - - uses: Alfresco/alfresco-build-tools/.github/actions/automate-propagation@a3f5a4ae53302e9a1f9dc728dee0f4069c1bc584 # v5.22.1 + - uses: Alfresco/alfresco-build-tools/.github/actions/automate-propagation@692f336894abea26ff555cdef6e098f415c47286 # v5.28.3 with: auto-merge-token: ${{ secrets.BOT_GITHUB_TOKEN }} approval-token: ${{ secrets.GITHUB_TOKEN }}