Skip to content

Commit

Permalink
Merge branch 'release/0.1.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
jangalinski committed Sep 25, 2022
2 parents ee5459d + 7ba3c4d commit d2e48e9
Show file tree
Hide file tree
Showing 23 changed files with 359 additions and 78 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Run administration tasks directly from the camunda 7 cockpit using generated min
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.holunda/camunda-admin-process-registry/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.holunda/camunda-admin-process-registry)
![Compatible with: Camunda Platform 7](https://img.shields.io/badge/Compatible%20with-Camunda%20Platform%207-26d07c)

This lib/spring-boot-auto-config allows you to easily and fast generate and deploy single-service-task processes that can e started from the camunda-webapp/tasklist.
This lib/spring-boot-auto-config allows you to easily and fast generate and deploy single-service-task processes that can be started from the camunda-webapp/tasklist.

Doing so enables you to implement administration/house-keeping jobs as a process, use camundas form/ui and run tasks controlled with the full power of the engine cockpit, including error handling and analysis.

Expand All @@ -18,7 +18,7 @@ Once you included the lib in your camunda spring boot application, create an [Ad

```kotlin

@Bean
@Bean
fun helloWorldAdminProcess(): AdminProcess {
val foo = StringField("foo", "Foo - enter your name")
val date = DateField("date", "Date - select some magic")
Expand Down
15 changes: 14 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>io.holunda</groupId>
<artifactId>camunda-admin-process-registry</artifactId>
<version>0.1.0</version>
<version>0.1.1</version>
<name>${project.artifactId}</name>
<description>Register and run utility processes</description>
<url>https://github.com/holunda-io/camunda-admin-process-registry/</url>
Expand Down Expand Up @@ -145,15 +145,28 @@
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb-impl.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>1.0.2</version>
<scope>test</scope>
</dependency>
</dependencies>


<build>
<defaultGoal>clean jacoco:prepare-agent package</defaultGoal>
<resources>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package io.holunda.camunda.platform.adminprocess

import io.holunda.camunda.platform.adminprocess.CamundaAdminProcessRegistryLib.camundaFormFields
import io.holunda.camunda.platform.adminprocess.form.FormField
import org.camunda.bpm.engine.delegate.JavaDelegate
import org.camunda.bpm.model.bpmn.Bpmn
import org.camunda.bpm.model.bpmn.BpmnModelInstance
import org.camunda.bpm.model.bpmn.builder.StartEventBuilder


abstract class AdminProcess(
val activityId: String,
Expand Down Expand Up @@ -39,12 +39,4 @@ abstract class AdminProcess(
}


fun StartEventBuilder.camundaFormFields(formFields: List<FormField<*>>): StartEventBuilder = formFields.fold(this) { builder, formField ->
builder.camundaFormField()
.camundaLabel(formField.label)
.camundaType(formField.type)
.camundaId(formField.id)
.camundaDefaultValue(formField.defaultValue?.toString())
.camundaFormFieldDone()
}

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import org.camunda.bpm.engine.repository.Deployment
import org.camunda.bpm.spring.boot.starter.event.PostDeployEvent
import org.springframework.context.event.EventListener


class AdminProcessRegistry(
private val processes: Map<ActivityId, AdminProcess>
) : JavaDelegate {
Expand All @@ -23,7 +22,6 @@ class AdminProcessRegistry(
val WARN = CamundaAdminProcessRegistryLib.adminProcess("WARN") {
logger.warn { "no adminProcess registered with processDefinitionKey=${it.currentActivityId}" }
}

}

@EventListener
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package io.holunda.camunda.platform.adminprocess

import mu.KLogging
import io.holunda.camunda.platform.adminprocess.form.FormField
import org.camunda.bpm.engine.delegate.DelegateExecution
import org.camunda.bpm.engine.delegate.JavaDelegate
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import javax.annotation.PostConstruct
import org.camunda.bpm.model.bpmn.builder.StartEventBuilder

object CamundaAdminProcessRegistryLib {

@JvmStatic
fun adminProcess(
activityId: String,
label: String = activityId,
Expand All @@ -21,18 +20,15 @@ object CamundaAdminProcessRegistryLib {
delegate.execute(execution)
}
}
}

@Configuration
class CamundaAdminProcessAutoConfiguration {
companion object : KLogging()

/**
* Collects all beans of type [AdminProcess] in context and registers them in a map.
* Add single form field to builder.
*/
@Bean(AdminProcessRegistry.NAME)
fun adminProcessRegistry(
processes: List<AdminProcess>?
) = AdminProcessRegistry((processes?: emptyList()).associateBy { it.activityId })
fun StartEventBuilder.camundaFormField(formField: FormField<*>): StartEventBuilder = formField.addToStartEvent(this)

/**
* Add multiple form fields to builder.
*/
fun StartEventBuilder.camundaFormFields(formFields: List<FormField<*>>): StartEventBuilder = formFields
.fold(this) { builder, formField -> builder.camundaFormField(formField) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.holunda.camunda.platform.adminprocess.config

import io.holunda.camunda.platform.adminprocess.AdminProcess
import io.holunda.camunda.platform.adminprocess.AdminProcessRegistry
import mu.KLogging
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class CamundaAdminProcessAutoConfiguration {
companion object : KLogging()

/**
* Collects all beans of type [AdminProcess] in context and registers them in a map.
*/
@Bean(AdminProcessRegistry.NAME)
fun adminProcessRegistry(
processes: List<AdminProcess>?
) = AdminProcessRegistry((processes ?: emptyList()).associateBy { it.activityId })

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.holunda.camunda.platform.adminprocess.form

import io.holunda.camunda.bpm.data.CamundaBpmData

data class BooleanField(
override val id: String,
override val label: String
) : FormField<Boolean>(id, label, null, "boolean", CamundaBpmData.booleanVariable(id)) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.holunda.camunda.platform.adminprocess.form

import io.holunda.camunda.bpm.data.CamundaBpmData
import java.util.*

data class DateField(
override val id: String,
override val label: String
) : FormField<Date>(id, label, null, "date", CamundaBpmData.dateVariable(id))
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.holunda.camunda.platform.adminprocess.form

import io.holunda.camunda.bpm.data.factory.VariableFactory
import org.camunda.bpm.model.bpmn.builder.StartEventBuilder

sealed class FormField<T>(
/**
* id of the formField, name of the variable
*/
open val id: String,
/**
* label of the variable
*/
open val label: String = id,
/**
* optional default value
*/
open val defaultValue: T? = null,

val type: String,
/**
* variable factory for simplified access.
*/
private val variable: VariableFactory<T>
) : VariableFactory<T> by variable {

fun addToStartEvent(startEventBuilder: StartEventBuilder): StartEventBuilder = startEventBuilder.camundaFormField()
.camundaLabel(label)
.camundaType(type)
.camundaId(id)
//.camundaDefaultValue(defaultValue?.toString())
.camundaFormFieldDone()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.holunda.camunda.platform.adminprocess.form

import io.holunda.camunda.bpm.data.CamundaBpmData

data class LongField(
override val id: String,
override val label: String
) : FormField<Long>(id, label, null, "long", CamundaBpmData.longVariable(id))
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.holunda.camunda.platform.adminprocess.form

import io.holunda.camunda.bpm.data.CamundaBpmData

data class StringField(
override val id: String,
override val label: String
) : FormField<String>(id, label, null, "string", CamundaBpmData.stringVariable(id))
2 changes: 1 addition & 1 deletion src/main/resources/META-INF/spring.factories
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
io.holunda.camunda.platform.adminprocess.CamundaAdminProcessAutoConfiguration
io.holunda.camunda.platform.adminprocess.config.CamundaAdminProcessAutoConfiguration
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.holunda.camunda.platform.adminprocess

import io.holunda.camunda.platform.adminprocess.form.FormField
import org.camunda.bpm.model.bpmn.Bpmn
import org.camunda.bpm.model.bpmn.BpmnModelInstance


object TestFixtures {

fun createProcess(field: FormField<*>) = Bpmn.createExecutableProcess()
.startEvent()
.apply { field.addToStartEvent(this) }
.endEvent()
.done()


fun BpmnModelInstance.xml() = Bpmn.convertToString(this)

fun String.extensionElements() = this
.substringAfter("<extensionElements>")
.substringBefore("</extensionElements>")
.flatten()
.trim().trimIndent()

fun String.flatten() = this.lines().map { it.trim() }
.joinToString("\n")
}
Original file line number Diff line number Diff line change
@@ -1,39 +1,72 @@
package io.holunda.camunda.platform.adminprocess._test

import com.github.javafaker.Faker
import io.holunda.camunda.bpm.data.CamundaBpmData
import io.holunda.camunda.platform.adminprocess.AdminProcess
import io.holunda.camunda.platform.adminprocess.AdminProcessRegistry.Companion.logger
import io.holunda.camunda.platform.adminprocess.CamundaAdminProcessRegistryLib.adminProcess
import io.holunda.camunda.platform.adminprocess.DateField
import io.holunda.camunda.platform.adminprocess.StringField
import io.holunda.camunda.platform.adminprocess.form.BooleanField
import io.holunda.camunda.platform.adminprocess.form.DateField
import io.holunda.camunda.platform.adminprocess.form.LongField
import io.holunda.camunda.platform.adminprocess.form.StringField
import org.camunda.bpm.spring.boot.starter.annotation.EnableProcessApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean
import java.time.Instant
import java.time.temporal.ChronoUnit
import java.util.*

fun main(args: Array<String>) = runApplication<CamundaAdminProcessRegistryTestApplication>(*args).let { }

data class SomeData(
val id: String,
val name: String,
val age: Int
)

enum class SomeEnum(val id:String) {
FOO("foo"),
BAR("bar"),
;
}

@SpringBootApplication
@EnableProcessApplication
class CamundaAdminProcessRegistryTestApplication {

@Bean
fun helloWorldAdminProcess(): AdminProcess {
val foo = StringField("foo", "Foo - enter your name")
val date = DateField("date", "Date - select some magic")
val stringField = StringField("fooId", "Foo - enter your name")
val dateField = DateField("dateId", "Date - select some magic")
val numberField = LongField("longId", "A number")
val booleanField = BooleanField("booleanId", "Yes or no?")

return adminProcess(
activityId = "helloWorld",
label = "Hello World 2",
formFields = listOf(foo, date)
formFields = listOf(stringField, dateField, numberField, booleanField)
) {
val variables = CamundaBpmData.reader(it)

logger.info { """ Hi, I am the process running with:
* foo: ${variables.get(foo)}
* date: ${variables.get(date)}
* foo: ${variables.get(stringField)}
* date: ${variables.get(dateField)}
* number: ${variables.get(numberField)}
* yes?: ${variables.get(booleanField)}
""".trimIndent()
}
}
}

@Bean
fun fake() = JFakerProvider()

class JFakerProvider {
private val faker = Faker(Locale.GERMAN)

fun randomName(): String = faker.name().fullName()

fun randomDate() : Date = Date.from(Instant.now().plus(10, ChronoUnit.DAYS))
}
}
Loading

0 comments on commit d2e48e9

Please sign in to comment.