commit 2f9c0a5c9ecbefd0305a0bd318c4fba3df4c16b6 Author: Andreas Isler Date: Fri May 22 14:59:58 2026 +0200 Initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..502631a Binary files /dev/null and b/.DS_Store differ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..48e8bbd --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..6b6ce83 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,19 @@ + + + + + postgresql + true + true + $PROJECT_DIR$/customer-control/src/main/resources/application.properties + org.postgresql.Driver + jdbc:postgresql://localhost:5435/flowable + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..655a70f --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..81a5c40 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c4e36e4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..29a0f78 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/customer-control/.DS_Store b/customer-control/.DS_Store new file mode 100644 index 0000000..fbfcadb Binary files /dev/null and b/customer-control/.DS_Store differ diff --git a/customer-control/pom.xml b/customer-control/pom.xml new file mode 100644 index 0000000..9d15297 --- /dev/null +++ b/customer-control/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + + com.customer + customer-parent + 0.0.1-SNAPSHOT + + + customer-control + customer-control + customer-control + + + + + + + + + + + + + + + + + + + + com.flowable.control + flowable-spring-boot-starter-control + ${com.flowable.platform.version} + + + org.postgresql + postgresql + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/customer-control/src/main/java/com/customer/control/ControlApplication.java b/customer-control/src/main/java/com/customer/control/ControlApplication.java new file mode 100644 index 0000000..d1f4e02 --- /dev/null +++ b/customer-control/src/main/java/com/customer/control/ControlApplication.java @@ -0,0 +1,12 @@ +package com.customer.control; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ControlApplication { + + public static void main(String[] args) { + SpringApplication.run(ControlApplication.class, args); + } +} diff --git a/customer-control/src/main/resources/application.properties b/customer-control/src/main/resources/application.properties new file mode 100644 index 0000000..28207ea --- /dev/null +++ b/customer-control/src/main/resources/application.properties @@ -0,0 +1,34 @@ +server.port=8107 +server.servlet.context-path=/ + +#spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5435/flowable +spring.datasource.username=flowable +spring.datasource.password=flowable + +# In order for hot swapping to work for the custom.js and custom.css +spring.thymeleaf.cache=false +spring.web.resources.chain.cache=false + +# Enable all endpoints over HTTP +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=ALWAYS +# Pretty-print JSON responses +spring.jackson.serialization.indent_output=true + +# TODO Change these to an other random string with a length of 16 characters +# Used to encrypt your passwords. After a change existing password become invalid! +flowable.control.app.security.encryption.credentials-i-v-spec=fh39chqoxjDF3fhb +flowable.control.app.security.encryption.credentials-secret-spec=lw91VtkPq84nGqiJ + +flowable.control.app.cluster-config.name=Default Cluster +flowable.control.app.cluster-config.description=Default Flowable Cluster +flowable.control.app.cluster-config.server-address=http://localhost +flowable.control.app.cluster-config.port=8105 +flowable.control.app.cluster-config.context-root=/ +flowable.control.app.cluster-config.user-name=admin +flowable.control.app.cluster-config.password=test + +flowable.control.app.db-store-enabled=false +flowable.control.app.cluster-type=work +flowable.control.app.user-store.password=test \ No newline at end of file diff --git a/customer-control/target/classes/application.properties b/customer-control/target/classes/application.properties new file mode 100644 index 0000000..28207ea --- /dev/null +++ b/customer-control/target/classes/application.properties @@ -0,0 +1,34 @@ +server.port=8107 +server.servlet.context-path=/ + +#spring.datasource.driver-class-name=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5435/flowable +spring.datasource.username=flowable +spring.datasource.password=flowable + +# In order for hot swapping to work for the custom.js and custom.css +spring.thymeleaf.cache=false +spring.web.resources.chain.cache=false + +# Enable all endpoints over HTTP +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=ALWAYS +# Pretty-print JSON responses +spring.jackson.serialization.indent_output=true + +# TODO Change these to an other random string with a length of 16 characters +# Used to encrypt your passwords. After a change existing password become invalid! +flowable.control.app.security.encryption.credentials-i-v-spec=fh39chqoxjDF3fhb +flowable.control.app.security.encryption.credentials-secret-spec=lw91VtkPq84nGqiJ + +flowable.control.app.cluster-config.name=Default Cluster +flowable.control.app.cluster-config.description=Default Flowable Cluster +flowable.control.app.cluster-config.server-address=http://localhost +flowable.control.app.cluster-config.port=8105 +flowable.control.app.cluster-config.context-root=/ +flowable.control.app.cluster-config.user-name=admin +flowable.control.app.cluster-config.password=test + +flowable.control.app.db-store-enabled=false +flowable.control.app.cluster-type=work +flowable.control.app.user-store.password=test \ No newline at end of file diff --git a/customer-control/target/classes/com/customer/control/ControlApplication.class b/customer-control/target/classes/com/customer/control/ControlApplication.class new file mode 100644 index 0000000..7a15127 Binary files /dev/null and b/customer-control/target/classes/com/customer/control/ControlApplication.class differ diff --git a/customer-design/.DS_Store b/customer-design/.DS_Store new file mode 100644 index 0000000..cae2506 Binary files /dev/null and b/customer-design/.DS_Store differ diff --git a/customer-design/pom.xml b/customer-design/pom.xml new file mode 100644 index 0000000..fbdcfff --- /dev/null +++ b/customer-design/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + + com.customer + customer-parent + 0.0.1-SNAPSHOT + + + customer-design + customer-design + customer-design + + + + + + + + + + + + + + + + + + + + com.flowable.design + flowable-spring-boot-starter-design + ${com.flowable.platform.version} + + + com.flowable.platform + flowable-platform-palette + ${com.flowable.platform.version} + + + org.postgresql + postgresql + runtime + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + runtime + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/customer-design/src/.DS_Store b/customer-design/src/.DS_Store new file mode 100644 index 0000000..30f994d Binary files /dev/null and b/customer-design/src/.DS_Store differ diff --git a/customer-design/src/main/.DS_Store b/customer-design/src/main/.DS_Store new file mode 100644 index 0000000..8df4a8e Binary files /dev/null and b/customer-design/src/main/.DS_Store differ diff --git a/customer-design/src/main/java/com/customer/design/DesignApplication.java b/customer-design/src/main/java/com/customer/design/DesignApplication.java new file mode 100644 index 0000000..0e75a42 --- /dev/null +++ b/customer-design/src/main/java/com/customer/design/DesignApplication.java @@ -0,0 +1,13 @@ +package com.customer.design; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DesignApplication { + + public static void main(String[] args) { + SpringApplication.run(DesignApplication.class, args); + } + +} diff --git a/customer-design/src/main/java/com/customer/design/SecurityHttpBasicConfiguration.java b/customer-design/src/main/java/com/customer/design/SecurityHttpBasicConfiguration.java new file mode 100644 index 0000000..b46e94b --- /dev/null +++ b/customer-design/src/main/java/com/customer/design/SecurityHttpBasicConfiguration.java @@ -0,0 +1,61 @@ +package com.customer.design; + +import jakarta.servlet.DispatcherType; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.HttpStatusEntryPoint; +import org.springframework.security.web.util.matcher.AnyRequestMatcher; +import org.springframework.security.web.util.matcher.DispatcherTypeRequestMatcher; + +import com.flowable.autoconfigure.design.security.DesignHttpSecurityCustomizer; +import com.flowable.autoconfigure.design.security.servlet.DesignPathRequest; +import com.flowable.design.security.spring.web.authentication.AjaxAuthenticationFailureHandler; +import com.flowable.design.security.spring.web.authentication.AjaxAuthenticationSuccessHandler; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(prefix = "application.design.security", name = "type", havingValue = "basic", matchIfMissing = true) +@EnableWebSecurity +public class SecurityHttpBasicConfiguration { + + @Bean + @Order(10) + public SecurityFilterChain basicDefaultSecurity(HttpSecurity http, ObjectProvider httpSecurityCustomizers) throws Exception { + for (DesignHttpSecurityCustomizer customizer : httpSecurityCustomizers.orderedStream().toList()) { + customizer.customize(http); + } + + http.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); + + http.logout(logout -> logout.logoutUrl("/auth/logout").logoutSuccessUrl("/")); + + // Non authenticated exception handling. The formLogin and httpBasic configure the exceptionHandling + // We have to initialize the exception handling with a default authentication entry point in order to return 401 each time and not have a + // forward due to the formLogin or the http basic popup due to the httpBasic + http + .exceptionHandling(exceptionHandling -> exceptionHandling + .defaultAuthenticationEntryPointFor((request, response, authException) -> {}, new DispatcherTypeRequestMatcher(DispatcherType.ERROR)) + .defaultAuthenticationEntryPointFor(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED), AnyRequestMatcher.INSTANCE)) + .formLogin(formLogin -> formLogin + .loginProcessingUrl("/auth/login") + .successHandler(new AjaxAuthenticationSuccessHandler()) + .failureHandler(new AjaxAuthenticationFailureHandler()) + ) + .authorizeHttpRequests(configurer -> configurer + .requestMatchers(DesignPathRequest.toStaticResources().atCommonLocations()).permitAll() + .anyRequest().authenticated() + ) + .httpBasic(Customizer.withDefaults()); + + return http.build(); + } +} diff --git a/customer-design/src/main/resources/application.properties b/customer-design/src/main/resources/application.properties new file mode 100644 index 0000000..159657a --- /dev/null +++ b/customer-design/src/main/resources/application.properties @@ -0,0 +1,20 @@ +server.port=8106 +#spring.datasource.url=jdbc:h2:~/flowable-design-db/db;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1 +#spring.datasource.username=flowable +#spring.datasource.password=flowable + +#Comment out and configure database +spring.datasource.url=jdbc:postgresql://localhost:5435/flowable +spring.datasource.username=flowable +spring.datasource.password=flowable + + +# Connection to Work +flowable.design.remote.idm-url=http://localhost:8105/flowable-work +flowable.design.remote.authentication.user=admin +flowable.design.remote.authentication.password=test + +#flowable.design.deployment-api-url=http://localhost:8080/flowable-work/app-api +#flowable.design.undeployment-api-url=http://localhost:8080/flowable-work/platform-api/app-deployments +flowable.design.deployment-api-url=http://localhost:8105/app-api +flowable.design.undeployment-api-url=http://localhost:8105/platform-api/app-deployments diff --git a/customer-design/src/test/java/com/customer/design/DesignApplicationTests.java b/customer-design/src/test/java/com/customer/design/DesignApplicationTests.java new file mode 100644 index 0000000..3f1b64c --- /dev/null +++ b/customer-design/src/test/java/com/customer/design/DesignApplicationTests.java @@ -0,0 +1,13 @@ +package com.customer.design; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DesignApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/customer-design/target/classes/application.properties b/customer-design/target/classes/application.properties new file mode 100644 index 0000000..159657a --- /dev/null +++ b/customer-design/target/classes/application.properties @@ -0,0 +1,20 @@ +server.port=8106 +#spring.datasource.url=jdbc:h2:~/flowable-design-db/db;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1 +#spring.datasource.username=flowable +#spring.datasource.password=flowable + +#Comment out and configure database +spring.datasource.url=jdbc:postgresql://localhost:5435/flowable +spring.datasource.username=flowable +spring.datasource.password=flowable + + +# Connection to Work +flowable.design.remote.idm-url=http://localhost:8105/flowable-work +flowable.design.remote.authentication.user=admin +flowable.design.remote.authentication.password=test + +#flowable.design.deployment-api-url=http://localhost:8080/flowable-work/app-api +#flowable.design.undeployment-api-url=http://localhost:8080/flowable-work/platform-api/app-deployments +flowable.design.deployment-api-url=http://localhost:8105/app-api +flowable.design.undeployment-api-url=http://localhost:8105/platform-api/app-deployments diff --git a/customer-design/target/classes/com/customer/design/DesignApplication.class b/customer-design/target/classes/com/customer/design/DesignApplication.class new file mode 100644 index 0000000..8bcb230 Binary files /dev/null and b/customer-design/target/classes/com/customer/design/DesignApplication.class differ diff --git a/customer-design/target/classes/com/customer/design/SecurityHttpBasicConfiguration.class b/customer-design/target/classes/com/customer/design/SecurityHttpBasicConfiguration.class new file mode 100644 index 0000000..66c9dc2 Binary files /dev/null and b/customer-design/target/classes/com/customer/design/SecurityHttpBasicConfiguration.class differ diff --git a/customer-design/target/customer-design-0.0.1-SNAPSHOT.jar b/customer-design/target/customer-design-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000..298e2cc Binary files /dev/null and b/customer-design/target/customer-design-0.0.1-SNAPSHOT.jar differ diff --git a/customer-design/target/customer-design-0.0.1-SNAPSHOT.jar.original b/customer-design/target/customer-design-0.0.1-SNAPSHOT.jar.original new file mode 100644 index 0000000..fff89c7 Binary files /dev/null and b/customer-design/target/customer-design-0.0.1-SNAPSHOT.jar.original differ diff --git a/customer-design/target/maven-archiver/pom.properties b/customer-design/target/maven-archiver/pom.properties new file mode 100644 index 0000000..f8324d7 --- /dev/null +++ b/customer-design/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=customer-design +groupId=com.customer +version=0.0.1-SNAPSHOT diff --git a/customer-design/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/customer-design/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..4eb4c2c --- /dev/null +++ b/customer-design/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,2 @@ +com/customer/design/DesignApplication.class +com/customer/design/SecurityHttpBasicConfiguration.class diff --git a/customer-design/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/customer-design/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..3e8cfb8 --- /dev/null +++ b/customer-design/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,2 @@ +/Users/andi/prj/flowable/2025.2/customer-design/src/main/java/com/customer/design/DesignApplication.java +/Users/andi/prj/flowable/2025.2/customer-design/src/main/java/com/customer/design/SecurityHttpBasicConfiguration.java diff --git a/customer-design/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/customer-design/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..d2f0193 --- /dev/null +++ b/customer-design/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com/customer/design/DesignApplicationTests.class diff --git a/customer-design/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/customer-design/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..a01e299 --- /dev/null +++ b/customer-design/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +/Users/andi/prj/flowable/2025.2/customer-design/src/test/java/com/customer/design/DesignApplicationTests.java diff --git a/customer-design/target/surefire-reports/TEST-com.customer.design.DesignApplicationTests.xml b/customer-design/target/surefire-reports/TEST-com.customer.design.DesignApplicationTests.xml new file mode 100644 index 0000000..e8c41eb --- /dev/null +++ b/customer-design/target/surefire-reports/TEST-com.customer.design.DesignApplicationTests.xml @@ -0,0 +1,1776 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (PgConnection.java:290) + at org.postgresql.Driver.makeConnection(Driver.java:448) + at org.postgresql.Driver.connect(Driver.java:298) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:210) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:488) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:97) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118) + at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:256) + at jdk.proxy2/jdk.proxy2.$Proxy86.getMetaData(Unknown Source) + at org.flowable.common.engine.impl.util.DbUtil.determineDatabaseType(DbUtil.java:89) + ... 132 more +Caused by: java.net.ConnectException: Connection refused + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:639) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:543) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:594) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:284) + at java.base/java.net.Socket.connect(Socket.java:659) + at org.postgresql.core.PGStream.createSocket(PGStream.java:261) + at org.postgresql.core.PGStream.(PGStream.java:122) + at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:146) + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:289) + ... 148 more +]]> + (PgConnection.java:290) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.Driver.makeConnection(Driver.java:448) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.Driver.connect(Driver.java:298) ~[postgresql-42.7.10.jar:42.7.10] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:210) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:488) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:97) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-7.0.2.jar:na] + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160) ~[spring-jdbc-7.0.5.jar:7.0.5] + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118) ~[spring-jdbc-7.0.5.jar:7.0.5] + at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:256) ~[spring-jdbc-7.0.5.jar:7.0.5] + at jdk.proxy2/jdk.proxy2.$Proxy86.getMetaData(Unknown Source) ~[na:na] + at org.flowable.common.engine.impl.util.DbUtil.determineDatabaseType(DbUtil.java:89) ~[flowable-engine-common-8.0.0.13.jar:8.0.0.13] + ... 198 common frames omitted +Caused by: java.net.ConnectException: Connection refused + at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:639) ~[na:na] + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:543) ~[na:na] + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:594) ~[na:na] + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:284) ~[na:na] + at java.base/java.net.Socket.connect(Socket.java:659) ~[na:na] + at org.postgresql.core.PGStream.createSocket(PGStream.java:261) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.PGStream.(PGStream.java:122) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:146) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:289) ~[postgresql-42.7.10.jar:42.7.10] + ... 214 common frames omitted + +2026-03-19T14:33:16.502+01:00 WARN 69968 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] to prepare test instance [com.customer.design.DesignApplicationTests@47c5cbf2] + +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@4aba7617 testClass = com.customer.design.DesignApplicationTests, locations = [], classes = [com.customer.design.DesignApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizer@30bcf3c1, org.springframework.boot.test.context.PropertyMappingContextCustomizer@0, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7c2b6087, org.springframework.boot.test.http.client.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@354fc8f0, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@5b43fbf6, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@5b07730f, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@ae57ec99], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:195) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.cache.DefaultContextCache.put(DefaultContextCache.java:214) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:160) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:210) ~[spring-test-7.0.5.jar:7.0.5] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$1(ClassBasedTestDescriptor.java:423) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:428) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$0(ClassBasedTestDescriptor.java:422) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:186) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197) ~[na:na] + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) ~[na:na] + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1716) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) ~[na:na] + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153) ~[na:na] + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176) ~[na:na] + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) ~[na:na] + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:632) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:422) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$0(ClassBasedTestDescriptor.java:334) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:333) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$1(ClassBasedTestDescriptor.java:322) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na] + at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$0(ClassBasedTestDescriptor.java:321) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:27) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:127) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:126) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:70) ~[junit-jupiter-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$0(NodeTestTask.java:144) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:144) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:110) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) ~[na:na] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:36) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:52) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:58) ~[junit-platform-engine-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:246) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:218) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:179) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:66) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:157) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:65) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:125) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:58) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$2(InterceptingLauncher.java:57) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:56) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:58) ~[junit-platform-launcher-6.0.3.jar:6.0.3] + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na] + at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:125) ~[surefire-api-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithCancellationToken(LauncherAdapter.java:68) ~[surefire-junit-platform-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:54) ~[surefire-junit-platform-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203) ~[surefire-junit-platform-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168) ~[surefire-junit-platform-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136) ~[surefire-junit-platform-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385) ~[surefire-booter-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162) ~[surefire-booter-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507) ~[surefire-booter-3.5.4.jar:3.5.4] + at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495) ~[surefire-booter-3.5.4.jar:3.5.4] +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'basicDefaultSecurity' defined in class path resource [com/customer/design/SecurityHttpBasicConfiguration.class]: Unsatisfied dependency expressed through method 'basicDefaultSecurity' parameter 0: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:872) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:827) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:493) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1446) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1218) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1184) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:994) ~[spring-context-7.0.5.jar:7.0.5] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621) ~[spring-context-7.0.5.jar:7.0.5] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756) ~[spring-boot-4.0.3.jar:4.0.3] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445) ~[spring-boot-4.0.3.jar:4.0.3] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) ~[spring-boot-4.0.3.jar:4.0.3] + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$2(SpringBootContextLoader.java:156) ~[spring-boot-test-4.0.3.jar:4.0.3] + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-7.0.5.jar:7.0.5] + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-7.0.5.jar:7.0.5] + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1465) ~[spring-boot-4.0.3.jar:4.0.3] + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:605) ~[spring-boot-test-4.0.3.jar:4.0.3] + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:156) ~[spring-boot-test-4.0.3.jar:4.0.3] + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:115) ~[spring-boot-test-4.0.3.jar:4.0.3] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:247) ~[spring-test-7.0.5.jar:7.0.5] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:167) ~[spring-test-7.0.5.jar:7.0.5] + ... 86 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'basicDefaultSecurity' defined in class path resource [com/customer/design/SecurityHttpBasicConfiguration.class]: Unsatisfied dependency expressed through method 'basicDefaultSecurity' parameter 0: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:2008) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1971) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeanCollection(DefaultListableBeanFactory.java:1863) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1833) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1711) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:864) ~[spring-beans-7.0.5.jar:7.0.5] + ... 113 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:489) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:351) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-7.0.5.jar:7.0.5] + ... 130 common frames omitted +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:183) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:72) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:152) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-7.0.5.jar:7.0.5] + ... 142 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1305) ~[spring-context-7.0.5.jar:7.0.5] + at org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer.configure(InitializeUserDetailsBeanManagerConfigurer.java:94) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer.configure(InitializeUserDetailsBeanManagerConfigurer.java:63) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.configure(AbstractConfiguredSecurityBuilder.java:386) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:336) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:38) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration.getAuthenticationManager(AuthenticationConfiguration.java:121) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.authenticationManager(HttpSecurityConfiguration.java:152) ~[spring-security-config-7.0.3.jar:7.0.3] + at org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity(HttpSecurityConfiguration.java:119) ~[spring-security-config-7.0.3.jar:7.0.3] + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na] + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:155) ~[spring-beans-7.0.5.jar:7.0.5] + ... 145 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-7.0.5.jar:7.0.5] + ... 166 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:209) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1879) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1304) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:343) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) ~[spring-beans-7.0.5.jar:7.0.5] + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-7.0.5.jar:7.0.5] + ... 180 common frames omitted +Caused by: java.lang.RuntimeException: Exception while initializing Database connection + at org.flowable.common.engine.impl.util.DbUtil.determineDatabaseType(DbUtil.java:116) ~[flowable-engine-common-8.0.0.13.jar:8.0.0.13] + at org.flowable.common.engine.impl.AbstractEngineConfiguration.initDatabaseType(AbstractEngineConfiguration.java:475) ~[flowable-engine-common-8.0.0.13.jar:8.0.0.13] + at org.flowable.common.engine.impl.AbstractEngineConfiguration.initDataSource(AbstractEngineConfiguration.java:470) ~[flowable-engine-common-8.0.0.13.jar:8.0.0.13] + at com.flowable.design.engine.DesignEngineConfiguration.init(DesignEngineConfiguration.java:365) ~[flowable-design-engine-2025.2.04.jar:2025.2.04] + at org.flowable.common.engine.impl.AbstractBuildableEngineConfiguration.buildEngine(AbstractBuildableEngineConfiguration.java:28) ~[flowable-engine-common-8.0.0.13.jar:8.0.0.13] + at com.flowable.design.engine.DesignEngineConfiguration.buildDesignEngine(DesignEngineConfiguration.java:336) ~[flowable-design-engine-2025.2.04.jar:2025.2.04] + at com.flowable.design.engine.spring.DesignEngineFactoryBean.getObject(DesignEngineFactoryBean.java:36) ~[flowable-design-engine-2025.2.04.jar:2025.2.04] + at com.flowable.design.engine.spring.DesignEngineFactoryBean.getObject(DesignEngineFactoryBean.java:20) ~[flowable-design-engine-2025.2.04.jar:2025.2.04] + at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:203) ~[spring-beans-7.0.5.jar:7.0.5] + ... 190 common frames omitted +Caused by: org.postgresql.util.PSQLException: Connection to localhost:5435 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:373) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:57) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.jdbc.PgConnection.(PgConnection.java:290) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.Driver.makeConnection(Driver.java:448) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.Driver.connect(Driver.java:298) ~[postgresql-42.7.10.jar:42.7.10] + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:210) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:488) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:97) ~[HikariCP-7.0.2.jar:na] + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) ~[HikariCP-7.0.2.jar:na] + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160) ~[spring-jdbc-7.0.5.jar:7.0.5] + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118) ~[spring-jdbc-7.0.5.jar:7.0.5] + at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:256) ~[spring-jdbc-7.0.5.jar:7.0.5] + at jdk.proxy2/jdk.proxy2.$Proxy86.getMetaData(Unknown Source) ~[na:na] + at org.flowable.common.engine.impl.util.DbUtil.determineDatabaseType(DbUtil.java:89) ~[flowable-engine-common-8.0.0.13.jar:8.0.0.13] + ... 198 common frames omitted +Caused by: java.net.ConnectException: Connection refused + at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na] + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:639) ~[na:na] + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:543) ~[na:na] + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:594) ~[na:na] + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:284) ~[na:na] + at java.base/java.net.Socket.connect(Socket.java:659) ~[na:na] + at org.postgresql.core.PGStream.createSocket(PGStream.java:261) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.PGStream.(PGStream.java:122) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:146) ~[postgresql-42.7.10.jar:42.7.10] + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:289) ~[postgresql-42.7.10.jar:42.7.10] + ... 214 common frames omitted + +]]> + ; SearchStrategy: all) did not find any beans (OnBeanCondition) + + Jackson2AutoConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + Jackson2AutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperBuilderConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperBuilderConfiguration#jackson2ObjectMapperBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperConfiguration#jackson2ObjectMapper matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + Jackson2AutoConfiguration.ParameterNamesModuleConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.module.paramnames.ParameterNamesModule' (OnClassCondition) + + Jackson2AutoConfiguration.ParameterNamesModuleConfiguration#jackson2ParameterNamesModule matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.module.paramnames.ParameterNamesModule; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration matched: + - @ConditionalOnClass found required class 'tools.jackson.databind.json.JsonMapper' (OnClassCondition) + + JacksonAutoConfiguration#jacksonJsonMapper matched: + - @ConditionalOnMissingBean (types: tools.jackson.databind.json.JsonMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration#jsonMapperBuilder matched: + - @ConditionalOnMissingBean (types: tools.jackson.databind.json.JsonMapper$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration.JsonProblemDetailsConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.ProblemDetail' (OnClassCondition) + + JacksonHttpMessageConvertersConfiguration.JacksonJsonHttpMessageConverterConfiguration matched: + - @ConditionalOnClass found required class 'tools.jackson.databind.json.JsonMapper' (OnClassCondition) + - @ConditionalOnProperty (spring.http.converters.preferred-json-mapper=jackson) matched (OnPropertyCondition) + - @ConditionalOnBean (types: tools.jackson.databind.json.JsonMapper; SearchStrategy: all) found bean 'jacksonJsonMapper' (OnBeanCondition) + + JacksonHttpMessageConvertersConfiguration.JacksonJsonHttpMessageConverterConfiguration#jacksonJsonHttpMessageConvertersCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.JacksonJsonHttpMessageConverter ignored: org.springframework.hateoas.server.mvc.TypeConstrainedJacksonJsonHttpMessageConverter,org.springframework.data.rest.webmvc.alps.AlpsJacksonJsonHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JdbcClientAutoConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; SearchStrategy: all) found a single bean 'namedParameterJdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.simple.JdbcClient; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JdbcTemplateAutoConfiguration matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition) + - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition) + + JdbcTemplateConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + LicenseMetricsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found bean 'jdbcTemplate' (OnBeanCondition) + + LicenseMetricsConfiguration#licenseRequestsPublisher matched: + - @ConditionalOnMissingClass did not find unwanted class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + LicenseMetricsConfiguration.MetricsRestConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + LifecycleAutoConfiguration#defaultLifecycleProcessor matched: + - @ConditionalOnMissingBean (names: lifecycleProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.multipart.support.StandardServletMultipartResolver', 'jakarta.servlet.MultipartConfigElement' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (spring.servlet.multipart.enabled=true) matched (OnPropertyCondition) + + MultipartAutoConfiguration#multipartConfigElement matched: + - @ConditionalOnMissingBean (types: jakarta.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration#multipartResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + NamedParameterJdbcTemplateConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found a single bean 'jdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PersistenceExceptionTranslationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor' (OnClassCondition) + + PersistenceExceptionTranslationAutoConfiguration#persistenceExceptionTranslationPostProcessor matched: + - @ConditionalOnBooleanProperty (spring.persistence.exceptiontranslation.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformValidationConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.validation.bpmn.impl.FlowablePlatformServiceTaskValidator' (OnClassCondition) + + PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition) + + ReactiveHttpClientAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.http.client.reactive.ClientHttpConnector', 'reactor.core.publisher.Mono' (OnClassCondition) + - Detected ClientHttpConnectorBuilder (ConditionalOnClientHttpConnectorBuilderDetection) + + ReactiveHttpClientAutoConfiguration#clientHttpConnector matched: + - @ConditionalOnMissingBean (types: org.springframework.http.client.reactive.ClientHttpConnector; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ReactiveHttpClientAutoConfiguration#clientHttpConnectorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.reactive.ClientHttpConnectorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ReactiveWebSecurityAutoConfiguration matched: + - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.web.server.WebFilterChainProxy', 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + RestApiAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.common.rest.resolver.ContentTypeResolver' (OnClassCondition) + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + RestApiAutoConfiguration.DesignRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.design.rest.service.api.DesignEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.design.engine.DesignEngine; SearchStrategy: all) found bean 'designEngine' (OnBeanCondition) + + RestApiAutoConfiguration.DesignRestApiConfiguration#designCurrentUserAvailableApplicationsEnhancer matched: + - @ConditionalOnMissingBean (names: designCurrentUserAvailableApplicationsEnhancer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestApiAutoConfiguration.DesignRestApiConfiguration#designRestEngineConfigurer matched: + - @ConditionalOnMissingBean (names: designRestEngineConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestApiAutoConfiguration.DesignRestApiConfiguration#flowableDefaultContentMediaTypeResolver matched: + - @ConditionalOnProperty (flowable.design.content-type-resolver=default) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: com.flowable.design.rest.service.api.util.ContentMediaTypeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestApiAutoConfiguration.PaletteRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.palette.rest.service.api.PaletteEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.palette.api.PaletteRepositoryService; SearchStrategy: all) found bean 'paletteRepositoryService' (OnBeanCondition) + + SecurityAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.security.authentication.DefaultAuthenticationEventPublisher' (OnClassCondition) + + SecurityAutoConfiguration#authenticationEventPublisher matched: + - @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationEventPublisher; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SecurityFilterAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer', 'org.springframework.security.config.http.SessionCreationPolicy' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + SecurityFilterAutoConfiguration#securityFilterChainRegistration matched: + - @ConditionalOnBean (names: springSecurityFilterChain; SearchStrategy: all) found bean 'springSecurityFilterChain' (OnBeanCondition) + + SecurityHttpBasicConfiguration matched: + - @ConditionalOnProperty (application.design.security.type=basic) matched (OnPropertyCondition) + + ServletWebSecurityAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebSecurityAutoConfiguration.PathPatternRequestMatcherBuilderConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.boot.webmvc.autoconfigure.DispatcherServletPath' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.boot.webmvc.autoconfigure.DispatcherServletPath; SearchStrategy: all) found bean 'dispatcherServletRegistration' (OnBeanCondition) + + ServletWebSecurityAutoConfiguration.PathPatternRequestMatcherBuilderConfiguration#pathPatternRequestMatcherBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslAutoConfiguration#sslBundleRegistry matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.ssl.SslBundleRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' (OnClassCondition) + + TaskExecutorConfigurations.AsyncConfigurerConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.scheduling.annotation.AsyncConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration matched: + - AnyNestedCondition 1 matched 1 did not; NestedCondition on TaskExecutorConfigurations.OnExecutorCondition.ModelCondition @ConditionalOnProperty (spring.task.execution.mode=force) did not find property 'spring.task.execution.mode'; NestedCondition on TaskExecutorConfigurations.OnExecutorCondition.ExecutorBeanCondition @ConditionalOnMissingBean (types: java.util.concurrent.Executor; SearchStrategy: all) did not find any beans (TaskExecutorConfigurations.OnExecutorCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration#applicationTaskExecutor matched: + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration#threadPoolTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskSchedulingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskSchedulingConfigurations.ThreadPoolTaskSchedulerBuilderConfiguration#threadPoolTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TemplateEngineConfigurations.DefaultTemplateEngineConfiguration#templateEngine matched: + - @ConditionalOnMissingBean (types: org.thymeleaf.spring6.ISpringTemplateEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ThymeleafAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.thymeleaf.templatemode.TemplateMode', 'org.thymeleaf.spring6.SpringTemplateEngine' (OnClassCondition) + + ThymeleafAutoConfiguration.DefaultTemplateResolverConfiguration matched: + - @ConditionalOnMissingBean (names: defaultTemplateResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration#resourceUrlEncodingFilter matched: + - @ConditionalOnEnabledResourceChain enabled (OnEnabledResourceChainCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.view.AbstractCachingViewResolver' (OnClassCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration#thymeleafViewResolver matched: + - @ConditionalOnMissingBean (names: thymeleafViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TomcatServletWebServerAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.ServletRequest', 'org.apache.catalina.startup.Tomcat', 'org.apache.coyote.UpgradeProtocol', 'org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + TomcatServletWebServerAutoConfiguration#tomcatServletWebServerFactory matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.server.servlet.ServletWebServerFactory; SearchStrategy: current) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration matched: + - @ConditionalOnBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found bean 'transactionManager'; @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration matched: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) + + TransactionAutoConfiguration.TransactionTemplateConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a single bean 'transactionManager' (OnBeanCondition) + + TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate matched: + - @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionManagerCustomizationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionManagerCustomizationAutoConfiguration#platformTransactionManagerCustomizers matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebClientAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + WebClientAutoConfiguration#webClientBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.web.reactive.function.client.WebClient$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebClientAutoConfiguration#webClientHttpConnectorCustomizer matched: + - @ConditionalOnBean (types: org.springframework.http.client.reactive.ClientHttpConnector; SearchStrategy: all) found bean 'clientHttpConnector' (OnBeanCondition) + + WebClientAutoConfiguration#webClientSsl matched: + - @ConditionalOnBean (types: org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found bean 'sslBundleRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.webclient.autoconfigure.WebClientSsl; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebClientAutoConfiguration.WebClientCodecsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.boot.http.codec.CodecCustomizer; SearchStrategy: all) found beans 'jacksonCodecCustomizer', 'defaultCodecCustomizer' (OnBeanCondition) + + WebClientAutoConfiguration.WebClientCodecsConfiguration#exchangeStrategiesCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.webclient.autoconfigure.WebClientCodecCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration#formContentFilter matched: + - @ConditionalOnBooleanProperty (spring.mvc.formcontent.filter.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.filter.FormContentFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#flashMapManager matched: + - @ConditionalOnMissingBean (names: flashMapManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#localeResolver matched: + - @ConditionalOnMissingBean (names: localeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#viewNameTranslator matched: + - @ConditionalOnMissingBean (names: viewNameTranslator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.ResourceChainCustomizerConfiguration matched: + - @ConditionalOnEnabledResourceChain enabled (OnEnabledResourceChainCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#defaultViewResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.InternalResourceViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.context.request.RequestContextListener,org.springframework.web.filter.RequestContextFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#viewResolver matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.ViewResolver; SearchStrategy: all) found beans 'defaultViewResolver', 'beanNameViewResolver', 'mvcViewResolver'; @ConditionalOnMissingBean (names: viewResolver types: org.springframework.web.servlet.view.ContentNegotiatingViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + +Negative matches: +----------------- + + AopAutoConfiguration.AspectJAutoProxyingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + CodecsAutoConfiguration.Jackson2JsonCodecConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on CodecsAutoConfiguration.NoJacksonOrJackson2Preferred.Jackson2Preferred @ConditionalOnProperty (spring.http.codecs.preferred-json-mapper=jackson2) did not find property 'spring.http.codecs.preferred-json-mapper'; NestedCondition on CodecsAutoConfiguration.NoJacksonOrJackson2Preferred.NoJackson @ConditionalOnMissingClass found unwanted class 'tools.jackson.databind.json.JsonMapper' (CodecsAutoConfiguration.NoJacksonOrJackson2Preferred) + Matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + CodecsAutoConfiguration.KotlinxSerializationJsonCodecConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'kotlinx.serialization.json.Json' (OnClassCondition) + + DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration: + Did not match: + - EmbeddedDataSource spring.datasource.url is set (DataSourceAutoConfiguration.EmbeddedDatabaseCondition) + + DataSourceCheckpointRestoreConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.crac.Resource' (OnClassCondition) + + DataSourceConfiguration.Dbcp2: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition) + + DataSourceConfiguration.Generic: + Did not match: + - @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (OnPropertyCondition) + + DataSourceConfiguration.OracleUcp: + Did not match: + - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSourceImpl', 'oracle.jdbc.OracleConnection' (OnClassCondition) + + DataSourceConfiguration.Tomcat: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition) + + DataSourceHealthContributorAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.health.autoconfigure.contributor.ConditionalOnEnabledHealthIndicator' (OnClassCondition) + + DataSourceJmxConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + + DataSourcePoolMetadataProvidersConfiguration.CommonsDbcp2PoolDataSourceMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition) + + DataSourcePoolMetadataProvidersConfiguration.OracleUcpPoolDataSourceMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSource', 'oracle.jdbc.OracleConnection' (OnClassCondition) + + DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition) + + DataSourcePoolMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + DesignBucket4jRateLimitConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.github.bucket4j.distributed.proxy.ProxyManager' (OnClassCondition) + + DesignCurrentUserEnhancersConfiguration.AccessTokenConfiguration: + Did not match: + - AllNestedConditions 0 matched 2 did not; NestedCondition on DesignCurrentUserEnhancersConfiguration.AccessTokenEnhancerCondition.AccessTokenSigningSecretProperty @ConditionalOnProperty (flowable.design.security.access-token.signing-secret) did not find property 'signing-secret'; NestedCondition on DesignCurrentUserEnhancersConfiguration.AccessTokenEnhancerCondition.JwtAvailable @ConditionalOnClass did not find required classes 'org.springframework.security.oauth2.jwt.Jwt', 'org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken' (DesignCurrentUserEnhancersConfiguration.AccessTokenEnhancerCondition) + + DesignCurrentUserEnhancersConfiguration.LicenseDbStoreConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.design.db-store-enabled=true) did not find property 'flowable.design.db-store-enabled' (OnPropertyCondition) + + DesignEngineAutoConfiguration#modelTenantDeploymentTenantProvider: + Did not match: + - @ConditionalOnProperty (flowable.design.deployment-tenant-source=model-tenant-id) did not find property 'deployment-tenant-source' (OnPropertyCondition) + + DesignEngineAutoConfiguration#modelWorkspaceDeploymentTenantProvider: + Did not match: + - @ConditionalOnProperty (flowable.design.deployment-tenant-source=model-workspace-key) did not find property 'deployment-tenant-source' (OnPropertyCondition) + + DesignEngineAutoConfiguration.PasswordEncoderConfiguration#accessTokenPasswordEncoderConfigurer: + Did not match: + - @ConditionalOnProperty (flowable.design.security.access-token.signing-secret) did not find property 'signing-secret' (OnPropertyCondition) + + DesignGraphAutoConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.design.idm.service-type=microsoft-graph) did not find property 'service-type' (OnPropertyCondition) + + DesignHttpClientConfiguration.ApacheHttpClient: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.http.impl.client.HttpClientBuilder' (OnClassCondition) + + DesignHttpClientConfiguration.ApacheHttpClient5: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder' (OnClassCondition) + + DesignInfoContributorConfiguration.ActuatorDesignInfoContributorConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.info.InfoContributor' (OnClassCondition) + + DesignLdapAutoConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.design.idm.service-type=ldap) did not find property 'service-type' (OnPropertyCondition) + + DesignLdapSecurityAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: com.flowable.design.engine.api.idm.ldap.DesignLdapConfigurationApi; SearchStrategy: all) did not find any beans of type com.flowable.design.engine.api.idm.ldap.DesignLdapConfigurationApi (OnBeanCondition) + + DesignLicenseAutoConfiguration.LicenseServiceDatabaseStoreConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.design.db-store-enabled=true) did not find property 'flowable.design.db-store-enabled' (OnPropertyCondition) + + DesignOAuth2ClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.core.user.OAuth2User' (OnClassCondition) + + DesignOAuth2ResourceServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationToken' (OnClassCondition) + + DesignRemoteHttpCustomizerConfiguration.IdTokenFactoryConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.jwt.JwtDecoderFactory' (OnClassCondition) + + DesignRemoteHttpCustomizerConfiguration.OAuthCurrentUserRemoteHttpConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; SearchStrategy: all) did not find any beans of type org.springframework.security.oauth2.client.registration.ClientRegistrationRepository (OnBeanCondition) + + DesignRemoteHttpCustomizerConfiguration.OAuthRemoteHttpConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; SearchStrategy: all) did not find any beans of type org.springframework.security.oauth2.client.registration.ClientRegistrationRepository (OnBeanCondition) + + DesignSecurityOAuth2AutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.core.user.OAuth2User' (OnClassCondition) + + DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver: + Did not match: + - @ConditionalOnBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans of type org.springframework.web.multipart.MultipartResolver (OnBeanCondition) + + GsonHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition) + + HttpClientMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + Jackson2HttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on Jackson2HttpMessageConvertersConfiguration.PreferJackson2OrJacksonUnavailableCondition.JacksonUnavailable @ConditionalOnMissingBean (types: org.springframework.boot.http.converter.autoconfigure.JacksonHttpMessageConvertersConfiguration$JacksonJsonHttpMessageConvertersCustomizer; SearchStrategy: all) found beans of type 'org.springframework.boot.http.converter.autoconfigure.JacksonHttpMessageConvertersConfiguration$JacksonJsonHttpMessageConvertersCustomizer' jacksonJsonHttpMessageConvertersCustomizer; NestedCondition on Jackson2HttpMessageConvertersConfiguration.PreferJackson2OrJacksonUnavailableCondition.Jackson2Preferred @ConditionalOnProperty (spring.http.converters.preferred-json-mapper=jackson2) did not find property 'spring.http.converters.preferred-json-mapper' (Jackson2HttpMessageConvertersConfiguration.PreferJackson2OrJacksonUnavailableCondition) + Matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + Jackson2HttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.fasterxml.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JacksonAutoConfiguration.CborConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'tools.jackson.dataformat.cbor.CBORMapper' (OnClassCondition) + + JacksonAutoConfiguration.XmlConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'tools.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JacksonHttpMessageConvertersConfiguration.JacksonXmlHttpMessageConverterConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'tools.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JmxAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.jmx.export.MBeanExporter' (OnClassCondition) + + JndiDataSourceAutoConfiguration: + Did not match: + - @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'spring.datasource.jndi-name' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + + JsonbHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition) + + JtaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.transaction.Transaction' (OnClassCondition) + + KotlinSerializationHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'kotlinx.serialization.Serializable', 'kotlinx.serialization.json.Json' (OnClassCondition) + + LicenseMetricsConfiguration.MetricsLicensePublisherConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + ManagementWebSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' (OnClassCondition) + + MessageSourceAutoConfiguration: + Did not match: + - ResourceBundle did not find bundle with basename messages (MessageSourceAutoConfiguration.ResourceBundleCondition) + + ProjectInfoAutoConfiguration#buildProperties: + Did not match: + - @ConditionalOnResource did not find resource '${spring.info.build.location:classpath:META-INF/build-info.properties}' (OnResourceCondition) + + ProjectInfoAutoConfiguration#gitProperties: + Did not match: + - GitResource did not find git info at classpath:git.properties (ProjectInfoAutoConfiguration.GitResourceAvailableCondition) + + RSocketSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.rsocket.server.RSocketServerCustomizer' (OnClassCondition) + + ReactiveHttpClientAutoConfiguration.ReactorNetty: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.reactor.netty.autoconfigure.ReactorNettyConfigurations' (OnClassCondition) + + ReactiveHttpServiceClientAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.web.service.registry.HttpServiceProxyRegistry; SearchStrategy: all) did not find any beans of type org.springframework.web.service.registry.HttpServiceProxyRegistry (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.support.WebClientAdapter' (OnClassCondition) + + ReactiveManagementWebSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' (OnClassCondition) + + ReactiveUserDetailsServiceAutoConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication.ReactiveWebApplicationCondition not a reactive web application; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication.RSocketSecurityEnabledCondition @ConditionalOnBean (types: org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler; SearchStrategy: all) did not find any beans of type org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler (ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.authentication.ReactiveAuthenticationManager' (OnClassCondition) + - AnyNestedCondition 1 matched 2 did not; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) did not find property 'spring.security.user.password'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) did not find property 'spring.security.user.name'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass did not find unwanted classes 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository', 'org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector', 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured) + + ReactiveWebSecurityAutoConfiguration.SpringBootWebFluxSecurityConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + RestAiAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.design.ai.rest.service.api.DesignAiRestMarker' (OnClassCondition) + + RestApiAutoConfiguration.DesignRestApiConfiguration#flowableTikaAutoDetectParserContentMediaTypeResolver: + Did not match: + - @ConditionalOnProperty (flowable.design.content-type-resolver=tika-auto-detect-parser) did not find property 'content-type-resolver' (OnPropertyCondition) + + SecurityAutoConfiguration.SecurityDataConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.data.repository.query.SecurityEvaluationContextExtension' (OnClassCondition) + + ServletHttpExchangesAutoConfiguration: + Did not match: + - @ConditionalOnBean did not find required type 'org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository' (OnBeanCondition) + + ServletManagementContextAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' (OnClassCondition) + + ServletMappingsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint' (OnClassCondition) + + ServletWebSecurityAutoConfiguration.EnableWebSecurityConfiguration: + Did not match: + - @ConditionalOnMissingBean (names: springSecurityFilterChain; SearchStrategy: all) found beans named springSecurityFilterChain (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) + + ServletWebSecurityAutoConfiguration.SecurityFilterChainConfiguration: + Did not match: + - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) found beans of type 'org.springframework.security.web.SecurityFilterChain' basicDefaultSecurity; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass found required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition) + + ServletWebServerConfiguration#forwardedHeaderFilter: + Did not match: + - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition) + + SpringApplicationAdminJmxAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.application.admin.enabled=true) did not find property 'spring.application.admin.enabled' (OnPropertyCondition) + + TaskExecutorConfigurations.AsyncConfigurerWrapperConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.scheduling.annotation.AsyncConfigurer; SearchStrategy: all) did not find any beans of type org.springframework.scheduling.annotation.AsyncConfigurer (OnBeanCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder' simpleAsyncTaskExecutorBuilder (OnBeanCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration#applicationTaskExecutorVirtualThreads: + Did not match: + - @ConditionalOnThreading did not find VIRTUAL (OnThreadingCondition) + + TaskSchedulingAutoConfiguration#scheduledBeanLazyInitializationExcludeFilter: + Did not match: + - @ConditionalOnBean (names: org.springframework.scheduling.config.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.scheduling.config.internalScheduledAnnotationProcessor (OnBeanCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder' simpleAsyncTaskSchedulerBuilder (OnBeanCondition) + + TaskSchedulingConfigurations.TaskSchedulerConfiguration: + Did not match: + - @ConditionalOnBean (names: org.springframework.scheduling.config.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.scheduling.config.internalScheduledAnnotationProcessor (OnBeanCondition) + + TemplateEngineConfigurations.ReactiveTemplateEngineConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + ThymeleafAutoConfiguration.DataAttributeDialectConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.github.mxab.thymeleaf.extras.dataattribute.dialect.DataAttributeDialect' (OnClassCondition) + + ThymeleafAutoConfiguration.ThymeleafSecurityDialectConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.thymeleaf.extras.springsecurity6.dialect.SpringSecurityDialect' (OnClassCondition) + + ThymeleafAutoConfiguration.ThymeleafWebFluxConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + ThymeleafAutoConfiguration.ThymeleafWebLayoutConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'nz.net.ultraq.thymeleaf.layoutdialect.LayoutDialect' (OnClassCondition) + + TomcatMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.core.instrument.binder.tomcat.TomcatMetrics' (OnClassCondition) + + TomcatReactiveManagementContextAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextFactory' (OnClassCondition) + + TomcatReactiveWebServerAutoConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.http.ReactiveHttpInputMessage', 'org.apache.catalina.startup.Tomcat', 'org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory' (OnClassCondition) + + TomcatServletManagementContextAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextFactory' (OnClassCondition) + + TomcatServletWebServerAutoConfiguration#tomcatForwardedHeaderFilterCustomizer: + Did not match: + - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition) + + TomcatWebServerConfiguration: + Did not match: + - Application is deployed as a WAR file. (OnWarDeploymentCondition) + + TransactionAutoConfiguration#transactionalOperator: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.transaction.ReactiveTransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration.AspectJTransactionManagementConfiguration: + Did not match: + - @ConditionalOnBean did not find required type 'org.springframework.transaction.aspectj.AbstractTransactionAspect' (OnBeanCondition) + - @ConditionalOnBean (types: org.springframework.transaction.aspectj.AbstractTransactionAspect; SearchStrategy: all) did not find any beans of type org.springframework.transaction.aspectj.AbstractTransactionAspect (OnBeanCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration.JdkDynamicAutoProxyConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition) + + UserDetailsServiceAutoConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationManager,org.springframework.security.authentication.AuthenticationProvider,org.springframework.security.core.userdetails.UserDetailsService,org.springframework.security.authentication.AuthenticationManagerResolver,org.springframework.security.oauth2.jwt.JwtDecoder; SearchStrategy: all) found beans of type 'org.springframework.security.core.userdetails.UserDetailsService' designUserDetailsService (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.authentication.AuthenticationManager' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - AnyNestedCondition 1 matched 2 did not; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) did not find property 'spring.security.user.password'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) did not find property 'spring.security.user.name'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass did not find unwanted classes 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository', 'org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector', 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured) + + WebClientObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties' (OnClassCondition) + + WebMvcAutoConfiguration#hiddenHttpMethodFilter: + Did not match: + - @ConditionalOnBooleanProperty (spring.mvc.hiddenmethod.filter.enabled=true) did not find property 'spring.mvc.hiddenmethod.filter.enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.ProblemDetailsErrorHandlingConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.mvc.problemdetails.enabled=true) did not find property 'spring.mvc.problemdetails.enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#beanNameViewResolver: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) found beans of type 'org.springframework.web.servlet.view.BeanNameViewResolver' beanNameViewResolver (OnBeanCondition) + + WebMvcHealthEndpointExtensionAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.health.actuate.endpoint.HealthEndpoint' (OnClassCondition) + + WebMvcMappingsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint' (OnClassCondition) + + WebMvcObservationAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties' (OnClassCondition) + + XADataSourceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.transaction.TransactionManager' (OnClassCondition) + + +Exclusions: +----------- + + None + + +Unconditional classes: +---------------------- + + org.springframework.boot.http.client.autoconfigure.HttpClientAutoConfiguration + + org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration + + org.springframework.boot.http.client.autoconfigure.service.HttpServiceClientPropertiesAutoConfiguration + + org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration + + org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration + + org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration + + org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration + + org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration + + + +]]> + + \ No newline at end of file diff --git a/customer-design/target/surefire-reports/com.customer.design.DesignApplicationTests.txt b/customer-design/target/surefire-reports/com.customer.design.DesignApplicationTests.txt new file mode 100644 index 0000000..0c9314c --- /dev/null +++ b/customer-design/target/surefire-reports/com.customer.design.DesignApplicationTests.txt @@ -0,0 +1,195 @@ +------------------------------------------------------------------------------- +Test set: com.customer.design.DesignApplicationTests +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.527 s <<< FAILURE! -- in com.customer.design.DesignApplicationTests +com.customer.design.DesignApplicationTests.contextLoads -- Time elapsed: 0.012 s <<< ERROR! +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@4aba7617 testClass = com.customer.design.DesignApplicationTests, locations = [], classes = [com.customer.design.DesignApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizer@30bcf3c1, org.springframework.boot.test.context.PropertyMappingContextCustomizer@0, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@7c2b6087, org.springframework.boot.test.http.client.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@354fc8f0, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@5b43fbf6, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@5b07730f, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@ae57ec99], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:195) + at org.springframework.test.context.cache.DefaultContextCache.put(DefaultContextCache.java:214) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:160) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:210) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:186) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1716) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:632) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'basicDefaultSecurity' defined in class path resource [com/customer/design/SecurityHttpBasicConfiguration.class]: Unsatisfied dependency expressed through method 'basicDefaultSecurity' parameter 0: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:872) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:827) + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:493) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1446) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1218) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1184) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:994) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$2(SpringBootContextLoader.java:156) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1465) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:605) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:156) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:115) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:247) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:167) + ... 21 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'basicDefaultSecurity' defined in class path resource [com/customer/design/SecurityHttpBasicConfiguration.class]: Unsatisfied dependency expressed through method 'basicDefaultSecurity' parameter 0: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:2008) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1971) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeanCollection(DefaultListableBeanFactory.java:1863) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1833) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1711) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:864) + ... 48 more +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:489) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:351) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 65 more +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:183) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:72) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:152) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + ... 77 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'designUserDetailsService' defined in class path resource [com/flowable/autoconfigure/design/security/DesignSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designUserDetailsService' parameter 0: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1305) + at org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer.configure(InitializeUserDetailsBeanManagerConfigurer.java:94) + at org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer.configure(InitializeUserDetailsBeanManagerConfigurer.java:63) + at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.configure(AbstractConfiguredSecurityBuilder.java:386) + at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:336) + at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:38) + at org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration.getAuthenticationManager(AuthenticationConfiguration.java:121) + at org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.authenticationManager(HttpSecurityConfiguration.java:152) + at org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity(HttpSecurityConfiguration.java:119) + at java.base/java.lang.reflect.Method.invoke(Method.java:565) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:155) + ... 80 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'designIdentityQueryService' defined in class path resource [com/flowable/autoconfigure/design/DesignEngineAutoConfiguration.class]: Unsatisfied dependency expressed through method 'designIdentityQueryService' parameter 0: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 100 more +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'designEngine': FactoryBean threw exception on object creation + at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:209) + at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) + at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1879) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getObjectForBeanInstance(AbstractAutowireCapableBeanFactory.java:1304) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:343) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 114 more +Caused by: java.lang.RuntimeException: Exception while initializing Database connection + at org.flowable.common.engine.impl.util.DbUtil.determineDatabaseType(DbUtil.java:116) + at org.flowable.common.engine.impl.AbstractEngineConfiguration.initDatabaseType(AbstractEngineConfiguration.java:475) + at org.flowable.common.engine.impl.AbstractEngineConfiguration.initDataSource(AbstractEngineConfiguration.java:470) + at com.flowable.design.engine.DesignEngineConfiguration.init(DesignEngineConfiguration.java:365) + at org.flowable.common.engine.impl.AbstractBuildableEngineConfiguration.buildEngine(AbstractBuildableEngineConfiguration.java:28) + at com.flowable.design.engine.DesignEngineConfiguration.buildDesignEngine(DesignEngineConfiguration.java:336) + at com.flowable.design.engine.spring.DesignEngineFactoryBean.getObject(DesignEngineFactoryBean.java:36) + at com.flowable.design.engine.spring.DesignEngineFactoryBean.getObject(DesignEngineFactoryBean.java:20) + at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:203) + ... 124 more +Caused by: org.postgresql.util.PSQLException: Connection to localhost:5435 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:373) + at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:57) + at org.postgresql.jdbc.PgConnection.(PgConnection.java:290) + at org.postgresql.Driver.makeConnection(Driver.java:448) + at org.postgresql.Driver.connect(Driver.java:298) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:210) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:488) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:97) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:111) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118) + at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:256) + at jdk.proxy2/jdk.proxy2.$Proxy86.getMetaData(Unknown Source) + at org.flowable.common.engine.impl.util.DbUtil.determineDatabaseType(DbUtil.java:89) + ... 132 more +Caused by: java.net.ConnectException: Connection refused + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:639) + at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:543) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:594) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:284) + at java.base/java.net.Socket.connect(Socket.java:659) + at org.postgresql.core.PGStream.createSocket(PGStream.java:261) + at org.postgresql.core.PGStream.(PGStream.java:122) + at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:146) + at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:289) + ... 148 more + diff --git a/customer-design/target/test-classes/com/customer/design/DesignApplicationTests.class b/customer-design/target/test-classes/com/customer/design/DesignApplicationTests.class new file mode 100644 index 0000000..20927a2 Binary files /dev/null and b/customer-design/target/test-classes/com/customer/design/DesignApplicationTests.class differ diff --git a/customer-work/.DS_Store b/customer-work/.DS_Store new file mode 100644 index 0000000..00fae8c Binary files /dev/null and b/customer-work/.DS_Store differ diff --git a/customer-work/pom.xml b/customer-work/pom.xml new file mode 100644 index 0000000..62ac3e8 --- /dev/null +++ b/customer-work/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + + + com.customer + customer-parent + 0.0.1-SNAPSHOT + + + customer-work + customer-work + customer-work + + + + + + + + + + + + + + + + + + + + com.flowable.work + flowable-work-frontend + + + com.flowable.platform + flowable-platform-default-models + + + com.flowable.platform + flowable-spring-boot-starter-platform-rest + + + com.flowable.platform + flowable-tenant-setup + + + org.postgresql + postgresql + runtime + + + + + + com.flowable.inspect + flowable-spring-boot-starter-inspect-rest + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + runtime + + + com.github.wnameless.json + json-flattener + 0.16.6 + + + com.icegreen + greenmail + 2.1.8 + + + org.apache.poi + poi-ooxml + test + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/customer-work/src/.DS_Store b/customer-work/src/.DS_Store new file mode 100644 index 0000000..d6f9810 Binary files /dev/null and b/customer-work/src/.DS_Store differ diff --git a/customer-work/src/main/.DS_Store b/customer-work/src/main/.DS_Store new file mode 100644 index 0000000..428b0ab Binary files /dev/null and b/customer-work/src/main/.DS_Store differ diff --git a/customer-work/src/main/java/com/customer/work/SecurityHttpBasicConfiguration.java b/customer-work/src/main/java/com/customer/work/SecurityHttpBasicConfiguration.java new file mode 100644 index 0000000..2786cf5 --- /dev/null +++ b/customer-work/src/main/java/com/customer/work/SecurityHttpBasicConfiguration.java @@ -0,0 +1,62 @@ +package com.customer.work; + +import java.util.stream.Collectors; + +import jakarta.servlet.DispatcherType; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.HttpStatusEntryPoint; +import org.springframework.security.web.util.matcher.AnyRequestMatcher; +import org.springframework.security.web.util.matcher.DispatcherTypeRequestMatcher; + +import com.flowable.autoconfigure.security.FlowableHttpSecurityCustomizer; +import com.flowable.autoconfigure.security.servlet.PlatformPathRequest; +import com.flowable.core.spring.security.web.authentication.AjaxAuthenticationFailureHandler; +import com.flowable.core.spring.security.web.authentication.AjaxAuthenticationSuccessHandler; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty(prefix = "application.security", name = "type", havingValue = "basic", matchIfMissing = true) +@EnableWebSecurity +public class SecurityHttpBasicConfiguration { + + @Bean + @Order(10) + public SecurityFilterChain basicDefaultSecurity(HttpSecurity http, ObjectProvider httpSecurityCustomizers) throws Exception { + for (FlowableHttpSecurityCustomizer customizer : httpSecurityCustomizers.orderedStream() + .collect(Collectors.toList())) { + customizer.customize(http); + } + + http + .logout(logout -> logout.logoutUrl("/auth/logout").logoutSuccessUrl("/")); + + // Non authenticated exception handling. The formLogin and httpBasic configure the exceptionHandling + // We have to initialize the exception handling with a default authentication entry point in order to return 401 each time and not have a + // forward due to the formLogin or the http basic popup due to the httpBasic + http + .exceptionHandling(exceptionHandling -> exceptionHandling + .defaultAuthenticationEntryPointFor((request, response, authException) -> {}, new DispatcherTypeRequestMatcher(DispatcherType.ERROR)) + .defaultAuthenticationEntryPointFor(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED), AnyRequestMatcher.INSTANCE)) + .formLogin(formLogin -> formLogin + .loginProcessingUrl("/auth/login") + .successHandler(new AjaxAuthenticationSuccessHandler()) + .failureHandler(new AjaxAuthenticationFailureHandler()) + ) + .authorizeHttpRequests(configurer -> configurer + .requestMatchers(PlatformPathRequest.toStaticResources().atCommonLocations()).permitAll() + .anyRequest().authenticated() + ) + .httpBasic(Customizer.withDefaults()); + + return http.build(); + } +} diff --git a/customer-work/src/main/java/com/customer/work/StaticResourceConfiguration.java b/customer-work/src/main/java/com/customer/work/StaticResourceConfiguration.java new file mode 100644 index 0000000..622a27d --- /dev/null +++ b/customer-work/src/main/java/com/customer/work/StaticResourceConfiguration.java @@ -0,0 +1,65 @@ +package com.customer.work; + +import java.util.concurrent.TimeUnit; + +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration(proxyBeanMethods = false) +public class StaticResourceConfiguration implements WebMvcConfigurer { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.setOrder(10) + .addResourceHandler("/ext/*.js", "/*/ext/*.js") + .addResourceLocations("classpath:/static/ext/", "classpath:/public/ext/") + .setCacheControl(CacheControl.noCache()); + + registry.setOrder(20) + .addResourceHandler("/ext/*.css", "/*/ext/*.css") + .addResourceLocations("classpath:/static/ext/", "classpath:/public/ext/") + .setCacheControl(CacheControl.noCache()); + + registry.setOrder(30) + .addResourceHandler("/*.js") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(40) + .addResourceHandler("/*.css") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(50) + .addResourceHandler("/*.woff") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(60) + .addResourceHandler("/*.woff2") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(70) + .addResourceHandler("/*.svg") + .addResourceLocations("classpath:/public/", "classpath:/public/twemoji/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(80) + .addResourceHandler("/*.map") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(90) + .addResourceHandler("/*.png") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + + registry.setOrder(100) + .addResourceHandler("/*.ico") + .addResourceLocations("classpath:/public/") + .setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS)); + } +} diff --git a/customer-work/src/main/java/com/customer/work/WorkApplication.java b/customer-work/src/main/java/com/customer/work/WorkApplication.java new file mode 100644 index 0000000..28cb2ab --- /dev/null +++ b/customer-work/src/main/java/com/customer/work/WorkApplication.java @@ -0,0 +1,13 @@ +package com.customer.work; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WorkApplication { + + public static void main(String[] args) { + SpringApplication.run(WorkApplication.class, args); + } + +} diff --git a/customer-work/src/main/java/com/customer/work/service/JsonUtils.java b/customer-work/src/main/java/com/customer/work/service/JsonUtils.java new file mode 100644 index 0000000..c1b88e3 --- /dev/null +++ b/customer-work/src/main/java/com/customer/work/service/JsonUtils.java @@ -0,0 +1,107 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.github.wnameless.json.flattener.JsonFlattener; +import com.github.wnameless.json.unflattener.JsonUnflattener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +@Component +public class JsonUtils { + + protected static final Logger LOGGER = LoggerFactory.getLogger(JsonUtils.class); + protected final ObjectMapper objectMapper; + protected final JavaTimeModule javaTimeModule; + + public JsonUtils(ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + this.javaTimeModule = new JavaTimeModule(); + + // Enable ObjectMapper for handling Instant as string + this.objectMapper.registerModule(javaTimeModule); + this.objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + public JsonNode convertListToJsonNode(List list) { + return objectMapper.valueToTree(list); + } + + public JsonNode convertMapToJsonNode(Map map) { + return objectMapper.valueToTree(map); + } + + public Map convertJsonNodeToMap(JsonNode jsonNode) { + return objectMapper.convertValue(jsonNode, new TypeReference>() {}); + } + + public Map flatten(Object payload) { + try { + return JsonFlattener.flattenAsMap(objectMapper.writeValueAsString(payload)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public Map unflatten(Map flatVars) { + try { + return objectMapper.readValue(JsonUnflattener.unflatten(flatVars), Map.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public JsonNode convertJsonStringToJsonNode(String jsonString) { + try { + return objectMapper.readTree(jsonString); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public Map convertObjectNodeToMap(ObjectNode objectNode) { + return objectMapper.convertValue(objectNode, new TypeReference>() {}); + } + + public ObjectNode getEmptyObjectNode() { + return objectMapper.createObjectNode(); + } + + public ObjectNode loadObjectNodeFromFile(String path) { + try { + return (ObjectNode) this.objectMapper.readTree(new File(path)); + } catch (IOException e) { + LOGGER.debug(e.getMessage()); + return null; + } + } + + public ArrayNode convertObjectToArrayNode(Object object) { + if (object == null) { + LOGGER.debug("{}: Argument is null", this.getClass().getName()); + return null; + } + String obyTypeName = object.getClass().getName(); + if (obyTypeName.equals("java.util.Collections$EmptyList") || obyTypeName.equals("java.util.ArrayList")) { + return objectMapper.convertValue(object, ArrayNode.class); + } else if (obyTypeName.equals("com.fasterxml.jackson.databind.node.ArrayNode")) { + return (ArrayNode) object; + } else { + LOGGER.debug("{}: {} is not implemented}", this.getClass().getName(), obyTypeName); + return null; + } + } +} diff --git a/customer-work/src/main/java/com/customer/work/service/VarUtils.java b/customer-work/src/main/java/com/customer/work/service/VarUtils.java new file mode 100644 index 0000000..cc90f6a --- /dev/null +++ b/customer-work/src/main/java/com/customer/work/service/VarUtils.java @@ -0,0 +1,418 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.flowable.cmmn.api.CmmnRuntimeService; +import org.flowable.cmmn.engine.CmmnEngineConfiguration; +import org.flowable.cmmn.engine.impl.persistence.entity.CaseInstanceEntity; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.engine.ProcessEngineConfiguration; +import org.flowable.cmmn.api.runtime.CaseInstance; +import org.flowable.cmmn.api.runtime.PlanItemInstance; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.variable.api.delegate.VariableScope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * General-purpose Flowable variable utility bean. + * Usable in BPMN process and CMMN case backend expressions without any scope parameter: + * ${varUtils.get('order.customer.name')} + * ${varUtils.track('order.customer.name,order.total,status')} + * Root variables are supported. + * How the scope is resolved without a parameter + * ----------------------------------------------- + * The bean registers itself as a Flowable event listener on both engines. + * Before a service task expression is evaluated, Flowable fires events on the + * same thread that allow us to capture the current variable scope: + * BPMN — PROCESS_STARTED fires a FlowableEngineEntityEvent. + * The execution is retrieved via event.getEntity(). + + * CMMN — CASE_STARTED fires a FlowableEngineEntityEvent.; Instead, when a plan + * The case instance is retrieved via event.getEntity(). + */ +@Component("varUtils") +public class VarUtils implements FlowableEventListener, SmartInitializingSingleton { + + private static final Logger LOGGER = LoggerFactory.getLogger(VarUtils.class); + + private static final ThreadLocal SCOPE = new ThreadLocal<>(); + + private static final ObjectMapper MAPPER; + static { + MAPPER = new ObjectMapper(); + MAPPER.registerModule(new JavaTimeModule()); + MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + @Autowired + private ProcessEngineConfiguration processEngineConfiguration; + + @Autowired + private CmmnEngineConfiguration cmmnEngineConfiguration; + + @Autowired + private RuntimeService runtimeService; + + @Autowired + private CmmnRuntimeService cmmnRuntimeService; + + // ------------------------------------------------------------------------- + // Listener registration — runs after all beans are ready + // ------------------------------------------------------------------------- + @Override + public void afterSingletonsInstantiated() { + if (processEngineConfiguration != null) { + processEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on BPMN event dispatcher"); + } + if (cmmnEngineConfiguration != null) { + cmmnEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on CMMN event dispatcher"); + } + } + + // ------------------------------------------------------------------------- + // FlowableEventListener — bind / unbind the scope ThreadLocal + // ------------------------------------------------------------------------- + @Override + public void onEvent(FlowableEvent event) { + + if (event instanceof FlowableEngineEntityEvent entityEvent) { + String typeName = event.getType().name(); + Object entity = entityEvent.getEntity(); + + // BPMN execution + if (entity instanceof ExecutionEntity execution) { + switch (typeName) { + case "PROCESS_STARTED" + -> SCOPE.set(execution); + case "PROCESS_CANCELLED", + "PROCESS_COMPLETED", + "PROCESS_COMPLETED_WITH_ERROR_END_EVENT", + "PROCESS_COMPLETED_WITH_ESCALATION_END_EVENT", + "PROCESS_COMPLETED_WITH_TERMINATE_END_EVENT" + -> SCOPE.remove(); + } + return; + } + + // CMMN case instance itself + if (entity instanceof CaseInstanceEntity caseInstance) { + if ("CASE_STARTED".equals(typeName)) + SCOPE.set(caseInstance); + else if ("CASE_ENDED".equals(typeName)) + SCOPE.remove(); + } + } + } + + @Override public boolean isFailOnException() { return false; } + @Override public boolean isFireOnTransactionLifecycleEvent() { return false; } + @Override public String getOnTransaction() { return null; } + + // ------------------------------------------------------------------------- + // Public API — called from Flowable expressions + // ------------------------------------------------------------------------- + + /** + * Checks which of the given comma-separated variable paths changed since the + * last call and returns a JSON array describing each change. + * ${varUtils.trackVars('root.snapshot', 'root.myString, status')} + * {@code snapshotPath} is a dot-notation path (supports the {@code root.} prefix) + * pointing to where the previous-values snapshot is stored and updated. + * Each subsequent call compares against the previous snapshot and updates it. + * Example return value: + * [{"path":"root.myString","oldValue":"a","newValue":"b"}] + */ + public ArrayNode trackVars(String snapshotPath, String variablePathsCsv) { + + // Check parameters + if (snapshotPath == null || snapshotPath.isBlank() || variablePathsCsv == null || variablePathsCsv.isBlank()) { + LOGGER.debug("{}.trackVars: empty parameters", getClass().getName()); + return MAPPER.createArrayNode(); + } + + // Get current scope + VariableScope currentScope = getCurrentScope(); + if (currentScope == null) { + LOGGER.debug("{}.trackVars: currentScope not found", getClass().getName()); + return MAPPER.createArrayNode(); + } + + // Create paths list + List paths = Arrays.stream(variablePathsCsv.split(",")) + .map(String::trim).filter(s -> !s.isEmpty()).toList(); + + Map oldSnapshot = loadSnapshot(currentScope, snapshotPath); + Map newSnapshot = new HashMap<>(); + ArrayNode changes = MAPPER.createArrayNode(); + + // Loop paths list + for (String path : paths) { + JsonNode newValue = toJson(readVariableFromPath(currentScope, path)); + newSnapshot.put(path, newValue); + + JsonNode oldValue = oldSnapshot.getOrDefault(path, MAPPER.nullNode()); + if (!oldValue.equals(newValue)) { + ObjectNode change = MAPPER.createObjectNode(); + change.put("path", path); + change.set("oldValue", oldValue); + change.set("newValue", newValue); + changes.add(change); + } + } + + saveSnapshot(currentScope, snapshotPath, newSnapshot); + + return changes; + } + + // ------------------------------------------------------------------------- + // Path resolution + // ------------------------------------------------------------------------- + + private Object readVariableFromPath(VariableScope scope, String path) { + String[] segments = path.split("\\.", -1); + if (segments.length < 1) return null; + + int startIndex = 0; + if ("root".equals(segments[0])) { + if (segments.length < 2) return null; + startIndex = 1; + scope = getRootScope(scope); + } + if (scope == null) return null; + + Object currentValue = scope.getVariable(segments[startIndex]); + for (int i = startIndex + 1; i < segments.length; i++) { + if (currentValue == null) return null; + currentValue = getNestedVariable(currentValue, segments[i]); + } + return currentValue; + } + + private void writeVariableToPath(VariableScope scope, String path, Object value) { + String[] segments = path.split("\\.", -1); + if (segments.length < 1) return; + + VariableScope targetScope; + String[] varSegments; + if ("root".equals(segments[0])) { + if (segments.length < 2) return; + targetScope = getRootScope(scope); + varSegments = Arrays.copyOfRange(segments, 1, segments.length); + } else { + targetScope = scope; + varSegments = segments; + } + if (targetScope == null) return; + + if (varSegments.length == 1) { + targetScope.setVariable(varSegments[0], value); + return; + } + + // Nested path: read the top-level variable, navigate to the parent node, + // mutate it in-place, then write the top-level variable back. + String topVar = varSegments[0]; + Object topValue = targetScope.getVariable(topVar); + + Object parent = topValue; + for (int i = 1; i < varSegments.length - 1; i++) { + if (parent == null) { + LOGGER.warn("varUtils.writeVariableToPath: null at '{}' in path '{}'", varSegments[i - 1], path); + return; + } + parent = getNestedVariable(parent, varSegments[i]); + } + + if (!setNestedValue(parent, varSegments[varSegments.length - 1], value, path)) return; + targetScope.setVariable(topVar, topValue); + } + + @SuppressWarnings("unchecked") + private boolean setNestedValue(Object parent, String key, Object value, String path) { + if (parent instanceof Map map) { + map.put(key, value); + return true; + } + if (parent instanceof ObjectNode on) { + on.set(key, toJson(value)); + return true; + } + LOGGER.warn("varUtils.writeVariableToPath: cannot set '{}' on {} in path '{}'", + key, parent == null ? "null" : parent.getClass().getName(), path); + return false; + } + + // ------------------------------------------------------------------------- + // Scope resolution + // ------------------------------------------------------------------------- + + private VariableScope getCurrentScope() { + VariableScope scope = SCOPE.get(); + if (scope == null) { + LOGGER.error("{}.getCurrentScope called without an active Flowable scope", getClass().getName()); + } + return scope; + } + + private VariableScope getRootScope(VariableScope scope) { + if (scope instanceof DelegateExecution ex) return findBpmnRootScope(ex.getProcessInstanceId()); + if (scope instanceof CaseInstance ci) return findCmmnRootScope(ci.getId()); + return null; + } + + private VariableScope findBpmnRootScope(String processInstanceId) { + if (processInstanceId == null || runtimeService == null) return null; + try { + Execution piExec = runtimeService.createExecutionQuery() + .executionId(processInstanceId).singleResult(); + if (piExec != null && piExec.getSuperExecutionId() != null) { + Execution superExec = runtimeService.createExecutionQuery() + .executionId(piExec.getSuperExecutionId()).singleResult(); + if (superExec != null) + return findBpmnRootScope(superExec.getProcessInstanceId()); + } + ProcessInstance pi = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).singleResult(); + if (pi != null && pi.getCallbackType() != null && pi.getCallbackId() != null + && cmmnRuntimeService != null) { + PlanItemInstance planItem = cmmnRuntimeService.createPlanItemInstanceQuery() + .planItemInstanceId(pi.getCallbackId()).singleResult(); + if (planItem != null) + return findCmmnRootScope(planItem.getCaseInstanceId()); + } + return (ExecutionEntity) piExec; // root: ExecutionEntity implements VariableScope + } catch (Exception e) { + LOGGER.debug("{}.findBpmnRootScope: BPMN root scope climb failed: {}", getClass().getName(), e.getMessage()); + return null; + } + } + + private VariableScope findCmmnRootScope(String caseInstanceId) { + if (caseInstanceId == null || cmmnRuntimeService == null) return null; + try { + CaseInstance ci = cmmnRuntimeService.createCaseInstanceQuery() + .caseInstanceId(caseInstanceId).singleResult(); + if (ci == null) return null; + if (ci.getParentId() != null) + return findCmmnRootScope(ci.getParentId()); + if (ci.getCallbackType() != null && ci.getCallbackId() != null + && runtimeService != null) { + Execution callbackExec = runtimeService.createExecutionQuery() + .executionId(ci.getCallbackId()).singleResult(); + if (callbackExec != null) + return findBpmnRootScope(callbackExec.getProcessInstanceId()); + } + return (CaseInstanceEntity) ci; // root: CaseInstanceEntity implements VariableScope + } catch (Exception e) { + LOGGER.debug("{}.findCmmnRootScope: CMMN root scope climb failed: {}", getClass().getName(), e.getMessage()); + return null; + } + } + + private static Object getNestedVariable(Object obj, String segment) { + if (obj instanceof List list) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < list.size() ? list.get(i) : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Object[] arr) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < arr.length ? arr[i] : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Map map) return map.get(segment); + if (obj instanceof JsonNode jn) { + JsonNode node = jn.get(segment); + if (node == null || node.isNull()) return null; + if (node.isTextual()) return node.asText(); + if (node.isBoolean()) return node.asBoolean(); + if (node.isLong()) return node.asLong(); + if (node.isInt()) return node.asInt(); + if (node.isDouble()) return node.asDouble(); + return node; + } + String cap = Character.toUpperCase(segment.charAt(0)) + segment.substring(1); + try { + return obj.getClass().getMethod("get" + cap).invoke(obj); + } catch (Exception ignored) {} + try { + return obj.getClass().getMethod("is" + cap).invoke(obj); + } catch (Exception ignored) {} + try { + java.lang.reflect.Field f = findField(obj.getClass(), segment); + if (f != null) { f.setAccessible(true); return f.get(obj); } + } catch (Exception ignored) {} + LOGGER.warn("varUtils: cannot resolve '{}' on {}", segment, obj.getClass().getName()); + return null; + } + + private static java.lang.reflect.Field findField(Class c, String name) { + while (c != null && c != Object.class) { + try { return c.getDeclaredField(name); } + catch (NoSuchFieldException e) { c = c.getSuperclass(); } + } + return null; + } + + // ------------------------------------------------------------------------- + // Snapshot persistence + // ------------------------------------------------------------------------- + + private Map loadSnapshot(VariableScope scope, String path) { + Object raw = readVariableFromPath(scope, path); + if (raw == null) return new HashMap<>(); + try { + String json = raw instanceof String s ? s : MAPPER.writeValueAsString(raw); + Map flat = MAPPER.readValue(json, + MAPPER.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); + Map result = new HashMap<>(); + flat.forEach((k, v) -> result.put(k, toJson(v))); + return result; + } catch (Exception e) { + LOGGER.warn("varUtils: could not load snapshot at '{}': {}", path, e.getMessage()); + return new HashMap<>(); + } + } + + private void saveSnapshot(VariableScope scope, String path, Map snapshot) { + try { + writeVariableToPath(scope, path, MAPPER.writeValueAsString(snapshot)); + } catch (Exception e) { + LOGGER.error("varUtils: could not save snapshot at '{}'", path, e); + } + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private static JsonNode toJson(Object value) { + if (value == null) return MAPPER.nullNode(); + if (value instanceof JsonNode jn) return jn; + return MAPPER.valueToTree(value); + } +} diff --git a/customer-work/src/main/resources/application.properties b/customer-work/src/main/resources/application.properties new file mode 100644 index 0000000..f6d5519 --- /dev/null +++ b/customer-work/src/main/resources/application.properties @@ -0,0 +1,38 @@ +server.port=8105 + +# Enable all endpoints over HTTP +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=when_authorized + +flowable.frontend.title=flowable-work + +#spring.datasource.url=jdbc:h2:~/flowable-work-db/db;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1 +#spring.datasource.username=flowable +#spring.datasource.password=flowable + +#Comment out and configure database +spring.datasource.url=jdbc:postgresql://localhost:5435/flowable +spring.datasource.username=flowable +spring.datasource.password=flowable + +# Local Elasticsearch config +spring.elasticsearch.uris=http://localhost:9203 + +# spring.data.elasticsearch.repositories.enabled=true +# spring.data.elasticsearch.cluster-nodes=localhost:9300 +# spring.data.elasticsearch.cluster-name=elasticsearch + +flowable.indexing.index-name-prefix=flowable-work- +#Disable ElasticSearch Indexing +#flowable.indexing.enabled=false + +# Enable Flowable Inspect +flowable.inspect.enabled=true + +# Forms will update even if an old process/case/task definition will be used +flowable.platform.enable-latest-form-definition-lookup=true + +# Server URL for REST calls +baseUrl=http://localhost:8105 + + diff --git a/customer-work/src/main/resources/com/flowable/filters/contact/work-contact-filters.json b/customer-work/src/main/resources/com/flowable/filters/contact/work-contact-filters.json new file mode 100644 index 0000000..a0087c6 --- /dev/null +++ b/customer-work/src/main/resources/com/flowable/filters/contact/work-contact-filters.json @@ -0,0 +1,48 @@ +[ + { + "key": "all", + "labelKey": "contacts.filter.all", + "defaultLabel": "All", + "parameters": {} + }, + { + "key": "internal", + "labelKey": "contacts.filter.internal", + "defaultLabel": "Internal", + "parameters": { + "must": { + "type": "default" + } + } + }, + { + "key": "external", + "labelKey": "contacts.filter.external", + "defaultLabel": "External", + "parameters": { + "must" : { + "type": "external" + } + } + }, + { + "key": "active", + "labelKey": "contacts.filter.active", + "defaultLabel": "Active", + "parameters": { + "must" : { + "state": "ACTIVE" + } + } + }, + { + "key": "inactive", + "labelKey": "contacts.filter.inactive", + "defaultLabel": "Inactive", + "parameters": { + "must" : { + "state": "INACTIVE" + } + } + } +] \ No newline at end of file diff --git a/customer-work/src/main/resources/com/flowable/tenant-setup/custom/work-custom.json b/customer-work/src/main/resources/com/flowable/tenant-setup/custom/work-custom.json new file mode 100644 index 0000000..c9c6129 --- /dev/null +++ b/customer-work/src/main/resources/com/flowable/tenant-setup/custom/work-custom.json @@ -0,0 +1,21 @@ +{ + "name": "Flowable", + + "groups": [ + { "key": "flowableUser", "name": "Flowable User" }, + { "key": "flowableAdministrator", "name": "Flowable Administrator" } + ], + + "users": [ + { + "firstName": "Flowable", + "lastName": "Admin", + "login": "admin", + "email": "test@demo.flowable.io", + + "language": "en", + "theme": "flowable", + "userDefinitionKey": "user-admin" + } + ] +} \ No newline at end of file diff --git a/customer-work/src/main/resources/com/flowable/users/custom/work-custom.user.json b/customer-work/src/main/resources/com/flowable/users/custom/work-custom.user.json new file mode 100644 index 0000000..e3f68c5 --- /dev/null +++ b/customer-work/src/main/resources/com/flowable/users/custom/work-custom.user.json @@ -0,0 +1,67 @@ +[ + { + "key": "user-default", + "name": "Default user", + "description": "Creates a new, non-specific user where the member groups can be freely chosen.", + "initialState": "ACTIVE", + "initialSubState": "ACTIVE", + "forms": { + "init": "F01_userInitFormDefault", + "view": "F02_userViewFormDefault", + "edit": "F03_userEditFormDefault" + }, + "memberGroups": [ + "flowableUser" + ], + "lookupGroups":[ + "flowableUser" + ], + "actionPermissions": { + "create": [ "flowableAdministrator" ], + "edit": [ "flowableAdministrator" ], + "deactivate": [ "flowableAdministrator" ], + "activate": [ "flowableAdministrator" ] + }, + "contactFilters": [ "all" ], + "allowedFeatures": [ "contacts", "bubbles", "markdownInput", "replyToMessage", "forwardMessage", "reactToMessage", "fileUpload", "work", "createWork", + "personalAccessTokens", + "tasks", "documents", "changeOwnPassword", "changeOwnTheme", "editOwnAvatar"] + }, + { + "key": "user-admin", + "name": "Administration User", + "description": "Creates a new, administration user.", + "initialUserSubType": "admin", + "initialState": "ACTIVE", + "initialSubState": "ACTIVE", + "forms": { + "init": "F01_userInitFormDefault", + "view": "F02_userViewFormDefault", + "edit": "F03_userEditFormDefault" + }, + "memberGroups": [ + "flowableUser", + "flowableAdministrator" + ], + "lookupGroups":[ + "flowableUser" + ], + "actionPermissions": { + "create": [ "flowableAdministrator"], + "edit": [ "flowableAdministrator" ], + "deactivate": [ "flowableAdministrator" ], + "activate": [ "flowableAdministrator" ] + }, + "initialVariables": { + "adminUser": true, + "description": "Admin" + }, + "contactFilters": [ "all", "internal", "external", "inactive"], + "allowedFeatures": [ "contacts", "createUser", "reports", + "actuators", "user-mgmt", "search-api", "workobject-api", "templateManagement", + "markdownInput", "replyToMessage", "forwardMessage", "reactToMessage", "fileUpload", "work", "createWork", "tasks", "documents", + "impersonateUser", + "personalAccessTokens", + "changeOwnPassword", "changeOwnTheme", "editOwnAvatar", "themeManagement"] + } +] \ No newline at end of file diff --git a/customer-work/src/test/java/com/customer/work/WorkApplicationTests.java b/customer-work/src/test/java/com/customer/work/WorkApplicationTests.java new file mode 100644 index 0000000..c2bfa46 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/WorkApplicationTests.java @@ -0,0 +1,13 @@ +package com.customer.work; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class WorkApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/customer-work/src/test/java/com/customer/work/config/TestConfiguration.java b/customer-work/src/test/java/com/customer/work/config/TestConfiguration.java new file mode 100644 index 0000000..bc925ad --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/config/TestConfiguration.java @@ -0,0 +1,7 @@ +package com.customer.work.config; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class TestConfiguration { +} diff --git a/customer-work/src/test/java/com/customer/work/model/EmailDto.java b/customer-work/src/test/java/com/customer/work/model/EmailDto.java new file mode 100644 index 0000000..9261cb2 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/EmailDto.java @@ -0,0 +1,49 @@ +package com.customer.work.model; + +import java.util.List; + +public class EmailDto { + private String subject; + private List receiverList; + private String content; + private Object contentRaw; + + public EmailDto(String subject, List receiverList, String content, Object contentRaw) { + this.subject = subject; + this.receiverList = receiverList; + this.content = content; + this.contentRaw = contentRaw; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public List getReceiverList() { + return receiverList; + } + + public void setReceiverList(List receiverList) { + this.receiverList = receiverList; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Object getContentRaw() { + return contentRaw; + } + + public void setContentRaw(Object contentRaw) { + this.contentRaw = contentRaw; + } +} diff --git a/customer-work/src/test/java/com/customer/work/model/FlowableExcelMapper.java b/customer-work/src/test/java/com/customer/work/model/FlowableExcelMapper.java new file mode 100644 index 0000000..b6baa2c --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/FlowableExcelMapper.java @@ -0,0 +1,335 @@ +package com.customer.work.model; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.stereotype.Component; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + + +@Component +public class FlowableExcelMapper { + + protected static ObjectMapper objectMapper = new ObjectMapper(); + protected static JavaTimeModule javaTimeModule = new JavaTimeModule(); + protected static FlowableExcelParser flowableExcelParser = new FlowableExcelParser(); + + public FlowableExcelMapper() { + // Enable ObjectMapper for handling Instant as string + objectMapper.registerModule(javaTimeModule); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + // excelPath defines the location of the Excel file + // FlowableExcelParser is used to create an ArrayList from the Excel file + // The 1st row of every sheet contains the path of the variables to be created in the JsonNode + // Delimiter is "." for an ObjectNode and "*" for an ArrayNode + // The 2nd row contains tht type of the variable. Supported types are: + // - String + // - Boolean + // - Integer + // - Double + // - Date + // All sheets are added to an ArrayNode + // All rows are added to an ArrayNode in the sheets ArrayNode + // All cell values are added to an ObjectNode in the rows ArrayNode + public ArrayNode excelBookResourceToJsonNode(String resourcePath) { + ArrayList>> book = flowableExcelParser.parseExcelBookFromResource(resourcePath); + return bookToJsonNode(book); + } + + protected ArrayNode bookToJsonNode(ArrayList>> book) { + ArrayNode bookNode = objectMapper.createArrayNode(); + for (ArrayList> sheet : book) { + bookNode.add(sheetToJsonNode(sheet)); + } + return bookNode; + } + + protected ArrayNode sheetToJsonNode(ArrayList> rows) { + ArrayList paths = new ArrayList<>(); + ArrayList types = new ArrayList<>(); + ArrayNode arrayNode = objectMapper.createArrayNode(); + for (int rowNum = 0; rowNum < rows.size(); rowNum++) { + if (rowNum == 0) { + // The 1st row contains the paths + paths.addAll(rows.get(rowNum)); + } else if (rowNum == 1) { + // The 2nd row contains the types of the variables + types.addAll(rows.get(rowNum)); + } else { + // All other rows contain the values of the variables + arrayNode.add(rowToJsonNode(types, paths, rows.get(rowNum), null)); + } + } + return arrayNode; + } + + protected JsonNode rowToJsonNode(ArrayList types, ArrayList paths, ArrayList row, JsonNode jsonNode) { + for (int cellNum = 0; cellNum < row.size(); cellNum++) { + String cellValue = row.get(cellNum); + // Empty cells are not added to node + if (cellValue != null && !cellValue.isEmpty()) { + String type = types.get(cellNum); + Object content; + switch (cellValue) { + case "__NULL": content = null; break; + case "__N_A": content = "__N_A"; break; + default: + switch (type) { + case "String": + switch (cellValue) { + case "__EMPTY": content = ""; break; + case "__BLANK": content = " "; break; + default: content = cellValue; + } + break; + case "Boolean": content = Boolean.parseBoolean(cellValue); break; + case "Integer": content = Integer.parseInt(cellValue); break; + case "Double": content = Double.parseDouble(cellValue); break; + case "Long": content = Long.parseLong(cellValue); break; + case "Date": + // Excel considers dates as local dates, but we want them as UTC + Instant instant; + try { + LocalDateTime localDateTime = LocalDateTime.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant(); + } catch (DateTimeParseException e) { + LocalDate localDate = LocalDate.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant(); + } + content = instant.plusSeconds(ZonedDateTime.now().getOffset().getTotalSeconds()); + break; + default: + throw new RuntimeException("Variable type not supported: " + type); + } + } + jsonNode = addNode(jsonNode, paths.get(cellNum), content); + } + } + return jsonNode; + } + + protected JsonNode addNode(JsonNode parent, String path, Object value) { + if (parent == null) { + parent = objectMapper.createObjectNode(); + } + + int delimiterPosition = indexOfFirstDelimiter(path, ".*"); + if (delimiterPosition <= 0) { + if (parent instanceof ObjectNode) { + // Key of a value in an ObjectNode + ((ObjectNode) parent).set(path, objectMapper.valueToTree(value)); + } else { + // Index of a value in an ArrayNode + int index = Integer.parseInt(path); + while (parent.size() <= index) { + // Create empty entries to parent ArrayNode + ((ArrayNode) parent).add(objectMapper.createObjectNode()); + } + ((ArrayNode) parent).set(index, objectMapper.valueToTree(value)); + } + return parent; + } + + String key = path.substring(0, delimiterPosition); + String newPath = path.substring(delimiterPosition + 1); + String delimiter = path.substring(delimiterPosition, delimiterPosition + 1); + JsonNode child = null; + if (delimiter.equals(".")) { + child = objectMapper.createObjectNode(); + } else if (delimiter.equals("*")) { + child = objectMapper.createArrayNode(); + } + + JsonNode node; + if (parent instanceof ObjectNode) { + // Key of a JsonNode in an ObjectNode + node = parent.get(key); + if (node != null) { + // Take the existing ObjectNode as child + child = node; + } + ((ObjectNode) parent).set(key, addNode(child, newPath, value)); + } else { + // Index of a JsonNode in an ArrayNode + int index = Integer.parseInt(key); + node = parent.get(index); + if (node != null) { + // Take the existing ArrayNode as child + child = node; + } + while (parent.size() <= index) { + // Create empty entries to parent ArrayNode + ((ArrayNode) parent).add(objectMapper.createObjectNode()); + } + ((ArrayNode) parent).set(index, addNode(child, newPath, value)); + } + return parent; + } + + protected int indexOfFirstDelimiter(String str, String delimiters) { + for (int i = 0; i < str.length(); i++) { + for (char c : delimiters.toCharArray()) { + if (str.charAt(i) == c) { + return i; + } + } + } + return -1; + } + + public ArrayList> excelBookResourceToObj(String resourcePath) { + ArrayList>> book = flowableExcelParser.parseExcelBookFromResource(resourcePath); + return bookToObj(book); + } + + protected ArrayList> bookToObj(ArrayList>> book) { + ArrayList> bookNode = new ArrayList<>(); + for (ArrayList> sheet : book) { + bookNode.add(sheetToObj(sheet)); + } + return bookNode; + } + + protected ArrayList sheetToObj(ArrayList> rows) { + ArrayList paths = new ArrayList<>(); + ArrayList types = new ArrayList<>(); + ArrayList arrayNode = new ArrayList<>(); + for (int rowNum = 0; rowNum < rows.size(); rowNum++) { + if (rowNum == 0) { + // The 1st row contains the paths + paths.addAll(rows.get(rowNum)); + } else if (rowNum == 1) { + // The 2nd row contains the types of the variables + types.addAll(rows.get(rowNum)); + } else { + // All other rows contain the values of the variables + arrayNode.add(rowToObj(types, paths, rows.get(rowNum), null)); + } + } + return arrayNode; + } + + protected Object rowToObj(ArrayList types, ArrayList paths, ArrayList row, Object node) { + for (int cellNum = 0; cellNum < row.size(); cellNum++) { + String cellValue = row.get(cellNum); + // Empty cells are not added to node + if (cellValue != null && !cellValue.isEmpty()) { + String type = types.get(cellNum); + Object content; + switch (cellValue) { + case "__NULL": content = null; break; + case "__N_A": content = "__N_A"; break; + default: + switch (type) { + case "String": + switch (cellValue) { + case "__EMPTY": content = ""; break; + case "__BLANK": content = " "; break; + default: content = cellValue; + } + break; + case "Boolean": content = Boolean.parseBoolean(cellValue); break; + case "Integer": content = Integer.parseInt(cellValue); break; + case "Double": content = Double.parseDouble(cellValue); break; + case "Long": content = Long.parseLong(cellValue); break; + case "Date": + // Excel considers dates as local dates, but we want them as UTC + Instant instant; + try { + LocalDateTime localDateTime = LocalDateTime.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant(); + } catch (DateTimeParseException e) { + LocalDate localDate = LocalDate.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant(); + } + content = instant.plusSeconds(ZonedDateTime.now().getOffset().getTotalSeconds()); + break; + default: + throw new RuntimeException("Variable type not supported: " + type); + } + } + node = addObj(node, paths.get(cellNum), content); + } + } + return node; + } + + @SuppressWarnings("unchecked") + protected Object addObj(Object parent, String path, Object value) { + if (parent == null) { + parent = new LinkedHashMap(); + } + + int delimiterPosition = indexOfFirstDelimiter(path, ".*"); + if (delimiterPosition <= 0) { + if (parent instanceof LinkedHashMap) { + // Key of a value in an ObjectNode + ((Map) parent).put(path, value); + } else if (parent instanceof ArrayList) { + // Index of a value in an ArrayNode + int index = Integer.parseInt(path); + while (((ArrayList) parent).size() <= index) { + // Create empty entries to parent ArrayNode + ((ArrayList) parent).add(new LinkedHashMap ()); + } + ((ArrayList) parent).set(index, value); + } else { + throw new RuntimeException("Parent type not supported: " + parent.getClass().getName()); + } + return parent; + } + + String key = path.substring(0, delimiterPosition); + String newPath = path.substring(delimiterPosition + 1); + String delimiter = path.substring(delimiterPosition, delimiterPosition + 1); + Object child = null; + if (delimiter.equals(".")) { + child = new LinkedHashMap(); + } else if (delimiter.equals("*")) { + child = new ArrayList<>(); + } + + Object node; + if (parent instanceof LinkedHashMap) { + // Key of a JsonNode in an ObjectNode + node = ((Map) parent).get(key); + if (node != null) { + // Take the existing ObjectNode as child + child = node; + } + ((Map) parent).put(key, addObj(child, newPath, value)); + } else if (parent instanceof ArrayList) { + // Index of a JsonNode in an ArrayNode + int index = Integer.parseInt(key); + if (((ArrayList) parent).size() > index) { + node = ((ArrayList) parent).get(index); + } else { + node = null; + } + if (node != null) { + // Take the existing ArrayNode as child + child = node; + } + while (((ArrayList) parent).size() <= index) { + // Create empty entries to parent ArrayNode + ((ArrayList) parent).add(new LinkedHashMap ()); + } + ((ArrayList) parent).set(index, addObj(child, newPath, value)); + } else { + throw new RuntimeException("Parent type not supported: " + parent.getClass().getName()); + } + return parent; + } + +} diff --git a/customer-work/src/test/java/com/customer/work/model/FlowableExcelParser.java b/customer-work/src/test/java/com/customer/work/model/FlowableExcelParser.java new file mode 100644 index 0000000..afa1629 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/FlowableExcelParser.java @@ -0,0 +1,138 @@ +package com.customer.work.model; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.stereotype.Component; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.LinkedHashMap; + + +@Component +public class FlowableExcelParser { + + // excelPath defines the location of the Excel file + // Return all cells in all sheets with the following restrictions: + // - Max column count per sheet is defined in the first row + // - Max column count starts with the 1st cell and ends with the 1st empty cell + // - Parsing the sheet stops after the 1st empty row + // All sheets are added to an ArrayList + // All rows are added to an ArrayList in the sheets ArrayList + // All cell values are added to an ArrayList in the rows ArrayList + // Formulas in cells are evaluated + // All values are returned as String + public ArrayList>> parseExcelBookFromResource(String excelResourcePath) { + try (FileInputStream fileInputStream = new FileInputStream(getResourcePath(excelResourcePath))) { + Workbook workBook = new XSSFWorkbook(fileInputStream); + return parseBook(workBook); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private String getResourcePath(String resourcePath) { + ClassLoader classLoader = FlowableExcelParser.class.getClassLoader(); + URL resourceUrl = classLoader.getResource(resourcePath); + if (resourceUrl == null) { + throw new RuntimeException("Resource not found: " + resourcePath); + } + return resourceUrl.getPath(); + } + + private ArrayList>> parseBook(Workbook workBook ) { + ArrayList>> book = new ArrayList<>(); + FormulaEvaluator formulaEvaluator = workBook.getCreationHelper().createFormulaEvaluator(); + for (Sheet workSheet : workBook) { + book.add(parseSheet(workSheet, formulaEvaluator)); + } + return book; + } + + private ArrayList> parseSheet(Sheet workSheet, FormulaEvaluator formulaEvaluator) { + ArrayList> sheet = new ArrayList<>(); + // Count columns of first row + int maxCols = getMaxCols(workSheet.getRow(0)); + DataFormatter dataFormatter = new DataFormatter(); + int firstRow = workSheet.getFirstRowNum(); + int lastRow = workSheet.getLastRowNum(); + // For (Row workRow : workSheet) sometimes ignores empty rows, then the first empty row as an exit criterion wouldn't work + for (int rowIndex = firstRow; rowIndex <= lastRow; rowIndex++) { + ArrayList row = parseRow(workSheet.getRow(rowIndex), maxCols, formulaEvaluator, dataFormatter); + if (row == null) { + // Take all rows until the first empty row + break; + } else { + sheet.add(row); + } + } + return sheet; + } + + private ArrayList parseRow(Row workRow, int maxCols, FormulaEvaluator formulaEvaluator, DataFormatter dataFormatter) { + if (workRow == null) { + // Row is empty + return null; + } + ArrayList row = new ArrayList<>(); + boolean allCellsNull = true; + for (int colIndex = 0; colIndex < maxCols; colIndex++) { + Cell workCell = workRow.getCell(colIndex); + formulaEvaluator.evaluate(workCell); + String content = dataFormatter.formatCellValue(workCell, formulaEvaluator); + if (content != null && !content.isEmpty()) { + allCellsNull = false; + } + row.add(content); + } + if (allCellsNull) { + // Row is empty + return null; + } else { + return row; + } + } + + private int getMaxCols(Row workRow) { + int maxCol = workRow.getLastCellNum(); + for (int colIndex = 0; colIndex < maxCol; colIndex++) { + Cell workCell = workRow.getCell(colIndex); + if (workCell == null || workCell.getCellType() == CellType.BLANK || workCell.getCellType() == CellType._NONE) { + // Count cells until the first empty cell + return colIndex; + } + } + return maxCol; + } + + @Deprecated + public ArrayList> parseExcelFromResource(String resourcePath) { + try (FileInputStream fileInputStream = new FileInputStream(getResourcePath(resourcePath))) { + Workbook workBook = new XSSFWorkbook(fileInputStream); + FormulaEvaluator formulaEvaluator = workBook.getCreationHelper().createFormulaEvaluator(); + ArrayList> sheet = parseSheet(workBook.getSheetAt(0), formulaEvaluator); + ArrayList colHeaders = new ArrayList<>(); + ArrayList> rowList = new ArrayList<>(); + for (int rowIndex = 0; rowIndex < sheet.size(); rowIndex++) { + ArrayList row = sheet.get(rowIndex); + if (rowIndex == 0) { + // Header row + for (Object cell : row) { + colHeaders.add(String.valueOf(cell)); + } + continue; + } + LinkedHashMap rowMap = new LinkedHashMap<>(); + for (int colIndex = 0; colIndex < row.size(); colIndex++) { + rowMap.put(colHeaders.get(colIndex), row.get(colIndex)); + } + rowList.add(rowMap); + } + return rowList; + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/customer-work/src/test/java/com/customer/work/model/FlowableJsonParser.java b/customer-work/src/test/java/com/customer/work/model/FlowableJsonParser.java new file mode 100644 index 0000000..b101726 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/FlowableJsonParser.java @@ -0,0 +1,110 @@ +package com.customer.work.model; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +@Component +public class FlowableJsonParser { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final JavaTimeModule javaTimeModule = new JavaTimeModule(); + + public static final String BOOLEAN = "Boolean"; + public static final String STRING = "String"; + public static final String INTEGER = "Integer"; + public static final String DOUBLE = "Double"; + public static final String LONG = "Long"; + public static final String INSTANT = "Instant"; + public static final String JSON_OBJECT_NODE = "JsonObjectNode"; + public static final String JSON_ARRAY_NODE = "JsonArrayNode"; + public static final String MAP = "Map"; + public static final String ARRAY_LIST = "ArrayList"; + + + public FlowableJsonParser() { + objectMapper.registerModule(javaTimeModule); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + public Map parseMap(Object map) throws JsonProcessingException, ClassCastException { + return (Map) parseObject(map); + } + + public Object parseObject(Object object) throws JsonProcessingException, ClassCastException { + if (object instanceof Map) { + Map resultMap = new LinkedHashMap<>(Map.of()); + for (Map.Entry mapEntry : ((Map) object).entrySet()) { + String key = mapEntry.getKey(); + resultMap.put(key, parseMapEntry(key, mapEntry.getValue())); + } + return resultMap; + } + if (object instanceof ArrayList) { + ArrayList resultList = new ArrayList<>(); + for (Object arrayEntry : (ArrayList) object) { + resultList.add(parseArrayEntry(arrayEntry)); + } + return resultList; + } + return null; + } + + private Object parseMapEntry(String key, Object value) throws JsonProcessingException { + if (value instanceof Map) { + Map valueMap = (Map) value; + if (valueMap.containsKey("__TYPE") && valueMap.containsKey("__VALUE") && valueMap.size() == 2) { + // if Map in Map, check if inner Map has explicit type (__TYPE and __VALUE) + return convertObjectExplicit(valueMap.get("__VALUE"), (String) valueMap.get("__TYPE")); + } + if (Arrays.asList("__IN", "__OUT").contains(key)) { + // convert __IN and __OUT maps as Map + return parseObject(value); + } + // convert Map to JsonObjectNode (default in models) + return convertObjectExplicit(value, JSON_OBJECT_NODE); + } + if (value instanceof ArrayList) { + // convert ArrayList to JsonArrayNode (default in models) + return convertObjectExplicit(value, JSON_ARRAY_NODE); + } + // take json supported type (Boolean, String, Integer, Double) + return value; + } + + private Object parseArrayEntry(Object value) throws JsonProcessingException { + if (value instanceof Map) { + // convert Map to JsonObjectNode (default in models) + return convertObjectExplicit(value, JSON_OBJECT_NODE); + } + if (value instanceof ArrayList) { + // convert ArrayList to JsonArrayNode (default in models) + return convertObjectExplicit(value, JSON_ARRAY_NODE); + } + // take json supported type (Boolean, String, Integer, Double) + return value; + } + + private Object convertObjectExplicit(Object value, String explicitType) throws JsonProcessingException { + switch (explicitType) { + case BOOLEAN: return Boolean.parseBoolean(value.toString()); + case STRING: return value.toString(); + case INTEGER: return Integer.parseInt(value.toString()); + case DOUBLE: return Double.parseDouble(value.toString()); + case LONG: return Long.parseLong(value.toString()); + case INSTANT: return Instant.parse(value.toString()); + case MAP: case ARRAY_LIST: return parseObject(value); + case JSON_OBJECT_NODE: case JSON_ARRAY_NODE: return objectMapper.convertValue(parseObject(value), JsonNode.class); + default: return value; + } + } +} diff --git a/customer-work/src/test/java/com/customer/work/model/FlowableModelTest.java b/customer-work/src/test/java/com/customer/work/model/FlowableModelTest.java new file mode 100644 index 0000000..514bffc --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/FlowableModelTest.java @@ -0,0 +1,52 @@ +package com.customer.work.model; + +import com.flowable.action.engine.test.ActionExtension; +import com.flowable.app.engine.test.FlowableAppExtension; +import com.flowable.dataobject.engine.test.DataObjectExtension; +import com.flowable.form.spring.impl.test.FlowableFormSpringExtension; +import com.flowable.idm.engine.test.PlatformIdmExtension; +import com.flowable.platform.tenant.test.TenantSetupExtension; +import com.flowable.policy.engine.test.PolicyExtension; +import com.flowable.serviceregistry.engine.test.ServiceRegistryExtension; +import com.flowable.template.engine.test.TemplateExtension; +import org.flowable.cmmn.spring.impl.test.FlowableCmmnSpringExtension; +import org.flowable.dmn.spring.impl.test.FlowableDmnSpringExtension; +import org.flowable.spring.impl.test.FlowableSpringExtension; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; + +import java.lang.annotation.*; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited + +@ExtendWith(SpringExtension.class) +@ExtendWith(ActionExtension.class) +@ExtendWith(DataObjectExtension.class) +//@ExtendWith(EngageExtension.class) +@ExtendWith(FlowableAppExtension.class) +@ExtendWith(FlowableSpringExtension.class) +@ExtendWith(FlowableCmmnSpringExtension.class) +@ExtendWith(FlowableFormSpringExtension.class) +@ExtendWith(FlowableDmnSpringExtension.class) +@ExtendWith(PlatformIdmExtension.class) +@ExtendWith(PolicyExtension.class) +@ExtendWith(ServiceRegistryExtension.class) +@ExtendWith(TemplateExtension.class) +@ExtendWith(TenantSetupExtension.class) +@ExtendWith(TestMailServerExtension.class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@Transactional +@SpringBootTest +public @interface FlowableModelTest { + /* + @AliasFor(annotation = SpringBootTest.class, attribute = "webEnvironment") + SpringBootTest.WebEnvironment webEnvironment() default SpringBootTest.WebEnvironment.MOCK; + + */ +} diff --git a/customer-work/src/test/java/com/customer/work/model/FlowableModelTestUtils.java b/customer-work/src/test/java/com/customer/work/model/FlowableModelTestUtils.java new file mode 100644 index 0000000..58431db --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/FlowableModelTestUtils.java @@ -0,0 +1,656 @@ +package com.customer.work.model; + +import com.customer.work.service.JsonUtils; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.flowable.audit.api.AuditService; +import com.flowable.audit.api.runtime.AuditInstance; +import com.flowable.core.spring.security.SecurityUtils; +import com.flowable.platform.service.task.CompleteFormRepresentation; +import com.flowable.platform.service.task.PlatformTaskService; +import jakarta.mail.Address; +import org.apache.commons.lang3.tuple.Pair; +import org.assertj.core.api.Assertions; +import org.flowable.bpmn.model.*; +import org.flowable.bpmn.model.Process; +import org.flowable.cmmn.api.runtime.CaseInstance; +import org.flowable.cmmn.engine.CmmnEngine; +import org.flowable.common.engine.api.identity.AuthenticationContext; +import org.flowable.common.engine.impl.identity.Authentication; +import org.flowable.engine.ManagementService; +import org.flowable.engine.ProcessEngine; +import org.flowable.engine.TaskService; +import org.flowable.engine.history.HistoricProcessInstance; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.job.service.impl.persistence.entity.TimerJobEntity; +import org.flowable.spring.security.SpringSecurityAuthenticationContext; +import org.flowable.task.api.Task; +import org.flowable.variable.api.history.HistoricVariableInstance; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.platform.commons.util.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.StreamUtils; +import org.springframework.web.client.RestClient; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.file.Paths; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +@Component +public class FlowableModelTestUtils { + + protected final ProcessEngine processEngine; + protected final CmmnEngine cmmnEngine; + protected final TaskService taskService; + protected final PlatformTaskService platformTaskService; + protected final ManagementService managementService; + protected final JsonUtils jsonUtils; + protected final FlowableExcelMapper flowableExcelMapper; + protected static final Logger logger = LoggerFactory.getLogger(FlowableModelTestUtils.class); + protected final TestMailServer testMailServer; + protected final AuditService auditService; + + + public static String TENANT_ID = null; + public static String ROOT_PROCESS_ID = "ROOT_PROCESS_ID"; + public static String TEST_PROCESS_ID = "TEST_PROCESS_ID"; + + + public FlowableModelTestUtils(ProcessEngine processEngine, + CmmnEngine cmmnEngine, + TaskService taskService, + PlatformTaskService platformTaskService, + ManagementService managementService, + JsonUtils jsonUtils, + FlowableExcelMapper flowableExcelMapper, + TestMailServer testMailServer, + AuditService auditService) { + this.processEngine = processEngine; + this.cmmnEngine = cmmnEngine; + this.taskService = taskService; + this.platformTaskService = platformTaskService; + this.managementService = managementService; + this.jsonUtils = jsonUtils; + this.flowableExcelMapper = flowableExcelMapper; + this.testMailServer = testMailServer; + this.auditService = auditService; + } + + public void checkAndAndAssertAuditRecord(Map map, int auditNumber, String hint, String message, String category, String type) { + if (map != null) { + Object check = map.get("audit"); + if (check instanceof Integer && (Integer) check > 0) { + assertAuditRecord(auditNumber, hint, message, category, type); + } + } + } + + protected void assertAuditRecord(int auditNumber, String hint, String message, String category, String type) { + List auditTrail = getAuditTrail(); + int auditTrailSize = auditTrail.size(); + Assertions.assertThat(auditTrailSize).as(hint + ": invalid auditNumber " + auditTrailSize).isGreaterThanOrEqualTo(auditNumber); + if (auditTrailSize == 0) return; + + AuditInstance auditInstance = auditTrail.get(auditNumber - 1); + Assertions.assertThat(auditInstance.getPayload().get("message")).as(hint).isEqualTo(message); + Assertions.assertThat(auditInstance.getPayload().get("category")).as(hint).isEqualTo(category); + Assertions.assertThat(auditInstance.getType()).as(hint).isEqualTo(type); + } + + public void checkAndAssertEmail(Map map, int emailNumber, String hint, String subject, String receivers) { + if (map != null) { + Object check = map.get("email"); + if (check instanceof Integer && (Integer) check > 0) { + assertEmail(emailNumber, hint, subject, receivers); + } + } + } + + protected void assertEmail(int emailNumber, String hint, String subject, String receivers) { + List emails = getMailList(); + int emailListSize = emails.size(); + Assertions.assertThat(emailListSize).as(hint + ": invalid email number " + emailListSize).isGreaterThanOrEqualTo(emailNumber); + if (emailNumber == 0) return; + + EmailDto email = emails.get(emailNumber - 1); + String emailSubject = email.getSubject(); + Assertions.assertThat(emailSubject).as(hint + ": invalid subject " + emailSubject).endsWith(subject); + + List> receiverCheckList = new ArrayList<>(); + for (String receiver : receivers.split("[,\\s]+")) { + receiverCheckList.add(Pair.of(receiver, false)); + } + List emailReceiverList = email.getReceiverList(); + Assertions.assertThat(emailReceiverList.size()).as(hint + ": invalid number of receivers " + emailReceiverList).isEqualTo(receiverCheckList.size()); + + for (String emailReceiver : emailReceiverList) { + for (int i = 0; i < receiverCheckList.size(); i++) { + Pair checkReceiver = receiverCheckList.get(i); + if (checkReceiver.getLeft().equals(emailReceiver) && !checkReceiver.getRight()) { + receiverCheckList.set(i, Pair.of(emailReceiver, true)); + break; + } else if (i == receiverCheckList.size() - 1) { + Assertions.fail(hint + ": invalid email receiver " + emailReceiverList); + } + } + } + } + + public Map getHistoryCasePayload(String caseInstanceId) { + List historicVariableInstanceList = cmmnEngine.getCmmnHistoryService() + .createHistoricVariableInstanceQuery() + .caseInstanceId(caseInstanceId) + .list(); + return convertHistVariableListToMap(historicVariableInstanceList); + } + + public Map getRuntimeCasePayload(String caseId) { + return cmmnEngine.getCmmnRuntimeService().getVariables(caseId); + } + + public CaseInstance startCaseInstance(String key, Map variables) { + return cmmnEngine.getCmmnRuntimeService() + .createCaseInstanceBuilder() + .caseDefinitionKey(key) + .tenantId(TENANT_ID) // Must not be "default" + .variables(variables) + .start(); + } + + public ProcessInstance startProcessInstance(String key, Map variables) { + return processEngine.getRuntimeService() + .createProcessInstanceBuilder() + .processDefinitionKey(key) + .tenantId(TENANT_ID) // Must not be "default" + .variables(variables) + .start(); + } + + public Task getOpenTask(String taskKey) { + Task task = taskService.createTaskQuery().taskDefinitionKey(taskKey).singleResult(); + Assertions.assertThat(task).as("No open task with key {} found", taskKey).isNotNull(); + return task; + } + + public Task getOpenTaskByName(String taskName) { + Task task = taskService.createTaskQuery().taskName(taskName).singleResult(); + Assertions.assertThat(task).as("No open task with name {} found", taskName).isNotNull(); + return task; + } + + public void claimOpenTask(String taskKey, String userId) { + setTestAuthenticatedUser(userId, TENANT_ID); + taskService.claim(getOpenTask(taskKey).getId(), userId); + } + + public List getAuditTrail() { + return auditService.createAuditInstanceQuery() + //.tenantId(TENANT_ID) TODO: Must not be null, should work with default tenant + .list(); + } + + public List getMailList() { + return Arrays.stream(testMailServer.getMessages()).map(mimeMessage -> { + try { + return new EmailDto(mimeMessage.getSubject(), Arrays.stream(mimeMessage.getAllRecipients()) + .map(Address::toString).collect(Collectors.toList()), mimeMessage.getContent().toString(), mimeMessage.getContent()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }).collect(Collectors.toList()); + } + + public boolean isSubset(JsonNode root, JsonNode test) { + // If test is null, it is always a subset of root + if (test == null || test.isNull()) { + return true; + } + // If test is a value node, compare values + if (test.isValueNode()) { + if (test.isTextual() && "__N_A".equals(test.asText())) { + return false; + } + if (root == null) { + return false; + } + return root.isValueNode() && root.asText().equals(test.asText()); + } + // If test is an array node, check if all elements of test exist in root + if(test.isArray()){ + for (int i = 0; i < test.size(); i++) { + JsonNode testElement = test.get(i); + JsonNode rootElement = null; + if (root != null) { + rootElement = root.get(i); + } + if (testElement.isTextual() && "__N_A".equals(testElement.asText())) { + if (rootElement != null && !rootElement.isNull()) { + return false; + } + continue; + } + if (!isSubset(rootElement, testElement)) { + return false; + } + } + return true; + } + // If test is an object node, check if all fields in test exist in root + if (test.isObject()){ + for (Iterator iterator = test.fieldNames(); iterator.hasNext(); ) { + String fieldName = iterator.next(); + JsonNode testValue = test.get(fieldName); + JsonNode rootValue = null; + if (root != null) { + rootValue = root.get(fieldName); + } + if (testValue.isTextual() && "__N_A".equals(testValue.asText())) { + if (root != null && root.has(fieldName)) { + return false; + } + continue; + } + if (!isSubset(rootValue, testValue)){ + return false; + } + } + return true; + } + // If none of the above matches, return false + return false; + } + + public Stream getJsonArgumentsFromExcel(String path) { + ArrayList argumentList = new ArrayList<>(); + JsonNode book = flowableExcelMapper.excelBookResourceToJsonNode(path); + for (JsonNode sheet : book) { + for (JsonNode row : sheet) { + argumentList.add(Arguments.of(path, row)); + } + } + return argumentList.stream(); + } + + public Stream getObjArgumentsFromExcel(String path) { + ArrayList argumentList = new ArrayList<>(); + ArrayList> book = flowableExcelMapper.excelBookResourceToObj(path); + for (ArrayList sheet : book) { + for (Object row : sheet) { + argumentList.add(Arguments.of(path, row)); + } + } + return argumentList.stream(); + } + + public ObjectNode testJsonExcelRow(String path, JsonNode row) { + ObjectNode vars = jsonUtils.getEmptyObjectNode(); + JsonNode rootParam = row.get("root"); + if (rootParam != null) { + Iterator> rootVars = rootParam.fields(); + while (rootVars.hasNext()) { + Map.Entry rootVar = rootVars.next(); + String key = rootVar.getKey(); + JsonNode value = rootVar.getValue(); + vars.set(key, value); + } + } + JsonNode inParam = row.get("in"); + if (inParam != null) { + vars.set("__IN", inParam); + } + JsonNode outParam = row.get("out"); + if (outParam != null) { + vars.set("__OUT", outParam); + } + JsonNode idParam = row.get("id"); + JsonNode test = row.get("test"); + int timerCount = 0; + JsonNode timerNode = row.get("timer"); + if (timerNode != null) timerCount = timerNode.asInt(); + Integer auditRecordCount = null; + JsonNode auditNode = row.get("audit"); + if (auditNode != null) auditRecordCount = auditNode.asInt(); + Integer emailCount = null; + JsonNode emailNode = row.get("email"); + if (emailNode != null) emailCount = emailNode.asInt(); + + logger.info("TestExcelRow file={} id={} rootParam={} inParam={} outParam={} timer={} test={} audit={} email={} ", + path, idParam, rootParam, inParam, outParam, timerCount, test, auditRecordCount, emailCount); + ObjectNode processIds = createRootTestProcessInstance(idParam.asText(), jsonUtils.convertJsonNodeToMap(vars)); + for (int i = 0; i < timerCount; i++) { + executeTimer(processIds.get(TEST_PROCESS_ID).asText()); + } + + ObjectNode result = jsonUtils.getEmptyObjectNode(); + Map rootProcessPayload = getHistProcessPayload(processIds.get(FlowableModelTestUtils.ROOT_PROCESS_ID).asText()); + JsonNode root = jsonUtils.convertMapToJsonNode(rootProcessPayload); + if (root != null) { + Assertions.assertThat(isSubset(root, test)) + .withFailMessage(System.lineSeparator() + "test :" + test + System.lineSeparator() + "root :" + root).isTrue(); + result.set("root", root); + } + if (auditRecordCount != null) { +// List auditTrail = getAuditTrail(processIds.get(ROOT_PROCESS_ID).asText()); + List auditTrail = getAuditTrail(); + int auditTrailSize = auditTrail.size(); + Assertions.assertThat(auditTrailSize).as("Invalid audit trail size: {}", auditTrailSize).isEqualTo(auditRecordCount); + result.set("auditTrail", jsonUtils.convertListToJsonNode(Collections.singletonList(auditTrail))); + } + if (emailCount != null) { + List emailList = getMailList(); + int emailListSize = emailList.size(); + Assertions.assertThat(emailListSize).as("Invalid number of emails: {}", emailListSize).isEqualTo(emailCount); + result.set("emails", jsonUtils.convertListToJsonNode(Collections.singletonList(emailList))); + } + return result; + } + + public Map testObjExcelRow(String path, Map row) { + Map vars = new LinkedHashMap<>(); + Map rootParam = (Map) row.get("root"); + if (rootParam != null) { + for (Map.Entry entry : rootParam.entrySet()) { + vars.put(entry.getKey(), entry.getValue()); + } + } + Map inParam = (Map) row.get("in"); + if (inParam != null) { + vars.put("__IN", inParam); + } + Map outParam = (Map) row.get("out"); + if (outParam != null) { + vars.put("__OUT", outParam); + } + String idParam = (String) row.get("id"); + Map test =(Map) row.get("test"); + int timerCount = 0; + Object timerNode = row.get("timer"); + if (timerNode != null) timerCount = (Integer) timerNode; + Integer auditRecordCount = null; + Object auditNode = row.get("audit"); + if (auditNode != null) auditRecordCount = (Integer) auditNode; + Integer emailCount = null; + Object emailNode = row.get("email"); + if (emailNode != null) emailCount = (Integer) emailNode; + + logger.info("TestExcelRow file={} id={} rootParam={} inParam={} outParam={} timer={} test={} audit={} email={} ", + path, idParam, rootParam, inParam, outParam, timerCount, test, auditRecordCount, emailCount); + ObjectNode processIds = createRootTestProcessInstance(idParam, vars); + for (int i = 0; i < timerCount; i++) { + executeTimer(processIds.get(TEST_PROCESS_ID).asText()); + } + + Map result = new LinkedHashMap<>(); + Map rootProcessPayload = getHistProcessPayload(processIds.get(FlowableModelTestUtils.ROOT_PROCESS_ID).asText()); + JsonNode root = jsonUtils.convertMapToJsonNode(rootProcessPayload); + if (root != null) { + Assertions.assertThat(isSubset(root, jsonUtils.convertMapToJsonNode(test))) + .withFailMessage(System.lineSeparator() + "test :" + test + System.lineSeparator() + "root :" + root).isTrue(); + result.put("root", rootProcessPayload); + } + if (auditRecordCount != null) { +// List auditTrail = getAuditTrail(processIds.get(ROOT_PROCESS_ID).asText()); + List auditTrail = getAuditTrail(); + int auditTrailSize = auditTrail.size(); + Assertions.assertThat(auditTrailSize).as("Invalid audit trail size: {}", auditTrailSize).isEqualTo(auditRecordCount); + result.put("audit", auditRecordCount); + } + if (emailCount != null) { + List emailList = getMailList(); + int emailListSize = emailList.size(); + Assertions.assertThat(emailListSize).as("Invalid number of emails: {}", emailListSize).isEqualTo(emailCount); + result.put("email", emailCount); + } + return result; + } + + public void exportApp(String rootUrl, String appModelKey, String username, String password) { + RestClient restClient = RestClient.builder() + .baseUrl(rootUrl) + .defaultHeaders(h -> h.setBasicAuth(username, password)) + .build(); + + ResponseEntity responseEntity = restClient.post() + .uri("/app/authentication?j_username=" + username + "&j_password=" + password + "&spring_security_remember_me=true&submit=Login") + .retrieve() + .toEntity(JsonNode.class); + + String designCookieRaw = responseEntity.getHeaders().get("Set-Cookie").stream().collect(Collectors.joining(";")); + String flowableDesignRememberMeTokenValue = Arrays.stream(designCookieRaw.split(";")).filter(part -> part.contains("FLOWABLE_DESIGN_REMEMBER_ME")).findAny().get(); + String csrfToken = Arrays.stream(designCookieRaw.split(";")).filter(part -> part.contains("FLOWABLE_DESIGN_CSRF_TOKEN")).findAny().get(); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.set("Cookie", flowableDesignRememberMeTokenValue + ";" + csrfToken); + + ArrayNode apps = (ArrayNode) restClient.get() + .uri("/app/models?filter=apps&modelType=3&sort=modifiedDesc") + .headers(h -> h.addAll(httpHeaders)) + .retrieve() + .body(JsonNode.class) + .path("data"); + String appModelId = StreamSupport.stream(apps.spliterator(), false).filter(app -> app.path("key").asText().equals(appModelKey)).map(app -> app.path("id").asText()).findAny().get(); + + File file = new File(Paths.get("src/test/resources/test-auto-deploy-apps", appModelKey + ".zip").toString()); + restClient.get() + .uri("/app/app-definitions/" + appModelId + "/export-bar?includeChildReferences=true") + .header("Cookie", flowableDesignRememberMeTokenValue + ";" + csrfToken) + .exchange((req, resp) -> { + StreamUtils.copy(resp.getBody(), new FileOutputStream(file, false)); + return file; + }); + } + + public ObjectNode emptyNode() { + return jsonUtils.getEmptyObjectNode(); + } + + public Map emptyMap() { + return new LinkedHashMap<>(); + } + + public ObjectNode loadObjectNodeFromResources(String path) { + if (path.isEmpty()) return jsonUtils.getEmptyObjectNode(); + else return jsonUtils.loadObjectNodeFromFile(Paths.get("src","test", "resources", path).toString()); + } + + public Map loadMapFromResources(String path) { + return jsonUtils.convertJsonNodeToMap(loadObjectNodeFromResources(path)); + } + + public void executeTimer(String processId) { + TimerJobEntity timerJobEntity = (TimerJobEntity) managementService.createTimerJobQuery().processInstanceId(processId).singleResult(); + Assertions.assertThat(timerJobEntity).withFailMessage("No active timer").isNotNull(); + managementService.moveTimerToExecutableJob(timerJobEntity.getId()); + managementService.executeJob(timerJobEntity.getId()); + } + public void setTestAuthenticatedUser(String userId, String tenantId) { + if (userId == null) { + this.resetTestAuthenticatedUser(); + } else { + List grantedAuthorities = new ArrayList<>(); + if (StringUtils.isNotBlank(tenantId)) { + grantedAuthorities.add(SecurityUtils.createTenantAuthority(tenantId)); + } + SecurityContextHolder.getContext().setAuthentication(new TestingAuthenticationToken(userId, "", grantedAuthorities)); + AuthenticationContext authenticationContext = Authentication.getAuthenticationContext(); + if (!(authenticationContext instanceof SpringSecurityAuthenticationContext)) { + Authentication.setAuthenticatedUserId(userId); + } + } + } + + public void setTestAuthenticatedUser(String userId, String tenantId, String... groupKeys) { + if (userId == null) { + this.resetTestAuthenticatedUser(); + } else { + List grantedAuthorities = new ArrayList<>(); + if (StringUtils.isNotBlank(tenantId)) { + grantedAuthorities.add(SecurityUtils.createTenantAuthority(tenantId)); + } + + for (String groupKey : groupKeys) { + grantedAuthorities.add(SecurityUtils.createGroupAuthority(groupKey)); + } + + SecurityContextHolder.getContext().setAuthentication(new TestingAuthenticationToken(userId, "", grantedAuthorities)); + AuthenticationContext authenticationContext = Authentication.getAuthenticationContext(); + if (!(authenticationContext instanceof SpringSecurityAuthenticationContext)) { + Authentication.setAuthenticatedUserId(userId); + } + } + } + + public void resetTestAuthenticatedUser() { + SecurityContextHolder.getContext().setAuthentication(null); + AuthenticationContext authenticationContext = Authentication.getAuthenticationContext(); + if (!(authenticationContext instanceof SpringSecurityAuthenticationContext)) { + Authentication.setAuthenticatedUserId(null); + } + } + + public void completeTaskWithFlatVars(String taskId, Map variables, String outcome) { + Map taskVariables = platformTaskService.getTaskVariables(taskId); + Map taskVariablesFlat = jsonUtils.flatten(taskVariables); + taskVariablesFlat.putAll(variables); + Map completionVars = jsonUtils.unflatten(taskVariablesFlat); + + completeTask(taskId, completionVars, outcome); + } + + public void completeTask(String taskId, Map completionVariables, String outcome) { + CompleteFormRepresentation form = new CompleteFormRepresentation(); + for (String key : completionVariables.keySet()) { + form.setValues(key, completionVariables.get(key)); + } + form.setOutcome(outcome); + platformTaskService.completeTaskForm(taskId, form); + } + + public void completeOpenTask(String taskKey, ObjectNode vars, String outcome) { + Task task = getOpenTask(taskKey); + Map flatVars = jsonUtils.convertJsonNodeToMap(vars); + completeTaskWithFlatVars(task.getId(), flatVars, outcome); + } + + public Map getHistProcessPayload(String processInstanceId) { + List historicVariableInstanceList = processEngine.getHistoryService() + .createHistoricVariableInstanceQuery() + .processInstanceId(processInstanceId) + .list(); + return convertHistVariableListToMap(historicVariableInstanceList); + } + + private HashMap convertHistVariableListToMap(List historicVariableInstanceList) { + HashMap variableMap = new HashMap<>(); + for (HistoricVariableInstance historicVariableInstance : historicVariableInstanceList) { + variableMap.put(historicVariableInstance.getVariableName(), historicVariableInstance.getValue()); + } + return variableMap; + } + + public ObjectNode createRootTestProcessInstance(String testKey, Map variables) { + // Create root process with test process as call activity + String wrapperProcessKey = testKey + "_T"; + BpmnModel bpmnModel = createWrapperTestProcessModel(testKey, (ObjectNode) jsonUtils.convertMapToJsonNode(variables)); + processEngine.getProcessEngineConfiguration() + .getRepositoryService() + .createDeployment() + .addBpmnModel(wrapperProcessKey + ".bpmn20.xml", bpmnModel) + .tenantId(TENANT_ID) // Must not be "default" + .deploy(); + + // Start root process + ProcessInstance rootProcessInstance = startProcessInstance(wrapperProcessKey, variables); + + // Store the process IDs for using them in assertions + ProcessInstance runtimeTestProcessInstance = processEngine.getRuntimeService() + .createProcessInstanceQuery() + .superProcessInstanceId(rootProcessInstance.getId()) + .singleResult(); + String testProcessId; + if (runtimeTestProcessInstance != null) { + testProcessId = runtimeTestProcessInstance.getId(); + } else { + HistoricProcessInstance historicTestProcessInstance = processEngine.getHistoryService() + .createHistoricProcessInstanceQuery() + .superProcessInstanceId(rootProcessInstance.getId()) + .singleResult(); + // if history level is none, testProcessId is not available + testProcessId = historicTestProcessInstance != null ? historicTestProcessInstance.getId() : null; + } + ObjectNode rootNode = jsonUtils.getEmptyObjectNode(); + rootNode.put(ROOT_PROCESS_ID, rootProcessInstance.getProcessInstanceId()); + rootNode.put(TEST_PROCESS_ID, testProcessId); + return rootNode; + } + + protected BpmnModel createWrapperTestProcessModel(String testKey, ObjectNode variables) { + BpmnModel bpmnModel = new BpmnModel(); + Process process = new Process(); + process.setId(testKey + "_T"); + process.setName(testKey + "_T"); + + StartEvent startEvent = new StartEvent(); + startEvent.setId(testKey + "_Start"); + startEvent.setName(testKey + "_Start"); + process.addFlowElement(startEvent); + + CallActivity callActivity = new CallActivity(); + callActivity.setId(testKey); + callActivity.setCalledElement(testKey); + JsonNode inNode = variables.get("__IN"); + if (inNode instanceof ObjectNode) { + Map inMap = jsonUtils.convertObjectNodeToMap((ObjectNode) inNode); + ArrayList inParameters = new ArrayList<>(); + for (Map.Entry entry : inMap.entrySet()) { + IOParameter ioParameter = new IOParameter(); + ioParameter.setSourceExpression("${__IN." + entry.getKey() + "}"); + ioParameter.setTarget(entry.getKey()); + inParameters.add(ioParameter); + } + callActivity.setInParameters(inParameters); + } + JsonNode outNode = variables.get("__OUT"); + if (outNode instanceof ObjectNode) { + Map outMap = (Map) jsonUtils.convertJsonNodeToMap(variables).get("__OUT"); + ArrayList outParameters = new ArrayList<>(); + for (Map.Entry entry : outMap.entrySet()) { + IOParameter ioParameter = new IOParameter(); + ioParameter.setSource(entry.getKey()); + ioParameter.setTarget(entry.getValue()); + outParameters.add(ioParameter); + } + callActivity.setOutParameters(outParameters); + } + process.addFlowElement(callActivity); + + EndEvent endEvent = new EndEvent(); + endEvent.setId(testKey + "_End"); + endEvent.setName(testKey + "_End"); + process.addFlowElement(endEvent); + + SequenceFlow start = new SequenceFlow(testKey + "_Start", testKey); + start.setId("Start_Sequence_Flow"); + process.addFlowElement(start); + + SequenceFlow end = new SequenceFlow(testKey, testKey + "_End"); + end.setId("End_Sequence_Flow"); + process.addFlowElement(end); + + bpmnModel.addProcess(process); + return bpmnModel; + } + +} diff --git a/customer-work/src/test/java/com/customer/work/model/TestMailServer.java b/customer-work/src/test/java/com/customer/work/model/TestMailServer.java new file mode 100644 index 0000000..5ec4162 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/TestMailServer.java @@ -0,0 +1,33 @@ +package com.customer.work.model; + +import com.flowable.spring.boot.properties.FlowableMailProperties; +import com.icegreen.greenmail.util.GreenMail; +import com.icegreen.greenmail.util.ServerSetup; + +import jakarta.mail.internet.MimeMessage; +import org.springframework.stereotype.Component; + +import static com.icegreen.greenmail.util.ServerSetup.PROTOCOL_SMTP; + +@Component +public class TestMailServer { + private GreenMail greenMail; + + private final FlowableMailProperties flowableMailProperties; + public TestMailServer(FlowableMailProperties flowableMailProperties) { + this.flowableMailProperties = flowableMailProperties; + } + + public void setup() { + greenMail = new GreenMail(new ServerSetup(flowableMailProperties.getPort(), flowableMailProperties.getHost(), PROTOCOL_SMTP)); + greenMail.start(); + } + + public void stop() { + greenMail.stop(); + } + + public MimeMessage[] getMessages() { + return greenMail.getReceivedMessages(); + } +} diff --git a/customer-work/src/test/java/com/customer/work/model/TestMailServerExtension.java b/customer-work/src/test/java/com/customer/work/model/TestMailServerExtension.java new file mode 100644 index 0000000..8962020 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/TestMailServerExtension.java @@ -0,0 +1,22 @@ +package com.customer.work.model; + +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +public class TestMailServerExtension implements BeforeEachCallback, AfterEachCallback { + @Override + public void beforeEach(ExtensionContext context) { + getTestMailServer(context).setup(); + } + + @Override + public void afterEach(ExtensionContext context) { + getTestMailServer(context).stop(); + } + + protected TestMailServer getTestMailServer(ExtensionContext context) { + return SpringExtension.getApplicationContext(context).getBean(TestMailServer.class); + } +} diff --git a/customer-work/src/test/java/com/customer/work/model/test/ModelTest.java b/customer-work/src/test/java/com/customer/work/model/test/ModelTest.java new file mode 100644 index 0000000..e271f95 --- /dev/null +++ b/customer-work/src/test/java/com/customer/work/model/test/ModelTest.java @@ -0,0 +1,122 @@ +package com.customer.work.model.test; + +import com.customer.work.model.EmailDto; +import com.customer.work.model.FlowableModelTest; +import com.customer.work.model.FlowableModelTestUtils; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.assertj.core.api.Assertions; +import org.flowable.cmmn.api.runtime.CaseInstance; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +@FlowableModelTest +public class ModelTest { + + @Autowired + protected FlowableModelTestUtils flowableModelTest; + + @Test + @Disabled + public void exportApp() { + flowableModelTest.exportApp("http://localhost:8093", "TST_APP", "admin", "test"); + } + + @Test + public void c001Test() { + flowableModelTest.setTestAuthenticatedUser("admin", null); + CaseInstance caseInstance = flowableModelTest.startCaseInstance("TST_C001", Map.of()); + String caseInstanceId = caseInstance.getId(); + flowableModelTest.completeOpenTask("TST_P001_T001", flowableModelTest.loadObjectNodeFromResources("model/test/C001/T001.json"), "COMPLETE"); + Assertions.assertThat(flowableModelTest.getRuntimeCasePayload(caseInstanceId).get("testText")).isEqualTo("my test text"); + + flowableModelTest.completeOpenTask("TST_C001_T002", flowableModelTest.emptyNode(), "COMPLETE"); + Assertions.assertThat(flowableModelTest.getHistoryCasePayload(caseInstanceId).get("testText")).isEqualTo("my test text"); + + } + + @Test + public void p005HappyPathTest() { + ObjectNode processIds = flowableModelTest.createRootTestProcessInstance("TST_P005", flowableModelTest.emptyMap()); + flowableModelTest.claimOpenTask("TST_P005_T001", "admin"); + flowableModelTest.completeOpenTask("TST_P005_T001", flowableModelTest.loadObjectNodeFromResources("model/test/P005/T001.json"), null); + Map rootProcessPayload = flowableModelTest.getHistProcessPayload(processIds.get(FlowableModelTestUtils.ROOT_PROCESS_ID).asText()); + Assertions.assertThat(rootProcessPayload.get("dataEntry")).isEqualTo("my root text"); + } + + @NotNull + private Stream p001TestData() { + return Stream.of( + Arguments.of("admin", "model/test/P001/initiator.json") + ); + } + @ParameterizedTest + @MethodSource("p001TestData") + public void p001Test(String initiator, String path) { + flowableModelTest.setTestAuthenticatedUser(initiator, null); + ObjectNode processIds = flowableModelTest.createRootTestProcessInstance("TST_P001", + flowableModelTest.loadMapFromResources(path)); + flowableModelTest.completeOpenTask("TST_P001_T001", flowableModelTest.emptyNode(), "complete"); + Map rootProcessPayload = flowableModelTest.getHistProcessPayload(processIds.get(FlowableModelTestUtils.ROOT_PROCESS_ID).asText()); + + Assertions.assertThat(rootProcessPayload.get("rootResult")).isEqualTo(null); + } + + @NotNull + private Stream p002TestData() { + return Stream.of( + Arguments.of("model/test/P002/boolean1.json", true, false), + Arguments.of("model/test/P002/boolean2.json", false, true), + Arguments.of("model/test/P002/string1.json", "hello root", "hello"), + Arguments.of("model/test/P002/string2.json", "123", "456"), + Arguments.of("model/test/P002/string3.json", "123.456,", "456.789"), + Arguments.of("model/test/P002/int.json", 123, 456), + Arguments.of("model/test/P002/double.json", 123.456, 456.789), + Arguments.of("model/test/P002/date.json", "2025-11-12", "2025-11-11") + ); + } + @ParameterizedTest + @MethodSource("p002TestData") + public void p002Test(String path, Object result, Object out) { + ObjectNode processIds = flowableModelTest.createRootTestProcessInstance("TST_P002", + flowableModelTest.loadMapFromResources(path)); + Map rootProcessPayload = flowableModelTest.getHistProcessPayload(processIds.get(FlowableModelTestUtils.ROOT_PROCESS_ID).asText()); + + List mail = flowableModelTest.getMailList(); + Assertions.assertThat(mail.size()).isEqualTo(0); + + Assertions.assertThat(rootProcessPayload.get("result")).isEqualTo(result); + Assertions.assertThat(rootProcessPayload.get("out")).isEqualTo(out); + } + + private Stream p002ExcelTestData() { + return flowableModelTest.getJsonArgumentsFromExcel("model/test/P002/p002Test.xlsx"); + } + @ParameterizedTest + @MethodSource("p002ExcelTestData") + public void p002ExcelTest(String path, JsonNode argument) { + ObjectNode result = flowableModelTest.testJsonExcelRow(path, argument); + } + + private Stream p002ExcelTestData2() { + return flowableModelTest.getObjArgumentsFromExcel("model/test/P002/p002Test.xlsx"); + } + @ParameterizedTest + @MethodSource("p002ExcelTestData2") + public void p002ExcelTest2(String path, Map argument) { + Map result = flowableModelTest.testObjExcelRow(path, argument); + flowableModelTest.checkAndAssertEmail(result, 1, + "Email", "Test", "test@flowable.com"); + flowableModelTest.checkAndAndAssertAuditRecord(result, 1, + "Audit record", "TST_P002 Audit trail entry", "system", null); + } +} diff --git a/customer-work/src/test/resources/application.properties b/customer-work/src/test/resources/application.properties new file mode 100644 index 0000000..9fd4faf --- /dev/null +++ b/customer-work/src/test/resources/application.properties @@ -0,0 +1,24 @@ +spring.datasource.url=jdbc:h2:mem:flowable-work-db;DB_CLOSE_DELAY=1000 +spring.datasource.username=admin +spring.datasource.password=test + +# To make our life easier in tests we are disabling the async executor and elasticsearch +flowable.async-executor-activate=false +flowable.async-history-executor-activate=false +flowable.indexing.enabled=false +management.health.elasticsearch.enabled=false +management.metrics.export.elastic.enabled=false + +# Set debug level in tests +logging.level.com.flowable=INFO +logging.level.com.flowable.local.work.model.FlowableModelTestUtils=INFO + +# Disable the timeout process in the tests +flowable.external-system.wechat.timeout.process-definition-key= + +# Path to test-auto-deploy-apps +flowable.app.resource-location=classpath*:/test-auto-deploy-apps/ + +# Email +flowable.mail.server.host=localhost +flowable.mail.server.port=3025 \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/C001/T001.json b/customer-work/src/test/resources/model/test/C001/T001.json new file mode 100644 index 0000000..a48859a --- /dev/null +++ b/customer-work/src/test/resources/model/test/C001/T001.json @@ -0,0 +1,5 @@ +{ + "root": { + "testText": "my test text" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P001/initiator.json b/customer-work/src/test/resources/model/test/P001/initiator.json new file mode 100644 index 0000000..fbc534b --- /dev/null +++ b/customer-work/src/test/resources/model/test/P001/initiator.json @@ -0,0 +1,5 @@ +{ + "__IN": { + "initiator": "admin" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/boolean1.json b/customer-work/src/test/resources/model/test/P002/boolean1.json new file mode 100644 index 0000000..6f84512 --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/boolean1.json @@ -0,0 +1,9 @@ +{ + "param": true, + "__IN": { + "param": false + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/boolean2.json b/customer-work/src/test/resources/model/test/P002/boolean2.json new file mode 100644 index 0000000..3ebab25 --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/boolean2.json @@ -0,0 +1,9 @@ +{ + "param": false, + "__IN": { + "param": true + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/date.json b/customer-work/src/test/resources/model/test/P002/date.json new file mode 100644 index 0000000..2829b47 --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/date.json @@ -0,0 +1,9 @@ +{ + "param": "2025-11-12", + "__IN": { + "param": "2025-11-11" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/double.json b/customer-work/src/test/resources/model/test/P002/double.json new file mode 100644 index 0000000..38cd1a2 --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/double.json @@ -0,0 +1,9 @@ +{ + "param": 123.456, + "__IN": { + "param": 456.789 + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/int.json b/customer-work/src/test/resources/model/test/P002/int.json new file mode 100644 index 0000000..cd503ec --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/int.json @@ -0,0 +1,9 @@ +{ + "param": 123, + "__IN": { + "param": 456 + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/p002Test.xlsx b/customer-work/src/test/resources/model/test/P002/p002Test.xlsx new file mode 100644 index 0000000..b80f353 Binary files /dev/null and b/customer-work/src/test/resources/model/test/P002/p002Test.xlsx differ diff --git a/customer-work/src/test/resources/model/test/P002/string1.json b/customer-work/src/test/resources/model/test/P002/string1.json new file mode 100644 index 0000000..862081d --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/string1.json @@ -0,0 +1,9 @@ +{ + "param": "hello root", + "__IN": { + "param": "hello" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/string2.json b/customer-work/src/test/resources/model/test/P002/string2.json new file mode 100644 index 0000000..d0b0429 --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/string2.json @@ -0,0 +1,9 @@ +{ + "param": "123", + "__IN": { + "param": "456" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P002/string3.json b/customer-work/src/test/resources/model/test/P002/string3.json new file mode 100644 index 0000000..91626b3 --- /dev/null +++ b/customer-work/src/test/resources/model/test/P002/string3.json @@ -0,0 +1,9 @@ +{ + "param": "123.456,", + "__IN": { + "param": "456.789" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/model/test/P005/T001.json b/customer-work/src/test/resources/model/test/P005/T001.json new file mode 100644 index 0000000..e5451ad --- /dev/null +++ b/customer-work/src/test/resources/model/test/P005/T001.json @@ -0,0 +1,5 @@ +{ + "root": { + "dataEntry": "my root text" + } +} \ No newline at end of file diff --git a/customer-work/src/test/resources/test-auto-deploy-apps/TST_APP.zip b/customer-work/src/test/resources/test-auto-deploy-apps/TST_APP.zip new file mode 100644 index 0000000..62086df Binary files /dev/null and b/customer-work/src/test/resources/test-auto-deploy-apps/TST_APP.zip differ diff --git a/customer-work/target/classes/application.properties b/customer-work/target/classes/application.properties new file mode 100644 index 0000000..f6d5519 --- /dev/null +++ b/customer-work/target/classes/application.properties @@ -0,0 +1,38 @@ +server.port=8105 + +# Enable all endpoints over HTTP +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=when_authorized + +flowable.frontend.title=flowable-work + +#spring.datasource.url=jdbc:h2:~/flowable-work-db/db;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1 +#spring.datasource.username=flowable +#spring.datasource.password=flowable + +#Comment out and configure database +spring.datasource.url=jdbc:postgresql://localhost:5435/flowable +spring.datasource.username=flowable +spring.datasource.password=flowable + +# Local Elasticsearch config +spring.elasticsearch.uris=http://localhost:9203 + +# spring.data.elasticsearch.repositories.enabled=true +# spring.data.elasticsearch.cluster-nodes=localhost:9300 +# spring.data.elasticsearch.cluster-name=elasticsearch + +flowable.indexing.index-name-prefix=flowable-work- +#Disable ElasticSearch Indexing +#flowable.indexing.enabled=false + +# Enable Flowable Inspect +flowable.inspect.enabled=true + +# Forms will update even if an old process/case/task definition will be used +flowable.platform.enable-latest-form-definition-lookup=true + +# Server URL for REST calls +baseUrl=http://localhost:8105 + + diff --git a/customer-work/target/classes/com/customer/work/SecurityHttpBasicConfiguration.class b/customer-work/target/classes/com/customer/work/SecurityHttpBasicConfiguration.class new file mode 100644 index 0000000..ca9b67c Binary files /dev/null and b/customer-work/target/classes/com/customer/work/SecurityHttpBasicConfiguration.class differ diff --git a/customer-work/target/classes/com/customer/work/StaticResourceConfiguration.class b/customer-work/target/classes/com/customer/work/StaticResourceConfiguration.class new file mode 100644 index 0000000..87d79e4 Binary files /dev/null and b/customer-work/target/classes/com/customer/work/StaticResourceConfiguration.class differ diff --git a/customer-work/target/classes/com/customer/work/WorkApplication.class b/customer-work/target/classes/com/customer/work/WorkApplication.class new file mode 100644 index 0000000..f10c5a2 Binary files /dev/null and b/customer-work/target/classes/com/customer/work/WorkApplication.class differ diff --git a/customer-work/target/classes/com/customer/work/service/JsonUtils$1.class b/customer-work/target/classes/com/customer/work/service/JsonUtils$1.class new file mode 100644 index 0000000..0a312fd Binary files /dev/null and b/customer-work/target/classes/com/customer/work/service/JsonUtils$1.class differ diff --git a/customer-work/target/classes/com/customer/work/service/JsonUtils$2.class b/customer-work/target/classes/com/customer/work/service/JsonUtils$2.class new file mode 100644 index 0000000..902792c Binary files /dev/null and b/customer-work/target/classes/com/customer/work/service/JsonUtils$2.class differ diff --git a/customer-work/target/classes/com/customer/work/service/JsonUtils.class b/customer-work/target/classes/com/customer/work/service/JsonUtils.class new file mode 100644 index 0000000..615d277 Binary files /dev/null and b/customer-work/target/classes/com/customer/work/service/JsonUtils.class differ diff --git a/customer-work/target/classes/com/customer/work/service/VarUtils.class b/customer-work/target/classes/com/customer/work/service/VarUtils.class new file mode 100644 index 0000000..3a4bd75 Binary files /dev/null and b/customer-work/target/classes/com/customer/work/service/VarUtils.class differ diff --git a/customer-work/target/classes/com/flowable/filters/contact/work-contact-filters.json b/customer-work/target/classes/com/flowable/filters/contact/work-contact-filters.json new file mode 100644 index 0000000..a0087c6 --- /dev/null +++ b/customer-work/target/classes/com/flowable/filters/contact/work-contact-filters.json @@ -0,0 +1,48 @@ +[ + { + "key": "all", + "labelKey": "contacts.filter.all", + "defaultLabel": "All", + "parameters": {} + }, + { + "key": "internal", + "labelKey": "contacts.filter.internal", + "defaultLabel": "Internal", + "parameters": { + "must": { + "type": "default" + } + } + }, + { + "key": "external", + "labelKey": "contacts.filter.external", + "defaultLabel": "External", + "parameters": { + "must" : { + "type": "external" + } + } + }, + { + "key": "active", + "labelKey": "contacts.filter.active", + "defaultLabel": "Active", + "parameters": { + "must" : { + "state": "ACTIVE" + } + } + }, + { + "key": "inactive", + "labelKey": "contacts.filter.inactive", + "defaultLabel": "Inactive", + "parameters": { + "must" : { + "state": "INACTIVE" + } + } + } +] \ No newline at end of file diff --git a/customer-work/target/classes/com/flowable/tenant-setup/custom/work-custom.json b/customer-work/target/classes/com/flowable/tenant-setup/custom/work-custom.json new file mode 100644 index 0000000..c9c6129 --- /dev/null +++ b/customer-work/target/classes/com/flowable/tenant-setup/custom/work-custom.json @@ -0,0 +1,21 @@ +{ + "name": "Flowable", + + "groups": [ + { "key": "flowableUser", "name": "Flowable User" }, + { "key": "flowableAdministrator", "name": "Flowable Administrator" } + ], + + "users": [ + { + "firstName": "Flowable", + "lastName": "Admin", + "login": "admin", + "email": "test@demo.flowable.io", + + "language": "en", + "theme": "flowable", + "userDefinitionKey": "user-admin" + } + ] +} \ No newline at end of file diff --git a/customer-work/target/classes/com/flowable/users/custom/work-custom.user.json b/customer-work/target/classes/com/flowable/users/custom/work-custom.user.json new file mode 100644 index 0000000..e3f68c5 --- /dev/null +++ b/customer-work/target/classes/com/flowable/users/custom/work-custom.user.json @@ -0,0 +1,67 @@ +[ + { + "key": "user-default", + "name": "Default user", + "description": "Creates a new, non-specific user where the member groups can be freely chosen.", + "initialState": "ACTIVE", + "initialSubState": "ACTIVE", + "forms": { + "init": "F01_userInitFormDefault", + "view": "F02_userViewFormDefault", + "edit": "F03_userEditFormDefault" + }, + "memberGroups": [ + "flowableUser" + ], + "lookupGroups":[ + "flowableUser" + ], + "actionPermissions": { + "create": [ "flowableAdministrator" ], + "edit": [ "flowableAdministrator" ], + "deactivate": [ "flowableAdministrator" ], + "activate": [ "flowableAdministrator" ] + }, + "contactFilters": [ "all" ], + "allowedFeatures": [ "contacts", "bubbles", "markdownInput", "replyToMessage", "forwardMessage", "reactToMessage", "fileUpload", "work", "createWork", + "personalAccessTokens", + "tasks", "documents", "changeOwnPassword", "changeOwnTheme", "editOwnAvatar"] + }, + { + "key": "user-admin", + "name": "Administration User", + "description": "Creates a new, administration user.", + "initialUserSubType": "admin", + "initialState": "ACTIVE", + "initialSubState": "ACTIVE", + "forms": { + "init": "F01_userInitFormDefault", + "view": "F02_userViewFormDefault", + "edit": "F03_userEditFormDefault" + }, + "memberGroups": [ + "flowableUser", + "flowableAdministrator" + ], + "lookupGroups":[ + "flowableUser" + ], + "actionPermissions": { + "create": [ "flowableAdministrator"], + "edit": [ "flowableAdministrator" ], + "deactivate": [ "flowableAdministrator" ], + "activate": [ "flowableAdministrator" ] + }, + "initialVariables": { + "adminUser": true, + "description": "Admin" + }, + "contactFilters": [ "all", "internal", "external", "inactive"], + "allowedFeatures": [ "contacts", "createUser", "reports", + "actuators", "user-mgmt", "search-api", "workobject-api", "templateManagement", + "markdownInput", "replyToMessage", "forwardMessage", "reactToMessage", "fileUpload", "work", "createWork", "tasks", "documents", + "impersonateUser", + "personalAccessTokens", + "changeOwnPassword", "changeOwnTheme", "editOwnAvatar", "themeManagement"] + } +] \ No newline at end of file diff --git a/customer-work/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/customer-work/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..36bea68 --- /dev/null +++ b/customer-work/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,3 @@ +com/customer/work/WorkApplication.class +com/customer/work/StaticResourceConfiguration.class +com/customer/work/SecurityHttpBasicConfiguration.class diff --git a/customer-work/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/customer-work/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..b025098 --- /dev/null +++ b/customer-work/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +/Users/andi/prj/flowable/2025.2/customer-work/src/main/java/com/customer/work/SecurityHttpBasicConfiguration.java +/Users/andi/prj/flowable/2025.2/customer-work/src/main/java/com/customer/work/StaticResourceConfiguration.java +/Users/andi/prj/flowable/2025.2/customer-work/src/main/java/com/customer/work/WorkApplication.java diff --git a/customer-work/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/customer-work/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e2a4edd --- /dev/null +++ b/customer-work/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com/customer/work/WorkApplicationTests.class diff --git a/customer-work/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/customer-work/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..8d39a64 --- /dev/null +++ b/customer-work/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +/Users/andi/prj/flowable/2025.2/customer-work/src/test/java/com/customer/work/WorkApplicationTests.java diff --git a/customer-work/target/surefire-reports/TEST-com.customer.work.WorkApplicationTests.xml b/customer-work/target/surefire-reports/TEST-com.customer.work.WorkApplicationTests.xml new file mode 100644 index 0000000..02168be --- /dev/null +++ b/customer-work/target/surefire-reports/TEST-com.customer.work.WorkApplicationTests.xml @@ -0,0 +1,4850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.indexing.api.IndexingService' (OnClassCondition) + - @ConditionalOnProperty (flowable.indexing.enabled=true) matched (OnPropertyCondition) + + IndexingAutoConfiguration#activityIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.ActivityIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#appEngineIndexingConfigurator matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.index.AppEngineIndexingConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#caseInstanceIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.CaseInstanceIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#contentItemIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.ContentItemIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#defaultIndexVariableTypes matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.variable.types.IndexVariableTypes; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#defaultIndexingFilterProvider matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.filter.IndexingFilterProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#elasticsearchCompatibility matched: + - @ConditionalOnMissingBean (types: com.flowable.indexing.ElasticsearchCompatibility; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#flowableDefaultIndexingResourceProvider matched: + - @ConditionalOnProperty (flowable.indexing.enable-default-mappings=true) matched (OnPropertyCondition) + + IndexingAutoConfiguration#indexManager matched: + - @ConditionalOnMissingBean (types: com.flowable.indexing.IndexManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#planItemIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.PlanItemIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#platformGlobalSearchResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.work.PlatformGlobalSearchResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#processInstanceIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.ProcessInstanceIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#slaAuditInstanceIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.SlaAuditInstanceIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#taskIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.TaskIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration#workIndexingDataProducer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.dataproducer.WorkIndexingDataProducer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IndexingAutoConfiguration.CoreServiceConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.service.service.FlowableSystemInfoContributor' (OnClassCondition) + + IndexingAutoConfiguration.CoreServiceConfiguration#elasticSearchFlowableSystemInfoContributor matched: + - @ConditionalOnAvailableSystemInfoProvider no property flowable.core.system-info.providers.elasticsearch.disabled found so enabling by default (OnAvailableSystemInfoProvider) + + InspectAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.inspect.rest.service.InspectInstanceService', 'com.flowable.inspect.engine.InspectEngine', 'com.flowable.inspect.engine.InspectEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.inspect.enabled=true) matched (OnPropertyCondition) + + InspectBreakpointAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.inspect.rest.service.InspectInstanceService', 'com.flowable.inspect.engine.InspectEngine', 'com.flowable.inspect.engine.InspectEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.inspect.enabled=true) matched (OnPropertyCondition) + + InspectEngineAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.inspect.engine.InspectEngine', 'com.flowable.inspect.engine.InspectEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.inspect.enabled=true) matched (OnPropertyCondition) + + InspectEngineAutoConfiguration#inspectEngineConfiguration matched: + - @ConditionalOnMissingBean (types: com.flowable.inspect.engine.InspectEngineConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InspectEngineAutoConfiguration.InspectEngineAppConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + InspectEngineAutoConfiguration.InspectEngineAppConfiguration#inspectAppEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: inspectAppEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InspectEngineAutoConfiguration.InspectEngineAppConfiguration#inspectEngineConfigurator matched: + - @ConditionalOnMissingBean (types: com.flowable.inspect.engine.configurator.InspectEngineConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InspectEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.inspect.engine.InspectEngine', 'com.flowable.inspect.engine.InspectEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.inspect.enabled=true) matched (OnPropertyCondition) + + InspectEngineServicesAutoConfiguration.AlreadyInitializedAppEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: com.flowable.inspect.engine.InspectEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IntegrationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.integration.config.EnableIntegration' (OnClassCondition) + + IntegrationAutoConfiguration#integrationGlobalProperties matched: + - @ConditionalOnMissingBean (names: integrationGlobalProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IntegrationAutoConfiguration.IntegrationComponentScanConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.integration.config.IntegrationComponentScanRegistrar; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IntegrationAutoConfiguration.IntegrationConfiguration#defaultPollerMetadata matched: + - @ConditionalOnMissingBean (names: org.springframework.integration.context.defaultPollerMetadata; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IntegrationAutoConfiguration.IntegrationManagementConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.integration.config.EnableIntegrationManagement' (OnClassCondition) + - @ConditionalOnMissingBean (names: integrationManagementConfigurer types: org.springframework.integration.config.IntegrationManagementConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition) + + IntegrationAutoConfiguration.IntegrationTaskSchedulerConfiguration matched: + - @ConditionalOnMissingBean (names: taskScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + IntegrationAutoConfiguration.IntegrationTaskSchedulerConfiguration#taskScheduler matched: + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + - @ConditionalOnBean (types: org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder; SearchStrategy: all) found bean 'threadPoolTaskSchedulerBuilder' (OnBeanCondition) + + Jackson2AutoConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + Jackson2AutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperBuilderConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperBuilderConfiguration#jackson2ObjectMapperBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2AutoConfiguration.JacksonObjectMapperConfiguration#jackson2ObjectMapper matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + Jackson2AutoConfiguration.ParameterNamesModuleConfiguration matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.module.paramnames.ParameterNamesModule' (OnClassCondition) + + Jackson2AutoConfiguration.ParameterNamesModuleConfiguration#jackson2ParameterNamesModule matched: + - @ConditionalOnMissingBean (types: com.fasterxml.jackson.module.paramnames.ParameterNamesModule; SearchStrategy: all) did not find any beans (OnBeanCondition) + + Jackson2EndpointAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.fasterxml.jackson.databind.ObjectMapper', 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition) + + Jackson2EndpointAutoConfiguration#jackson2EndpointJsonMapper matched: + - @ConditionalOnBooleanProperty (management.endpoints.jackson2.isolated-object-mapper=true) matched (OnPropertyCondition) + + JacksonAutoConfiguration matched: + - @ConditionalOnClass found required class 'tools.jackson.databind.json.JsonMapper' (OnClassCondition) + + JacksonAutoConfiguration#jacksonJsonMapper matched: + - @ConditionalOnMissingBean (types: tools.jackson.databind.json.JsonMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration#jsonMapperBuilder matched: + - @ConditionalOnMissingBean (types: tools.jackson.databind.json.JsonMapper$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JacksonAutoConfiguration.JsonProblemDetailsConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.http.ProblemDetail' (OnClassCondition) + + JacksonEndpointAutoConfiguration matched: + - @ConditionalOnClass found required class 'tools.jackson.databind.json.JsonMapper' (OnClassCondition) + + JacksonEndpointAutoConfiguration#endpointJsonMapper matched: + - @ConditionalOnBooleanProperty (management.endpoints.jackson.isolated-json-mapper=true) matched (OnPropertyCondition) + + JacksonHttpMessageConvertersConfiguration.JacksonJsonHttpMessageConverterConfiguration matched: + - @ConditionalOnClass found required class 'tools.jackson.databind.json.JsonMapper' (OnClassCondition) + - @ConditionalOnProperty (spring.http.converters.preferred-json-mapper=jackson) matched (OnPropertyCondition) + - @ConditionalOnBean (types: tools.jackson.databind.json.JsonMapper; SearchStrategy: all) found bean 'jacksonJsonMapper' (OnBeanCondition) + + JacksonHttpMessageConvertersConfiguration.JacksonJsonHttpMessageConverterConfiguration#jacksonJsonHttpMessageConvertersCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.JacksonJsonHttpMessageConverter ignored: org.springframework.hateoas.server.mvc.TypeConstrainedJacksonJsonHttpMessageConverter,org.springframework.data.rest.webmvc.alps.AlpsJacksonJsonHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JdbcClientAutoConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; SearchStrategy: all) found a single bean 'namedParameterJdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.simple.JdbcClient; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JdbcTemplateAutoConfiguration matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition) + - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition) + + JdbcTemplateConfiguration matched: + - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + JvmMetricsAutoConfiguration#classLoaderMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmCompilationMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmGcMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmHeapPressureMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmInfoMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmMemoryMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + JvmMetricsAutoConfiguration#jvmThreadMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + LicenseMetricsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found bean 'jdbcTemplate' (OnBeanCondition) + + LicenseMetricsConfiguration.MetricsLicensePublisherConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + LicenseMetricsConfiguration.MetricsRestConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + LicenseSchemaManagerAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.service.CoreServiceMarker' (OnClassCondition) + - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource' (OnBeanCondition) + + LicenseSystemInformationConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.service.configuration.service.LicenseSystemInfoContributor' (OnClassCondition) + + LicenseSystemInformationConfiguration#licenseSystemInfoContributor matched: + - @ConditionalOnAvailableSystemInfoProvider no property flowable.core.system-info.providers.license.disabled found so enabling by default (OnAvailableSystemInfoProvider) + + LifecycleAutoConfiguration#defaultLifecycleProcessor matched: + - @ConditionalOnMissingBean (names: lifecycleProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition) + + LogbackMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.MeterRegistry', 'ch.qos.logback.classic.LoggerContext', 'org.slf4j.LoggerFactory' (OnClassCondition) + - LogbackLoggingCondition ILoggerFactory is a Logback LoggerContext (LogbackMetricsAutoConfiguration.LogbackLoggingCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + LogbackMetricsAutoConfiguration#logbackMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.logging.LogbackMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ManagementContextAutoConfiguration.SameManagementContextConfiguration matched: + - Management Port actual port type (SAME) matched required type (OnManagementPortCondition) + + MetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.annotation.Timed' (OnClassCondition) + + MetricsAutoConfiguration#micrometerClock matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.multipart.support.StandardServletMultipartResolver', 'jakarta.servlet.MultipartConfigElement' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (spring.servlet.multipart.enabled=true) matched (OnPropertyCondition) + + MultipartAutoConfiguration#multipartConfigElement matched: + - @ConditionalOnMissingBean (types: jakarta.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans (OnBeanCondition) + + MultipartAutoConfiguration#multipartResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + NamedParameterJdbcTemplateConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found a single bean 'jdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.observation.ObservationRegistry' (OnClassCondition) + + ObservationAutoConfiguration#observationRegistry matched: + - @ConditionalOnMissingBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ObservationAutoConfiguration#spelValueExpressionResolver matched: + - @ConditionalOnMissingBean (types: io.micrometer.common.annotation.ValueExpressionResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + OrchestrateLicenseCheckAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.service.CoreServiceMarker' (OnClassCondition) + + OrchestrateLicenseCheckAutoConfiguration.LicenseServiceConfiguration matched: + - @ConditionalOnProperty (flowable.license.db-store-enabled=false) matched (OnPropertyCondition) + + OrchestrateLicenseMetricsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found bean 'jdbcTemplate' (OnBeanCondition) + + OrchestrateLicenseMetricsConfiguration.InstanceCountsConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.service.service.impl.license.count.InstanceCountsConsumer' (OnClassCondition) + + OrchestrateLicenseMetricsConfiguration.InstanceCountsMicrometerConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.core.service.service.impl.license.count.InstanceCountsConsumer', 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + OrchestrateLicenseMetricsConfiguration.InstanceCountsMicrometerConfiguration#meterRegistryInstanceCountsConsumer matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnProperty (flowable.metrics.instance-counts-enabled=true) matched (OnPropertyCondition) + + OrchestrateTaskExecutorSupportConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.service.service.impl.TaskExecutorFlowableSystemInfoContributor' (OnClassCondition) + + OrchestrateTaskExecutorSupportConfiguration#defaultTaskExecutorFlowableSystemInfoContributor matched: + - @ConditionalOnAvailableSystemInfoProvider no property flowable.core.system-info.providers.default-task-executor.disabled found so enabling by default (OnAvailableSystemInfoProvider) + - @ConditionalOnBean (names: defaultAsyncTaskExecutor; SearchStrategy: all) found bean 'defaultAsyncTaskExecutor' (OnBeanCondition) + + OrchestrateTaskExecutorSupportConfiguration#flowableTaskInvokerTaskExecutorFlowableSystemInfoContributor matched: + - @ConditionalOnAvailableSystemInfoProvider no property flowable.core.system-info.providers.task-invoker-executor.disabled found so enabling by default (OnAvailableSystemInfoProvider) + - @ConditionalOnBean (names: flowableTaskInvokerAsyncTaskExecutor; SearchStrategy: all) found bean 'flowableTaskInvokerAsyncTaskExecutor' (OnBeanCondition) + + PersistenceExceptionTranslationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor' (OnClassCondition) + + PersistenceExceptionTranslationAutoConfiguration#persistenceExceptionTranslationPostProcessor matched: + - @ConditionalOnBooleanProperty (spring.persistence.exceptiontranslation.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration matched: + - @ConditionalOnClass found required classes 'org.flowable.cmmn.api.listener.PlanItemInstanceLifecycleListener', 'com.flowable.platform.service.action.UserEventActiveStateLeaveListener', 'com.flowable.platform.service.action.CmmnPlatformExposeCreateTaskListener', 'com.flowable.platform.service.action.CmmnPlatformExposeCompleteTaskListener' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.cmmn.spring.SpringCmmnEngineConfiguration; SearchStrategy: all) found bean 'cmmnEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#actionEngineCmmnEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: actionEngineCmmnEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#cmmnPlatformExposeCompleteTaskListener matched: + - @ConditionalOnMissingBean (names: cmmnPlatformExposeCompleteTaskListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#cmmnPlatformExposeCreateTaskListener matched: + - @ConditionalOnMissingBean (names: cmmnPlatformExposeCreateTaskListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#completeCaseAuditLogLifecycleListener matched: + - @ConditionalOnMissingBean (names: completeCaseAuditLogLifecycleListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#completeCaseReactivationActionLifecycleListener matched: + - @ConditionalOnMissingBean (names: completeCaseReactivationActionLifecycleListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#planItemInstanceEnableStateEnterListener matched: + - @ConditionalOnMissingBean (names: planItemInstanceEnableStateEnterListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#planItemInstanceEnableStateLeaveListener matched: + - @ConditionalOnMissingBean (names: planItemInstanceEnableStateLeaveListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#reactivateEventActiveStateLeaveListener matched: + - @ConditionalOnMissingBean (names: reactivateEventActiveStateLeaveListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#terminateCaseReactivationActionLifecycleListener matched: + - @ConditionalOnMissingBean (names: terminateCaseReactivationActionLifecycleListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#userEventActiveStateEnterListener matched: + - @ConditionalOnMissingBean (names: userEventActiveStateEnterListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineCmmnConfiguration#userEventActiveStateLeaveListener matched: + - @ConditionalOnMissingBean (names: userEventActiveStateLeaveListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineProcessConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.platform.service.action.BpmnPlatformExposeCreateTaskListener', 'com.flowable.platform.service.action.BpmnPlatformExposeCompleteTaskListener' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.spring.SpringProcessEngineConfiguration; SearchStrategy: all) found bean 'springProcessEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineProcessConfiguration#actionEngineProcessEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: actionEngineProcessEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineProcessConfiguration#bpmnEndEventCompleteAuditLogListener matched: + - @ConditionalOnMissingBean (names: bpmnEndEventCompleteAuditLogListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineProcessConfiguration#bpmnPlatformExposeCompleteTaskListener matched: + - @ConditionalOnMissingBean (names: bpmnPlatformExposeCompleteTaskListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ActionEngineProcessConfiguration#bpmnPlatformExposeCreateTaskListener matched: + - @ConditionalOnMissingBean (names: bpmnPlatformExposeCreateTaskListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.AgentEngineConfig matched: + - @ConditionalOnClass found required class 'com.flowable.agent.engine.AgentEngine' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.agent.engine.AgentEngineConfiguration; SearchStrategy: all) found bean 'agentEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformAppAutoDeployConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformAppAutoDeployConfiguration#defaultAppDefinitionDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultAppAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformAppEngineConfiguration matched: + - @ConditionalOnBean (types: org.flowable.app.api.AppEngineConfigurationApi; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngineConfiguration; SearchStrategy: all) found bean 'cmmnEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration#defaultCaseDefinitionDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultCaseDefinitionAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration#platformCmmmnFlowableFunctionDelegatesProvider matched: + - @ConditionalOnMissingBean (names: platformCmmnFlowableFunctionDelegatesProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration#platformCmmnIdentityLinkInterceptor matched: + - @ConditionalOnMissingBean (names: platformCmmnIdentityLinkInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration#platformCreateHumanTaskInterceptor matched: + - @ConditionalOnMissingBean (names: platformCreateHumanTaskInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration#platformEndCaseInstanceInterceptor matched: + - @ConditionalOnMissingBean (names: platformEndCaseInstanceInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCaseAutoDeployConfiguration#platformStartCaseInstanceInterceptor matched: + - @ConditionalOnMissingBean (names: platformStartCaseInstanceInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformContentConfiguration matched: + - @ConditionalOnBean (types: org.flowable.content.api.ContentEngineConfigurationApi; SearchStrategy: all) found bean 'contentEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformCoreIdmEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.idm.engine.CoreIdmEngineConfiguration; SearchStrategy: all) found bean 'coreIdmEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformDmnAutoDeployConfiguration matched: + - @ConditionalOnBean (types: org.flowable.dmn.engine.DmnEngineConfiguration; SearchStrategy: all) found bean 'dmnEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformDmnAutoDeployConfiguration#defaultDmnDefinitionDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultDmnDefinitionAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformEngineConfig matched: + - @ConditionalOnClass found required class 'com.flowable.platform.engine.PlatformEngine' (OnClassCondition) + + PlatformAutoConfiguration.PlatformEngineConfig#platformExpressionManagerConfigurer matched: + - @ConditionalOnMissingBean (names: platformExpressionManagerConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformEventRegistryAutoDeployConfiguration matched: + - @ConditionalOnBean (types: org.flowable.eventregistry.impl.EventRegistryEngineConfiguration; SearchStrategy: all) found bean 'eventEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformEventRegistryAutoDeployConfiguration#defaultEventRegistryDefinitionDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultEventRegistryDefinitionAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformFormAutoDeployConfiguration matched: + - @ConditionalOnBean (types: com.flowable.form.engine.FormEngineConfiguration; SearchStrategy: all) found bean 'platformFormEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformFormAutoDeployConfiguration#defaultFormDefinitionDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultFormDefinitionAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAssignmentRestrictionsConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.service.assignment.BpmnPlatformDisallowAssigneeTaskListener' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.spring.SpringProcessEngineConfiguration; SearchStrategy: all) found bean 'springProcessEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAssignmentRestrictionsConfiguration#bpmnPlatformDisallowAssigneeTaskListener matched: + - @ConditionalOnMissingBean (names: bpmnPlatformDisallowAssigneeTaskListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAssignmentRestrictionsConfiguration#cmmnPlatformDisallowAssigneeTaskListener matched: + - @ConditionalOnMissingBean (names: cmmnPlatformDisallowAssigneeTaskListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration matched: + - @ConditionalOnBean (types: org.flowable.spring.SpringProcessEngineConfiguration; SearchStrategy: all) found bean 'springProcessEngineConfiguration' (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration#defaultProcessDefinitionDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultProcessDefinitionAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration#platformBpmnFlowableFunctionDelegatesProvider matched: + - @ConditionalOnMissingBean (names: platformBpmnFlowableFunctionDelegatesProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration#platformCreateUserTaskInterceptor matched: + - @ConditionalOnMissingBean (names: platformCreateUserTaskInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration#platformEndProcessInstanceInterceptor matched: + - @ConditionalOnMissingBean (names: platformEndProcessInstanceInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration#platformIdentityLinkInterceptor matched: + - @ConditionalOnMissingBean (names: platformIdentityLinkInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.PlatformProcessAutoDeployConfiguration#platformStartProcessInstanceInterceptor matched: + - @ConditionalOnMissingBean (names: platformStartProcessInstanceInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformAutoConfiguration.ServiceRegistryEngineConfig matched: + - @ConditionalOnClass found required class 'org.flowable.engine.ProcessEngine' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.serviceregistry.engine.ServiceRegistryEngineConfiguration; SearchStrategy: all) found bean 'serviceRegistryEngineConfiguration' (OnBeanCondition) + + PlatformContentEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.content.engine.ContentEngine', 'com.flowable.content.spring.SpringContentEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.content.enabled=true) matched (OnPropertyCondition) + + PlatformContentEngineServicesAutoConfiguration.ContentEngineAutoDeployConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.common.deployer.DefaultDocumentDefinitionAutoDeployer' (OnClassCondition) + + PlatformContentEngineServicesAutoConfiguration.ContentEngineAutoDeployConfiguration#defaultDocumentDefinitionAutoDeployer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.deployer.DefaultDocumentDefinitionAutoDeployer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformContentEngineServicesAutoConfiguration.TaskExecutorSystemConfigurerConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.service.configuration.service.ThreadPoolTaskExecutorSystemConfigurationConfigurer' (OnClassCondition) + + PlatformContentEngineServicesAutoConfiguration.TaskExecutorSystemConfigurerConfiguration#contentAsyncExecutorSystemConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: contentAsyncExecutorSystemConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformContentEngineServicesAutoConfiguration.TaskExecutorSystemConfigurerConfiguration#contentAsyncTaskExecutorSystemConfigurationConfigurer matched: + - @ConditionalOnBean (names: contentAsyncTaskExecutor; SearchStrategy: all) found bean 'contentAsyncTaskExecutor'; @ConditionalOnMissingBean (names: contentAsyncTaskExecutorSystemConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.platform.engine.PlatformEngine', 'com.flowable.platform.engine.PlatformEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.platform.enabled=true) matched (OnPropertyCondition) + + PlatformEngineAutoConfiguration#defaultLanguageConfigurationProvider matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.api.configuration.LanguageConfigurationProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration#flowableThresholdProvider matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.sandbox.repetition.FlowableThresholdProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration#maxCommandDurationProvider matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.sandbox.longrunning.FlowableMaxCommandDurationProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration#platformEngineConfiguration matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.PlatformEngineConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration.EventRegistryMailConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.platform.engine.impl.eventregistry.mail.MailChannelModelProcessor', 'jakarta.mail.Message', 'org.springframework.integration.mail.ImapMailReceiver', 'org.springframework.integration.dsl.context.IntegrationFlowContext' (OnClassCondition) + + PlatformEngineAutoConfiguration.EventRegistryMailConfiguration#mailChannelModelProcessor matched: + - @ConditionalOnProperty (flowable.eventregistry.mail.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (names: mailChannelModelProcessor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration.EventRegistryMailConfiguration#mailListenerContainerFactory matched: + - @ConditionalOnProperty (flowable.eventregistry.mail.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.eventregistry.mail.MailListenerContainerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration.PlatformCmmnEngineConfiguration matched: + - @ConditionalOnBean (types: org.flowable.cmmn.spring.SpringCmmnEngineConfiguration; SearchStrategy: all) found bean 'cmmnEngineConfiguration' (OnBeanCondition) + + PlatformEngineAutoConfiguration.PlatformContentEngineConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.content.spring.SpringContentEngineConfiguration' (OnClassCondition) + + PlatformEngineAutoConfiguration.PlatformEngineAppConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + PlatformEngineAutoConfiguration.PlatformEngineAppConfiguration#platformAppEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: platformAppEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration.PlatformEngineAppConfiguration#platformEngineConfigurator matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.configurator.PlatformEngineConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineAutoConfiguration.PlatformProcessEngineConfiguration matched: + - @ConditionalOnBean (types: org.flowable.spring.SpringProcessEngineConfiguration; SearchStrategy: all) found bean 'springProcessEngineConfiguration' (OnBeanCondition) + + PlatformEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.platform.engine.PlatformEngine', 'com.flowable.platform.engine.PlatformEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.platform.enabled=true) matched (OnPropertyCondition) + + PlatformEngineServicesAutoConfiguration#defaultThemeAutoImporter matched: + - @ConditionalOnProperty (flowable.platform.default-theme.auto-import=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (names: defaultThemeAutoImporter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineServicesAutoConfiguration#themeAutoImporter matched: + - @ConditionalOnProperty (flowable.platform.theme.auto-import=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (names: themeAutoImporter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformEngineServicesAutoConfiguration.AlreadyInitializedAppEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformExpressionsAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.expressions.FlowableExpressionFormatUtils' (OnClassCondition) + + PlatformIndexAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.platform.service.PlatformServiceMarker', 'com.flowable.indexing.api.IndexingService' (OnClassCondition) + - @ConditionalOnProperty (flowable.indexing.enabled=true) matched (OnPropertyCondition) + + PlatformIndexAutoConfiguration#activityIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.ActivityIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#caseInstanceIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.CaseInstanceIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#contentItemIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.ContentItemIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#indexingInstanceSynchronizedEventListener matched: + - @ConditionalOnMissingBean (names: indexingInstanceSynchronizedEventListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#planItemInstanceIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.PlanItemInstanceIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#platformReindexService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.index.PlatformReindexService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#processInstanceIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.ProcessInstanceIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#taskIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.TaskIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#workIndexService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.index.WorkIndexService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformIndexAutoConfiguration#workIndexingScheduler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.impl.indexing.scheduler.WorkIndexingScheduler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInfoContributorConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.rest.service.api.info.PlatformInfoContributor' (OnClassCondition) + + PlatformInfoContributorConfiguration#buildInfoPlatformInfoContributor matched: + - @ConditionalOnMissingBean (names: buildInfoPlatformInfoContributor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInfoContributorConfiguration#licensePlatformInfoContributor matched: + - @ConditionalOnBean (types: com.flowable.license.LicenseCheckService; SearchStrategy: all) found bean 'licenseCheckService'; @ConditionalOnMissingBean (names: licensePlatformInfoContributor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.platform.service.PlatformServiceMarker', 'org.flowable.common.rest.resolver.ContentTypeResolver' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.AppRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.app.rest.AppRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.AppRestApiConfiguration#appRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: com.flowable.app.rest.AppRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.BpmnRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.rest.service.api.BpmnRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.BpmnRestApiConfiguration#bpmnRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.rest.service.api.BpmnRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.BpmnRestApiConfiguration#formHandlerRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.rest.service.api.FormHandlerRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.CmmnRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.cmmn.rest.service.api.CmmnRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.CmmnRestApiConfiguration#cmmnFormHandlerRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.cmmn.rest.service.api.CmmnFormHandlerRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.CmmnRestApiConfiguration#cmmnRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.cmmn.rest.service.api.CmmnRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.ContentRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.content.rest.ContentRestApiInterceptor' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.content.engine.ContentEngine; SearchStrategy: all) found bean 'contentEngine' (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.ContentRestApiConfiguration#contentRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: com.flowable.content.rest.ContentRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.CoreRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.rest.service.api.CoreRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.CoreRestApiConfiguration#coreRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: com.flowable.core.rest.service.api.CoreRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.DmnRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.dmn.rest.service.api.DmnRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.DmnRestApiConfiguration#dmnRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.dmn.rest.service.api.DmnRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.EventRegistryRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.eventregistry.rest.service.api.EventRegistryRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.EventRegistryRestApiConfiguration#eventRegistryRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.eventregistry.rest.service.api.EventRegistryRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.ExternalWorkerJobRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.external.job.rest.service.api.ExternalWorkerJobRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.ExternalWorkerJobRestApiConfiguration#externalWorkerJobRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: org.flowable.external.job.rest.service.api.ExternalWorkerJobRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.FormRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.form.rest.FormRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.FormRestApiConfiguration#formRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: com.flowable.form.rest.FormRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformInterceptorAutoConfiguration.ReportRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.rest.service.api.reports.PlatformReportRestApiInterceptor' (OnClassCondition) + + PlatformInterceptorAutoConfiguration.ReportRestApiConfiguration#platformReportRestApiInterceptor matched: + - @ConditionalOnMissingBean (types: com.flowable.core.reporting.rest.service.ReportRestApiInterceptor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformLicenseAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.service.CoreServiceMarker' (OnClassCondition) + + PlatformRenditionConvertersAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.content.engine.ContentEngine', 'com.flowable.content.spring.SpringContentEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.content.enabled=true) matched (OnPropertyCondition) + + PlatformRenditionConvertersAutoConfiguration.PlatformRenditionContentConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.rendition.converter.PlatformRenditionConverter' (OnClassCondition) + - @ConditionalOnProperty (flowable.content.rendition-converters.enabled=true) matched (OnPropertyCondition) + + PlatformRestApiAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.common.rest.resolver.ContentTypeResolver' (OnClassCondition) + + PlatformRestApiAutoConfiguration.ActionEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.action.rest.service.api.ActionEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.action.engine.ActionEngine; SearchStrategy: all) found bean 'actionEngine' (OnBeanCondition) + + PlatformRestApiAutoConfiguration.ActionEngineRestApiConfiguration#actionConfirmationTemplateService matched: + - @ConditionalOnMissingBean (types: com.flowable.action.api.repository.ActionTemplateService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformRestApiAutoConfiguration.ActionEngineRestApiConfiguration#actionTemplateResourceService matched: + - @ConditionalOnMissingBean (types: com.flowable.action.rest.service.api.template.ActionTemplateResourceService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformRestApiAutoConfiguration.AgentEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.agent.rest.service.api.AgentEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.agent.engine.AgentEngine; SearchStrategy: all) found bean 'agentEngine' (OnBeanCondition) + + PlatformRestApiAutoConfiguration.DataObjectEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.dataobject.rest.service.api.DataObjectEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.dataobject.engine.DataObjectEngine; SearchStrategy: all) found bean 'dataObjectEngine' (OnBeanCondition) + + PlatformRestApiAutoConfiguration.FlowableFormDocumentDefinitionProviderConfiguration matched: + - @ConditionalOnBean (types: com.flowable.content.engine.ContentEngineConfiguration; SearchStrategy: all) found bean 'contentEngineConfiguration' (OnBeanCondition) + + PlatformRestApiAutoConfiguration.FlowableFormDocumentDefinitionProviderConfiguration#flowableFormDocumentDefinitionProvider matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.form.FormDocumentDefinitionProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformRestApiAutoConfiguration.FlowablePlatformExceptionHandlerAdviceConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.engine.PlatformEngine' (OnClassCondition) + + PlatformRestApiAutoConfiguration.FlowablePlatformExceptionHandlerAdviceConfiguration#flowablePlatformExceptionHandlerAdvice matched: + - @ConditionalOnMissingBean (names: flowablePlatformExceptionHandlerAdvice; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformRestApiAutoConfiguration.InspectRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.inspect.rest.service.api.InspectRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.inspect.rest.service.InspectInstanceService; SearchStrategy: all) found bean 'inspectInstancesService' (OnBeanCondition) + + PlatformRestApiAutoConfiguration.PlatformRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.rest.service.api.PlatformRestApiMarker' (OnClassCondition) + + PlatformRestApiAutoConfiguration.PlatformRestApiConfiguration#currentUserAvailableApplicationsEnhancer matched: + - @ConditionalOnMissingBean (names: currentUserAvailableApplicationsEnhancer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformRestApiAutoConfiguration.PlatformRestApiConfiguration#currentUserThemeEnhancer matched: + - @ConditionalOnMissingBean (names: currentUserThemeEnhancer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformRestApiAutoConfiguration.ServiceRegistryEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.serviceregistry.rest.service.api.ServiceRegistryEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.serviceregistry.engine.ServiceRegistryEngine; SearchStrategy: all) found bean 'serviceRegistryEngine' (OnBeanCondition) + + PlatformRestApiAutoConfiguration.TemplateEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.template.rest.service.api.TemplateEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.template.engine.TemplateEngine; SearchStrategy: all) found bean 'flowableTemplateEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.service.PlatformServiceMarker' (OnClassCondition) + + PlatformServiceAutoConfiguration#activityResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.activity.ActivityResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#bpmnFormProvider matched: + - @ConditionalOnBean (types: org.flowable.engine.ProcessEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'processEngine'; @ConditionalOnMissingBean (names: flowableBpmnFormProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#caseInstanceResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.caze.CaseInstanceResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#casePageFormProvider matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'cmmnEngine'; @ConditionalOnMissingBean (names: flowableCasePageFormProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#cmmnRestResponseFactory matched: + - @ConditionalOnMissingBean (types: org.flowable.cmmn.rest.service.api.CmmnRestResponseFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#contentItemResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.content.ContentItemResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#dashboardComponentQueryResultMapperService matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.dashboard.resultmapper.DashboardComponentQueryResultMapperService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#dashboardService matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.dashboard.DashboardService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#dataSourceSystemConfigurationConfigurer matched: + - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource'; @ConditionalOnMissingBean (names: dataSourceSystemConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#dataTableDataConverter matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.query.datatable.DataTableDataConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#defaultTaskFilterService matched: + - @ConditionalOnMissingBean (names: defaultTaskFilterService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#defaultWorkFilterService matched: + - @ConditionalOnMissingBean (names: defaultWorkFilterService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#flowableCmmnFormProvider matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'cmmnEngine'; @ConditionalOnMissingBean (names: flowableCmmnFormProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#flowableTaskFormProvider matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (names: flowableTaskFormProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#formCustomComponentResourceProvider matched: + - @ConditionalOnBean (types: com.flowable.form.engine.FormEngine; SearchStrategy: all) found bean 'coreFormEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.form.customcomponent.FormCustomComponentResourceProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#licenseLoginsReportRunner matched: + - @ConditionalOnBean (types: com.flowable.license.LicenseLoginService; SearchStrategy: all) found bean 'licenseLoginService' (OnBeanCondition) + + PlatformServiceAutoConfiguration#planItemResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.planitem.PlanItemResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformAppService matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.app.PlatformAppService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformCaseDefinitionService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'cmmnEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.caze.PlatformCaseDefinitionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformCaseInstanceService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine; SearchStrategy: all) found beans 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.caze.PlatformCaseInstanceService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformCasePageService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'cmmnEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.casepage.PlatformCasePageService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformCasePermissionService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine; SearchStrategy: all) found bean 'cmmnEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.security.permission.CasePermissionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformCommentService matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.comment.PlatformCommentService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformEntityLinkService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine; SearchStrategy: all) found beans 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.work.PlatformEntityLinkService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformExternalWorkerJobPermissionService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine; SearchStrategy: all) found beans 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.security.permission.ExternalWorkerJobPermissionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformFlowableFormDecorator matched: + - @ConditionalOnMissingBean (names: defaultFlowableFormDecorator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformHierarchyService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.hierarchy.InstanceHierarchyService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformPageService matched: + - @ConditionalOnBean (types: com.flowable.form.engine.FormEngine; SearchStrategy: all) found bean 'coreFormEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.page.PlatformPageService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformProcessDefinitionService matched: + - @ConditionalOnBean (types: org.flowable.engine.ProcessEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.process.PlatformProcessDefinitionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformProcessInstanceService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine; SearchStrategy: all) found beans 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.process.PlatformProcessInstanceService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformProcessPermissionService matched: + - @ConditionalOnBean (types: org.flowable.engine.ProcessEngine; SearchStrategy: all) found bean 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.security.permission.ProcessPermissionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformRestVariableTransformer matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.variable.PlatformRestVariableTransformer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformSimpleContentTypeMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.content.SimpleContentTypeMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformStandardDataQuerySafeQueryTransformer matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.indexing.query.builder.standard.StandardDataQuerySafeQueryTransformer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformTaskPermissionService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine; SearchStrategy: all) found beans 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.security.permission.TaskPermissionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformTaskService matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine,com.flowable.form.engine.FormEngine; SearchStrategy: all) found beans 'coreFormEngine', 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.task.PlatformTaskService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#platformTranslationService matched: + - @ConditionalOnBean (types: com.flowable.platform.api.translation.TranslationService; SearchStrategy: all) found bean 'translationService'; @ConditionalOnMissingBean (types: com.flowable.platform.service.translation.PlatformTranslationService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#processInstanceResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.process.ProcessInstanceResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#queryResultToCsvTransformer matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.dashboard.transformer.QueryResultToCsvTransformerService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#queryService matched: + - @ConditionalOnClass found required class 'com.flowable.indexing.api.IndexingService' (OnClassCondition) + - @ConditionalOnProperty (flowable.indexing.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.query.QueryService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#restResponseFactory matched: + - @ConditionalOnMissingBean (types: org.flowable.rest.service.api.RestResponseFactory; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#securityHelper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.security.SecurityHelper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#standardDataQueryInputValuesTransformer matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.indexing.query.builder.standard.StandardDataQueryInputValuesTransformer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#standardQueryConfigurationTransformer matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine'; @ConditionalOnMissingBean (types: com.flowable.indexing.query.builder.standard.StandardDataQueryTransformerService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#taskResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.task.TaskResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#workDefinitionService matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine,org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine; SearchStrategy: all) found beans 'flowableAppEngine', 'cmmnEngine', 'processEngine'; @ConditionalOnMissingBean (types: com.flowable.platform.service.work.WorkDefinitionService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration#workInstanceResultMapper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.work.WorkInstanceResultMapper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.AgentAndServiceRegistryPlatformServiceConfiguration matched: + - @ConditionalOnBean (types: com.flowable.agent.engine.AgentEngine,com.flowable.serviceregistry.engine.ServiceRegistryEngine; SearchStrategy: all) found beans 'agentEngine', 'serviceRegistryEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.AgentAndServiceRegistryPlatformServiceConfiguration#platformAndServiceRegistryEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: platformAndServiceRegistryEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.AgentPlatformServiceConfiguration matched: + - @ConditionalOnBean (types: com.flowable.agent.engine.AgentEngine; SearchStrategy: all) found bean 'agentEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.AgentPlatformServiceConfiguration#flowableFormAgentInvoker matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.form.invocation.FormAgentInvoker; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.AgentPlatformServiceConfiguration#platformAgentAppEngineConfigurer matched: + - @ConditionalOnMissingBean (names: platformAgentAppEngineConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformCmmnEngineServiceConfiguration matched: + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine; SearchStrategy: all) found bean 'cmmnEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformCmmnEngineServiceConfiguration#cmmnAsyncExecutorSystemConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: cmmnAsyncExecutorSystemConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformCmmnEngineServiceConfiguration#flowableFormUserEventListenerInvoker matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.form.invocation.FormUserEventListenerInvoker; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration matched: + - @ConditionalOnBean (types: com.flowable.content.engine.ContentEngine; SearchStrategy: all) found bean 'contentEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#PlatformBigDecimalVariableConverter matched: + - @ConditionalOnMissingBean (names: platformBigDecimalVariableConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#PlatformBigIntegerVariableConverter matched: + - @ConditionalOnMissingBean (names: platformBigIntegerVariableConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#documentMetadataHandler matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.content.DocumentMetadataHandler; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#flowableDefaultContentMediaTypeResolver matched: + - @ConditionalOnProperty (flowable.content.content-type-resolver=default) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: com.flowable.platform.service.content.ContentMediaTypeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#folderNameParser matched: + - @ConditionalOnMissingBean (types: com.flowable.core.service.form.FolderNameParser; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#platformContentItemService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.content.PlatformContentItemService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#platformContentItemVariableConverter matched: + - @ConditionalOnMissingBean (names: platformContentItemVariableConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#platformFolderItemService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.content.PlatformFolderItemService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformDataObjectServiceConfiguration matched: + - @ConditionalOnBean (types: com.flowable.dataobject.engine.DataObjectEngine; SearchStrategy: all) found bean 'dataObjectEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformDataObjectServiceConfiguration#dataObjectIndexVariableType matched: + - @ConditionalOnMissingBean (names: dataObjectIndexVariableType; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformDataObjectServiceConfiguration#dataObjectInstanceVariableContainerVariableConverter matched: + - @ConditionalOnMissingBean (names: dataObjectInstanceVariableContainerVariableConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformDataObjectServiceConfiguration#detachedDataObjectIndexVariableType matched: + - @ConditionalOnMissingBean (names: detachedDataObjectIndexVariableType; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformProcessEngineServiceConfiguration matched: + - @ConditionalOnBean (types: org.flowable.engine.ProcessEngine; SearchStrategy: all) found bean 'processEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformProcessEngineServiceConfiguration#asyncHistoryExecutorSystemConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: asyncHistoryExecutorSystemConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformProcessEngineServiceConfiguration#bpmnAsyncExecutorSystemConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: bpmnAsyncExecutorSystemConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.platform.engine.PlatformEngine; SearchStrategy: all) found bean 'platformEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceEngineConfiguration#dataDictionaryComplexIndexVariableType matched: + - @ConditionalOnMissingBean (names: dataDictionaryComplexIndexVariableType; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceEngineConfiguration#dataDictionaryVariableRestConverter matched: + - @ConditionalOnMissingBean (names: dataDictionaryVariableRestConverter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceEngineConfiguration#systemConfigurationApplierService matched: + - @ConditionalOnMissingBean (names: systemConfigurationApplierService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceEngineConfiguration#systemConfigurationFlowableSystemInfoContributor matched: + - @ConditionalOnAvailableSystemInfoProvider no property flowable.core.system-info.providers.system-configurations.disabled found so enabling by default (OnAvailableSystemInfoProvider) + + PlatformServiceAutoConfiguration.PlatformServiceIndexingConfiguration matched: + - @ConditionalOnBean (types: com.flowable.indexing.SearchService; SearchStrategy: all) found bean 'searchService' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceRegistryEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.serviceregistry.engine.ServiceRegistryEngine; SearchStrategy: all) found bean 'serviceRegistryEngine' (OnBeanCondition) + + PlatformServiceAutoConfiguration.PlatformServiceRegistryEngineConfiguration#flowableFormServiceInvoker matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.service.form.invocation.FormServiceInvoker; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PolicyEngineAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.policy.engine.PolicyEngine', 'com.flowable.policy.engine.PolicyEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.policy.enabled=true) matched (OnPropertyCondition) + + PolicyEngineAutoConfiguration#policyEngineConfiguration matched: + - @ConditionalOnMissingBean (types: com.flowable.policy.engine.PolicyEngineConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PolicyEngineAutoConfiguration.PolicyEngineAppConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + PolicyEngineAutoConfiguration.PolicyEngineAppConfiguration#policyAppEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: policyAppEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PolicyEngineAutoConfiguration.PolicyEngineAppConfiguration#policyEngineConfigurator matched: + - @ConditionalOnMissingBean (types: com.flowable.policy.engine.configurator.PolicyEngineConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + PolicyEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.policy.engine.PolicyEngine', 'com.flowable.policy.engine.PolicyEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.policy.enabled=true) matched (OnPropertyCondition) + + PolicyEngineServicesAutoConfiguration.AlreadyInitializedAppEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: com.flowable.policy.engine.PolicyEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.flowable.engine.ProcessEngine', 'org.flowable.spring.SpringProcessEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.process.enabled=true) matched (OnPropertyCondition) + + ProcessEngineAutoConfiguration#asyncHistoryExecutorStarter matched: + - @ConditionalOnProperty (flowable.process.async-history.enable) matched (OnPropertyCondition) + + ProcessEngineAutoConfiguration#flowableProcessValidator matched: + - @ConditionalOnMissingBean (types: org.flowable.validation.ProcessValidator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineAutoConfiguration#processAsyncExecutor matched: + - @ConditionalOnMissingBean (names: processAsyncExecutor,platformAsyncExecutor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineAutoConfiguration#springProcessEngineConfiguration matched: + - @ConditionalOnMissingBean (types: org.flowable.spring.SpringProcessEngineConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineAutoConfiguration.ProcessEngineAppConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + ProcessEngineAutoConfiguration.ProcessEngineAppConfiguration#processAppEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: processAppEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineAutoConfiguration.ProcessEngineAppConfiguration#processEngineConfigurator matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.configurator.ProcessEngineConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.flowable.engine.ProcessEngine', 'org.flowable.spring.SpringProcessEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.process.enabled=true) matched (OnPropertyCondition) + + ProcessEngineServicesAutoConfiguration#dynamicBpmnServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.DynamicBpmnService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#formServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.FormService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#historyServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.HistoryService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#identityServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.IdentityService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#managementServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.ManagementService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#processMigrationServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.ProcessMigrationService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#repositoryServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.RepositoryService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#runtimeServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.RuntimeService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration#taskServiceBean matched: + - @ConditionalOnMissingBean (types: org.flowable.engine.TaskService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessEngineServicesAutoConfiguration.AlreadyInitializedAppEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: org.flowable.engine.ProcessEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessFunctionDelegatesAutoConfiguration#propertyConfigurationService matched: + - @ConditionalOnBean (types: org.springframework.core.env.PropertyResolver; SearchStrategy: all) found bean 'environment' (OnBeanCondition) + + ProcessFunctionDelegatesAutoConfiguration.PlatformCommonFunctionDelegatesConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.common.el.FlowableListOfFunctionDelegate' (OnClassCondition) + + ProcessFunctionDelegatesAutoConfiguration.PlatformCommonFunctionDelegatesConfiguration#platformCommonFlowableFunctionDelegatesProvider matched: + - @ConditionalOnMissingBean (names: platformCommonFlowableFunctionDelegatesProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessFunctionDelegatesAutoConfiguration.PlatformEngineFunctionDelegatesConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.engine.impl.sequence.el.SequenceNextFormattedValueFunctionDelegate' (OnClassCondition) + + ProcessFunctionDelegatesAutoConfiguration.PlatformEngineFunctionDelegatesConfiguration#platformEngineFunctionDelegatesProvider matched: + - @ConditionalOnMissingBean (names: platformEngineFunctionDelegatesProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProcessFunctionDelegatesAutoConfiguration.PlatformIdmFunctionDelegatesConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.idm.engine.impl.el.FindPlatformUserFunctionDelegate' (OnClassCondition) + + ProcessFunctionDelegatesAutoConfiguration.PlatformIdmFunctionDelegatesConfiguration#platformIdmFlowableFunctionDelegatesProvider matched: + - @ConditionalOnMissingBean (names: platformIdmFlowableFunctionDelegatesProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ProjectAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.autoconfigure.project.ProjectSchemaManager' (OnClassCondition) + - @ConditionalOnBean (types: javax.sql.DataSource; SearchStrategy: all) found bean 'dataSource' (OnBeanCondition) + + PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched: + - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition) + + ReactiveHttpClientAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.http.client.reactive.ClientHttpConnector', 'reactor.core.publisher.Mono' (OnClassCondition) + - Detected ClientHttpConnectorBuilder (ConditionalOnClientHttpConnectorBuilderDetection) + + ReactiveHttpClientAutoConfiguration#clientHttpConnector matched: + - @ConditionalOnMissingBean (types: org.springframework.http.client.reactive.ClientHttpConnector; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ReactiveHttpClientAutoConfiguration#clientHttpConnectorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.reactive.ClientHttpConnectorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ReactiveWebSecurityAutoConfiguration matched: + - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.web.server.WebFilterChainProxy', 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition) + + RequestLoggingAutoConfiguration matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + ResourceHelperAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.template.engine.TemplateEngine', 'com.flowable.template.engine.TemplateEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.template.enabled=true) matched (OnPropertyCondition) + + ResourceHelperAutoConfiguration#resourceHelper matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.common.resource.ResourceHelper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestApiAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.common.rest.resolver.ContentTypeResolver' (OnClassCondition) + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + RestApiAutoConfiguration.AppEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.app.rest.AppRestUrls' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine' (OnBeanCondition) + + RestApiAutoConfiguration.CmmnEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.cmmn.rest.service.api.CmmnRestUrls' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine; SearchStrategy: all) found bean 'cmmnEngine' (OnBeanCondition) + + RestApiAutoConfiguration.CommonRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.common.rest.response.ResponseEntityHelper' (OnClassCondition) + + RestApiAutoConfiguration.CommonRestApiConfiguration#responseEntityHelper matched: + - @ConditionalOnMissingBean (types: com.flowable.core.common.rest.response.ResponseEntityHelper; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestApiAutoConfiguration.ContentEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.content.rest.ContentRestUrls' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.content.engine.ContentEngine; SearchStrategy: all) found bean 'contentEngine' (OnBeanCondition) + + RestApiAutoConfiguration.CoreRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.rest.service.api.CoreRestApiMarker' (OnClassCondition) + + RestApiAutoConfiguration.CoreRestApiConfiguration#coreRestProcessEngineConfigurer matched: + - @ConditionalOnMissingBean (names: coreRestProcessEngineConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + RestApiAutoConfiguration.DmnEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.dmn.rest.service.api.DmnRestUrls' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.dmn.engine.DmnEngine; SearchStrategy: all) found bean 'dmnEngine' (OnBeanCondition) + + RestApiAutoConfiguration.EventRegistryRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.eventregistry.rest.service.api.EventRestUrls' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.eventregistry.impl.EventRegistryEngine; SearchStrategy: all) found bean 'eventRegistryEngine' (OnBeanCondition) + + RestApiAutoConfiguration.ExternalJobRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.external.job.rest.service.api.ExternalJobRestUrls' (OnClassCondition) + - AnyNestedCondition 2 matched 0 did not; NestedCondition on RestApiAutoConfiguration.ExternalJobRestApiConfiguration.ExternalJobRestCondition.CmmnEngineBeanCondition @ConditionalOnBean (types: org.flowable.cmmn.engine.CmmnEngine; SearchStrategy: all) found bean 'cmmnEngine'; NestedCondition on RestApiAutoConfiguration.ExternalJobRestApiConfiguration.ExternalJobRestCondition.ProcessEngineBeanCondition @ConditionalOnBean (types: org.flowable.engine.ProcessEngine; SearchStrategy: all) found bean 'processEngine' (RestApiAutoConfiguration.ExternalJobRestApiConfiguration.ExternalJobRestCondition) + + RestApiAutoConfiguration.FormEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.form.rest.FormRestUrls' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.form.engine.FormEngine; SearchStrategy: all) found bean 'coreFormEngine' (OnBeanCondition) + + RestApiAutoConfiguration.IdmEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.idm.rest.service.api.CoreIdmEngineRestMarker' (OnClassCondition) + - @ConditionalOnBean (types: com.flowable.idm.engine.CoreIdmEngine; SearchStrategy: all) found bean 'coreIdmEngine' (OnBeanCondition) + + RestApiAutoConfiguration.ProcessEngineRestApiConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.rest.service.api.RestUrls' (OnClassCondition) + - @ConditionalOnBean (types: org.flowable.engine.ProcessEngine; SearchStrategy: all) found bean 'processEngine' (OnBeanCondition) + + RestApiAutoConfiguration.ReportingRestApiConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.core.reporting.rest.service.CoreReportingRestMarker' (OnClassCondition) + + SalesforceAgentforceAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.agent.engine.impl.model.external.salesforce.client.SalesforceAgentforceClient' (OnClassCondition) + + SalesforceAgentforceAutoConfiguration#salesforceAgentforceClient matched: + - @ConditionalOnMissingBean (types: com.flowable.agent.engine.impl.model.external.salesforce.client.SalesforceAgentforceClient; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SandboxScriptingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.flowable.common.engine.impl.scripting.FlowableScriptEngine' (OnClassCondition) + + ScheduledTasksObservationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + SecurityAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.security.authentication.DefaultAuthenticationEventPublisher' (OnClassCondition) + + SecurityAutoConfiguration#authenticationEventPublisher matched: + - @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationEventPublisher; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SecurityFilterAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer', 'org.springframework.security.config.http.SessionCreationPolicy' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + SecurityFilterAutoConfiguration#securityFilterChainRegistration matched: + - @ConditionalOnBean (names: springSecurityFilterChain; SearchStrategy: all) found bean 'springSecurityFilterChain' (OnBeanCondition) + + SecurityHttpBasicConfiguration matched: + - @ConditionalOnProperty (application.security.type=basic) matched (OnPropertyCondition) + + SecurityRequestMatchersManagementContextConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.security.web.util.matcher.RequestMatcher' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + SecurityRequestMatchersManagementContextConfiguration.MvcRequestMatcherConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.boot.webmvc.autoconfigure.DispatcherServletPath; SearchStrategy: all) found bean 'dispatcherServletRegistration' (OnBeanCondition) + + SecurityRequestMatchersManagementContextConfiguration.MvcRequestMatcherConfiguration#requestMatcherProvider matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.security.autoconfigure.actuate.web.servlet.RequestMatcherProvider; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ServiceRegistryEngineAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.serviceregistry.engine.ServiceRegistryEngine', 'com.flowable.serviceregistry.engine.ServiceRegistryEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.service-registry.enabled=true) matched (OnPropertyCondition) + + ServiceRegistryEngineAutoConfiguration#serviceRegistryEngineConfiguration matched: + - @ConditionalOnMissingBean (types: com.flowable.serviceregistry.engine.ServiceRegistryEngineConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ServiceRegistryEngineAutoConfiguration#serviceRegistryValidator matched: + - @ConditionalOnMissingBean (types: com.flowable.serviceregistry.api.validation.ServiceRegistryValidator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ServiceRegistryEngineAutoConfiguration.ServiceRegistryEngineAppConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + ServiceRegistryEngineAutoConfiguration.ServiceRegistryEngineAppConfiguration#serviceRegistryAppEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: serviceRegistryAppEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ServiceRegistryEngineAutoConfiguration.ServiceRegistryEngineAppConfiguration#serviceRegistryEngineConfigurator matched: + - @ConditionalOnMissingBean (types: com.flowable.serviceregistry.engine.impl.deployer.ServiceRegistryEngineConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ServiceRegistryEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.serviceregistry.engine.ServiceRegistryEngine', 'com.flowable.serviceregistry.engine.ServiceRegistryEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.service-registry.enabled=true) matched (OnPropertyCondition) + + ServiceRegistryEngineServicesAutoConfiguration.AlreadyInitializedAppEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: com.flowable.serviceregistry.engine.ServiceRegistryEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ServletEndpointManagementContextConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + ServletManagementContextAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebSecurityAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebSecurityAutoConfiguration.PathPatternRequestMatcherBuilderConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.boot.webmvc.autoconfigure.DispatcherServletPath' (OnClassCondition) + - @ConditionalOnBean (types: org.springframework.boot.webmvc.autoconfigure.DispatcherServletPath; SearchStrategy: all) found bean 'dispatcherServletRegistration' (OnBeanCondition) + + ServletWebSecurityAutoConfiguration.PathPatternRequestMatcherBuilderConfiguration#pathPatternRequestMatcherBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SimpleMetricsExportAutoConfiguration matched: + - @ConditionalOnEnabledMetricsExport management.defaults.metrics.export.enabled is considered true (OnMetricsExportEnabledCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) found bean 'micrometerClock'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SimpleMetricsExportAutoConfiguration#simpleConfig matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.simple.SimpleConfig; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslAutoConfiguration#sslBundleRegistry matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.ssl.SslBundleRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslHealthContributorAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.boot.health.contributor.Health' (OnClassCondition) + - @ConditionalOnEnabledHealthIndicator management.health.defaults.enabled is considered true (OnEnabledHealthIndicatorCondition) + + SslHealthContributorAutoConfiguration#sslHealthIndicator matched: + - @ConditionalOnMissingBean (names: sslHealthIndicator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslHealthContributorAutoConfiguration#sslInfo matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SslMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found beans 'sslBundleRegistry', 'simpleMeterRegistry' (OnBeanCondition) + + StartupTimeMetricsListenerAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + StartupTimeMetricsListenerAutoConfiguration#startupTimeMetrics matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.micrometer.metrics.startup.StartupTimeMetricsListener; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SubFolderItemMigrationConfiguration matched: + - @ConditionalOnBean (types: com.flowable.content.engine.ContentEngineConfiguration,com.flowable.platform.engine.PlatformEngineConfiguration; SearchStrategy: all) found beans 'contentEngineConfiguration', 'platformEngineConfiguration' (OnBeanCondition) + + SystemMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + SystemMetricsAutoConfiguration#diskSpaceMetrics matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.micrometer.metrics.system.DiskSpaceMetricsBinder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#fileDescriptorMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#processorMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.ProcessorMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + SystemMetricsAutoConfiguration#uptimeMetrics matched: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.system.UptimeMetrics; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' (OnClassCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilder matched: + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorConfigurations.TaskInvokerConfiguration matched: + - AnyNestedCondition 2 matched 0 did not; NestedCondition on TaskExecutorConfigurations.OrchestrateTaskInvokerCondition.CmmnEngineCondition found matching nested conditions @ConditionalOnClass found required classes 'org.flowable.cmmn.engine.CmmnEngine', 'org.flowable.cmmn.spring.SpringCmmnEngineConfiguration', @ConditionalOnProperty (flowable.cmmn.enabled=true) matched; NestedCondition on TaskExecutorConfigurations.OrchestrateTaskInvokerCondition.ProcessEngineCondition found matching nested conditions @ConditionalOnClass found required classes 'org.flowable.engine.ProcessEngine', 'org.flowable.spring.SpringProcessEngineConfiguration', @ConditionalOnProperty (flowable.process.enabled=true) matched (TaskExecutorConfigurations.OrchestrateTaskInvokerCondition) + + TaskExecutorConfigurations.TaskInvokerConfiguration#flowableTaskInvokerAsyncTaskExecutor matched: + - @ConditionalOnMissingBean (names: flowableTaskInvokerAsyncTaskExecutor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorConfigurations.TaskInvokerConfiguration#flowableTaskInvokerFlowableTaskExecutor matched: + - @ConditionalOnMissingBean (names: flowableTaskInvokerFlowableTaskExecutor; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration#threadPoolTaskExecutorBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TaskExecutorMetricsAutoConfiguration matched: + - @ConditionalOnClass found required class 'io.micrometer.core.instrument.binder.jvm.ExecutorServiceMetrics' (OnClassCondition) + - @ConditionalOnBean (types: java.util.concurrent.Executor,io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans 'contentAsyncTaskExecutor', 'platformAsyncHistoryTaskExecutor', 'platformAsyncTaskExecutor', 'flowableTaskInvokerAsyncTaskExecutor', 'simpleMeterRegistry', 'taskScheduler', 'defaultAsyncTaskExecutor', 'agentAsyncTaskExecutor' (OnBeanCondition) + + TaskSchedulingAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + - @ConditionalOnThreading found PLATFORM (OnThreadingCondition) + + TaskSchedulingConfigurations.ThreadPoolTaskSchedulerBuilderConfiguration#threadPoolTaskSchedulerBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#auditLogService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.AuditLogService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#cmmnInitVariablesService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.CmmnInitVariablesService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#convertDocumentToPDFService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.document.ConvertDocumentToPDFService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#createDocumentService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.document.CreateDocumentService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#excelDocumentConverter matched: + - @ConditionalOnClass found required class 'com.aspose.cells.Workbook' (OnClassCondition) + + TasksAutoConfiguration#flowablePlatformCaseValidatorSet matched: + - @ConditionalOnMissingBean (names: flowablePlatformCaseValidatorSet; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#flowablePlatformServiceTaskValidator matched: + - @ConditionalOnMissingBean (names: flowablePlatformServiceTaskValidator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#flowablePlatformTemplateService matched: + - @ConditionalOnMissingBean (names: flowablePlatformTemplateService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#flowablePlatformValidatorSet matched: + - @ConditionalOnMissingBean (names: flowablePlatformValidatorSet; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#generateDocumentService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.document.GenerateDocumentService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#housekeepingServiceTask matched: + - @ConditionalOnMissingBean (names: housekeepingServiceTask; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#imageDocumentConverter matched: + - @ConditionalOnClass found required class 'com.aspose.imaging.Image' (OnClassCondition) + + TasksAutoConfiguration#initVariablesService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.InitVariablesService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#mergeDocumentService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.document.MergeDocumentService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#processInitVariablesService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.ProcessInitVariablesService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#serviceRegistryService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.ServiceRegistryService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration#textDocumentConverter matched: + - @ConditionalOnClass found required class 'com.aspose.words.Document' (OnClassCondition) + + TasksAutoConfiguration.AgentTaskConfiguration matched: + - @ConditionalOnBean (types: com.flowable.agent.api.AgentEngineConfigurationApi; SearchStrategy: all) found bean 'agentEngineConfiguration' (OnBeanCondition) + + TasksAutoConfiguration.AgentTaskConfiguration#agentService matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.agent.AgentService; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration.AgentTaskConfiguration#triggerIntentEvaluationServiceTask matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.agent.TriggerIntentEvaluationServiceTask; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration.DataObjectTaskConfiguration matched: + - @ConditionalOnBean (types: com.flowable.dataobject.api.runtime.DataObjectRuntimeService; SearchStrategy: all) found bean 'dataObjectRuntimeService' (OnBeanCondition) + + TasksAutoConfiguration.DataObjectTaskConfiguration#dataObjectServiceTask matched: + - @ConditionalOnMissingBean (types: com.flowable.platform.tasks.dataobject.DataObjectServiceTask; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TasksAutoConfiguration.PlatformTaskConfiguration matched: + - @ConditionalOnBean (types: com.flowable.platform.api.sequence.SequenceService; SearchStrategy: all) found bean 'sequenceService' (OnBeanCondition) + + TasksAutoConfiguration.PlatformTaskConfiguration#generateSequenceServiceTask matched: + - @ConditionalOnMissingBean (names: generateSequenceServiceTask; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TemplateEngineAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.template.engine.TemplateEngine', 'com.flowable.template.engine.TemplateEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.template.enabled=true) matched (OnPropertyCondition) + + TemplateEngineAutoConfiguration#templateEngineConfiguration matched: + - @ConditionalOnMissingBean (types: com.flowable.template.engine.TemplateEngineConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TemplateEngineAutoConfiguration.TemplateEngineAppConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found bean 'appEngineConfiguration' (OnBeanCondition) + + TemplateEngineAutoConfiguration.TemplateEngineAppConfiguration#templateAppEngineConfigurationConfigurer matched: + - @ConditionalOnMissingBean (names: templateAppEngineConfigurationConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TemplateEngineAutoConfiguration.TemplateEngineAppConfiguration#templateEngineConfigurator matched: + - @ConditionalOnMissingBean (types: com.flowable.template.engine.configurator.TemplateEngineConfigurator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TemplateEngineConfigurations.DefaultTemplateEngineConfiguration#templateEngine matched: + - @ConditionalOnMissingBean (types: org.thymeleaf.spring6.ISpringTemplateEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TemplateEngineServicesAutoConfiguration matched: + - @ConditionalOnClass found required classes 'com.flowable.template.engine.TemplateEngine', 'com.flowable.template.engine.TemplateEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.template.enabled=true) matched (OnPropertyCondition) + + TemplateEngineServicesAutoConfiguration.AlreadyInitializedAppEngineConfiguration matched: + - @ConditionalOnBean (types: com.flowable.app.engine.AppEngine; SearchStrategy: all) found bean 'flowableAppEngine'; @ConditionalOnMissingBean (types: com.flowable.template.engine.TemplateEngine; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TenantBootstrapAutoConfiguration matched: + - @ConditionalOnClass found required class 'com.flowable.platform.tenant.TenantSetupServiceImpl' (OnClassCondition) + - @ConditionalOnProperty (flowable.platform.idm.service-type=default) matched (OnPropertyCondition) + - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper,com.flowable.core.idm.api.PlatformIdentityService; SearchStrategy: all) found beans 'platformIdentityService', 'jackson2ObjectMapper' (OnBeanCondition) + + TenantBootstrapAutoConfiguration.TenantBootstrapContentConfiguration matched: + - @ConditionalOnBean (types: org.flowable.content.api.ContentService; SearchStrategy: all) found bean 'contentService' (OnBeanCondition) + + ThymeleafAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.thymeleaf.templatemode.TemplateMode', 'org.thymeleaf.spring6.SpringTemplateEngine' (OnClassCondition) + + ThymeleafAutoConfiguration.DefaultTemplateResolverConfiguration matched: + - @ConditionalOnMissingBean (names: defaultTemplateResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration#resourceUrlEncodingFilter matched: + - @ConditionalOnEnabledResourceChain enabled (OnEnabledResourceChainCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.resource.ResourceUrlEncodingFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.servlet.view.AbstractCachingViewResolver' (OnClassCondition) + + ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration#thymeleafViewResolver matched: + - @ConditionalOnMissingBean (names: thymeleafViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TomcatMetricsAutoConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.binder.tomcat.TomcatMetrics', 'org.apache.catalina.Manager', 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + TomcatMetricsAutoConfiguration#tomcatMetricsBinder matched: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry'; @ConditionalOnMissingBean (types: io.micrometer.core.instrument.binder.tomcat.TomcatMetrics,org.springframework.boot.tomcat.metrics.TomcatMetricsBinder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TomcatServletWebServerAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.ServletRequest', 'org.apache.catalina.startup.Tomcat', 'org.apache.coyote.UpgradeProtocol', 'org.springframework.boot.tomcat.servlet.TomcatServletWebServerFactory' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + TomcatServletWebServerAutoConfiguration#tomcatServletWebServerFactory matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.web.server.servlet.ServletWebServerFactory; SearchStrategy: current) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration matched: + - @ConditionalOnBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found bean 'transactionManager'; @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration matched: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition) + + TransactionAutoConfiguration.TransactionTemplateConfiguration matched: + - @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a single bean 'transactionManager' (OnBeanCondition) + + TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate matched: + - @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionOperations; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionManagerCustomizationAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition) + + TransactionManagerCustomizationAutoConfiguration#platformTransactionManagerCustomizers matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransformerEventRegistryAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.flowable.eventregistry.impl.EventRegistryEngine', 'org.flowable.eventregistry.spring.SpringEventRegistryEngineConfiguration' (OnClassCondition) + - @ConditionalOnProperty (flowable.eventregistry.enabled=true) matched (OnPropertyCondition) + + WebClientAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition) + + WebClientAutoConfiguration#webClientBuilder matched: + - @ConditionalOnMissingBean (types: org.springframework.web.reactive.function.client.WebClient$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebClientAutoConfiguration#webClientHttpConnectorCustomizer matched: + - @ConditionalOnBean (types: org.springframework.http.client.reactive.ClientHttpConnector; SearchStrategy: all) found bean 'clientHttpConnector' (OnBeanCondition) + + WebClientAutoConfiguration#webClientSsl matched: + - @ConditionalOnBean (types: org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found bean 'sslBundleRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.webclient.autoconfigure.WebClientSsl; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebClientAutoConfiguration.WebClientCodecsConfiguration matched: + - @ConditionalOnBean (types: org.springframework.boot.http.codec.CodecCustomizer; SearchStrategy: all) found beans 'jacksonCodecCustomizer', 'defaultCodecCustomizer' (OnBeanCondition) + + WebClientAutoConfiguration.WebClientCodecsConfiguration#exchangeStrategiesCustomizer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.webclient.autoconfigure.WebClientCodecCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebClientObservationAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.web.reactive.function.client.WebClient', 'org.springframework.boot.webclient.observation.ObservationWebClientCustomizer', 'io.micrometer.observation.ObservationRegistry', 'org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties' (OnClassCondition) + + WebEndpointAutoConfiguration matched: + - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition) + + WebEndpointAutoConfiguration#controllerEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#endpointMediaTypes matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#pathMappedEndpoints matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.PathMappedEndpoints; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration#webEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebEndpointAutoConfiguration.WebEndpointServletConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + + WebEndpointAutoConfiguration.WebEndpointServletConfiguration#servletEndpointDiscoverer matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration matched: + - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration#formContentFilter matched: + - @ConditionalOnBooleanProperty (spring.mvc.formcontent.filter.enabled=true) matched (OnPropertyCondition) + - @ConditionalOnMissingBean (types: org.springframework.web.filter.FormContentFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#flashMapManager matched: + - @ConditionalOnMissingBean (names: flashMapManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#localeResolver matched: + - @ConditionalOnMissingBean (names: localeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.EnableWebMvcConfiguration#viewNameTranslator matched: + - @ConditionalOnMissingBean (names: viewNameTranslator; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.ResourceChainCustomizerConfiguration matched: + - @ConditionalOnEnabledResourceChain enabled (OnEnabledResourceChainCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#defaultViewResolver matched: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.InternalResourceViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.context.request.RequestContextListener,org.springframework.web.filter.RequestContextFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#viewResolver matched: + - @ConditionalOnBean (types: org.springframework.web.servlet.ViewResolver; SearchStrategy: all) found beans 'defaultViewResolver', 'beanNameViewResolver', 'mvcViewResolver'; @ConditionalOnMissingBean (names: viewResolver types: org.springframework.web.servlet.view.ContentNegotiatingViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration matched: + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet,org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; SearchStrategy: all) found beans 'webEndpointDiscoverer', 'dispatcherServlet' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#controllerEndpointHandlerMapping matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.webmvc.actuate.endpoint.web.ControllerEndpointHandlerMapping; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#endpointJackson2ObjectMapperWebMvcConfigurer matched: + - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.jackson.EndpointJackson2ObjectMapper; SearchStrategy: all) found bean 'jackson2EndpointJsonMapper' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#endpointJsonMapperWebMvcConfigurer matched: + - @ConditionalOnBean (types: org.springframework.boot.actuate.endpoint.jackson.EndpointJsonMapper; SearchStrategy: all) found bean 'endpointJsonMapper' (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration#webEndpointServletHandlerMapping matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.webmvc.actuate.endpoint.web.WebMvcEndpointHandlerMapping; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration.HealthConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.boot.health.actuate.endpoint.HealthEndpoint' (OnClassCondition) + + WebMvcHealthEndpointExtensionAutoConfiguration matched: + - @ConditionalOnClass found required class 'org.springframework.boot.health.actuate.endpoint.HealthEndpoint' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + - @ConditionalOnBean (types: org.springframework.boot.health.actuate.endpoint.HealthEndpoint,org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier,org.springframework.boot.health.actuate.endpoint.HealthEndpointGroups; SearchStrategy: all) found beans 'webEndpointDiscoverer', 'healthEndpoint', 'healthEndpointGroups' (OnBeanCondition) + + WebMvcObservationAutoConfiguration matched: + - @ConditionalOnClass found required classes 'org.springframework.web.servlet.DispatcherServlet', 'io.micrometer.observation.Observation', 'org.springframework.boot.micrometer.observation.autoconfigure.ObservationProperties' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBean (types: io.micrometer.observation.ObservationRegistry; SearchStrategy: all) found bean 'observationRegistry' (OnBeanCondition) + + WebMvcObservationAutoConfiguration#webMvcObservationFilter matched: + - @ConditionalOnMissingBean (types: org.springframework.web.filter.ServerHttpObservationFilter; SearchStrategy: all) did not find any beans (OnBeanCondition) + + WebMvcObservationAutoConfiguration.MeterFilterConfiguration matched: + - @ConditionalOnClass found required classes 'io.micrometer.core.instrument.MeterRegistry', 'org.springframework.boot.micrometer.metrics.autoconfigure.MetricsProperties' (OnClassCondition) + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found bean 'simpleMeterRegistry' (OnBeanCondition) + + +Negative matches: +----------------- + + AbbyAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.platform.abbyy.FlowableAbbyyService' (OnClassCondition) + + ActionEngineAutoConfiguration.ActionEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + ActionEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.action.engine.ActionEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.action.engine.ActionEngine' actionEngine (OnBeanCondition) + + AgentEngineAutoConfiguration.AgentEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + AgentEngineAutoConfiguration.FlowableBedrockAgentConfiguration: + Did not match: + - @ConditionalOnBean (types: com.flowable.agent.engine.external.aws.client.AwsBedrockClient; SearchStrategy: all) did not find any beans of type com.flowable.agent.engine.external.aws.client.AwsBedrockClient (OnBeanCondition) + + AgentEngineServicesAutoConfiguration.AlreadyInitializedProcessEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.agent.engine.AgentEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.agent.engine.AgentEngine' agentEngine (OnBeanCondition) + + AgentMetricsAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: io.micrometer.core.instrument.MeterRegistry,com.flowable.agent.engine.AgentEngineConfiguration; SearchStrategy: all) did not find any beans of type io.micrometer.core.instrument.MeterRegistry (OnBeanCondition) + + AopAutoConfiguration.AspectJAutoProxyingConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + AppOpticsMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.appoptics.AppOpticsMeterRegistry' (OnClassCondition) + + AtlasMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.atlas.AtlasMeterRegistry' (OnClassCondition) + + AuditAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; SearchStrategy: all) did not find any beans of type org.springframework.boot.actuate.audit.AuditEventRepository (OnBeanCondition) + Matched: + - @ConditionalOnBooleanProperty (management.auditevents.enabled=true) matched (OnPropertyCondition) + + AuditEngineAutoConfiguration.AuditEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + AuditEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.audit.engine.AuditEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.audit.engine.AuditEngine' auditEngine (OnBeanCondition) + + AuditEventsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + AvailabilityHealthContributorAutoConfiguration#livenessStateHealthIndicator: + Did not match: + - @ConditionalOnBooleanProperty (management.health.livenessstate.enabled=true) did not find property 'management.health.livenessstate.enabled' (OnPropertyCondition) + + AvailabilityHealthContributorAutoConfiguration#readinessStateHealthIndicator: + Did not match: + - @ConditionalOnBooleanProperty (management.health.readinessstate.enabled=true) did not find property 'management.health.readinessstate.enabled' (OnPropertyCondition) + + AwsBedrockAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'software.amazon.awssdk.services.bedrockagentruntime.BedrockAgentRuntimeAsyncClient' (OnClassCondition) + + BeansEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + CmmnEngineAutoConfiguration.CmmnEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + CmmnEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.cmmn.engine.CmmnEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.cmmn.engine.CmmnEngine' cmmnEngine (OnBeanCondition) + + CmmnEngineServicesAutoConfiguration.StandaloneEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.cmmn.engine.CmmnEngine,org.flowable.engine.ProcessEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.engine.ProcessEngine' processEngine (OnBeanCondition) + + CodecsAutoConfiguration.Jackson2JsonCodecConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on CodecsAutoConfiguration.NoJacksonOrJackson2Preferred.Jackson2Preferred @ConditionalOnProperty (spring.http.codecs.preferred-json-mapper=jackson2) did not find property 'spring.http.codecs.preferred-json-mapper'; NestedCondition on CodecsAutoConfiguration.NoJacksonOrJackson2Preferred.NoJackson @ConditionalOnMissingClass found unwanted class 'tools.jackson.databind.json.JsonMapper' (CodecsAutoConfiguration.NoJacksonOrJackson2Preferred) + Matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + CodecsAutoConfiguration.KotlinxSerializationJsonCodecConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'kotlinx.serialization.json.Json' (OnClassCondition) + + CompositeMeterRegistryConfiguration: + Did not match: + - NoneNestedConditions 1 matched 1 did not; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.SingleInjectableMeterRegistry @ConditionalOnSingleCandidate (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found a single bean 'simpleMeterRegistry'; NestedCondition on CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition.NoMeterRegistryCondition @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' simpleMeterRegistry (CompositeMeterRegistryConfiguration.MultipleNonPrimaryMeterRegistriesCondition) + + ConditionsReportEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ConfigurationPropertiesReportEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ContentEngineAutoConfiguration#coreRenditionConvertersConfigurer: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.core.rendition.converter.CoreRenditionConverter' (OnClassCondition) + + ContentEngineAutoConfiguration#flowableDatabaseContentStorage: + Did not match: + - @ConditionalOnProperty (flowable.content.storage.type=db) did not find property 'type' (OnPropertyCondition) + + ContentEngineAutoConfiguration.ContentEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + ContentEngineAutoConfiguration.FlowableContentStorageAwsS3Configuration: + Did not match: + - @ConditionalOnProperty (flowable.content.storage.type=aws-s3) did not find property 'type' (OnPropertyCondition) + + ContentEngineAutoConfiguration.FlowableContentStorageAzureBlobStorageConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.content.storage.type=azure-blob) did not find property 'type' (OnPropertyCondition) + + ContentEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.content.engine.ContentEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.content.engine.ContentEngine' contentEngine (OnBeanCondition) + + ContentEngineServicesAutoConfiguration.StandaloneConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.content.engine.ContentEngine,org.flowable.engine.ProcessEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.engine.ProcessEngine' processEngine (OnBeanCondition) + + CoreInterceptorAutoConfiguration.BpmnRestApiConfiguration#formHandlerRestApiInterceptor: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.rest.service.api.FormHandlerRestApiInterceptor; SearchStrategy: all) found beans of type 'org.flowable.rest.service.api.FormHandlerRestApiInterceptor' formHandlerRestApiInterceptor (OnBeanCondition) + + CoreInterceptorAutoConfiguration.CmmnRestApiConfiguration#cmmnFormHandlerRestApiInterceptor: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.cmmn.rest.service.api.CmmnFormHandlerRestApiInterceptor; SearchStrategy: all) found beans of type 'org.flowable.cmmn.rest.service.api.CmmnFormHandlerRestApiInterceptor' cmmnFormHandlerRestApiInterceptor (OnBeanCondition) + + CoreServiceAutoConfiguration#coreFlowableFormDecorator: + Did not match: + - @ConditionalOnMissingBean (names: defaultFlowableFormDecorator; SearchStrategy: all) found beans named defaultFlowableFormDecorator (OnBeanCondition) + + CoreServiceAutoConfiguration.ElasticMeterRegistryReportConfiguration: + Did not match: + - @ConditionalOnBean (types: io.micrometer.elastic.ElasticConfig; SearchStrategy: all) did not find any beans of type io.micrometer.elastic.ElasticConfig (OnBeanCondition) + + DataObjectBootstrapAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper,com.flowable.dataobject.api.repository.DataObjectRepositoryService,com.flowable.serviceregistry.api.repository.ServiceRegistryRepositoryService; SearchStrategy: all) did not find any beans of type com.fasterxml.jackson.databind.ObjectMapper (OnBeanCondition) + + DataObjectEngineAutoConfiguration.DataObjectEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + DataObjectEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.dataobject.engine.DataObjectEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.dataobject.engine.DataObjectEngine' dataObjectEngine and found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine (OnBeanCondition) + + DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration: + Did not match: + - EmbeddedDataSource spring.datasource.url is set (DataSourceAutoConfiguration.EmbeddedDatabaseCondition) + + DataSourceCheckpointRestoreConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.crac.Resource' (OnClassCondition) + + DataSourceConfiguration.Dbcp2: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition) + + DataSourceConfiguration.Generic: + Did not match: + - @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (OnPropertyCondition) + + DataSourceConfiguration.OracleUcp: + Did not match: + - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSourceImpl', 'oracle.jdbc.OracleConnection' (OnClassCondition) + + DataSourceConfiguration.Tomcat: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition) + + DataSourceJmxConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + + DataSourcePoolMetadataProvidersConfiguration.CommonsDbcp2PoolDataSourceMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition) + + DataSourcePoolMetadataProvidersConfiguration.OracleUcpPoolDataSourceMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSource', 'oracle.jdbc.OracleConnection' (OnClassCondition) + + DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition) + + DatadogMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.datadog.DatadogMeterRegistry' (OnClassCondition) + + DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver: + Did not match: + - @ConditionalOnBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans of type org.springframework.web.multipart.MultipartResolver (OnBeanCondition) + + DmnEngineAutoConfiguration.DmnEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + DmnEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.dmn.engine.DmnEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.dmn.engine.DmnEngine' dmnEngine (OnBeanCondition) + + DmnEngineServicesAutoConfiguration.StandaloneEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.dmn.engine.DmnEngine,org.flowable.engine.ProcessEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.engine.ProcessEngine' processEngine (OnBeanCondition) + + DynatraceMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.dynatrace.DynatraceMeterRegistry' (OnClassCondition) + + ElasticMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.elastic.ElasticMeterRegistry' (OnClassCondition) + + ElasticsearchClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'co.elastic.clients.elasticsearch.ElasticsearchClient' (OnClassCondition) + + ElasticsearchRestClientConfigurations.RestClientSnifferConfiguration: + Did not match: + - @ConditionalOnProperty (spring.elasticsearch.restclient.sniffer.enabled) did not find property 'spring.elasticsearch.restclient.sniffer.enabled' (OnPropertyCondition) + + EndpointAutoConfiguration#processEngineEndpoint: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + EnvironmentEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + EventRegistryAutoConfiguration.EventRegistryAwsSnsConfiguration: + Did not match: + - @ConditionalOnBean (types: software.amazon.awssdk.services.sns.SnsClient; SearchStrategy: all) did not find any beans of type software.amazon.awssdk.services.sns.SnsClient (OnBeanCondition) + + EventRegistryAutoConfiguration.EventRegistryAwsSqsConfiguration: + Did not match: + - @ConditionalOnBean (types: software.amazon.awssdk.services.sqs.SqsClient; SearchStrategy: all) did not find any beans of type software.amazon.awssdk.services.sqs.SqsClient (OnBeanCondition) + + EventRegistryAutoConfiguration.EventRegistryJmsConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.jms.core.JmsOperations; SearchStrategy: all) did not find any beans of type org.springframework.jms.core.JmsOperations (OnBeanCondition) + + EventRegistryAutoConfiguration.EventRegistryKafkaConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.kafka.core.KafkaOperations; SearchStrategy: all) did not find any beans of type org.springframework.kafka.core.KafkaOperations (OnBeanCondition) + + EventRegistryAutoConfiguration.EventRegistryProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + EventRegistryAutoConfiguration.EventRegistryRabbitConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.amqp.rabbit.core.RabbitOperations; SearchStrategy: all) did not find any beans of type org.springframework.amqp.rabbit.core.RabbitOperations (OnBeanCondition) + + EventRegistryServicesAutoConfiguration.AlreadyInitializedEventRegistryConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.eventregistry.impl.EventRegistryEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'org.flowable.eventregistry.impl.EventRegistryEngine' eventRegistryEngine and found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine (OnBeanCondition) + + EventRegistryServicesAutoConfiguration.StandaloneEventRegistryConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.eventregistry.impl.EventRegistryEngine,org.flowable.engine.ProcessEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.engine.ProcessEngine' processEngine (OnBeanCondition) + + FlowableAwsS3AutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'software.amazon.awssdk.services.s3.S3Client' (OnClassCondition) + + FlowableAzureBlobStorageAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.azure.storage.blob.BlobContainerClient' (OnClassCondition) + + FlowableBucket4jRateLimitAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.github.bucket4j.distributed.proxy.ProxyManager' (OnClassCondition) + + FlowableFrontendConfigurationControllerConfiguration#flowableFrontendConfigurationController: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.autoconfigure.frontend.FlowableFrontendConfigurationController; SearchStrategy: all) found beans of type 'com.flowable.autoconfigure.frontend.FlowableFrontendConfigurationController' flowableWorkFrontendController (OnBeanCondition) + + FlowableJpaAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans of type jakarta.persistence.EntityManagerFactory (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.flowable.spring.SpringProcessEngineConfiguration' (OnClassCondition) + + FlowableMcpAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.platform.mcp.serviceregistry.McpServiceInvoker' (OnClassCondition) + + FlowableOAuth2ClientAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.core.user.OAuth2User' (OnClassCondition) + + FlowableOAuth2ClientTokenProviderAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.client.OAuth2AuthorizedClientService' (OnClassCondition) + + FlowableOAuth2ResourceServerAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationToken' (OnClassCondition) + + FlowableSecurityAutoConfiguration#flowableUserDetailsService: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.security.core.userdetails.UserDetailsService; SearchStrategy: all) found beans of type 'org.springframework.security.core.userdetails.UserDetailsService' flowableUserDetailsService (OnBeanCondition) + + FlowableSecurityJwtAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.jwt.Jwt' (OnClassCondition) + + FlowableSecurityOAuth2AutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.core.user.OAuth2User' (OnClassCondition) + + FlowableServiceSystemInfoAutoConfiguration.ProcessEngineSystemInfoConfiguration#flowableDatabaseTableCountsSystemInfoContributor: + Did not match: + - @ConditionalOnAvailableSystemInfoProvider no property flowable.core.system-info.providers.table-counts.disabled found so disabling by default (OnAvailableSystemInfoProvider) + + FlowableSnsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'software.amazon.awssdk.services.sns.SnsClient' (OnClassCondition) + + FlowableSqsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'software.amazon.awssdk.services.sqs.SqsClient' (OnClassCondition) + + FormEngineAutoConfiguration.FormEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + FormEngineServicesAutoConfiguration.AlreadyInitializedFormEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.form.engine.FormEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.form.engine.FormEngine' coreFormEngine (OnBeanCondition) + + FormEngineServicesAutoConfiguration.StandaloneFormEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.form.engine.FormEngine,org.flowable.engine.ProcessEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'org.flowable.engine.ProcessEngine' processEngine (OnBeanCondition) + + GangliaMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.ganglia.GangliaMeterRegistry' (OnClassCondition) + + GraphIdmEngineAutoConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.platform.idm.service-type=microsoft-graph) did not find property 'service-type' (OnPropertyCondition) + + GraphiteMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.graphite.GraphiteMeterRegistry' (OnClassCondition) + + GsonHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition) + + HealthEndpointReactiveWebExtensionConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + HeapDumpWebEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint the configured access for endpoint 'heapdump' is NONE (OnAvailableEndpointCondition) + + HttpClientConfiguration.ApacheHttpClient: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.spring.boot.http.FlowableHttpClientBuilder; SearchStrategy: all) found beans of type 'com.flowable.spring.boot.http.FlowableHttpClientBuilder' flowableHttpClientBuilder (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.apache.http.impl.client.HttpClientBuilder' (OnClassCondition) + - @ConditionalOnProperty (flowable.http.client-type=apacheHttpClient4) matched (OnPropertyCondition) + + HttpClientConfiguration.ApacheHttpClient5: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.spring.boot.http.FlowableHttpClientBuilder; SearchStrategy: all) found beans of type 'com.flowable.spring.boot.http.FlowableHttpClientBuilder' flowableHttpClientBuilder (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder' (OnClassCondition) + - @ConditionalOnProperty (flowable.http.client-type=apacheHttpClient5) matched (OnPropertyCondition) + + HttpExchangesEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + HumioMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.humio.HumioMeterRegistry' (OnClassCondition) + + IdmEngineAutoConfiguration.CoreIdmEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + IdmEngineAutoConfiguration.PasswordEncoderConfiguration#accessTokenPasswordEncoderConfigurer: + Did not match: + - @ConditionalOnProperty (flowable.platform.idm.token-signing-secret) did not find property 'token-signing-secret' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.crypto.argon2.Argon2PasswordEncoder' (OnClassCondition) + + IdmEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.idm.engine.CoreIdmEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.idm.engine.CoreIdmEngine' coreIdmEngine (OnBeanCondition) + + IncidentAutoConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.incident.report.exception.enabled=true) did not find property 'enabled' (OnPropertyCondition) + + IndexingAutoConfiguration#flowableCustomPropertyBackedIndexingResourceProvider: + Did not match: + - @ConditionalOnProperty (flowable.indexing.mapping-resources) did not find property 'mapping-resources' (OnPropertyCondition) + + IndexingMetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.elastic.ElasticMeterRegistry' (OnClassCondition) + + InfluxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.influx.InfluxMeterRegistry' (OnClassCondition) + + InfoContributorAutoConfiguration#buildInfoContributor: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.boot.info.BuildProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InfoContributorAutoConfiguration#envInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.env.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#gitInfoContributor: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.boot.info.GitProperties; SearchStrategy: all) did not find any beans (OnBeanCondition) + Matched: + - @ConditionalOnEnabledInfoContributor management.info.defaults.enabled is considered true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#javaInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.java.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#osInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.os.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#processInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.process.enabled is not true (OnEnabledInfoContributorCondition) + + InfoContributorAutoConfiguration#sslInfo: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.ssl.enabled is not true (OnEnabledInfoContributorCondition) + Matched: + - @ConditionalOnMissingBean (types: org.springframework.boot.info.SslInfo; SearchStrategy: all) did not find any beans (OnBeanCondition) + + InfoContributorAutoConfiguration#sslInfoContributor: + Did not match: + - @ConditionalOnEnabledInfoContributor management.info.ssl.enabled is not true (OnEnabledInfoContributorCondition) + + InfoEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + InspectEngineAutoConfiguration.InspectEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + InspectEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.inspect.engine.InspectEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.inspect.engine.InspectEngine' inspectEngine (OnBeanCondition) + + IntegrationAutoConfiguration.IntegrationJdbcConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.integration.jdbc.store.JdbcMessageStore' (OnClassCondition) + + IntegrationAutoConfiguration.IntegrationJmxConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.integration.jmx.config.EnableIntegrationMBeanExport' (OnClassCondition) + + IntegrationAutoConfiguration.IntegrationRSocketConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'org.springframework.integration.rsocket.IntegrationRSocketEndpoint', 'io.rsocket.RSocket' (OnClassCondition) + + IntegrationAutoConfiguration.IntegrationTaskSchedulerConfiguration#taskSchedulerVirtualThreads: + Did not match: + - @ConditionalOnThreading did not find VIRTUAL (OnThreadingCondition) + Matched: + - @ConditionalOnBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) found bean 'simpleAsyncTaskSchedulerBuilder' (OnBeanCondition) + + IntegrationGraphEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.integration.graph.IntegrationGraphServer', 'org.springframework.boot.integration.actuate.endpoint.IntegrationGraphEndpoint', 'org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint' (OnClassCondition) + + Jackson2HttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on Jackson2HttpMessageConvertersConfiguration.PreferJackson2OrJacksonUnavailableCondition.JacksonUnavailable @ConditionalOnMissingBean (types: org.springframework.boot.http.converter.autoconfigure.JacksonHttpMessageConvertersConfiguration$JacksonJsonHttpMessageConvertersCustomizer; SearchStrategy: all) found beans of type 'org.springframework.boot.http.converter.autoconfigure.JacksonHttpMessageConvertersConfiguration$JacksonJsonHttpMessageConvertersCustomizer' jacksonJsonHttpMessageConvertersCustomizer; NestedCondition on Jackson2HttpMessageConvertersConfiguration.PreferJackson2OrJacksonUnavailableCondition.Jackson2Preferred @ConditionalOnProperty (spring.http.converters.preferred-json-mapper=jackson2) did not find property 'spring.http.converters.preferred-json-mapper' (Jackson2HttpMessageConvertersConfiguration.PreferJackson2OrJacksonUnavailableCondition) + Matched: + - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition) + + Jackson2HttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.fasterxml.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JacksonAutoConfiguration.CborConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'tools.jackson.dataformat.cbor.CBORMapper' (OnClassCondition) + + JacksonAutoConfiguration.XmlConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'tools.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JacksonHttpMessageConvertersConfiguration.JacksonXmlHttpMessageConverterConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'tools.jackson.dataformat.xml.XmlMapper' (OnClassCondition) + + JmxAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.jmx.export.MBeanExporter' (OnClassCondition) + + JmxEndpointAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.jmx.enabled=true) found different value in property 'spring.jmx.enabled' (OnPropertyCondition) + + JmxMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.jmx.JmxMeterRegistry' (OnClassCondition) + + JndiDataSourceAutoConfiguration: + Did not match: + - @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'spring.datasource.jndi-name' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition) + + JsonbHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition) + + JtaAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.transaction.Transaction' (OnClassCondition) + + JvmMetricsAutoConfiguration.VirtualThreadMetricsConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.java21.instrument.binder.jdk.VirtualThreadMetrics' (OnClassCondition) + + KairosMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.kairos.KairosMeterRegistry' (OnClassCondition) + + KotlinSerializationHttpMessageConvertersConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'kotlinx.serialization.Serializable', 'kotlinx.serialization.json.Json' (OnClassCondition) + + LdapIdmEngineAutoConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.platform.idm.service-type=ldap) did not find property 'service-type' (OnPropertyCondition) + + LicenseMetricsConfiguration#licenseRequestsPublisher: + Did not match: + - @ConditionalOnMissingClass found unwanted class 'io.micrometer.core.instrument.MeterRegistry' (OnClassCondition) + + Log4J2MetricsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.apache.logging.log4j.core.LoggerContext' (OnClassCondition) + + LogFileWebEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + LoggersEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ManagementContextAutoConfiguration.DifferentManagementContextConfiguration: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + + ManagementWebSecurityAutoConfiguration: + Did not match: + - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) found beans of type 'org.springframework.security.web.SecurityFilterChain' basicDefaultSecurity; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass found required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.security.web.util.matcher.RequestMatcher', 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + MappingsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + MessageSourceAutoConfiguration: + Did not match: + - ResourceBundle did not find bundle with basename messages (MessageSourceAutoConfiguration.ResourceBundleCondition) + + MetricsAspectsAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + MetricsEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint', 'io.micrometer.core.annotation.Timed' (OnClassCondition) + + NewRelicMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.newrelic.NewRelicMeterRegistry' (OnClassCondition) + + NoOpMeterRegistryConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: io.micrometer.core.instrument.MeterRegistry; SearchStrategy: all) found beans of type 'io.micrometer.core.instrument.MeterRegistry' simpleMeterRegistry (OnBeanCondition) + + NotificationEngineAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'com.flowable.notification.engine.NotificationEngine', 'com.flowable.notification.engine.NotificationEngineConfiguration' (OnClassCondition) + + ObservationAutoConfiguration.ObservedAspectConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.aspectj.weaver.Advice' (OnClassCondition) + + OrchestrateLicenseCheckAutoConfiguration.LicenseServiceDatabaseStoreConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.license.db-store-enabled=true) did not find property 'flowable.license.db-store-enabled' (OnPropertyCondition) + + OtlpMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.registry.otlp.OtlpMeterRegistry' (OnClassCondition) + + PlatformEngineAutoConfiguration#platformTenantVariableValueEncryptor: + Did not match: + - @ConditionalOnProperty (flowable.platform.protected-variable-encryption.initialization-vector) did not find property 'initialization-vector' (OnPropertyCondition) + + PlatformEngineAutoConfiguration.PlatformDataObjectEngineConfiguration: + Did not match: + - @ConditionalOnBean (types: com.flowable.dataobject.engine.DataObjectEngineConfiguration; SearchStrategy: all) did not find any beans of type com.flowable.dataobject.engine.DataObjectEngineConfiguration (OnBeanCondition) + + PlatformEngineAutoConfiguration.PlatformEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + PlatformEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.platform.engine.PlatformEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.platform.engine.PlatformEngine' platformEngine and found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine (OnBeanCondition) + + PlatformRestApiAutoConfiguration.PlatformAiRestApiConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.platform.ai.rest.service.api.PlatformAiRestApiMarker' (OnClassCondition) + + PlatformRestApiAutoConfiguration.PlatformDesignRestApiConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.platform.design.base-url) did not find property 'base-url' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'com.flowable.platform.rest.service.api.PlatformRestApiMarker' (OnClassCondition) + + PlatformRestApiAutoConfiguration.PlatformRestApiConfiguration#simpleUserLoginGenerator: + Did not match: + - @ConditionalOnProperty (flowable.platform.idm.experimental.user-login-generator=simple) did not find property 'experimental.user-login-generator' (OnPropertyCondition) + + PlatformRestApiAutoConfiguration.PlatformRestApiConfiguration#uuidUserLoginGenerator: + Did not match: + - @ConditionalOnProperty (flowable.platform.idm.experimental.user-login-generator=uuid) did not find property 'experimental.user-login-generator' (OnPropertyCondition) + + PlatformRestApiAutoConfiguration.TutorialEngineRestApiConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.tutorial.rest.service.api.TutorialEngineRestMarker' (OnClassCondition) + + PlatformServiceAiAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.platform.ai.service.PlatformAiServiceMarker' (OnClassCondition) + + PlatformServiceAutoConfiguration.PlatformContentServiceConfiguration#flowableTikaAutoDetectParserContentMediaTypeResolver: + Did not match: + - @ConditionalOnProperty (flowable.content.content-type-resolver=tika-auto-detect-parser) did not find property 'content-type-resolver' (OnPropertyCondition) + + PlatformServiceAutoConfiguration.PlatformMetricsReportRunnerConfiguration: + Did not match: + - @ConditionalOnBean (types: io.micrometer.elastic.ElasticMeterRegistry,com.flowable.indexing.IndexManager; SearchStrategy: all) did not find any beans of type io.micrometer.elastic.ElasticMeterRegistry (OnBeanCondition) + + PolicyEngineAutoConfiguration.PolicyEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + PolicyEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.policy.engine.PolicyEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.policy.engine.PolicyEngine' policyEngine (OnBeanCondition) + + PowerAutomateAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.platform.powerautomate.FlowablePowerAutomateService' (OnClassCondition) + + ProcessEngineAutoConfiguration#asyncHistoryExecutor: + Did not match: + - @ConditionalOnMissingBean (names: asyncHistoryExecutor; SearchStrategy: all) found beans named asyncHistoryExecutor (OnBeanCondition) + Matched: + - @ConditionalOnProperty (flowable.process.async-history.enable) matched (OnPropertyCondition) + + ProcessEngineServicesAutoConfiguration.StandaloneEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.flowable.engine.ProcessEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine (OnBeanCondition) + + ProcessMessageDelivererAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.notification.process.ProcessMessageDeliverer' (OnClassCondition) + + ProjectAutoConfiguration#projectSchemaManager: + Did not match: + - @ConditionalOnResource did not find resource 'classpath:liquibase/flowable-project-db-changelog.xml' (OnResourceCondition) + + ProjectAutoConfiguration#projectSchemaManagerAutoTriggerLifecycle: + Did not match: + - @ConditionalOnBean (names: projectSchemaManager; SearchStrategy: all) did not find any beans named projectSchemaManager (OnBeanCondition) + + ProjectInfoAutoConfiguration#buildProperties: + Did not match: + - @ConditionalOnResource did not find resource '${spring.info.build.location:classpath:META-INF/build-info.properties}' (OnResourceCondition) + + ProjectInfoAutoConfiguration#gitProperties: + Did not match: + - GitResource did not find git info at classpath:git.properties (ProjectInfoAutoConfiguration.GitResourceAvailableCondition) + + PrometheusMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.prometheusmetrics.PrometheusMeterRegistry' (OnClassCondition) + + QuestionnaireAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.questionnaire.service.QuestionnaireServiceImpl' (OnClassCondition) + + RSocketSecurityAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.rsocket.server.RSocketServerCustomizer' (OnClassCondition) + + ReactiveHttpClientAutoConfiguration.ReactorNetty: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.boot.reactor.netty.autoconfigure.ReactorNettyConfigurations' (OnClassCondition) + + ReactiveHttpServiceClientAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.web.service.registry.HttpServiceProxyRegistry; SearchStrategy: all) did not find any beans of type org.springframework.web.service.registry.HttpServiceProxyRegistry (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.web.reactive.function.client.support.WebClientAdapter' (OnClassCondition) + + ReactiveManagementWebSecurityAutoConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.web.server.WebFilterChainProxy', 'org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration' (OnClassCondition) + + ReactiveUserDetailsServiceAutoConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication.ReactiveWebApplicationCondition not a reactive web application; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication.RSocketSecurityEnabledCondition @ConditionalOnBean (types: org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler; SearchStrategy: all) did not find any beans of type org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler (ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.authentication.ReactiveAuthenticationManager' (OnClassCondition) + - AnyNestedCondition 1 matched 2 did not; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) did not find property 'spring.security.user.password'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) did not find property 'spring.security.user.name'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass did not find unwanted classes 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository', 'org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector', 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured) + + ReactiveWebSecurityAutoConfiguration.SpringBootWebFluxSecurityConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + RequestLoggingAutoConfiguration#flowableRequestLoggingFilter: + Did not match: + - @ConditionalOnProperty (flowable.rest.request-logging.enabled=true) did not find property 'enabled' (OnPropertyCondition) + + SandboxExpressionAutoConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.sandbox.expression.strict-mode=true) did not find property 'strict-mode' (OnPropertyCondition) + Matched: + - @ConditionalOnClass found required class 'com.flowable.platform.common.el.AllowedInStrictMode' (OnClassCondition) + + SandboxScriptingAutoConfiguration#functionScriptingEngineConfigurer: + Did not match: + - @ConditionalOnBean (types: org.flowable.common.engine.impl.scripting.FlowableScriptEngine; SearchStrategy: all) did not find any beans of type org.flowable.common.engine.impl.scripting.FlowableScriptEngine (OnBeanCondition) + + SandboxScriptingConfigurations.AzureFunctionScriptingConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.sandbox.script.type=remote) did not find property 'type' (OnPropertyCondition) + + SandboxScriptingConfigurations.DisabledScriptingConfiguration: + Did not match: + - @ConditionalOnProperty (flowable.sandbox.script.disabled=true) did not find property 'disabled' (OnPropertyCondition) + + SbomEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ScheduledTasksEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + SecurityAutoConfiguration.SecurityDataConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.springframework.security.data.repository.query.SecurityEvaluationContextExtension' (OnClassCondition) + + SecurityRequestMatchersManagementContextConfiguration.JerseyRequestMatcherConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.ResourceConfig' (OnClassCondition) + + ServiceRegistryEngineAutoConfiguration.ServiceRegistryEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + ServiceRegistryEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.serviceregistry.engine.ServiceRegistryEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.serviceregistry.engine.ServiceRegistryEngine' serviceRegistryEngine and found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine (OnBeanCondition) + + ServletHttpExchangesAutoConfiguration: + Did not match: + - @ConditionalOnBean (types: org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository; SearchStrategy: all) did not find any beans of type org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository (OnBeanCondition) + Matched: + - found 'session' scope (OnWebApplicationCondition) + - @ConditionalOnBooleanProperty (management.httpexchanges.recording.enabled=true) matched (OnPropertyCondition) + + ServletManagementContextAutoConfiguration.ApplicationContextFilterConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (management.server.add-application-context-header=true) did not find property 'management.server.add-application-context-header' (OnPropertyCondition) + + ServletMappingsAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint', 'org.springframework.boot.actuate.web.mappings.MappingsEndpoint' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + ServletWebSecurityAutoConfiguration.EnableWebSecurityConfiguration: + Did not match: + - @ConditionalOnMissingBean (names: springSecurityFilterChain; SearchStrategy: all) found beans named springSecurityFilterChain (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition) + + ServletWebSecurityAutoConfiguration.SecurityFilterChainConfiguration: + Did not match: + - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) found beans of type 'org.springframework.security.web.SecurityFilterChain' basicDefaultSecurity; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass found required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition) + + ServletWebServerConfiguration#forwardedHeaderFilter: + Did not match: + - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition) + + SharePointAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.platform.sharepoint.FlowableSharepointService' (OnClassCondition) + + ShutdownEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint the configured access for endpoint 'shutdown' is NONE (OnAvailableEndpointCondition) + + SpringApplicationAdminJmxAutoConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.application.admin.enabled=true) did not find property 'spring.application.admin.enabled' (OnPropertyCondition) + + StackdriverMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.stackdriver.StackdriverMeterRegistry' (OnClassCondition) + + StartupEndpointAutoConfiguration: + Did not match: + - ApplicationStartup configured applicationStartup is of type class org.springframework.core.metrics.DefaultApplicationStartup, expected BufferingApplicationStartup. (StartupEndpointAutoConfiguration.ApplicationStartupCondition) + + StatsdMetricsExportAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'io.micrometer.statsd.StatsdMeterRegistry' (OnClassCondition) + + TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilderVirtualThreads: + Did not match: + - @ConditionalOnThreading did not find VIRTUAL (OnThreadingCondition) + + TaskExecutorConfigurations.TaskExecutorConfiguration: + Did not match: + - AnyNestedCondition 0 matched 2 did not; NestedCondition on TaskExecutorConfigurations.OnExecutorCondition.ModelCondition @ConditionalOnProperty (spring.task.execution.mode=force) did not find property 'spring.task.execution.mode'; NestedCondition on TaskExecutorConfigurations.OnExecutorCondition.ExecutorBeanCondition @ConditionalOnMissingBean (types: java.util.concurrent.Executor; SearchStrategy: all) found beans of type 'java.util.concurrent.Executor' defaultAsyncTaskExecutor, flowableTaskInvokerAsyncTaskExecutor (TaskExecutorConfigurations.OnExecutorCondition) + + TaskSchedulingAutoConfiguration#scheduledBeanLazyInitializationExcludeFilter: + Did not match: + - @ConditionalOnBean (names: org.springframework.scheduling.config.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.scheduling.config.internalScheduledAnnotationProcessor (OnBeanCondition) + + TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilderVirtualThreads: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder' simpleAsyncTaskSchedulerBuilder (OnBeanCondition) + + TaskSchedulingConfigurations.TaskSchedulerConfiguration: + Did not match: + - @ConditionalOnBean (names: org.springframework.scheduling.config.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.scheduling.config.internalScheduledAnnotationProcessor (OnBeanCondition) + + TasksAutoConfiguration.AbbyyTaskConfiguration: + Did not match: + - @ConditionalOnBean (types: com.flowable.platform.abbyy.FlowableAbbyyService; SearchStrategy: all) did not find any beans of type com.flowable.platform.abbyy.FlowableAbbyyService (OnBeanCondition) + + TasksAutoConfiguration.PowerAutomateTaskConfiguration: + Did not match: + - @ConditionalOnBean (types: com.flowable.platform.powerautomate.FlowablePowerAutomateService; SearchStrategy: all) did not find any beans of type com.flowable.platform.powerautomate.FlowablePowerAutomateService (OnBeanCondition) + + TemplateEngineAutoConfiguration.TemplateEngineProcessConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.app.engine.AppEngineConfiguration; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngineConfiguration' appEngineConfiguration (OnBeanCondition) + + TemplateEngineConfigurations.ReactiveTemplateEngineConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + TemplateEngineServicesAutoConfiguration.AlreadyInitializedEngineConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: com.flowable.template.engine.TemplateEngine,com.flowable.app.engine.AppEngine; SearchStrategy: all) found beans of type 'com.flowable.app.engine.AppEngine' flowableAppEngine and found beans of type 'com.flowable.template.engine.TemplateEngine' flowableTemplateEngine (OnBeanCondition) + + ThreadDumpEndpointAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + + ThymeleafAutoConfiguration.DataAttributeDialectConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.github.mxab.thymeleaf.extras.dataattribute.dialect.DataAttributeDialect' (OnClassCondition) + + ThymeleafAutoConfiguration.ThymeleafSecurityDialectConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'org.thymeleaf.extras.springsecurity6.dialect.SpringSecurityDialect' (OnClassCondition) + + ThymeleafAutoConfiguration.ThymeleafWebFluxConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + + ThymeleafAutoConfiguration.ThymeleafWebLayoutConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'nz.net.ultraq.thymeleaf.layoutdialect.LayoutDialect' (OnClassCondition) + + TomcatReactiveManagementContextAutoConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + Matched: + - @ConditionalOnClass found required classes 'org.apache.catalina.startup.Tomcat', 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextFactory' (OnClassCondition) + + TomcatReactiveWebServerAutoConfiguration: + Did not match: + - not a reactive web application (OnWebApplicationCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.http.ReactiveHttpInputMessage', 'org.apache.catalina.startup.Tomcat', 'org.springframework.boot.tomcat.reactive.TomcatReactiveWebServerFactory' (OnClassCondition) + + TomcatServletManagementContextAutoConfiguration: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextFactory' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + TomcatServletWebServerAutoConfiguration#tomcatForwardedHeaderFilterCustomizer: + Did not match: + - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition) + + TomcatWebServerConfiguration: + Did not match: + - Application is deployed as a WAR file. (OnWarDeploymentCondition) + + TransactionAutoConfiguration#transactionalOperator: + Did not match: + - @ConditionalOnSingleCandidate (types: org.springframework.transaction.ReactiveTransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition) + + TransactionAutoConfiguration.AspectJTransactionManagementConfiguration: + Did not match: + - @ConditionalOnBean did not find required type 'org.springframework.transaction.aspectj.AbstractTransactionAspect' (OnBeanCondition) + - @ConditionalOnBean (types: org.springframework.transaction.aspectj.AbstractTransactionAspect; SearchStrategy: all) did not find any beans of type org.springframework.transaction.aspectj.AbstractTransactionAspect (OnBeanCondition) + + TransactionAutoConfiguration.EnableTransactionManagementConfiguration.JdkDynamicAutoProxyConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.aop.proxy-target-class=false) did not find property 'spring.aop.proxy-target-class' (OnPropertyCondition) + + TutorialEngineAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'com.flowable.tutorial.engine.TutorialEngine', 'com.flowable.tutorial.engine.TutorialEngineConfiguration' (OnClassCondition) + + TutorialEngineServicesAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required classes 'com.flowable.tutorial.engine.TutorialEngine', 'com.flowable.tutorial.engine.TutorialEngineConfiguration' (OnClassCondition) + + UserDetailsServiceAutoConfiguration: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationManager,org.springframework.security.authentication.AuthenticationProvider,org.springframework.security.core.userdetails.UserDetailsService,org.springframework.security.authentication.AuthenticationManagerResolver,org.springframework.security.oauth2.jwt.JwtDecoder; SearchStrategy: all) found beans of type 'org.springframework.security.core.userdetails.UserDetailsService' flowableUserDetailsService (OnBeanCondition) + Matched: + - @ConditionalOnClass found required class 'org.springframework.security.authentication.AuthenticationManager' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + - AnyNestedCondition 1 matched 2 did not; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) did not find property 'spring.security.user.password'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) did not find property 'spring.security.user.name'; NestedCondition on MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass did not find unwanted classes 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository', 'org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector', 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (MissingAlternativeUserDetailsManagerOrUserPropertiesConfigured) + + WebDavAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'com.flowable.webdav.impl.WebDavEngine' (OnClassCondition) + + WebMvcAutoConfiguration#hiddenHttpMethodFilter: + Did not match: + - @ConditionalOnBooleanProperty (spring.mvc.hiddenmethod.filter.enabled=true) did not find property 'spring.mvc.hiddenmethod.filter.enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.ProblemDetailsErrorHandlingConfiguration: + Did not match: + - @ConditionalOnBooleanProperty (spring.mvc.problemdetails.enabled=true) did not find property 'spring.mvc.problemdetails.enabled' (OnPropertyCondition) + + WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#beanNameViewResolver: + Did not match: + - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) found beans of type 'org.springframework.web.servlet.view.BeanNameViewResolver' beanNameViewResolver (OnBeanCondition) + + WebMvcEndpointManagementContextConfiguration.HealthConfiguration#managementHealthEndpointWebMvcHandlerMapping: + Did not match: + - Management Port actual port type (SAME) did not match required type (DIFFERENT) (OnManagementPortCondition) + Matched: + - @ConditionalOnBean (types: org.springframework.boot.health.actuate.endpoint.HealthEndpoint; SearchStrategy: all) found bean 'healthEndpoint' (OnBeanCondition) + - @ConditionalOnAvailableEndpoint marked as exposed by a 'management.endpoints.web.exposure' property (OnAvailableEndpointCondition) + + WebMvcMappingsAutoConfiguration: + Did not match: + - @ConditionalOnAvailableEndpoint not exposed (OnAvailableEndpointCondition) + Matched: + - @ConditionalOnClass found required classes 'org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint', 'org.springframework.web.servlet.DispatcherServlet', 'org.springframework.boot.actuate.web.mappings.MappingsEndpoint' (OnClassCondition) + - found 'session' scope (OnWebApplicationCondition) + + XADataSourceAutoConfiguration: + Did not match: + - @ConditionalOnClass did not find required class 'jakarta.transaction.TransactionManager' (OnClassCondition) + + +Exclusions: +----------- + + None + + +Unconditional classes: +---------------------- + + org.springframework.boot.health.autoconfigure.registry.HealthContributorRegistryAutoConfiguration + + org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration + + org.springframework.boot.http.client.autoconfigure.service.HttpServiceClientPropertiesAutoConfiguration + + org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.info.InfoContributorAutoConfiguration + + com.flowable.autoconfigure.platform.ProcessFunctionDelegatesAutoConfiguration + + org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration + + org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration + + org.springframework.boot.health.autoconfigure.contributor.HealthContributorAutoConfiguration + + org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration + + org.springframework.boot.http.client.autoconfigure.HttpClientAutoConfiguration + + com.flowable.autoconfigure.tasks.TasksAutoConfiguration + + com.flowable.autoconfigure.platform.PlatformAutoConfiguration + + com.flowable.spring.boot.rest.CoreInterceptorAutoConfiguration + + org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration + + org.springframework.boot.integration.autoconfigure.metrics.IntegrationMetricsAutoConfiguration + + org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration + + + +]]> + + \ No newline at end of file diff --git a/customer-work/target/surefire-reports/com.customer.work.WorkApplicationTests.txt b/customer-work/target/surefire-reports/com.customer.work.WorkApplicationTests.txt new file mode 100644 index 0000000..8adbdc9 --- /dev/null +++ b/customer-work/target/surefire-reports/com.customer.work.WorkApplicationTests.txt @@ -0,0 +1,292 @@ +------------------------------------------------------------------------------- +Test set: com.customer.work.WorkApplicationTests +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 7.754 s <<< FAILURE! -- in com.customer.work.WorkApplicationTests +com.customer.work.WorkApplicationTests.contextLoads -- Time elapsed: 0.013 s <<< ERROR! +java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@40e41f88 testClass = com.customer.work.WorkApplicationTests, locations = [], classes = [com.customer.work.WorkApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizer@62e70ea3, org.springframework.boot.test.context.PropertyMappingContextCustomizer@0, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@25ddbbbb, org.springframework.boot.test.http.client.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@226642a5, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@625e134e, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@5dbe30be, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@dfa5ba73], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:195) + at org.springframework.test.context.cache.DefaultContextCache.put(DefaultContextCache.java:214) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:160) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:210) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:186) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1716) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:153) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:176) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:632) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1604) +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0: Error creating bean with name 'basicDefaultSecurity' defined in class path resource [com/customer/work/SecurityHttpBasicConfiguration.class]: Unsatisfied dependency expressed through method 'basicDefaultSecurity' parameter 0: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'flowableUserDetailsService' defined in class path resource [com/flowable/autoconfigure/security/FlowablePlatformSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableUserDetailsService' parameter 0: Error creating bean with name 'platformIdentityService' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'platformIdentityService' parameter 0: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:872) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:827) + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:493) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1446) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1218) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1184) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121) + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:994) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) + at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$2(SpringBootContextLoader.java:156) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1465) + at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:605) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:156) + at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:115) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:247) + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:167) + ... 21 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'basicDefaultSecurity' defined in class path resource [com/customer/work/SecurityHttpBasicConfiguration.class]: Unsatisfied dependency expressed through method 'basicDefaultSecurity' parameter 0: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'flowableUserDetailsService' defined in class path resource [com/flowable/autoconfigure/security/FlowablePlatformSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableUserDetailsService' parameter 0: Error creating bean with name 'platformIdentityService' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'platformIdentityService' parameter 0: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:2008) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1971) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeanCollection(DefaultListableBeanFactory.java:1863) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1833) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1711) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.resolveMethodArguments(AutowiredAnnotationBeanPostProcessor.java:864) + ... 48 more +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity' defined in class path resource [org/springframework/security/config/annotation/web/configuration/HttpSecurityConfiguration.class]: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'flowableUserDetailsService' defined in class path resource [com/flowable/autoconfigure/security/FlowablePlatformSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableUserDetailsService' parameter 0: Error creating bean with name 'platformIdentityService' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'platformIdentityService' parameter 0: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:657) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:489) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:351) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 65 more +Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.config.annotation.web.builders.HttpSecurity]: Factory method 'httpSecurity' threw exception with message: Error creating bean with name 'flowableUserDetailsService' defined in class path resource [com/flowable/autoconfigure/security/FlowablePlatformSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableUserDetailsService' parameter 0: Error creating bean with name 'platformIdentityService' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'platformIdentityService' parameter 0: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:183) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiateWithFactoryMethod(SimpleInstantiationStrategy.java:72) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:152) + at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) + ... 77 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'flowableUserDetailsService' defined in class path resource [com/flowable/autoconfigure/security/FlowablePlatformSecurityAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableUserDetailsService' parameter 0: Error creating bean with name 'platformIdentityService' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'platformIdentityService' parameter 0: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1305) + at org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer.configure(InitializeUserDetailsBeanManagerConfigurer.java:94) + at org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer$InitializeUserDetailsManagerConfigurer.configure(InitializeUserDetailsBeanManagerConfigurer.java:63) + at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.configure(AbstractConfiguredSecurityBuilder.java:386) + at org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder.doBuild(AbstractConfiguredSecurityBuilder.java:336) + at org.springframework.security.config.annotation.AbstractSecurityBuilder.build(AbstractSecurityBuilder.java:38) + at org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration.getAuthenticationManager(AuthenticationConfiguration.java:121) + at org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.authenticationManager(HttpSecurityConfiguration.java:152) + at org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration.httpSecurity(HttpSecurityConfiguration.java:119) + at java.base/java.lang.reflect.Method.invoke(Method.java:565) + at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:155) + ... 80 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'platformIdentityService' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'platformIdentityService' parameter 0: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 100 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'coreIdmEngine' defined in class path resource [com/flowable/spring/boot/idm/IdmEngineServicesAutoConfiguration$AlreadyInitializedAppEngineConfiguration.class]: Unsatisfied dependency expressed through method 'coreIdmEngine' parameter 0: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:1225) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1704) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 114 more +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.flowable.spring.boot.app.AppEngineServicesAutoConfiguration': Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:610) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:413) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 128 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appIndexingConfigurer' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appIndexingConfigurer' parameter 0: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.addCandidateEntry(DefaultListableBeanFactory.java:2015) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1971) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveMultipleBeans(DefaultListableBeanFactory.java:1792) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1711) + at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.resolveStream(DefaultListableBeanFactory.java:2685) + at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.orderedStream(DefaultListableBeanFactory.java:2679) + at com.flowable.spring.boot.BaseEngineConfigurationWithConfigurers.setEngineConfigurers(BaseEngineConfigurationWithConfigurers.java:32) + at java.base/java.lang.reflect.Method.invoke(Method.java:565) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:832) + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:493) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1446) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) + ... 147 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appEngineIndexingConfigurator' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'appEngineIndexingConfigurator' parameter 0: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:1225) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1704) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 170 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'indexManager' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'indexManager' parameter 0: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:1225) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1704) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 184 more +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'flowableElasticsearchClient' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Unsatisfied dependency expressed through method 'flowableElasticsearchClient' parameter 1: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) + at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1362) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 198 more +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticsearchCompatibility' defined in class path resource [com/flowable/autoconfigure/indexing/IndexingAutoConfiguration.class]: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1817) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333) + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371) + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331) + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:1225) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1704) + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651) + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912) + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) + ... 212 more +Caused by: org.flowable.common.engine.api.FlowableException: Could not retrieve Elasticsearch version information. One possible reason could be that ES is not accessible. See root cause + at com.flowable.indexing.ElasticsearchCompatibilityImpl.afterPropertiesSet(ElasticsearchCompatibilityImpl.java:134) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1864) + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1813) + ... 223 more +Caused by: java.net.ConnectException: Connect to http://localhost:9203 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused + at co.elastic.clients.transport.rest5_client.low_level.Rest5Client.extractAndWrapCause(Rest5Client.java:945) + at co.elastic.clients.transport.rest5_client.low_level.Rest5Client.performRequest(Rest5Client.java:308) + at co.elastic.clients.transport.rest5_client.low_level.Rest5Client.performRequest(Rest5Client.java:293) + at com.flowable.indexing.ElasticsearchCompatibilityImpl.afterPropertiesSet(ElasticsearchCompatibilityImpl.java:56) + ... 225 more +Caused by: org.apache.hc.client5.http.HttpHostConnectException: Connect to http://localhost:9203 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused + at java.base/sun.nio.ch.Net.pollConnect(Native Method) + at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:639) + at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:1046) + at org.apache.hc.core5.reactor.InternalConnectChannel.onIOEvent(InternalConnectChannel.java:70) + at org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51) + at org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:176) + at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:125) + at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(AbstractSingleCoreIOReactor.java:92) + at org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:44) + at java.base/java.lang.Thread.run(Thread.java:1474) + diff --git a/customer-work/target/test-classes/application.properties b/customer-work/target/test-classes/application.properties new file mode 100644 index 0000000..9fd4faf --- /dev/null +++ b/customer-work/target/test-classes/application.properties @@ -0,0 +1,24 @@ +spring.datasource.url=jdbc:h2:mem:flowable-work-db;DB_CLOSE_DELAY=1000 +spring.datasource.username=admin +spring.datasource.password=test + +# To make our life easier in tests we are disabling the async executor and elasticsearch +flowable.async-executor-activate=false +flowable.async-history-executor-activate=false +flowable.indexing.enabled=false +management.health.elasticsearch.enabled=false +management.metrics.export.elastic.enabled=false + +# Set debug level in tests +logging.level.com.flowable=INFO +logging.level.com.flowable.local.work.model.FlowableModelTestUtils=INFO + +# Disable the timeout process in the tests +flowable.external-system.wechat.timeout.process-definition-key= + +# Path to test-auto-deploy-apps +flowable.app.resource-location=classpath*:/test-auto-deploy-apps/ + +# Email +flowable.mail.server.host=localhost +flowable.mail.server.port=3025 \ No newline at end of file diff --git a/customer-work/target/test-classes/com/customer/work/WorkApplicationTests.class b/customer-work/target/test-classes/com/customer/work/WorkApplicationTests.class new file mode 100644 index 0000000..a749da7 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/WorkApplicationTests.class differ diff --git a/customer-work/target/test-classes/com/customer/work/config/TestConfiguration.class b/customer-work/target/test-classes/com/customer/work/config/TestConfiguration.class new file mode 100644 index 0000000..4b3e8b2 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/config/TestConfiguration.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/EmailDto.class b/customer-work/target/test-classes/com/customer/work/model/EmailDto.class new file mode 100644 index 0000000..67e3101 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/EmailDto.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/FlowableExcelMapper.class b/customer-work/target/test-classes/com/customer/work/model/FlowableExcelMapper.class new file mode 100644 index 0000000..6686984 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/FlowableExcelMapper.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/FlowableExcelParser.class b/customer-work/target/test-classes/com/customer/work/model/FlowableExcelParser.class new file mode 100644 index 0000000..222d3e3 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/FlowableExcelParser.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/FlowableJsonParser.class b/customer-work/target/test-classes/com/customer/work/model/FlowableJsonParser.class new file mode 100644 index 0000000..6186f7c Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/FlowableJsonParser.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/FlowableModelTest.class b/customer-work/target/test-classes/com/customer/work/model/FlowableModelTest.class new file mode 100644 index 0000000..80d6ee4 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/FlowableModelTest.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/FlowableModelTestUtils.class b/customer-work/target/test-classes/com/customer/work/model/FlowableModelTestUtils.class new file mode 100644 index 0000000..0aaa2cf Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/FlowableModelTestUtils.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/TestMailServer.class b/customer-work/target/test-classes/com/customer/work/model/TestMailServer.class new file mode 100644 index 0000000..30d5747 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/TestMailServer.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/TestMailServerExtension.class b/customer-work/target/test-classes/com/customer/work/model/TestMailServerExtension.class new file mode 100644 index 0000000..3270ec0 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/TestMailServerExtension.class differ diff --git a/customer-work/target/test-classes/com/customer/work/model/test/ModelTest.class b/customer-work/target/test-classes/com/customer/work/model/test/ModelTest.class new file mode 100644 index 0000000..da4ac77 Binary files /dev/null and b/customer-work/target/test-classes/com/customer/work/model/test/ModelTest.class differ diff --git a/customer-work/target/test-classes/model/test/C001/T001.json b/customer-work/target/test-classes/model/test/C001/T001.json new file mode 100644 index 0000000..a48859a --- /dev/null +++ b/customer-work/target/test-classes/model/test/C001/T001.json @@ -0,0 +1,5 @@ +{ + "root": { + "testText": "my test text" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P001/initiator.json b/customer-work/target/test-classes/model/test/P001/initiator.json new file mode 100644 index 0000000..fbc534b --- /dev/null +++ b/customer-work/target/test-classes/model/test/P001/initiator.json @@ -0,0 +1,5 @@ +{ + "__IN": { + "initiator": "admin" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/boolean1.json b/customer-work/target/test-classes/model/test/P002/boolean1.json new file mode 100644 index 0000000..6f84512 --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/boolean1.json @@ -0,0 +1,9 @@ +{ + "param": true, + "__IN": { + "param": false + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/boolean2.json b/customer-work/target/test-classes/model/test/P002/boolean2.json new file mode 100644 index 0000000..3ebab25 --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/boolean2.json @@ -0,0 +1,9 @@ +{ + "param": false, + "__IN": { + "param": true + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/date.json b/customer-work/target/test-classes/model/test/P002/date.json new file mode 100644 index 0000000..2829b47 --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/date.json @@ -0,0 +1,9 @@ +{ + "param": "2025-11-12", + "__IN": { + "param": "2025-11-11" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/double.json b/customer-work/target/test-classes/model/test/P002/double.json new file mode 100644 index 0000000..38cd1a2 --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/double.json @@ -0,0 +1,9 @@ +{ + "param": 123.456, + "__IN": { + "param": 456.789 + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/int.json b/customer-work/target/test-classes/model/test/P002/int.json new file mode 100644 index 0000000..cd503ec --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/int.json @@ -0,0 +1,9 @@ +{ + "param": 123, + "__IN": { + "param": 456 + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/p002Test.xlsx b/customer-work/target/test-classes/model/test/P002/p002Test.xlsx new file mode 100644 index 0000000..b80f353 Binary files /dev/null and b/customer-work/target/test-classes/model/test/P002/p002Test.xlsx differ diff --git a/customer-work/target/test-classes/model/test/P002/string1.json b/customer-work/target/test-classes/model/test/P002/string1.json new file mode 100644 index 0000000..862081d --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/string1.json @@ -0,0 +1,9 @@ +{ + "param": "hello root", + "__IN": { + "param": "hello" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/string2.json b/customer-work/target/test-classes/model/test/P002/string2.json new file mode 100644 index 0000000..d0b0429 --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/string2.json @@ -0,0 +1,9 @@ +{ + "param": "123", + "__IN": { + "param": "456" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P002/string3.json b/customer-work/target/test-classes/model/test/P002/string3.json new file mode 100644 index 0000000..91626b3 --- /dev/null +++ b/customer-work/target/test-classes/model/test/P002/string3.json @@ -0,0 +1,9 @@ +{ + "param": "123.456,", + "__IN": { + "param": "456.789" + }, + "__OUT": { + "result": "out" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/model/test/P005/T001.json b/customer-work/target/test-classes/model/test/P005/T001.json new file mode 100644 index 0000000..e5451ad --- /dev/null +++ b/customer-work/target/test-classes/model/test/P005/T001.json @@ -0,0 +1,5 @@ +{ + "root": { + "dataEntry": "my root text" + } +} \ No newline at end of file diff --git a/customer-work/target/test-classes/test-auto-deploy-apps/TST_APP.zip b/customer-work/target/test-classes/test-auto-deploy-apps/TST_APP.zip new file mode 100644 index 0000000..62086df Binary files /dev/null and b/customer-work/target/test-classes/test-auto-deploy-apps/TST_APP.zip differ diff --git a/docker/.env b/docker/.env new file mode 100644 index 0000000..3157569 --- /dev/null +++ b/docker/.env @@ -0,0 +1 @@ +COMPOSE_PROJECT_NAME=2025-2 \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..6a6f9ed --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,154 @@ +services: + flowable-db: + image: postgres:16 + environment: + POSTGRES_DB: flowable + POSTGRES_USER: flowable + POSTGRES_PASSWORD: flowable + ports: + - 5435:5432 + volumes: + - data_db:/var/lib/postgresql/data + healthcheck: + test: [ "CMD", "pg_isready", "-q", "-d", "flowable", "-U", "flowable" ] + interval: 5s + timeout: 5s + retries: 3 + start_period: 10s + + flowable-index: + image: docker.elastic.co/elasticsearch/elasticsearch:8.11.2 + environment: + discovery.type: single-node + node.name: flowable-node-01 + cluster.name: flowable-cluster + xpack.security.enabled: "false" + ports: + - 9303:9300 + - 9203:9200 + mem_limit: 1024m # if not set, ES may allocate more memory than available and terminate, especially when running multiple ES containers + volumes: + - data_index:/usr/share/elasticsearch/data + ulimits: + memlock: + soft: -1 + hard: -1 + healthcheck: + test: ["CMD", "curl", "-f", "http://host.docker.internal:9200"] + interval: 5s + timeout: 5s + retries: 3 + start_period: 20s + + # Vanilla Flowable Work, uncomment to activate + # This image requires to login to the Flowable Docker Repo (docker login artifacts.flowable.com) +# flowable-work: +# image: artifacts.flowable.com/flowable/flowable-work:3.14.4 +# environment: +# flowable.license.db-store-enabled: "false" +# flowable.inspect.enabled: "true" +# flowable.security.impersonate.allowed: "true" +# flowable.platform.enable-latest-form-definition-lookup: "true" +# flowable.platform.idm.minimal-setup: "true" +# flowable.example.deploy-apps: "false" +# info.env.name: Development +# logging.file: flowable-work.log +# management.metrics.export.elastic.enabled: "true" +# management.endpoints.web.exposure.include: "*" +# management.endpoint.health.show-details: ALWAYS +# server.servlet.context-path: / +# spring.elasticsearch.rest.uris: http://host.docker.internal:9200 +# spring.datasource.driver-class-name: org.postgresql.Driver +# spring.datasource.url: jdbc:postgresql://host.docker.internal:5432/flowable +# spring.datasource.username: flowable +# spring.datasource.password: flowable +# ports: +# - 8090:8080 +# volumes: +# - ~/.flowable/flowable.license:/root/.flowable/flowable.license:ro +# depends_on: +# flowable-db: +# condition: service_healthy +# flowable-index: +# condition: service_healthy + + # Vanilla Flowable Design, uncomment to activate + # This image requires to login to the Flowable Docker Repo (docker login artifacts.flowable.com) +# flowable-design: +# image: artifacts.flowable.com/docker-local/flowable/flowable-design:3.14.4 +# environment: +# flowable.design.remote.authentication.user: admin +# flowable.design.remote.authentication.password: test +# flowable.design.remote.idm-url: http://host.docker.internal:8090 +# flowable.design.deployment-api-url: http://host.docker.internal:8090/app-api # not yet working for linux systems, check https://github.com/docker/for-linux/issues/264 for PR state and workarounds +# flowable.design.undeployment-api-url: http://host.docker.internal:8090/platform-api/app-deployments # not yet working for linux systems, check https://github.com/docker/for-linux/issues/264 for PR state and workarounds +# flowable.design.db-store-enabled: "false" +# logging.file: flowable-design.log +# server.servlet.context-path: / +# spring.datasource.driver-class-name: org.postgresql.Driver +# spring.datasource.url: jdbc:postgresql://host.docker.internal:5432/flowable +# spring.datasource.username: flowable +# spring.datasource.password: flowable +# ports: +# - 8091:8080 +# volumes: +# - ~/.flowable/flowable.license:/root/.flowable/flowable.license:ro +# depends_on: +# flowable-db: +# condition: service_healthy + + # Vanilla Flowable Design Angular, uncomment to activate + # This image requires to login to the Flowable Docker Repo (docker login artifacts.flowable.com) +# flowable-design-angular: +# image: artifacts.flowable.com/docker-local/flowable/flowable-design-angular:3.14.4 +# environment: +# flowable.common.app.idm-admin.user: admin +# flowable.common.app.idm-admin.password: test +# flowable.common.app.idm-url: http://host.docker.internal:8090 +# flowable.modeler.app.deployment-api-url: http://host.docker.internal:8090/app-api # not yet working for linux systems, check https://github.com/docker/for-linux/issues/264 for PR state and workarounds +# flowable.modeler.app.undeployment-api-url: http://host.docker.internal:8090/platform-api/app-deployments # not yet working for linux systems, check https://github.com/docker/for-linux/issues/264 for PR state and workarounds +# flowable.modeler.app.db-store-enabled: "false" +# logging.file: flowable-design.log +# server.servlet.context-path: / +# spring.datasource.driver-class-name: org.postgresql.Driver +# spring.datasource.url: jdbc:postgresql://host.docker.internal:5432/flowable +# spring.datasource.username: flowable +# spring.datasource.password: flowable +# ports: +# - 8091:8080 +# volumes: +# - ~/.flowable/flowable.license:/root/.flowable/flowable.license:ro +# depends_on: +# flowable-db: +# condition: service_healthy + + # Vanilla Flowable Control, uncomment to activate + # This image requires to login to the Flowable Docker Repo (docker login artifacts.flowable.com) +# flowable-control: +# image: artifacts.flowable.com/docker-local/flowable/flowable-control:3.14.4 +# environment: +# flowable.common.app.idm-admin.user: admin +# flowable.common.app.idm-admin.password: test +# flowable.control.app.cluster-config.server-address: http://host.docker.internal # not yet working for linux systems, check https://github.com/docker/for-linux/issues/264 for pr state and workarounds +# flowable.control.app.cluster-config.server-port: 8090 +# flowable.control.app.cluster-config.context-root: / +# flowable.control.app.cluster-config.password: test +# flowable.control.app.db-store-enabled: "false" +# logging.file: flowable-control.log +# server.servlet.context-path: / +# spring.datasource.driver-class-name: org.postgresql.Driver +# spring.datasource.url: jdbc:postgresql://host.docker.internal:5432/flowable +# spring.datasource.username: flowable +# spring.datasource.password: flowable +# ports: +# - 8092:8080 +# volumes: +# - ~/.flowable/flowable.license:/root/.flowable/flowable.license:ro +# depends_on: +# flowable-db: +# condition: service_healthy + +# Volumes will get a prefix based on the `.env` file and data can be cleared by `docker-compose down -v` +volumes: + data_db: + data_index: \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..19529dd --- /dev/null +++ b/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e54c424 --- /dev/null +++ b/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 4.0.3 + + + + com.customer + customer-parent + 0.0.1-SNAPSHOT + pom + + + customer-design + customer-work + customer-control + + + + UTF-8 + UTF-8 + 21 + 2025.2.05 + false + + + + + + + com.flowable + flowable-platform-bom + ${com.flowable.platform.version} + pom + import + + + + + \ No newline at end of file diff --git a/tmp/VarUtils03.java b/tmp/VarUtils03.java new file mode 100644 index 0000000..6d6ecf7 --- /dev/null +++ b/tmp/VarUtils03.java @@ -0,0 +1,297 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.flowable.cmmn.engine.CmmnEngineConfiguration; +import org.flowable.common.engine.api.delegate.event.FlowableEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.common.engine.api.variable.VariableContainer; +import org.flowable.engine.ProcessEngineConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * General-purpose Flowable variable utility bean. + * + * Usable in BPMN process and CMMN case backend expressions without any + * scope parameter — the current execution / plan-item instance is captured + * automatically via a Flowable event listener registered on both engines. + * + * Expression examples: + * ${varUtils.get('order.customer.name')} + * ${varUtils.track('order.customer.name,order.total,status')} + * + * How the scope is resolved without a parameter + * ----------------------------------------------- + * Flowable fires ACTIVITY_STARTED (BPMN) or PLAN_ITEM_INSTANCE_STARTED (CMMN) + * on the same thread — and strictly before — the service-task expression is + * evaluated. onEvent() stores the current VariableContainer in a ThreadLocal. + * The ThreadLocal is cleared when the activity / plan item completes or is + * cancelled, so it never leaks across tasks. + * + * Registration + * ------------ + * SmartInitializingSingleton.afterSingletonsInstantiated() runs after all + * Spring beans (including engine configurations) are fully initialised, so + * addEventListener() is always called on a live event dispatcher. + * Only the engine configurations that are present in the application context + * are registered; the other one is silently skipped. + */ +@Component("varUtils") +public class VarUtils implements FlowableEventListener, SmartInitializingSingleton { + + private static final Logger LOGGER = LoggerFactory.getLogger(VarUtils.class); + private static final String SNAPSHOT_PREFIX = "__vartracker__"; + + private static final ThreadLocal SCOPE = new ThreadLocal<>(); + + private static final ObjectMapper MAPPER; + static { + MAPPER = new ObjectMapper(); + MAPPER.registerModule(new JavaTimeModule()); + MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + @Autowired(required = false) + private ProcessEngineConfiguration processEngineConfiguration; + + @Autowired(required = false) + private CmmnEngineConfiguration cmmnEngineConfiguration; + + // ------------------------------------------------------------------------- + // Listener registration + // ------------------------------------------------------------------------- + + @Override + public void afterSingletonsInstantiated() { + if (processEngineConfiguration != null) { + processEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on BPMN event dispatcher"); + } + if (cmmnEngineConfiguration != null) { + cmmnEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on CMMN event dispatcher"); + } + } + + // ------------------------------------------------------------------------- + // FlowableEventListener — bind / unbind the scope ThreadLocal + // ------------------------------------------------------------------------- + + @Override + public void onEvent(FlowableEvent event) { + if (!(event instanceof FlowableEntityEvent entityEvent)) return; + Object entity = entityEvent.getEntity(); + if (!(entity instanceof VariableContainer vc)) return; + + String eventName = event.getType().name(); + LOGGER.info("eventName={}", eventName); + + switch (eventName) { + case "CASE_STARTED", + "PROCESS_STARTED", + "ACTIVITY_STARTED", + "PLAN_ITEM_INSTANCE_STARTED" -> SCOPE.set(vc); + case "CASE_ENDED", + "PROCESS_COMPLETED", + "ACTIVITY_COMPLETED", + "ACTIVITY_CANCELLED", + "PLAN_ITEM_INSTANCE_COMPLETED", + "PLAN_ITEM_INSTANCE_TERMINATED", + "PLAN_ITEM_INSTANCE_SUSPENDED" -> SCOPE.remove(); + default -> { /* ignore */ } + } + } + + @Override public boolean isFailOnException() { return false; } + @Override public boolean isFireOnTransactionLifecycleEvent() { return false; } + @Override public String getOnTransaction() { return null; } + + // ------------------------------------------------------------------------- + // Public API — called from Flowable expressions + // ------------------------------------------------------------------------- + + /** + * Returns the value at the given dot-separated path within the current + * variable scope. Supports Maps, Lists (integer index), Jackson JsonNodes, + * and POJOs (getter or field). Returns null for any missing segment. + * + * ${varUtils.get('order.customer.name')} + * ${varUtils.get('order.lines.0.price')} + */ + public Object get(String path) { + VariableContainer scope = currentScope("get"); + if (scope == null || path == null || path.isBlank()) return null; + return resolvePath(scope, path.trim()); + } + + /** + * Checks which of the given comma-separated variable paths changed since the + * last call and returns a JSON array describing each change. + * + * ${varUtils.track('order.customer.name,order.total,status')} + * + * Returns [] on the first call (baseline snapshot recorded). + * Each subsequent call compares against the previous snapshot and updates it. + * The snapshot is stored inside the variable scope so it survives across tasks. + * + * Example return value: + * [{"path":"order.total","oldValue":100,"newValue":150}] + */ + public String track(String pathsCsv) { + VariableContainer scope = currentScope("track"); + if (scope == null || pathsCsv == null || pathsCsv.isBlank()) return "[]"; + + List paths = Arrays.stream(pathsCsv.split(",")) + .map(String::trim).filter(s -> !s.isEmpty()).toList(); + + String snapshotKey = SNAPSHOT_PREFIX + pathsCsv.replaceAll("\\s+", ""); + Map previous = loadSnapshot(scope, snapshotKey); + Map current = new HashMap<>(); + ArrayNode changes = MAPPER.createArrayNode(); + + for (String path : paths) { + JsonNode value = toJson(resolvePath(scope, path)); + current.put(path, value); + + if (previous.isEmpty()) continue; // first call — baseline only + + JsonNode prev = previous.getOrDefault(path, MAPPER.nullNode()); + if (!prev.equals(value)) { + ObjectNode change = MAPPER.createObjectNode(); + change.put("path", path); + change.set("oldValue", prev); + change.set("newValue", value); + changes.add(change); + } + } + + saveSnapshot(scope, snapshotKey, current); + + try { + return MAPPER.writeValueAsString(changes); + } catch (Exception e) { + LOGGER.error("varUtils.track: failed to serialize changes", e); + return "[]"; + } + } + + // ------------------------------------------------------------------------- + // Path resolution + // ------------------------------------------------------------------------- + + private static Object resolvePath(VariableContainer scope, String path) { + String[] segments = path.split("\\.", -1); + Object current = scope.getVariable(segments[0]); + for (int i = 1; i < segments.length; i++) { + if (current == null) return null; + current = step(current, segments[i]); + } + return current; + } + + @SuppressWarnings("unchecked") + private static Object step(Object obj, String segment) { + if (obj instanceof List list) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < list.size() ? list.get(i) : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Object[] arr) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < arr.length ? arr[i] : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Map map) return map.get(segment); + if (obj instanceof JsonNode jn) { + JsonNode node = jn.get(segment); + if (node == null || node.isNull()) return null; + if (node.isTextual()) return node.asText(); + if (node.isBoolean()) return node.asBoolean(); + if (node.isLong()) return node.asLong(); + if (node.isInt()) return node.asInt(); + if (node.isDouble()) return node.asDouble(); + return node; + } + // POJO: try getter (getX / isX) then field + String cap = Character.toUpperCase(segment.charAt(0)) + segment.substring(1); + try { return obj.getClass().getMethod("get" + cap).invoke(obj); } catch (Exception ignored) {} + try { return obj.getClass().getMethod("is" + cap).invoke(obj); } catch (Exception ignored) {} + try { + java.lang.reflect.Field f = findField(obj.getClass(), segment); + if (f != null) { f.setAccessible(true); return f.get(obj); } + } catch (Exception ignored) {} + LOGGER.warn("varUtils: cannot resolve '{}' on {}", segment, obj.getClass().getName()); + return null; + } + + private static java.lang.reflect.Field findField(Class c, String name) { + while (c != null && c != Object.class) { + try { return c.getDeclaredField(name); } + catch (NoSuchFieldException e) { c = c.getSuperclass(); } + } + return null; + } + + // ------------------------------------------------------------------------- + // Snapshot persistence + // ------------------------------------------------------------------------- + + private static Map loadSnapshot(VariableContainer scope, String key) { + Object raw = scope.getVariable(key); + if (raw == null) return new HashMap<>(); + try { + String json = raw instanceof String s ? s : MAPPER.writeValueAsString(raw); + Map flat = MAPPER.readValue(json, + MAPPER.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); + Map result = new HashMap<>(); + flat.forEach((k, v) -> result.put(k, toJson(v))); + return result; + } catch (Exception e) { + LOGGER.warn("varUtils: could not load snapshot '{}': {}", key, e.getMessage()); + return new HashMap<>(); + } + } + + private static void saveSnapshot(VariableContainer scope, String key, Map snapshot) { + try { + scope.setVariable(key, MAPPER.writeValueAsString(snapshot)); + } catch (Exception e) { + LOGGER.error("varUtils: could not save snapshot '{}'", key, e); + } + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private VariableContainer currentScope(String method) { + VariableContainer scope = SCOPE.get(); + if (scope == null) { + LOGGER.error("varUtils.{}() called without an active Flowable scope — " + + "is VarUtils registered on the engine event dispatcher?", method); + } + return scope; + } + + private static JsonNode toJson(Object value) { + if (value == null) return MAPPER.nullNode(); + if (value instanceof JsonNode jn) return jn; + return MAPPER.valueToTree(value); + } +} diff --git a/tmp/VarUtils04.java b/tmp/VarUtils04.java new file mode 100644 index 0000000..5100dac --- /dev/null +++ b/tmp/VarUtils04.java @@ -0,0 +1,424 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.flowable.cmmn.api.CmmnRuntimeService; +import org.flowable.cmmn.api.delegate.DelegatePlanItemInstance; +import org.flowable.cmmn.engine.CmmnEngineConfiguration; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.engine.ProcessEngineConfiguration; +import org.flowable.cmmn.api.runtime.CaseInstance; +import org.flowable.cmmn.api.runtime.PlanItemInstance; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.event.FlowableProcessEngineEvent; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.variable.api.delegate.VariableScope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * General-purpose Flowable variable utility bean. + * + * Usable in BPMN process and CMMN case backend expressions without any + * scope parameter: + * ${varUtils.get('order.customer.name')} + * ${varUtils.track('order.customer.name,order.total,status')} + * + * How the scope is resolved without a parameter + * ----------------------------------------------- + * The bean registers itself as a Flowable event listener on both engines. + * Before a service task expression is evaluated, Flowable fires events on the + * same thread that allow us to capture the current variable scope: + * + * BPMN — ACTIVITY_STARTED fires a FlowableProcessEngineEvent; the execution + * is retrieved via event.getExecution(). + * + * CMMN — There is no PLAN_ITEM_INSTANCE_STARTED event. Instead, when a plan + * item instance transitions to the ACTIVE state, the base entity manager + * calls update(), which dispatches ENTITY_UPDATED carrying the + * PlanItemInstanceEntity (implements DelegatePlanItemInstance). + * We bind the scope when the state is "active" and clear it when the + * state reaches a terminal value. + */ +@Component("varUtils") +public class VarUtils implements FlowableEventListener, SmartInitializingSingleton { + + private static final Logger LOGGER = LoggerFactory.getLogger(VarUtils.class); + private static final String SNAPSHOT_PREFIX = "__vartracker__"; + + private static final ThreadLocal SCOPE = new ThreadLocal<>(); + + private static final ObjectMapper MAPPER; + static { + MAPPER = new ObjectMapper(); + MAPPER.registerModule(new JavaTimeModule()); + MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + @Autowired(required = false) + private ProcessEngineConfiguration processEngineConfiguration; + + @Autowired(required = false) + private CmmnEngineConfiguration cmmnEngineConfiguration; + + @Autowired(required = false) + private RuntimeService runtimeService; + + @Autowired(required = false) + private CmmnRuntimeService cmmnRuntimeService; + + // ------------------------------------------------------------------------- + // Listener registration — runs after all beans are ready + // ------------------------------------------------------------------------- + + @Override + public void afterSingletonsInstantiated() { + if (processEngineConfiguration != null) { + processEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on BPMN event dispatcher"); + } + if (cmmnEngineConfiguration != null) { + cmmnEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on CMMN event dispatcher"); + } + } + + // ------------------------------------------------------------------------- + // FlowableEventListener — bind / unbind the scope ThreadLocal + // ------------------------------------------------------------------------- + + @Override + public void onEvent(FlowableEvent event) { + String typeName = event.getType().name(); + + // BPMN — ACTIVITY_STARTED fires FlowableActivityEventImpl which implements + // FlowableProcessEngineEvent (not FlowableEntityEvent as one might expect). + // The execution is accessed via getExecution(), not getEntity(). + if (event instanceof FlowableProcessEngineEvent pe) { + DelegateExecution execution = pe.getExecution(); + if (execution == null) return; + switch (typeName) { + case "CASE_STARTED", "PROCESS_STARTED" -> SCOPE.set(execution); + case "CASE_ENDED", "PROCESS_COMPLETED" -> SCOPE.remove(); + } + return; + } + + // CMMN — There is no dedicated PLAN_ITEM_INSTANCE_STARTED event type. + // The base AbstractEntityManager.update() dispatches ENTITY_UPDATED whenever + // a plan item instance's state is persisted. We filter on DelegatePlanItemInstance + // and check the state string to bind / unbind the scope. + if ("ENTITY_UPDATED".equals(typeName) && event instanceof FlowableEngineEntityEvent ee) { + Object entity = ee.getEntity(); + if (entity instanceof DelegatePlanItemInstance dpi) { + String state = dpi.getState(); + if ("active".equals(state)) { + SCOPE.set(dpi); + } else if ("completed".equals(state) || "terminated".equals(state) + || "failed".equals(state) || "suspended".equals(state)) { + SCOPE.remove(); + } + } + } + } + + @Override public boolean isFailOnException() { return false; } + @Override public boolean isFireOnTransactionLifecycleEvent() { return false; } + @Override public String getOnTransaction() { return null; } + + // ------------------------------------------------------------------------- + // Public API — called from Flowable expressions + // ------------------------------------------------------------------------- + + /** + * Returns the value at the given dot-separated path within the current + * variable scope. Supports Maps, Lists (integer index), Jackson JsonNodes, + * and POJOs (getter or field). Returns null for any missing segment. + * + * ${varUtils.get('order.customer.name')} + * ${varUtils.get('order.lines.0.price')} + */ + public Object get(String path) { + VariableScope scope = currentScope("get"); + if (scope == null || path == null || path.isBlank()) return null; + return resolvePath(scope, path.trim(), this); + } + + /** + * Checks which of the given comma-separated variable paths changed since the + * last call and returns a JSON array describing each change. + * + * ${varUtils.track('order.customer.name,order.total,status')} + * + * Returns [] on the first call (baseline snapshot recorded). + * Each subsequent call compares against the previous snapshot and updates it. + * The snapshot is stored inside the variable scope so it survives across tasks. + * + * Example return value: + * [{"path":"order.total","oldValue":100,"newValue":150}] + */ + public String track(String pathsCsv) { + VariableScope scope = currentScope("track"); + if (scope == null || pathsCsv == null || pathsCsv.isBlank()) return "[]"; + + List paths = Arrays.stream(pathsCsv.split(",")) + .map(String::trim).filter(s -> !s.isEmpty()).toList(); + + String snapshotKey = SNAPSHOT_PREFIX + pathsCsv.replaceAll("\\s+", ""); + Map previous = loadSnapshot(scope, snapshotKey); + Map current = new HashMap<>(); + ArrayNode changes = MAPPER.createArrayNode(); + + for (String path : paths) { + JsonNode value = toJson(resolvePath(scope, path, this)); + current.put(path, value); + + if (previous.isEmpty()) continue; // first call — baseline only + + JsonNode prev = previous.getOrDefault(path, MAPPER.nullNode()); + if (!prev.equals(value)) { + ObjectNode change = MAPPER.createObjectNode(); + change.put("path", path); + change.set("oldValue", prev); + change.set("newValue", value); + changes.add(change); + } + } + + saveSnapshot(scope, snapshotKey, current); + + try { + return MAPPER.writeValueAsString(changes); + } catch (Exception e) { + LOGGER.error("varUtils.track: failed to serialize changes", e); + return "[]"; + } + } + + // ------------------------------------------------------------------------- + // Path resolution + // ------------------------------------------------------------------------- + + /** + * Resolves a dot-separated path against the current scope. + * + * If the first segment is the reserved word {@code root}, the entire call + * hierarchy is climbed until no parent can be found; the next segment is + * then used as the variable name at that topmost scope. + * + * root.myString → topmost scope, variable "myString" + * root.myObj.field → topmost scope, variable "myObj", then navigate to "field" + * order.customer.name → current scope, variable "order", navigate normally + */ + private static Object resolvePath(VariableScope scope, String path, VarUtils self) { + String[] segments = path.split("\\.", -1); + Object current; + int startIdx; + + if ("root".equals(segments[0])) { + if (segments.length < 2) return null; + // climb all the way up, then get the variable named by segments[1] + current = self.getFromRootScope(scope, segments[1]); + startIdx = 2; + } else { + current = scope.getVariable(segments[0]); + startIdx = 1; + } + + for (int i = startIdx; i < segments.length; i++) { + if (current == null) return null; + current = step(current, segments[i]); + } + return current; + } + + /** Climbs to the topmost ancestor scope and returns the named variable from there. */ + private Object getFromRootScope(VariableScope scope, String varName) { + if (scope instanceof DelegateExecution ex && runtimeService != null) + return getFromBpmnRoot(ex.getProcessInstanceId(), varName); + if (scope instanceof DelegatePlanItemInstance dpi && cmmnRuntimeService != null) + return getFromCmmnRoot(dpi.getCaseInstanceId(), varName); + return null; + } + + /** + * Climbs the hierarchy from a BPMN process instance toward the root. + * Parent links: + * getSuperExecutionId() → launched via Call Activity (parent is BPMN) + * getCallbackId/Type() → launched via Case Task (parent is CMMN) + * When no parent exists this IS the root; the variable is fetched here. + */ + private Object getFromBpmnRoot(String processInstanceId, String varName) { + if (processInstanceId == null || runtimeService == null) return null; + try { + // Parent via Call Activity (BPMN → BPMN) + Execution piExec = runtimeService.createExecutionQuery() + .executionId(processInstanceId).singleResult(); + if (piExec != null && piExec.getSuperExecutionId() != null) { + Execution superExec = runtimeService.createExecutionQuery() + .executionId(piExec.getSuperExecutionId()).singleResult(); + if (superExec != null) + return getFromBpmnRoot(superExec.getProcessInstanceId(), varName); + } + + // Parent via Case Task (CMMN → BPMN): callbackId = plan item instance id + ProcessInstance pi = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).singleResult(); + if (pi != null && pi.getCallbackType() != null && pi.getCallbackId() != null + && cmmnRuntimeService != null) { + PlanItemInstance planItem = cmmnRuntimeService.createPlanItemInstanceQuery() + .planItemInstanceId(pi.getCallbackId()).singleResult(); + if (planItem != null) + return getFromCmmnRoot(planItem.getCaseInstanceId(), varName); + } + + // No parent reachable — this is the root BPMN process instance + return runtimeService.getVariable(processInstanceId, varName); + } catch (Exception e) { + LOGGER.debug("varUtils: BPMN root climb failed for '{}': {}", varName, e.getMessage()); + return null; + } + } + + /** + * Climbs the hierarchy from a CMMN case instance toward the root. + * Parent links: + * getParentId() → launched via Case Task in another case (parent is CMMN) + * getCallbackId/Type() → launched via Case Task in a process (parent is BPMN) + * When no parent exists this IS the root; the variable is fetched here. + */ + private Object getFromCmmnRoot(String caseInstanceId, String varName) { + if (caseInstanceId == null || cmmnRuntimeService == null) return null; + try { + CaseInstance ci = cmmnRuntimeService.createCaseInstanceQuery() + .caseInstanceId(caseInstanceId).singleResult(); + if (ci == null) return null; + + // Parent via Case Task in another case (CMMN → CMMN) + if (ci.getParentId() != null) + return getFromCmmnRoot(ci.getParentId(), varName); + + // Parent via Case Task in a process (BPMN → CMMN): callbackId = execution id + if (ci.getCallbackType() != null && ci.getCallbackId() != null + && runtimeService != null) { + Execution callbackExec = runtimeService.createExecutionQuery() + .executionId(ci.getCallbackId()).singleResult(); + if (callbackExec != null) + return getFromBpmnRoot(callbackExec.getProcessInstanceId(), varName); + } + + // No parent reachable — this is the root CMMN case instance + return cmmnRuntimeService.getVariable(caseInstanceId, varName); + } catch (Exception e) { + LOGGER.debug("varUtils: CMMN root climb failed for '{}': {}", varName, e.getMessage()); + return null; + } + } + + @SuppressWarnings("unchecked") + private static Object step(Object obj, String segment) { + if (obj instanceof List list) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < list.size() ? list.get(i) : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Object[] arr) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < arr.length ? arr[i] : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Map map) return map.get(segment); + if (obj instanceof JsonNode jn) { + JsonNode node = jn.get(segment); + if (node == null || node.isNull()) return null; + if (node.isTextual()) return node.asText(); + if (node.isBoolean()) return node.asBoolean(); + if (node.isLong()) return node.asLong(); + if (node.isInt()) return node.asInt(); + if (node.isDouble()) return node.asDouble(); + return node; + } + String cap = Character.toUpperCase(segment.charAt(0)) + segment.substring(1); + try { return obj.getClass().getMethod("get" + cap).invoke(obj); } catch (Exception ignored) {} + try { return obj.getClass().getMethod("is" + cap).invoke(obj); } catch (Exception ignored) {} + try { + java.lang.reflect.Field f = findField(obj.getClass(), segment); + if (f != null) { f.setAccessible(true); return f.get(obj); } + } catch (Exception ignored) {} + LOGGER.warn("varUtils: cannot resolve '{}' on {}", segment, obj.getClass().getName()); + return null; + } + + private static java.lang.reflect.Field findField(Class c, String name) { + while (c != null && c != Object.class) { + try { return c.getDeclaredField(name); } + catch (NoSuchFieldException e) { c = c.getSuperclass(); } + } + return null; + } + + // ------------------------------------------------------------------------- + // Snapshot persistence + // ------------------------------------------------------------------------- + + private static Map loadSnapshot(VariableScope scope, String key) { + Object raw = scope.getVariable(key); + if (raw == null) return new HashMap<>(); + try { + String json = raw instanceof String s ? s : MAPPER.writeValueAsString(raw); + Map flat = MAPPER.readValue(json, + MAPPER.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); + Map result = new HashMap<>(); + flat.forEach((k, v) -> result.put(k, toJson(v))); + return result; + } catch (Exception e) { + LOGGER.warn("varUtils: could not load snapshot '{}': {}", key, e.getMessage()); + return new HashMap<>(); + } + } + + private static void saveSnapshot(VariableScope scope, String key, Map snapshot) { + try { + scope.setVariable(key, MAPPER.writeValueAsString(snapshot)); + } catch (Exception e) { + LOGGER.error("varUtils: could not save snapshot '{}'", key, e); + } + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private VariableScope currentScope(String method) { + VariableScope scope = SCOPE.get(); + if (scope == null) { + LOGGER.error("varUtils.{}() called without an active Flowable scope — " + + "is VarUtils registered on the engine event dispatcher?", method); + } + return scope; + } + + private static JsonNode toJson(Object value) { + if (value == null) return MAPPER.nullNode(); + if (value instanceof JsonNode jn) return jn; + return MAPPER.valueToTree(value); + } +} diff --git a/tmp/VarUtils05.java b/tmp/VarUtils05.java new file mode 100644 index 0000000..32a79aa --- /dev/null +++ b/tmp/VarUtils05.java @@ -0,0 +1,483 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.flowable.cmmn.api.CmmnRuntimeService; +import org.flowable.cmmn.engine.CmmnEngineConfiguration; +import org.flowable.cmmn.engine.impl.persistence.entity.CaseInstanceEntity; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.engine.ProcessEngineConfiguration; +import org.flowable.cmmn.api.runtime.CaseInstance; +import org.flowable.cmmn.api.runtime.PlanItemInstance; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.engine.runtime.Execution; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.variable.api.delegate.VariableScope; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * General-purpose Flowable variable utility bean. + * + * Usable in BPMN process and CMMN case backend expressions without any + * scope parameter: + * ${varUtils.get('order.customer.name')} + * ${varUtils.track('order.customer.name,order.total,status')} + * + * How the scope is resolved without a parameter + * ----------------------------------------------- + * The bean registers itself as a Flowable event listener on both engines. + * Before a service task expression is evaluated, Flowable fires events on the + * same thread that allow us to capture the current variable scope: + * + * BPMN — ACTIVITY_STARTED fires a FlowableProcessEngineEvent; the execution + * is retrieved via event.getExecution(). + * + * CMMN — There is no PLAN_ITEM_INSTANCE_STARTED event. Instead, when a plan + * item instance transitions to the ACTIVE state, the base entity manager + * calls update(), which dispatches ENTITY_UPDATED carrying the + * PlanItemInstanceEntity (implements DelegatePlanItemInstance). + * We bind the scope when the state is "active" and clear it when the + * state reaches a terminal value. + */ +@Component("varUtils") +public class VarUtils implements FlowableEventListener, SmartInitializingSingleton { + + private static final Logger LOGGER = LoggerFactory.getLogger(VarUtils.class); + + private static final ThreadLocal SCOPE = new ThreadLocal<>(); + + private static final ObjectMapper MAPPER; + static { + MAPPER = new ObjectMapper(); + MAPPER.registerModule(new JavaTimeModule()); + MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + @Autowired(required = false) + private ProcessEngineConfiguration processEngineConfiguration; + + @Autowired(required = false) + private CmmnEngineConfiguration cmmnEngineConfiguration; + + @Autowired(required = false) + private RuntimeService runtimeService; + + @Autowired(required = false) + private CmmnRuntimeService cmmnRuntimeService; + + // ------------------------------------------------------------------------- + // Listener registration — runs after all beans are ready + // ------------------------------------------------------------------------- + + @Override + public void afterSingletonsInstantiated() { + if (processEngineConfiguration != null) { + processEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on BPMN event dispatcher"); + } + if (cmmnEngineConfiguration != null) { + cmmnEngineConfiguration.getEventDispatcher().addEventListener(this); + LOGGER.debug("varUtils registered on CMMN event dispatcher"); + } + } + + // ------------------------------------------------------------------------- + // FlowableEventListener — bind / unbind the scope ThreadLocal + // ------------------------------------------------------------------------- + + @Override + public void onEvent(FlowableEvent event) { + + if (event instanceof FlowableEngineEntityEvent entityEvent) { + String typeName = event.getType().name(); + Object entity = entityEvent.getEntity(); + + // BPMN execution + if (entity instanceof ExecutionEntity execution) { + switch (typeName) { + case "PROCESS_STARTED" -> SCOPE.set(execution); + case "PROCESS_CANCELLED", + "PROCESS_COMPLETED", + "PROCESS_COMPLETED_WITH_ERROR_END_EVENT", + "PROCESS_COMPLETED_WITH_ESCALATION_END_EVENT", + "PROCESS_COMPLETED_WITH_TERMINATE_END_EVENT" -> SCOPE.remove(); + + } + return; + } + + // CMMN case instance itself + if (entity instanceof CaseInstanceEntity caseInstance) { + if ("CASE_STARTED".equals(typeName)) + SCOPE.set(caseInstance); + else if ("CASE_ENDED".equals(typeName)) + SCOPE.remove(); + } + } + } + + @Override public boolean isFailOnException() { return false; } + @Override public boolean isFireOnTransactionLifecycleEvent() { return false; } + @Override public String getOnTransaction() { return null; } + + // ------------------------------------------------------------------------- + // Public API — called from Flowable expressions + // ------------------------------------------------------------------------- + + /** + * Returns the value at the given dot-separated path within the current + * variable scope. Supports Maps, Lists (integer index), Jackson JsonNodes, + * and POJOs (getter or field). Returns null for any missing segment. + * + * ${varUtils.get('order.customer.name')} + * ${varUtils.get('order.lines.0.price')} + */ + public Object get(String path) { + VariableScope scope = currentScope("get"); + if (scope == null || path == null || path.isBlank()) return null; + return resolvePath(scope, path.trim(), this); + } + + /** + * Checks which of the given comma-separated variable paths changed since the + * last call and returns a JSON array describing each change. + * + * ${varUtils.track('root.oldValues', 'root.myString,status')} + * + * {@code snapshotPath} is a dot-notation path (supports the {@code root.} prefix) + * pointing to where the previous-values snapshot is stored and updated. + * + * Returns [] on the first call (baseline snapshot recorded). + * Each subsequent call compares against the previous snapshot and updates it. + * + * Example return value: + * [{"path":"root.myString","oldValue":"a","newValue":"b"}] + */ + public String track(String snapshotPath, String pathsCsv) { + VariableScope scope = currentScope("track"); + if (scope == null || snapshotPath == null || snapshotPath.isBlank() + || pathsCsv == null || pathsCsv.isBlank()) return "[]"; + + List paths = Arrays.stream(pathsCsv.split(",")) + .map(String::trim).filter(s -> !s.isEmpty()).toList(); + + Map previous = loadSnapshot(scope, snapshotPath); + Map current = new HashMap<>(); + ArrayNode changes = MAPPER.createArrayNode(); + + for (String path : paths) { + JsonNode value = toJson(resolvePath(scope, path, this)); + current.put(path, value); + + if (previous.isEmpty()) continue; // first call — baseline only + + JsonNode prev = previous.getOrDefault(path, MAPPER.nullNode()); + if (!prev.equals(value)) { + ObjectNode change = MAPPER.createObjectNode(); + change.put("path", path); + change.set("oldValue", prev); + change.set("newValue", value); + changes.add(change); + } + } + + saveSnapshot(scope, snapshotPath, current); + + try { + return MAPPER.writeValueAsString(changes); + } catch (Exception e) { + LOGGER.error("varUtils.track: failed to serialize changes", e); + return "[]"; + } + } + + // ------------------------------------------------------------------------- + // Path resolution + // ------------------------------------------------------------------------- + + /** + * Resolves a dot-separated path against the current scope. + * + * If the first segment is the reserved word {@code root}, the entire call + * hierarchy is climbed until no parent can be found; the next segment is + * then used as the variable name at that topmost scope. + * + * root.myString → topmost scope, variable "myString" + * root.myObj.field → topmost scope, variable "myObj", then navigate to "field" + * order.customer.name → current scope, variable "order", navigate normally + */ + private static Object resolvePath(VariableScope scope, String path, VarUtils self) { + String[] segments = path.split("\\.", -1); + Object current; + int startIdx; + + if ("root".equals(segments[0])) { + if (segments.length < 2) return null; + // climb all the way up, then get the variable named by segments[1] + current = self.getFromRootScope(scope, segments[1]); + startIdx = 2; + } else { + current = scope.getVariable(segments[0]); + startIdx = 1; + } + + for (int i = startIdx; i < segments.length; i++) { + if (current == null) return null; + current = step(current, segments[i]); + } + return current; + } + + /** Climbs to the topmost ancestor scope and returns the named variable from there. */ + private Object getFromRootScope(VariableScope scope, String varName) { + if (scope instanceof DelegateExecution ex && runtimeService != null) + return getFromBpmnRoot(ex.getProcessInstanceId(), varName); + if (scope instanceof CaseInstance ci && cmmnRuntimeService != null) + return getFromCmmnRoot(ci.getId(), varName); + return null; + } + + /** + * Climbs the hierarchy from a BPMN process instance toward the root. + * Parent links: + * getSuperExecutionId() → launched via Call Activity (parent is BPMN) + * getCallbackId/Type() → launched via Case Task (parent is CMMN) + * When no parent exists this IS the root; the variable is fetched here. + */ + private Object getFromBpmnRoot(String processInstanceId, String varName) { + if (processInstanceId == null || runtimeService == null) return null; + try { + // Parent via Call Activity (BPMN → BPMN) + Execution piExec = runtimeService.createExecutionQuery() + .executionId(processInstanceId).singleResult(); + if (piExec != null && piExec.getSuperExecutionId() != null) { + Execution superExec = runtimeService.createExecutionQuery() + .executionId(piExec.getSuperExecutionId()).singleResult(); + if (superExec != null) + return getFromBpmnRoot(superExec.getProcessInstanceId(), varName); + } + + // Parent via Case Task (CMMN → BPMN): callbackId = plan item instance id + ProcessInstance pi = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).singleResult(); + if (pi != null && pi.getCallbackType() != null && pi.getCallbackId() != null + && cmmnRuntimeService != null) { + PlanItemInstance planItem = cmmnRuntimeService.createPlanItemInstanceQuery() + .planItemInstanceId(pi.getCallbackId()).singleResult(); + if (planItem != null) + return getFromCmmnRoot(planItem.getCaseInstanceId(), varName); + } + + // No parent reachable — this is the root BPMN process instance + return runtimeService.getVariable(processInstanceId, varName); + } catch (Exception e) { + LOGGER.debug("varUtils: BPMN root climb failed for '{}': {}", varName, e.getMessage()); + return null; + } + } + + /** + * Climbs the hierarchy from a CMMN case instance toward the root. + * Parent links: + * getParentId() → launched via Case Task in another case (parent is CMMN) + * getCallbackId/Type() → launched via Case Task in a process (parent is BPMN) + * When no parent exists this IS the root; the variable is fetched here. + */ + private Object getFromCmmnRoot(String caseInstanceId, String varName) { + if (caseInstanceId == null || cmmnRuntimeService == null) return null; + try { + CaseInstance ci = cmmnRuntimeService.createCaseInstanceQuery() + .caseInstanceId(caseInstanceId).singleResult(); + if (ci == null) return null; + + // Parent via Case Task in another case (CMMN → CMMN) + if (ci.getParentId() != null) + return getFromCmmnRoot(ci.getParentId(), varName); + + // Parent via Case Task in a process (BPMN → CMMN): callbackId = execution id + if (ci.getCallbackType() != null && ci.getCallbackId() != null + && runtimeService != null) { + Execution callbackExec = runtimeService.createExecutionQuery() + .executionId(ci.getCallbackId()).singleResult(); + if (callbackExec != null) + return getFromBpmnRoot(callbackExec.getProcessInstanceId(), varName); + } + + // No parent reachable — this is the root CMMN case instance + return cmmnRuntimeService.getVariable(caseInstanceId, varName); + } catch (Exception e) { + LOGGER.debug("varUtils: CMMN root climb failed for '{}': {}", varName, e.getMessage()); + return null; + } + } + + @SuppressWarnings("unchecked") + private static Object step(Object obj, String segment) { + if (obj instanceof List list) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < list.size() ? list.get(i) : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Object[] arr) { + try { + int i = Integer.parseInt(segment); + return i >= 0 && i < arr.length ? arr[i] : null; + } catch (NumberFormatException ignored) {} + } + if (obj instanceof Map map) return map.get(segment); + if (obj instanceof JsonNode jn) { + JsonNode node = jn.get(segment); + if (node == null || node.isNull()) return null; + if (node.isTextual()) return node.asText(); + if (node.isBoolean()) return node.asBoolean(); + if (node.isLong()) return node.asLong(); + if (node.isInt()) return node.asInt(); + if (node.isDouble()) return node.asDouble(); + return node; + } + String cap = Character.toUpperCase(segment.charAt(0)) + segment.substring(1); + try { return obj.getClass().getMethod("get" + cap).invoke(obj); } catch (Exception ignored) {} + try { return obj.getClass().getMethod("is" + cap).invoke(obj); } catch (Exception ignored) {} + try { + java.lang.reflect.Field f = findField(obj.getClass(), segment); + if (f != null) { f.setAccessible(true); return f.get(obj); } + } catch (Exception ignored) {} + LOGGER.warn("varUtils: cannot resolve '{}' on {}", segment, obj.getClass().getName()); + return null; + } + + private static java.lang.reflect.Field findField(Class c, String name) { + while (c != null && c != Object.class) { + try { return c.getDeclaredField(name); } + catch (NoSuchFieldException e) { c = c.getSuperclass(); } + } + return null; + } + + // ------------------------------------------------------------------------- + // Snapshot persistence + // ------------------------------------------------------------------------- + + private Map loadSnapshot(VariableScope scope, String path) { + Object raw = resolvePath(scope, path, this); + if (raw == null) return new HashMap<>(); + try { + String json = raw instanceof String s ? s : MAPPER.writeValueAsString(raw); + Map flat = MAPPER.readValue(json, + MAPPER.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); + Map result = new HashMap<>(); + flat.forEach((k, v) -> result.put(k, toJson(v))); + return result; + } catch (Exception e) { + LOGGER.warn("varUtils: could not load snapshot at '{}': {}", path, e.getMessage()); + return new HashMap<>(); + } + } + + private void saveSnapshot(VariableScope scope, String path, Map snapshot) { + try { + writeToPath(scope, path, MAPPER.writeValueAsString(snapshot)); + } catch (Exception e) { + LOGGER.error("varUtils: could not save snapshot at '{}'", path, e); + } + } + + /** + * Writes {@code value} to the location described by {@code path}. + * Supports the {@code root.} prefix (climbs to the topmost ancestor scope). + * Only single-segment variable names are supported after the optional prefix. + */ + private void writeToPath(VariableScope scope, String path, Object value) { + String[] parts = path.split("\\.", 2); + if (parts.length == 2 && "root".equals(parts[0])) { + if (scope instanceof DelegateExecution ex && runtimeService != null) + setAtBpmnRoot(ex.getProcessInstanceId(), parts[1], value); + else if (scope instanceof CaseInstance ci && cmmnRuntimeService != null) + setAtCmmnRoot(ci.getId(), parts[1], value); + } else { + scope.setVariable(parts[0], value); + } + } + + /** Climbs to the root BPMN process instance and sets the variable there. */ + private void setAtBpmnRoot(String processInstanceId, String varName, Object value) { + if (processInstanceId == null || runtimeService == null) return; + try { + Execution piExec = runtimeService.createExecutionQuery() + .executionId(processInstanceId).singleResult(); + if (piExec != null && piExec.getSuperExecutionId() != null) { + Execution superExec = runtimeService.createExecutionQuery() + .executionId(piExec.getSuperExecutionId()).singleResult(); + if (superExec != null) { setAtBpmnRoot(superExec.getProcessInstanceId(), varName, value); return; } + } + ProcessInstance pi = runtimeService.createProcessInstanceQuery() + .processInstanceId(processInstanceId).singleResult(); + if (pi != null && pi.getCallbackType() != null && pi.getCallbackId() != null + && cmmnRuntimeService != null) { + PlanItemInstance planItem = cmmnRuntimeService.createPlanItemInstanceQuery() + .planItemInstanceId(pi.getCallbackId()).singleResult(); + if (planItem != null) { setAtCmmnRoot(planItem.getCaseInstanceId(), varName, value); return; } + } + runtimeService.setVariable(processInstanceId, varName, value); + } catch (Exception e) { + LOGGER.debug("varUtils: BPMN root write failed for '{}': {}", varName, e.getMessage()); + } + } + + /** Climbs to the root CMMN case instance and sets the variable there. */ + private void setAtCmmnRoot(String caseInstanceId, String varName, Object value) { + if (caseInstanceId == null || cmmnRuntimeService == null) return; + try { + CaseInstance ci = cmmnRuntimeService.createCaseInstanceQuery() + .caseInstanceId(caseInstanceId).singleResult(); + if (ci == null) return; + if (ci.getParentId() != null) { setAtCmmnRoot(ci.getParentId(), varName, value); return; } + if (ci.getCallbackType() != null && ci.getCallbackId() != null + && runtimeService != null) { + Execution callbackExec = runtimeService.createExecutionQuery() + .executionId(ci.getCallbackId()).singleResult(); + if (callbackExec != null) { setAtBpmnRoot(callbackExec.getProcessInstanceId(), varName, value); return; } + } + cmmnRuntimeService.setVariable(caseInstanceId, varName, value); + } catch (Exception e) { + LOGGER.debug("varUtils: CMMN root write failed for '{}': {}", varName, e.getMessage()); + } + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private VariableScope currentScope(String method) { + VariableScope scope = SCOPE.get(); + if (scope == null) { + LOGGER.error("varUtils.{}() called without an active Flowable scope — " + + "is VarUtils registered on the engine event dispatcher?", method); + } + return scope; + } + + private static JsonNode toJson(Object value) { + if (value == null) return MAPPER.nullNode(); + if (value instanceof JsonNode jn) return jn; + return MAPPER.valueToTree(value); + } +} diff --git a/tmp/VariableGetPathFunction02.java b/tmp/VariableGetPathFunction02.java new file mode 100644 index 0000000..6910542 --- /dev/null +++ b/tmp/VariableGetPathFunction02.java @@ -0,0 +1,141 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import org.flowable.common.engine.api.variable.VariableContainer; +import org.flowable.common.engine.impl.el.function.AbstractFlowableVariableExpressionFunction; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +/** + * Flowable EL function delegate that reads a variable by dot-separated path. + * Works in both BPMN processes and CMMN cases without any explicit scope parameter. + * + * Flowable's AbstractFlowableVariableExpressionFunction automatically injects the + * current VariableContainer (execution / planItemInstance / caseInstance) as the + * first argument before the expression is evaluated, so no ThreadLocal or listener + * is required. + * + * Registered automatically by Flowable's Spring Boot integration when it finds a + * FlowableFunctionDelegate bean in the application context. + * + * Usage in a Flowable backend expression (prefixes var / vars / variables all work): + * ${var:getPath('myVar')} + * ${var:getPath('order.customer.name')} + * ${var:getPath('order.lines.0.price')} ← list index by position + * + * Path resolution per segment: + * - java.util.List / array → integer index (e.g. "2") + * - java.util.Map → key lookup + * - Jackson JsonNode → field lookup, scalar nodes unwrapped to Java types + * - POJO → public getter (getX / isX) or field, superclass included + * + * Returns null when any segment along the path does not exist. + */ +@Component +public class VariableGetPathFunction extends AbstractFlowableVariableExpressionFunction { + + public VariableGetPathFunction() { + super(List.of("getPath"), "getPath"); + } + + /** + * Called by Flowable's EL engine. The {@code container} is injected automatically; + * {@code path} is the dot-separated path string supplied in the expression. + */ + public static Object getPath(VariableContainer container, String path) { + if (container == null || path == null || path.isBlank()) { + return null; + } + + String[] segments = path.split("\\.", -1); + Object current = container.getVariable(segments[0]); + + for (int i = 1; i < segments.length; i++) { + if (current == null) { + return null; + } + current = step(current, segments[i]); + } + + return current; + } + + // ------------------------------------------------------------------------- + // Path navigation + // ------------------------------------------------------------------------- + + @SuppressWarnings("unchecked") + private static Object step(Object obj, String segment) { + + // List / array index + if (obj instanceof List list) { + try { + int idx = Integer.parseInt(segment); + return (idx >= 0 && idx < list.size()) ? list.get(idx) : null; + } catch (NumberFormatException ignored) { + } + } + if (obj instanceof Object[] arr) { + try { + int idx = Integer.parseInt(segment); + return (idx >= 0 && idx < arr.length) ? arr[idx] : null; + } catch (NumberFormatException ignored) { + } + } + + // Map key lookup + if (obj instanceof Map map) { + return map.get(segment); + } + + // Jackson JsonNode — unwrap scalar nodes to plain Java values + if (obj instanceof JsonNode jn) { + JsonNode node = jn.get(segment); + if (node == null || node.isNull()) return null; + if (node.isTextual()) return node.asText(); + if (node.isBoolean()) return node.asBoolean(); + if (node.isLong()) return node.asLong(); + if (node.isInt()) return node.asInt(); + if (node.isDouble()) return node.asDouble(); + return node; + } + + // POJO: try getter (getX / isX), then field with superclass walk + try { + Method m = obj.getClass().getMethod( + "get" + Character.toUpperCase(segment.charAt(0)) + segment.substring(1)); + return m.invoke(obj); + } catch (Exception ignored) { + } + try { + Method m = obj.getClass().getMethod( + "is" + Character.toUpperCase(segment.charAt(0)) + segment.substring(1)); + return m.invoke(obj); + } catch (Exception ignored) { + } + try { + java.lang.reflect.Field f = findField(obj.getClass(), segment); + if (f != null) { + f.setAccessible(true); + return f.get(obj); + } + } catch (Exception ignored) { + } + + return null; + } + + private static java.lang.reflect.Field findField(Class clazz, String name) { + while (clazz != null && clazz != Object.class) { + try { + return clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + return null; + } +} diff --git a/tmp/VariableTrackerComponent01.java b/tmp/VariableTrackerComponent01.java new file mode 100644 index 0000000..9a252bb --- /dev/null +++ b/tmp/VariableTrackerComponent01.java @@ -0,0 +1,228 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.flowable.engine.delegate.DelegateExecution; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Flowable Spring Boot component for tracking process variable changes across calls. + * + * Usage in Flowable expression: + * ${variableTracker.track(execution, 'order.customer.name,order.total,status')} + * + * Returns a JSON string with an array of changed variables, each entry containing: + * { "path": "order.customer.name", "oldValue": "Alice", "newValue": "Bob" } + * + * State (the snapshot of previous values) is stored as a process variable keyed by + * SNAPSHOT_VAR_PREFIX + the provided paths string, so independent track() calls + * with different path sets do not interfere with each other. + */ +@Component("variableTracker") +public class VariableTrackerComponent { + + private static final Logger LOGGER = LoggerFactory.getLogger(VariableTrackerComponent.class); + private static final String SNAPSHOT_VAR_PREFIX = "__vartracker__"; + + private final ObjectMapper objectMapper; + + public VariableTrackerComponent() { + this.objectMapper = new ObjectMapper(); + this.objectMapper.registerModule(new JavaTimeModule()); + this.objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + /** + * Checks which of the given variable paths changed since the last call and returns + * a JSON array describing each change. + * + * @param execution the current Flowable execution context + * @param pathsCsv comma-separated variable paths, e.g. "order.total,status,user.address.city" + * @return JSON string — an array of { path, oldValue, newValue } objects for every changed path + */ + public String track(DelegateExecution execution, String pathsCsv) { + if (pathsCsv == null || pathsCsv.isBlank()) { + return "[]"; + } + + List paths = Arrays.stream(pathsCsv.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toList(); + + String snapshotKey = SNAPSHOT_VAR_PREFIX + pathsCsv.replaceAll("\\s+", ""); + Map previousSnapshot = loadSnapshot(execution, snapshotKey); + Map currentSnapshot = new HashMap<>(); + + ArrayNode changes = objectMapper.createArrayNode(); + + for (String path : paths) { + JsonNode currentValue = resolvePathToJson(execution, path); + currentSnapshot.put(path, currentValue); + + if (previousSnapshot.isEmpty()) { + // First call — record baseline, no changes reported + continue; + } + + JsonNode previousValue = previousSnapshot.getOrDefault(path, objectMapper.nullNode()); + if (!jsonEquals(previousValue, currentValue)) { + ObjectNode change = objectMapper.createObjectNode(); + change.put("path", path); + change.set("oldValue", previousValue); + change.set("newValue", currentValue); + changes.add(change); + } + } + + saveSnapshot(execution, snapshotKey, currentSnapshot); + + try { + return objectMapper.writeValueAsString(changes); + } catch (Exception e) { + LOGGER.error("Failed to serialize changes to JSON", e); + return "[]"; + } + } + + // ------------------------------------------------------------------------- + // Variable path resolution + // ------------------------------------------------------------------------- + + /** + * Resolves a dot-separated path against the execution's variables and returns + * the result as a JsonNode. The first segment is the top-level process variable + * name; subsequent segments navigate into the object graph. + */ + private JsonNode resolvePathToJson(DelegateExecution execution, String path) { + String[] segments = path.split("\\.", -1); + Object current = execution.getVariable(segments[0]); + + for (int i = 1; i < segments.length; i++) { + if (current == null) { + return objectMapper.nullNode(); + } + current = getProperty(current, segments[i]); + } + + return toJsonNode(current); + } + + /** + * Reads a named property from an object. Supports Maps, Jackson ObjectNodes, + * and plain Java objects (via public getter or public field). + */ + @SuppressWarnings("unchecked") + private Object getProperty(Object obj, String property) { + if (obj instanceof Map map) { + return map.get(property); + } + if (obj instanceof ObjectNode on) { + JsonNode node = on.get(property); + return node != null ? node : null; + } + if (obj instanceof JsonNode jn) { + JsonNode node = jn.get(property); + return node != null ? node : null; + } + // Reflection: try getter first, then field + try { + String getter = "get" + Character.toUpperCase(property.charAt(0)) + property.substring(1); + Method method = obj.getClass().getMethod(getter); + return method.invoke(obj); + } catch (Exception ignored) { + } + try { + String getter = "is" + Character.toUpperCase(property.charAt(0)) + property.substring(1); + Method method = obj.getClass().getMethod(getter); + return method.invoke(obj); + } catch (Exception ignored) { + } + try { + java.lang.reflect.Field field = findField(obj.getClass(), property); + if (field != null) { + field.setAccessible(true); + return field.get(obj); + } + } catch (Exception ignored) { + } + LOGGER.warn("Could not resolve property '{}' on {}", property, obj.getClass().getName()); + return null; + } + + private java.lang.reflect.Field findField(Class clazz, String name) { + while (clazz != null && clazz != Object.class) { + try { + return clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } + } + return null; + } + + // ------------------------------------------------------------------------- + // Snapshot persistence + // ------------------------------------------------------------------------- + + @SuppressWarnings("unchecked") + private Map loadSnapshot(DelegateExecution execution, String key) { + Object raw = execution.getVariable(key); + if (raw == null) { + return new HashMap<>(); + } + try { + String json = raw instanceof String s ? s : objectMapper.writeValueAsString(raw); + Map flat = objectMapper.readValue(json, + objectMapper.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); + Map result = new HashMap<>(); + for (Map.Entry entry : flat.entrySet()) { + result.put(entry.getKey(), toJsonNode(entry.getValue())); + } + return result; + } catch (Exception e) { + LOGGER.warn("Could not load variable tracker snapshot for key '{}': {}", key, e.getMessage()); + return new HashMap<>(); + } + } + + private void saveSnapshot(DelegateExecution execution, String key, Map snapshot) { + try { + execution.setVariable(key, objectMapper.writeValueAsString(snapshot)); + } catch (Exception e) { + LOGGER.error("Could not save variable tracker snapshot for key '{}'", key, e); + } + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private JsonNode toJsonNode(Object value) { + if (value == null) { + return objectMapper.nullNode(); + } + if (value instanceof JsonNode jn) { + return jn; + } + return objectMapper.valueToTree(value); + } + + private boolean jsonEquals(JsonNode a, JsonNode b) { + if (a == null && b == null) return true; + if (a == null || b == null) return false; + return a.equals(b); + } +} diff --git a/tmp/VariableTrackerComponent02.java b/tmp/VariableTrackerComponent02.java new file mode 100644 index 0000000..1e11d95 --- /dev/null +++ b/tmp/VariableTrackerComponent02.java @@ -0,0 +1,197 @@ +package com.customer.work.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.flowable.common.engine.api.variable.VariableContainer; +import org.flowable.common.engine.impl.el.function.AbstractFlowableVariableExpressionFunction; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Flowable EL function delegate that tracks process / case variable changes across calls. + * Works in both BPMN processes and CMMN cases without any explicit scope parameter. + * + * Flowable's AbstractFlowableVariableExpressionFunction automatically injects the current + * VariableContainer as the first argument, so no ThreadLocal, listener, or auto-config + * is required. Registered automatically when Flowable finds a FlowableFunctionDelegate + * bean in the application context. + * + * Usage in a Flowable backend expression (prefixes var / vars / variables all work): + * ${var:track('order.customer.name,order.total,status')} + * + * Returns a JSON string with an array of entries for every changed variable: + * [{ "path": "order.total", "oldValue": 100, "newValue": 150 }, ...] + * + * The first call records a baseline snapshot and returns []. + * Subsequent calls compare current values against that baseline and update it. + * The snapshot is stored inside the variable scope under a hidden key so it persists + * across activity boundaries within the same process / case instance. + */ +@Component +public class VariableTrackerComponent extends AbstractFlowableVariableExpressionFunction { + + private static final Logger LOGGER = LoggerFactory.getLogger(VariableTrackerComponent.class); + private static final String SNAPSHOT_PREFIX = "__vartracker__"; + + // ObjectMapper is thread-safe after construction + private static final ObjectMapper MAPPER; + static { + MAPPER = new ObjectMapper(); + MAPPER.registerModule(new JavaTimeModule()); + MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + } + + public VariableTrackerComponent() { + super(List.of("track"), "track"); + } + + // ------------------------------------------------------------------------- + // EL function — called by Flowable's expression engine + // ------------------------------------------------------------------------- + + /** + * {@code container} is injected automatically by Flowable's AST rewriter. + * {@code pathsCsv} is the comma-separated path string from the expression. + */ + public static String track(VariableContainer container, String pathsCsv) { + if (container == null || pathsCsv == null || pathsCsv.isBlank()) { + return "[]"; + } + + List paths = Arrays.stream(pathsCsv.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toList(); + + String snapshotKey = SNAPSHOT_PREFIX + pathsCsv.replaceAll("\\s+", ""); + Map previous = loadSnapshot(container, snapshotKey); + Map current = new HashMap<>(); + + ArrayNode changes = MAPPER.createArrayNode(); + + for (String path : paths) { + JsonNode value = resolveToJson(container, path); + current.put(path, value); + + if (previous.isEmpty()) { + continue; // first call — record baseline only, report nothing + } + + JsonNode prev = previous.getOrDefault(path, MAPPER.nullNode()); + if (!prev.equals(value)) { + ObjectNode change = MAPPER.createObjectNode(); + change.put("path", path); + change.set("oldValue", prev); + change.set("newValue", value); + changes.add(change); + } + } + + saveSnapshot(container, snapshotKey, current); + + try { + return MAPPER.writeValueAsString(changes); + } catch (Exception e) { + LOGGER.error("Failed to serialize variable changes", e); + return "[]"; + } + } + + // ------------------------------------------------------------------------- + // Path resolution + // ------------------------------------------------------------------------- + + private static JsonNode resolveToJson(VariableContainer container, String path) { + String[] segments = path.split("\\.", -1); + Object current = container.getVariable(segments[0]); + + for (int i = 1; i < segments.length; i++) { + if (current == null) return MAPPER.nullNode(); + current = step(current, segments[i]); + } + + return toJson(current); + } + + @SuppressWarnings("unchecked") + private static Object step(Object obj, String segment) { + if (obj instanceof List list) { + try { int i = Integer.parseInt(segment); return i >= 0 && i < list.size() ? list.get(i) : null; } + catch (NumberFormatException ignored) {} + } + if (obj instanceof Object[] arr) { + try { int i = Integer.parseInt(segment); return i >= 0 && i < arr.length ? arr[i] : null; } + catch (NumberFormatException ignored) {} + } + if (obj instanceof Map map) return map.get(segment); + if (obj instanceof JsonNode jn) return jn.get(segment); + + // POJO: getter then field + try { return obj.getClass().getMethod("get" + cap(segment)).invoke(obj); } catch (Exception ignored) {} + try { return obj.getClass().getMethod("is" + cap(segment)).invoke(obj); } catch (Exception ignored) {} + try { + java.lang.reflect.Field f = findField(obj.getClass(), segment); + if (f != null) { f.setAccessible(true); return f.get(obj); } + } catch (Exception ignored) {} + + LOGGER.warn("variableTracker: cannot resolve segment '{}' on {}", segment, obj.getClass().getName()); + return null; + } + + private static String cap(String s) { + return Character.toUpperCase(s.charAt(0)) + s.substring(1); + } + + private static java.lang.reflect.Field findField(Class clazz, String name) { + while (clazz != null && clazz != Object.class) { + try { return clazz.getDeclaredField(name); } + catch (NoSuchFieldException e) { clazz = clazz.getSuperclass(); } + } + return null; + } + + // ------------------------------------------------------------------------- + // Snapshot persistence inside the variable scope + // ------------------------------------------------------------------------- + + private static Map loadSnapshot(VariableContainer container, String key) { + Object raw = container.getVariable(key); + if (raw == null) return new HashMap<>(); + try { + String json = raw instanceof String s ? s : MAPPER.writeValueAsString(raw); + Map flat = MAPPER.readValue(json, + MAPPER.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class)); + Map result = new HashMap<>(); + flat.forEach((k, v) -> result.put(k, toJson(v))); + return result; + } catch (Exception e) { + LOGGER.warn("variableTracker: could not load snapshot '{}': {}", key, e.getMessage()); + return new HashMap<>(); + } + } + + private static void saveSnapshot(VariableContainer container, String key, Map snapshot) { + try { + container.setVariable(key, MAPPER.writeValueAsString(snapshot)); + } catch (Exception e) { + LOGGER.error("variableTracker: could not save snapshot '{}'", key, e); + } + } + + private static JsonNode toJson(Object value) { + if (value == null) return MAPPER.nullNode(); + if (value instanceof JsonNode jn) return jn; + return MAPPER.valueToTree(value); + } +} diff --git a/tmp/hello-world-form.form b/tmp/hello-world-form.form new file mode 100644 index 0000000..8ea125a --- /dev/null +++ b/tmp/hello-world-form.form @@ -0,0 +1,27 @@ +{ + "key": "hello-world-form", + "name": "Hello World Form", + "fields": [ + { + "fieldType": "FormField", + "id": "helloField", + "name": "Hello", + "type": "text", + "value": "hello", + "required": false, + "readOnly": false, + "overrideId": false + }, + { + "fieldType": "FormField", + "id": "claudeField", + "name": "Claude", + "type": "text", + "value": "claude", + "required": false, + "readOnly": false, + "overrideId": false + } + ], + "outcomes": [] +} \ No newline at end of file diff --git a/tmp/new.json b/tmp/new.json new file mode 100644 index 0000000..de06a6a --- /dev/null +++ b/tmp/new.json @@ -0,0 +1,64 @@ +http://localhost:8105/action-api/action-repository/action-definitions/key/GKB_A003?formId=FRM-ce76b8bf-27a5-11f1-8af0-3ead6594277e&formFieldId=GKB_F004_work-action1 + +http://localhost:8105/#/work/assignee/case/CAS-6d2e2764-325b-11f1-9ab1-3aee1b292dd9 +#/work/assignee/case/{{$response.executionPayload.id}} + +http://localhost:8105/platform-api/channel-definitions/key/DCL_CH002/events + + +{{endpoints.platform}}/search/query-case-instances/query/DCL_Q001?start={{$start}}&size={{$pageSize}}&sort={{$sort || 'startTime&order=desc'}}&{{$filter}} +{{endpoints.platform}}/search/query-case-instances/query/DCL_Q001?caseDefinitionKey=DCL_C001&start={{$start}}&size={{$pageSize}}&sort={{$sort || 'startTime&order=desc'}}&{{$filter}} + +{{endpoints.platform}}/search/query-case-instances/query/DCL_Q001?caseDefinitionKey=DCL_C009&start={{$start}}&size={{$pageSize}}&sort={{$sort || 'startTime&order=desc'}}&{{$filter}} + +${var:eq(payload.startOnHold, true) ? 'hold' : 'sign'} + +http://localhost:8105/action-api/action-repository/action-definitions/AEN-ef8bdf0f-27ae-11f1-ba38-3ead6594277e/execute?scopeId=CAS-5b051448-3740-11f1-81d8-1eb9efb927bf&scopeType=cmmn + +- ${json:addToArray(jsonArray, json:object())} +${json:object()} + +${flw.format.formatString('Content %d' , root.versionNum)} + +${root.versions.size() < root.versionNum ? json:addToArray(root.versions, json:object()) : null} + +${cmmnRuntimeService.updateBusinessStatus(root.id, root.versions[root.versionIndex].)} + +${verifyDecision == 'verified' ? cmmnRuntimeService.updateBusinessStatus(root.id, 'verified') : cmmnRuntimeService.updateBusinessStatus(root.id, 'rejected')} + +root.versions[root.versionIndex] + +${root.businessStatus == 'verified' || root.businessStatus == 'verify'} + +${propertyConfigurationService.getProperty('baseUrl', 'baseUrl')} +${''.join('/', myBaseUrl, '#/work/assignee/case', root.id, 'task', myTaskId)} + +${myBaseUrl}/#/work/assignee/case/${root.id}/task/myTaskId + +${myBaseUrl}/#/work/assignee/case/${root.id}/task/${myTaskId} + +http://localhost:8105/platform-api/process-instances?includeTranslations=true&createTestDefinition=false&includeNextTaskInfo=true + + +Document Generation V${root.versionIndex}: ${root.versions[root.versionIndex].documentGeneration} +Verify V${root.versionIndex} +Released V${root.versionIndex} + +Verify Decision [${root.versionIndex}]: ${verifyDecision} - Overtime Selection: ${overtimeSelection} + +${root.versions[root.versionIndex].documentGeneration} + +Document Generation [${root.versionIndex}]: ${root.versions[root.versionIndex].documentGeneration} + +Sign Decision [${root.versionIndex}]: ${signDecision} - Overtime Selection: ${overtimeSelection} + +${root.versions[root.versionIndex].workOvertime} + +Print Contract [${root.versionIndex}] + +{{endpoints.platform}}/search/query-case-instances/query/DCL_Q001?caseDefinitionKey=DCL_C135&start={{$start}}&size={{$pageSize}}&sort={{$sort || 'startTime&order=desc'}}&{{$filter}} + + +{{endpoints.platform}}/search/query-process-instances/query/subitemProcessQuery?processDefinitionKey=subitemSubprocess&start={{$start}}&size={{$pageSize}}&sort={{$sort || 'startTime&order=desc'}}&{{$filter}} + + diff --git a/tmp/pom-nok.xml b/tmp/pom-nok.xml new file mode 100644 index 0000000..8baf182 --- /dev/null +++ b/tmp/pom-nok.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + + com.flowable + flowable-parent + 0.0.1-SNAPSHOT + + + com.flowable + flowable-work + 0.0.1-SNAPSHOT + flowable-work + flowable-work + + + + + + + + + + + + + + + + + com.flowable.inspect + flowable-spring-boot-starter-inspect-rest + + + com.flowable.platform + flowable-platform-default-models + + + com.flowable.platform + flowable-spring-boot-starter-platform-rest + + + com.flowable.platform + flowable-tenant-setup + + + + com.h2database + h2 + runtime + + + org.postgresql + postgresql + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + com.flowable + flowable-platform-bom + ${com.flowable.platform.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/tmp/pom-ok.xml b/tmp/pom-ok.xml new file mode 100644 index 0000000..e7d1852 --- /dev/null +++ b/tmp/pom-ok.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + + com.flowable + flowable-parent + 0.0.1-SNAPSHOT + + + com.flowable + flowable-work + 0.0.1-SNAPSHOT + flowable-work + Work 2025.2 + + + + + + + + + + + + + + + 21 + 2025.2.02 + + + + com.flowable.platform + flowable-platform-default-models + + + com.flowable.platform + flowable-spring-boot-starter-platform-rest + + + com.flowable.platform + flowable-tenant-setup + + + com.flowable.work + flowable-work-frontend + + + + com.h2database + h2 + runtime + + + org.postgresql + postgresql + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + com.flowable + flowable-platform-bom + ${com.flowable.platform.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + +