From 7a8fbbee76e5fe5360df8d5085361fb8211a39bd Mon Sep 17 00:00:00 2001 From: Jonathan Lukas Date: Tue, 4 Jun 2024 13:54:58 +0200 Subject: [PATCH] refactor --- .github/workflows/maven-build.yml | 31 ++ .github/workflows/maven-release.yml | 4 +- README.md | 7 +- .../rest/client/springboot/CamundaApi.java | 340 +++++++++--------- .../CamundaAutodeploymentProperties.java | 52 +++ .../client/springboot/CamundaHistoryApi.java | 159 ++++---- .../springboot/CamundaOpenApiStarter.java | 26 +- .../CamundaProcessAutodeployment.java | 163 ++++----- .../src/main/resources/application.yaml | 7 + .../rest/client/springboot/AppTest.java | 19 +- .../springboot/LegacyPropertiesTest.java | 31 ++ pom.xml | 128 +++++++ 12 files changed, 612 insertions(+), 355 deletions(-) create mode 100644 .github/workflows/maven-build.yml create mode 100644 camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaAutodeploymentProperties.java create mode 100644 camunda-engine-rest-client-openapi-springboot/src/main/resources/application.yaml create mode 100644 camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/LegacyPropertiesTest.java diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml new file mode 100644 index 0000000..96a353f --- /dev/null +++ b/.github/workflows/maven-build.yml @@ -0,0 +1,31 @@ +name: CI +on: [ pull_request, workflow_dispatch ] +jobs: + Build: + runs-on: ubuntu-latest + permissions: + checks: write + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + cache: 'maven' + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build + run: mvn verify -PcheckFormat -B + - name: Publish Unit Test Results + id: publish + uses: EnricoMi/publish-unit-test-result-action@v2 + if: always() + with: + files: '**/target/surefire-reports/*.xml' \ No newline at end of file diff --git a/.github/workflows/maven-release.yml b/.github/workflows/maven-release.yml index f9ce8b9..c2f3346 100644 --- a/.github/workflows/maven-release.yml +++ b/.github/workflows/maven-release.yml @@ -9,9 +9,9 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Java environment - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 17 distribution: temurin diff --git a/README.md b/README.md index 6236e41..5cad6cb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![](https://img.shields.io/badge/Community%20Extension-An%20open%20source%20community%20maintained%20project-FF4700)](https://github.com/camunda-community-hub/community) [![](https://img.shields.io/badge/Lifecycle-Incubating-blue)](https://github.com/Camunda-Community-Hub/community/blob/main/extension-lifecycle.md#incubating-) ![Compatible with: Camunda Platform 7](https://img.shields.io/badge/Compatible%20with-Camunda%20Platform%207-26d07c) -This community extension is a convenience wrapper around the generated Java client from the Camunda Platform 7.x OpenAPI spec. +This community extension is a convenience wrapper around the generated Java client from the Camunda Platform 7.x OpenAPI spec. ## Example application @@ -58,7 +58,7 @@ For convenience, there is also a Spring Boot Starter, that * Wires the ApiClient and provide all API's * Autodeploys all BPMN, DMN and form resources it finds on the classpath during startup. -Add this dependency: +Add this dependency: ``` @@ -110,7 +110,7 @@ You can disable auto deployment (which is enabled by default): camunda.autoDeploy.enabled: false ``` -If you want to disable service start failure if it fails during deployment of the resource (which is enabled by default): +If you want to disable service start failure if it fails during deployment of the resource (which is enabled by default): ``` camunda.autoDeploy.failStartupOnError: false ``` @@ -142,4 +142,3 @@ public class ExampleCheckNumberWorker implements ExternalTaskHandler { externalTaskService.complete(externalTask); } ``` - diff --git a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaApi.java b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaApi.java index 0d64e56..316a1c4 100644 --- a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaApi.java +++ b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaApi.java @@ -1,181 +1,181 @@ package org.camunda.community.rest.client.springboot; - import org.camunda.community.rest.client.api.*; import org.camunda.community.rest.client.invoker.ApiClient; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; @AutoConfiguration public class CamundaApi { - @Autowired - private ApiClient apiClient; - - @Bean - public AuthorizationApi authorizationApi() { - return new AuthorizationApi(apiClient); - } - - @Bean - public BatchApi batchApi() { - return new BatchApi(apiClient); - } - - @Bean - public ConditionApi conditionApi() { - return new ConditionApi(apiClient); - } - - @Bean - public DecisionDefinitionApi decisionDefinitionApi() { - return new DecisionDefinitionApi(apiClient); - } - - @Bean - public DecisionRequirementsDefinitionApi decisionRequirementsDefinitionApi() { - return new DecisionRequirementsDefinitionApi(apiClient); - } - - @Bean - public DeploymentApi deploymentApi() { - return new DeploymentApi(apiClient); - } - - @Bean - public EngineApi engineApi() { - return new EngineApi(apiClient); - } - - @Bean - public EventSubscriptionApi eventSubscriptionApi() { - return new EventSubscriptionApi(apiClient); - } - - @Bean - public ExecutionApi executionApi() { - return new ExecutionApi(apiClient); - } - - @Bean - public ExternalTaskApi externalTaskApi() { - return new ExternalTaskApi(apiClient); - } - - @Bean - public FilterApi filterApi() { - return new FilterApi(apiClient); - } - - @Bean - public GroupApi groupApi() { - return new GroupApi(apiClient); - } - - @Bean - public HistoryCleanupApi historyCleanupApi() { - return new HistoryCleanupApi(apiClient); - } - - @Bean - public IdentityApi identityApi() { - return new IdentityApi(apiClient); - } - - @Bean - public JobDefinitionApi jobDefinitionApi() { - return new JobDefinitionApi(apiClient); - } - - @Bean - public MessageApi messageApi() { - return new MessageApi(apiClient); - } - - @Bean - public MetricsApi metricsApi() { - return new MetricsApi(apiClient); - } - - @Bean - public MigrationApi migrationApi() { - return new MigrationApi(apiClient); - } - - @Bean - public ModificationApi modificationApi() { - return new ModificationApi(apiClient); - } - - @Bean - public ProcessDefinitionApi processDefinitionApi() { - return new ProcessDefinitionApi(apiClient); - } - - @Bean - public ProcessInstanceApi processInstanceApi() { - return new ProcessInstanceApi(apiClient); - } - - @Bean - public SchemaLogApi schemaLogApi() { - return new SchemaLogApi(apiClient); - } - - @Bean - public SignalApi signalApi() { - return new SignalApi(apiClient); - } - - @Bean - public TaskApi taskApi() { - return new TaskApi(apiClient); - } - - @Bean - public TaskAttachmentApi taskAttachmentApi() { - return new TaskAttachmentApi(apiClient); - } - - @Bean - public TaskCommentApi taskCommentApi() { - return new TaskCommentApi(apiClient); - } - - @Bean - public TaskIdentityLinkApi taskIdentityLinkApi() { - return new TaskIdentityLinkApi(apiClient); - } - - @Bean - public TaskLocalVariableApi taskLocalVariableApi() { - return new TaskLocalVariableApi(apiClient); - } - - @Bean - public TelemetryApi telemetryApi() { - return new TelemetryApi(apiClient); - } - - @Bean - public TenantApi tenantApi() { - return new TenantApi(apiClient); - } - - @Bean - public UserApi userApi() { - return new UserApi(apiClient); - } - - @Bean - public VariableInstanceApi variableInstanceApi() { - return new VariableInstanceApi(apiClient); - } - - @Bean - public VersionApi versionApi() { - return new VersionApi(apiClient); - } - + private final ApiClient apiClient; + + public CamundaApi(ApiClient apiClient) { + this.apiClient = apiClient; + } + + @Bean + public AuthorizationApi authorizationApi() { + return new AuthorizationApi(apiClient); + } + + @Bean + public BatchApi batchApi() { + return new BatchApi(apiClient); + } + + @Bean + public ConditionApi conditionApi() { + return new ConditionApi(apiClient); + } + + @Bean + public DecisionDefinitionApi decisionDefinitionApi() { + return new DecisionDefinitionApi(apiClient); + } + + @Bean + public DecisionRequirementsDefinitionApi decisionRequirementsDefinitionApi() { + return new DecisionRequirementsDefinitionApi(apiClient); + } + + @Bean + public DeploymentApi deploymentApi() { + return new DeploymentApi(apiClient); + } + + @Bean + public EngineApi engineApi() { + return new EngineApi(apiClient); + } + + @Bean + public EventSubscriptionApi eventSubscriptionApi() { + return new EventSubscriptionApi(apiClient); + } + + @Bean + public ExecutionApi executionApi() { + return new ExecutionApi(apiClient); + } + + @Bean + public ExternalTaskApi externalTaskApi() { + return new ExternalTaskApi(apiClient); + } + + @Bean + public FilterApi filterApi() { + return new FilterApi(apiClient); + } + + @Bean + public GroupApi groupApi() { + return new GroupApi(apiClient); + } + + @Bean + public HistoryCleanupApi historyCleanupApi() { + return new HistoryCleanupApi(apiClient); + } + + @Bean + public IdentityApi identityApi() { + return new IdentityApi(apiClient); + } + + @Bean + public JobDefinitionApi jobDefinitionApi() { + return new JobDefinitionApi(apiClient); + } + + @Bean + public MessageApi messageApi() { + return new MessageApi(apiClient); + } + + @Bean + public MetricsApi metricsApi() { + return new MetricsApi(apiClient); + } + + @Bean + public MigrationApi migrationApi() { + return new MigrationApi(apiClient); + } + + @Bean + public ModificationApi modificationApi() { + return new ModificationApi(apiClient); + } + + @Bean + public ProcessDefinitionApi processDefinitionApi() { + return new ProcessDefinitionApi(apiClient); + } + + @Bean + public ProcessInstanceApi processInstanceApi() { + return new ProcessInstanceApi(apiClient); + } + + @Bean + public SchemaLogApi schemaLogApi() { + return new SchemaLogApi(apiClient); + } + + @Bean + public SignalApi signalApi() { + return new SignalApi(apiClient); + } + + @Bean + public TaskApi taskApi() { + return new TaskApi(apiClient); + } + + @Bean + public TaskAttachmentApi taskAttachmentApi() { + return new TaskAttachmentApi(apiClient); + } + + @Bean + public TaskCommentApi taskCommentApi() { + return new TaskCommentApi(apiClient); + } + + @Bean + public TaskIdentityLinkApi taskIdentityLinkApi() { + return new TaskIdentityLinkApi(apiClient); + } + + @Bean + public TaskLocalVariableApi taskLocalVariableApi() { + return new TaskLocalVariableApi(apiClient); + } + + @Bean + public TelemetryApi telemetryApi() { + return new TelemetryApi(apiClient); + } + + @Bean + public TenantApi tenantApi() { + return new TenantApi(apiClient); + } + + @Bean + public UserApi userApi() { + return new UserApi(apiClient); + } + + @Bean + public VariableInstanceApi variableInstanceApi() { + return new VariableInstanceApi(apiClient); + } + + @Bean + public VersionApi versionApi() { + return new VersionApi(apiClient); + } } diff --git a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaAutodeploymentProperties.java b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaAutodeploymentProperties.java new file mode 100644 index 0000000..72be4b0 --- /dev/null +++ b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaAutodeploymentProperties.java @@ -0,0 +1,52 @@ +package org.camunda.community.rest.client.springboot; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("camunda.auto-deploy") +public class CamundaAutodeploymentProperties { + private String bpmnResources; + private String dmnResources; + private String formResources; + private Boolean enabled; + private Boolean failStartupOnError; + + public String getBpmnResources() { + return bpmnResources; + } + + public void setBpmnResources(String bpmnResources) { + this.bpmnResources = bpmnResources; + } + + public String getDmnResources() { + return dmnResources; + } + + public void setDmnResources(String dmnResources) { + this.dmnResources = dmnResources; + } + + public String getFormResources() { + return formResources; + } + + public void setFormResources(String formResources) { + this.formResources = formResources; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public Boolean getFailStartupOnError() { + return failStartupOnError; + } + + public void setFailStartupOnError(Boolean failStartupOnError) { + this.failStartupOnError = failStartupOnError; + } +} diff --git a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaHistoryApi.java b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaHistoryApi.java index d14a00a..27799d1 100644 --- a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaHistoryApi.java +++ b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaHistoryApi.java @@ -2,89 +2,90 @@ import org.camunda.community.rest.client.api.*; import org.camunda.community.rest.client.invoker.ApiClient; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; @AutoConfiguration public class CamundaHistoryApi { - @Autowired - private ApiClient apiClient; - - @Bean - public HistoricActivityInstanceApi historicActivityInstanceApi () { - return new HistoricActivityInstanceApi(apiClient); - } - - @Bean - public HistoricBatchApi historicBatchApi() { - return new HistoricBatchApi(apiClient); - } - - @Bean - public HistoricDecisionDefinitionApi historicDecisionDefinitionApi() { - return new HistoricDecisionDefinitionApi(apiClient); - } - - @Bean - public HistoricDecisionInstanceApi historicDecisionInstanceApi() { - return new HistoricDecisionInstanceApi(apiClient); - } - - @Bean - public HistoricDecisionRequirementsDefinitionApi historicDecisionRequirementsDefinitionApi() { - return new HistoricDecisionRequirementsDefinitionApi(apiClient); - } - - @Bean - public HistoricDetailApi historicDetailApi() { - return new HistoricDetailApi(apiClient); - } - - @Bean - public HistoricExternalTaskLogApi historicExternalTaskLogApi() { - return new HistoricExternalTaskLogApi(apiClient); - } - - @Bean - public HistoricIdentityLinkLogApi historicIdentityLinkLogApi() { - return new HistoricIdentityLinkLogApi(apiClient); - } - - @Bean - public HistoricIncidentApi historicIncidentApi() { - return new HistoricIncidentApi(apiClient); - } - - @Bean - public HistoricJobLogApi historicJobLogApi() { - return new HistoricJobLogApi(apiClient); - } - - @Bean - public HistoricProcessDefinitionApi historicProcessDefinitionApi() { - return new HistoricProcessDefinitionApi(apiClient); - } - - @Bean - public HistoricProcessInstanceApi historicProcessInstanceApi() { - return new HistoricProcessInstanceApi(apiClient); - } - - @Bean - public HistoricTaskInstanceApi historicTaskInstanceApi() { - return new HistoricTaskInstanceApi(apiClient); - } - - @Bean - public HistoricUserOperationLogApi historicTUserOperationLogApi() { - return new HistoricUserOperationLogApi(apiClient); - } - - @Bean - public HistoricVariableInstanceApi historicVariableInstanceApi() { - return new HistoricVariableInstanceApi(apiClient); - } - + private final ApiClient apiClient; + + public CamundaHistoryApi(ApiClient apiClient) { + this.apiClient = apiClient; + } + + @Bean + public HistoricActivityInstanceApi historicActivityInstanceApi() { + return new HistoricActivityInstanceApi(apiClient); + } + + @Bean + public HistoricBatchApi historicBatchApi() { + return new HistoricBatchApi(apiClient); + } + + @Bean + public HistoricDecisionDefinitionApi historicDecisionDefinitionApi() { + return new HistoricDecisionDefinitionApi(apiClient); + } + + @Bean + public HistoricDecisionInstanceApi historicDecisionInstanceApi() { + return new HistoricDecisionInstanceApi(apiClient); + } + + @Bean + public HistoricDecisionRequirementsDefinitionApi historicDecisionRequirementsDefinitionApi() { + return new HistoricDecisionRequirementsDefinitionApi(apiClient); + } + + @Bean + public HistoricDetailApi historicDetailApi() { + return new HistoricDetailApi(apiClient); + } + + @Bean + public HistoricExternalTaskLogApi historicExternalTaskLogApi() { + return new HistoricExternalTaskLogApi(apiClient); + } + + @Bean + public HistoricIdentityLinkLogApi historicIdentityLinkLogApi() { + return new HistoricIdentityLinkLogApi(apiClient); + } + + @Bean + public HistoricIncidentApi historicIncidentApi() { + return new HistoricIncidentApi(apiClient); + } + + @Bean + public HistoricJobLogApi historicJobLogApi() { + return new HistoricJobLogApi(apiClient); + } + + @Bean + public HistoricProcessDefinitionApi historicProcessDefinitionApi() { + return new HistoricProcessDefinitionApi(apiClient); + } + + @Bean + public HistoricProcessInstanceApi historicProcessInstanceApi() { + return new HistoricProcessInstanceApi(apiClient); + } + + @Bean + public HistoricTaskInstanceApi historicTaskInstanceApi() { + return new HistoricTaskInstanceApi(apiClient); + } + + @Bean + public HistoricUserOperationLogApi historicTUserOperationLogApi() { + return new HistoricUserOperationLogApi(apiClient); + } + + @Bean + public HistoricVariableInstanceApi historicVariableInstanceApi() { + return new HistoricVariableInstanceApi(apiClient); + } } diff --git a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaOpenApiStarter.java b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaOpenApiStarter.java index ac78b11..b12d303 100644 --- a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaOpenApiStarter.java +++ b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaOpenApiStarter.java @@ -8,16 +8,22 @@ @AutoConfiguration public class CamundaOpenApiStarter { - @Value( "${camunda.bpm.client.base-url:null}" ) - private String basePath; + private final String basePath; - @Bean - public ApiClient createApiClient() { - ApiClient client = new ApiClient(); - if (basePath!=null) { - client.setBasePath(basePath); - } - return client; - } + public CamundaOpenApiStarter(@Value("${camunda.bpm.client.base-url:#{null}}") String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + @Bean + public ApiClient createApiClient() { + ApiClient client = new ApiClient(); + if (basePath != null) { + client.setBasePath(basePath); + } + return client; + } } diff --git a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaProcessAutodeployment.java b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaProcessAutodeployment.java index dce4db3..c8704dd 100644 --- a/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaProcessAutodeployment.java +++ b/camunda-engine-rest-client-openapi-springboot/src/main/java/org/camunda/community/rest/client/springboot/CamundaProcessAutodeployment.java @@ -11,109 +11,94 @@ import org.camunda.community.rest.client.invoker.ApiException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.event.EventListener; import org.springframework.core.io.Resource; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.util.DigestUtils; -/** - * Auto deploys all Camunda resources found on classpath during startup of the application - */ +/** Auto deploys all Camunda resources found on classpath during startup of the application */ @AutoConfiguration +@EnableConfigurationProperties(CamundaAutodeploymentProperties.class) public class CamundaProcessAutodeployment { - private static final Logger logger = LoggerFactory.getLogger(CamundaProcessAutodeployment.class); - - @Autowired - private DeploymentApi deploymentApi; - - @Autowired - private ResourcePatternResolver patternResolver; - - // TODO Possible extension: Provide a @Deployment annotation like Spring Zeebe - @Value("${camunda.autoDeploy.bpmnResources:}") - private String bpmnResourcesPattern; - - @Value("${camunda.autoDeploy.dmnResources:}") - private String dmnResourcesPattern; - - @Value("${camunda.autoDeploy.formResources:}") - private String formResourcesPattern; - - @Value("${spring.application.name:spring-app}") - private String applicationName; - - @Value("${camunda.autoDeploy.enabled:true}") - private boolean autoDeployEnabled; - - @Value("${camunda.autoDeploy.failStartupOnError:true}") - private boolean autoDeployFailStartupOnError; - - @EventListener(ApplicationStartedEvent.class) - - public void deployCamundaResources() throws IOException, ApiException { - if(!autoDeployEnabled){ - return; - } - if (bpmnResourcesPattern==null || bpmnResourcesPattern.isEmpty()) { - bpmnResourcesPattern = "classpath*:**/*.bpmn"; // Not sure why the default mechanism in @Value makes problems - but this works! - } - if (dmnResourcesPattern==null || dmnResourcesPattern.isEmpty()) { - dmnResourcesPattern = "classpath*:**/*.dmn"; - } - if (formResourcesPattern==null || formResourcesPattern.isEmpty()) { - formResourcesPattern = "classpath*:**/*.form"; - } - - deployResources(Arrays.asList(patternResolver.getResources(bpmnResourcesPattern)), "bpmn"); - deployResources(Arrays.asList(patternResolver.getResources(dmnResourcesPattern)), "dmn"); - deployResources(Arrays.asList(patternResolver.getResources(formResourcesPattern)), "form"); + private static final Logger logger = LoggerFactory.getLogger(CamundaProcessAutodeployment.class); + private final DeploymentApi deploymentApi; + private final ResourcePatternResolver patternResolver; + private final CamundaAutodeploymentProperties properties; + private final String applicationName; + + public CamundaProcessAutodeployment( + DeploymentApi deploymentApi, + ResourcePatternResolver patternResolver, + CamundaAutodeploymentProperties properties, + @Value("${spring.application.name:spring-app}") String applicationName) { + this.deploymentApi = deploymentApi; + this.patternResolver = patternResolver; + this.properties = properties; + this.applicationName = applicationName; + } + + // TODO Possible extension: Provide a @Deployment annotation like Spring Zeebe + @EventListener(ApplicationStartedEvent.class) + public void deployCamundaResources() throws IOException, ApiException { + if (!properties.getEnabled()) { + return; } - - private void deployResources(List resourcesToDeploy, String type) throws IOException, ApiException { - logger.info("Found resources for deployment of type "+ type +": " + resourcesToDeploy); - for (Resource camundaResource: resourcesToDeploy) { - // We have to create a tmpFile because we need to read the files via InputStream to work also in a jar-packed environment - // but the OpenAPI will need a File. - // We still have to set the file ending correct in the temp file - // (because otherwise the deployer will not pick it up as e.g. BPMN file) - try { - String tempDirectoryName = FileUtils.getTempDirectory().getAbsolutePath(); - String filename = getResourceFilename(camundaResource, type); - final File tempFile = new File(tempDirectoryName + File.separator + filename); - tempFile.deleteOnExit(); - try (FileOutputStream out = new FileOutputStream(tempFile)) { - IOUtils.copy(camundaResource.getInputStream(), out); - } - logger.info(" - Now deploying: " + camundaResource); - deploymentApi.createDeployment( - null, - null, - true, // changedOnly - true, // duplicateFiltering - applicationName + "-" + filename, // deploymentName - null, - tempFile); - } catch (Exception exception){ - logger.error("Error Deploying resources for deployment of type "+ type +": " + resourcesToDeploy); - if(autoDeployFailStartupOnError){ - throw exception; - } - } - // deploying the files one by one because of limitation of OpenAPI at the moment - // see https://jira.camunda.com/browse/CAM-13105 + deployResources( + Arrays.asList(patternResolver.getResources(properties.getBpmnResources())), "bpmn"); + deployResources( + Arrays.asList(patternResolver.getResources(properties.getDmnResources())), "dmn"); + deployResources( + Arrays.asList(patternResolver.getResources(properties.getFormResources())), "form"); + } + + private void deployResources(List resourcesToDeploy, String type) + throws IOException, ApiException { + logger.info("Found resources for deployment of type " + type + ": " + resourcesToDeploy); + for (Resource camundaResource : resourcesToDeploy) { + // We have to create a tmpFile because we need to read the files via InputStream to work also + // in a jar-packed environment + // but the OpenAPI will need a File. + // We still have to set the file ending correct in the temp file + // (because otherwise the deployer will not pick it up as e.g. BPMN file) + try { + String tempDirectoryName = FileUtils.getTempDirectory().getAbsolutePath(); + String filename = getResourceFilename(camundaResource, type); + final File tempFile = new File(tempDirectoryName + File.separator + filename); + tempFile.deleteOnExit(); + try (FileOutputStream out = new FileOutputStream(tempFile)) { + IOUtils.copy(camundaResource.getInputStream(), out); } + logger.info(" - Now deploying: " + camundaResource); + deploymentApi.createDeployment( + null, + null, + true, // changedOnly + true, // duplicateFiltering + applicationName + "-" + filename, // deploymentName + null, + tempFile); + } catch (Exception exception) { + logger.error( + "Error Deploying resources for deployment of type " + type + ": " + resourcesToDeploy); + if (properties.getFailStartupOnError()) { + throw exception; + } + } + // deploying the files one by one because of limitation of OpenAPI at the moment + // see https://jira.camunda.com/browse/CAM-13105 } + } - private String getResourceFilename(Resource camundaResource, String type) throws IOException { - if (camundaResource.getFilename() != null) { - return camundaResource.getFilename(); - } else { - return DigestUtils.md5DigestAsHex(camundaResource.getInputStream()) + '.' + type; - } + private String getResourceFilename(Resource camundaResource, String type) throws IOException { + if (camundaResource.getFilename() != null) { + return camundaResource.getFilename(); + } else { + return DigestUtils.md5DigestAsHex(camundaResource.getInputStream()) + '.' + type; } + } } diff --git a/camunda-engine-rest-client-openapi-springboot/src/main/resources/application.yaml b/camunda-engine-rest-client-openapi-springboot/src/main/resources/application.yaml new file mode 100644 index 0000000..9c62b25 --- /dev/null +++ b/camunda-engine-rest-client-openapi-springboot/src/main/resources/application.yaml @@ -0,0 +1,7 @@ +camunda: + auto-deploy: + bpmn-resources: "classpath*:**/*.bpmn" + dmn-resources: "classpath*:**/*.dmn" + form-resources: "classpath*:**/*.form" + enabled: true + fail-startup-on-error: true \ No newline at end of file diff --git a/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/AppTest.java b/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/AppTest.java index fa20471..07664bf 100644 --- a/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/AppTest.java +++ b/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/AppTest.java @@ -1,13 +1,30 @@ package org.camunda.community.rest.client.springboot; +import static org.assertj.core.api.Assertions.*; + import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class AppTest { + @Autowired CamundaAutodeploymentProperties properties; + @Autowired CamundaOpenApiStarter starter; @Test - void shouldRun() { + void shouldRun() {} + @Test + void shouldSetDefaultProperties() { + assertThat(properties.getEnabled()).isEqualTo(true); + assertThat(properties.getBpmnResources()).isEqualTo("classpath*:**/*.bpmn"); + assertThat(properties.getDmnResources()).isEqualTo("classpath*:**/*.dmn"); + assertThat(properties.getFormResources()).isEqualTo("classpath*:**/*.form"); + assertThat(properties.getFailStartupOnError()).isEqualTo(true); + } + + @Test + void shouldNotSetBaseUrl() { + assertThat(starter.getBasePath()).isNull(); } } diff --git a/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/LegacyPropertiesTest.java b/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/LegacyPropertiesTest.java new file mode 100644 index 0000000..169d84e --- /dev/null +++ b/camunda-engine-rest-client-openapi-springboot/src/test/java/org/camunda/community/rest/client/springboot/LegacyPropertiesTest.java @@ -0,0 +1,31 @@ +package org.camunda.community.rest.client.springboot; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest( + properties = { + "camunda.autoDeploy.bpmnResources=custom", + "camunda.autoDeploy.dmnResources=custom", + "camunda.autoDeploy.formResources=custom", + "camunda.autoDeploy.enabled=false", + "camunda.autoDeploy.failStartupOnError=false" + }) +public class LegacyPropertiesTest { + @Autowired CamundaAutodeploymentProperties properties; + + @Test + void shouldRun() {} + + @Test + void shouldSetLegacyProperties() { + assertThat(properties.getEnabled()).isEqualTo(false); + assertThat(properties.getBpmnResources()).isEqualTo("custom"); + assertThat(properties.getDmnResources()).isEqualTo("custom"); + assertThat(properties.getFormResources()).isEqualTo("custom"); + assertThat(properties.getFailStartupOnError()).isEqualTo(false); + } +} diff --git a/pom.xml b/pom.xml index c823bfa..c635008 100644 --- a/pom.xml +++ b/pom.xml @@ -85,8 +85,88 @@ maven-surefire-plugin 3.2.5 + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + + + + + + + + + enforce + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.1 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-site-plugin + 3.12.1 + + + com.diffplug.spotless + spotless-maven-plugin + 2.43.0 + + + + + *.md + .gitignore + + + + + true + 2 + + + + + + + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + @@ -95,4 +175,52 @@ camunda-engine-rest-client-complete-springboot-starter + + + autoFormat + + true + + + + + com.diffplug.spotless + spotless-maven-plugin + + + spotless-format + + apply + + process-sources + + + + + + + + + + checkFormat + + + + com.diffplug.spotless + spotless-maven-plugin + + + spotless-check + + check + + validate + + + + + + + +