Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
9cb36e0
FBP-224. Initial resource commit for swimlanes
valb3r Oct 30, 2021
5f78dfa
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Nov 28, 2021
0f78c27
FBP-224. Fixed semantic
valb3r Nov 28, 2021
28f735d
Initial data structures for swimlane
valb3r Nov 28, 2021
964840e
FBP-224. Fixes to make Camunda parser XML test suite runnable
valb3r Nov 29, 2021
d631760
FBP-224. Camunda swimlane parsing test - initial phase
valb3r Nov 29, 2021
c8416df
FBP-224. Rename properties according to their scope
valb3r Dec 2, 2021
2ccd4c7
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Dec 5, 2021
62d6ecb
FBP-224. Allow null collaboration
valb3r Dec 5, 2021
0573936
FBP-224. Wrap collaboration and view to dto
valb3r Dec 5, 2021
efae57c
FBP-224. Handle collaboration in toView
valb3r Dec 12, 2021
8e680a0
FBP-224. Extract process id from collaboration
valb3r Dec 13, 2021
bf008ef
FBP-224. Extract process id from collaboration
valb3r Dec 13, 2021
6f868ac
FBP-224. Map all elements and properties in CurrentState
valb3r Dec 14, 2021
c33d324
FBP-224. Rename CurrentState properties
valb3r Dec 14, 2021
fd97cee
Further mapping of elements
valb3r Dec 14, 2021
c3339bf
FBP-224. Render collaboration process
valb3r Dec 15, 2021
bbbe46e
FBP-224. Propagating lane rendering
valb3r Dec 15, 2021
c75b234
FBP-224. Fixed parent element selection
valb3r Dec 16, 2021
3d65a99
FBP-224. Properly draw no swimlane participants
valb3r Dec 17, 2021
9d74a1e
FBP-224. Customize for higher DCEVM xmx
valb3r Dec 18, 2021
9ecf9e9
FBP-224. Dev helper functionality
valb3r Dec 18, 2021
bd2d453
FBP-224. Added dev helper tooling
valb3r Dec 18, 2021
c612a9f
FBP-224. Directly dump render tree
valb3r Dec 19, 2021
9578f86
FBP-224. Detect cyclic structure
valb3r Dec 19, 2021
2baed50
FBP-224. Detect cyclic structure
valb3r Dec 19, 2021
f66542b
FBP-224. Fixed rendering tree for collaboration
valb3r Dec 19, 2021
917e3e9
FBP-224. Fixed circular tree for non-collaboration processes
valb3r Dec 19, 2021
01c373c
FBP-224. Properly align elements to lanes
valb3r Dec 19, 2021
e2d9cd8
FBP-224. Better diagnostic logging + do not render processes
valb3r Dec 19, 2021
ae981b1
FBP-224. Make edge elements visible when they pass through lanes
valb3r Dec 19, 2021
831b1b6
FBP-224. Improve edge selection
valb3r Dec 19, 2021
98faf94
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Jan 2, 2022
086561f
FBP-224. Remove redundant shape and add new type
valb3r Jan 2, 2022
52c4594
FBP-224. Correctly handle drag for lane (no drag end action unless pa…
valb3r Jan 2, 2022
40bf860
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Jun 25, 2022
80a8a09
Dropped usage 'toLinkedHashSet'
valb3r Jun 26, 2022
7fee095
Ensure Collaboration virtual IDs can't exists due to illegal character
valb3r Jun 26, 2022
bf1e4c6
Fixed majority of XML tests
valb3r Jun 26, 2022
922638f
Fixed compilation issues
valb3r Jun 26, 2022
bd4273c
Improve cycle found message
valb3r Jun 26, 2022
f54eed4
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Nov 12, 2022
c22d898
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Dec 26, 2022
e944526
Merge remote-tracking branch 'origin/master' into feature/FBP-224-swi…
valb3r Mar 12, 2023
454eeb0
Remove runIde section
valb3r Mar 12, 2023
f9afefc
Fixed compilation issues
valb3r Mar 12, 2023
43f0079
Fixed problem when rendering non-collaboration files
valb3r Mar 26, 2023
f621947
FBP-224. Initial work to handle flowNodeRef properly
valb3r Mar 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import com.fasterxml.jackson.module.kotlin.readValue
import com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.BpmnFile
import com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.DiagramNode
import com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.ProcessNode
import com.valb3r.bpmn.intellij.plugin.bpmn.api.BpmnProcessObject
import com.valb3r.bpmn.intellij.plugin.bpmn.api.BpmnFileObject
import com.valb3r.bpmn.intellij.plugin.bpmn.api.info.PropertyType
import com.valb3r.bpmn.intellij.plugin.bpmn.parser.core.BaseBpmnParser
import com.valb3r.bpmn.intellij.plugin.bpmn.parser.core.NS
Expand Down Expand Up @@ -116,18 +116,18 @@ open class ActivitiParser : BaseBpmnParser() {

private val mapper: XmlMapper = mapper()

override fun parse(input: String): BpmnProcessObject {
override fun parse(input: String): BpmnFileObject {
val dto = mapper.readValue<BpmnFile>(input)
return toProcessObject(dto)
}

private fun toProcessObject(dto: BpmnFile): BpmnProcessObject {
// TODO - Multi process support?
private fun toProcessObject(dto: BpmnFile): BpmnFileObject {
markSubprocessesAndTransactionsThatHaveExternalDiagramAsCollapsed(dto.processes[0], dto.diagrams!!)
val process = dto.processes[0].toElement()
val processes = dto.processes.map { it.toElement() }
val collaborations = dto.collaborations?.map { it.toElement() } ?: emptyList()
val diagrams = dto.diagrams!!.map { it.toElement() }

return BpmnProcessObject(process, diagrams)
return BpmnFileObject(processes, collaborations, diagrams)
}

override fun modelNs(): NS {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ import com.valb3r.bpmn.intellij.plugin.bpmn.api.bpmn.elements.subprocess.BpmnEve
import com.valb3r.bpmn.intellij.plugin.bpmn.api.bpmn.elements.subprocess.BpmnSubProcess
import com.valb3r.bpmn.intellij.plugin.bpmn.api.bpmn.elements.tasks.*
import com.valb3r.bpmn.intellij.plugin.bpmn.api.diagram.DiagramElement
import com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.collaboration.Collaboration
import org.mapstruct.Mapper
import org.mapstruct.Mapping
import org.mapstruct.Mappings
import org.mapstruct.factory.Mappers
import java.util.concurrent.ConcurrentHashMap
import kotlin.reflect.KClass


const val EXTENSION_ELEM_STREAM = "java(null == input.getExtensionElements() ? null : input.getExtensionElements().stream()"
Expand All @@ -38,20 +38,25 @@ const val EXTENSION_BOOLEAN_EXTRACTOR = ".map(it -> Boolean.valueOf(it.getString
// https://github.com/FasterXML/jackson-dataformat-xml/issues/363
// unfortunately this has failed with Kotlin 'data' classes
class BpmnFile(
@JacksonXmlProperty(localName = "message")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var messages: List<MessageNode>? = null,

@JacksonXmlProperty(localName = "process")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var processes: List<ProcessNode>,

@JacksonXmlProperty(localName = "BPMNDiagram")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var diagrams: List<DiagramNode>? = null
@JacksonXmlProperty(localName = "message")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var messages: List<MessageNode>? = null,

@JacksonXmlProperty(localName = "collaboration")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var collaborations: List<Collaboration>? = null,

@JacksonXmlProperty(localName = "process")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var processes: List<ProcessNode>,

@JacksonXmlProperty(localName = "BPMNDiagram")
@JsonMerge
@JacksonXmlElementWrapper(useWrapping = false)
var diagrams: List<DiagramNode>? = null
)

data class MessageNode(val id: String, var name: String?)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.collaboration

import com.fasterxml.jackson.annotation.JsonMerge
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
import com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.BpmnMappable
import com.valb3r.bpmn.intellij.plugin.activiti.parser.nodes.process.BpmnElementIdMapper
import com.valb3r.bpmn.intellij.plugin.bpmn.api.bpmn.BpmnCollaboration
import org.mapstruct.Mapper
import org.mapstruct.factory.Mappers

data class Collaboration(
@JacksonXmlProperty(isAttribute = true) val id: String,
@JacksonXmlProperty(isAttribute = true) val name: String?,
@JsonMerge @JacksonXmlElementWrapper(useWrapping = false) val participant: List<Participant>?,
@JsonMerge @JacksonXmlElementWrapper(useWrapping = false) val messageFlow: List<MessageFlow>?,
) : BpmnMappable<BpmnCollaboration> {

override fun toElement(): BpmnCollaboration {
return Mappers.getMapper(Mapping::class.java).convertToDto(this)
}

@Mapper(uses = [BpmnElementIdMapper::class])
interface Mapping {
fun convertToDto(input: Collaboration): BpmnCollaboration
}
}

data class Participant(
@JacksonXmlProperty(isAttribute = true) val id: String,
@JacksonXmlProperty(isAttribute = true) val name: String?,
@JacksonXmlProperty(isAttribute = true) val processRef: String?,
val documentation: String?
)

data class MessageFlow(
@JacksonXmlProperty(isAttribute = true) val id: String,
@JacksonXmlProperty(isAttribute = true) val name: String?,
val documentation: String?,
@JacksonXmlProperty(isAttribute = true) val sourceRef: String?,
@JacksonXmlProperty(isAttribute = true) val targetRef: String?,
)

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.valb3r.bpmn.intellij.plugin.activiti.parser

import com.valb3r.bpmn.intellij.plugin.activiti.parser.testevents.*
import com.valb3r.bpmn.intellij.plugin.bpmn.api.BpmnProcessObject
import com.valb3r.bpmn.intellij.plugin.bpmn.api.BpmnFileObject
import com.valb3r.bpmn.intellij.plugin.bpmn.api.PropertyTable
import com.valb3r.bpmn.intellij.plugin.bpmn.api.bpmn.BpmnElementId
import com.valb3r.bpmn.intellij.plugin.bpmn.api.bpmn.elements.BpmnSequenceFlow
Expand All @@ -25,7 +25,7 @@ internal class ActivityParserDumbTest {

@Test
fun `XML process with all Activiti elements is parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("popurri.bpmn20.xml".asResource()!!)

Expand All @@ -34,7 +34,7 @@ internal class ActivityParserDumbTest {

@Test
fun `XML process without name should be parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("empty-process-name.bpmn20.xml".asResource()!!)

Expand All @@ -44,7 +44,7 @@ internal class ActivityParserDumbTest {

@Test
fun `XML process with interlaced elements of same type should be parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("duplicates.bpmn20.xml".asResource()!!)

Expand All @@ -53,7 +53,7 @@ internal class ActivityParserDumbTest {

@Test
fun `XML process with nested subprocess elements of same type should be parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("nested.bpmn20.xml".asResource()!!)

Expand All @@ -62,38 +62,38 @@ internal class ActivityParserDumbTest {

@Test
fun `XML process with nested subprocess elements that have interlaced subelems of same type should be parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("nested-interlaced.bpmn20.xml".asResource()!!)

processObject.shouldNotBeNull()
processObject.process.body!!.serviceTask!!.map { it.id.id }.shouldContainAll(arrayOf("parentInterlaceBeginServiceTask", "parentInterlaceEndServiceTask"))
processObject.process.children!![BpmnElementId("sid-9E62AF47-D4DF-4492-BA2F-E531CEB29A03")]!!.serviceTask!!.shouldHaveSize(2)
processObject.process.children!![BpmnElementId("sid-9E62AF47-D4DF-4492-BA2F-E531CEB29A03")]!!.serviceTask!!.map { it.id.id }.shouldContain("nestedServiceTaskInterlaced")
processObject.processes[0].body!!.serviceTask!!.map { it.id.id }.shouldContainAll(arrayOf("parentInterlaceBeginServiceTask", "parentInterlaceEndServiceTask"))
processObject.processes[0].children!![BpmnElementId("sid-9E62AF47-D4DF-4492-BA2F-E531CEB29A03")]!!.serviceTask!!.shouldHaveSize(2)
processObject.processes[0].children!![BpmnElementId("sid-9E62AF47-D4DF-4492-BA2F-E531CEB29A03")]!!.serviceTask!!.map { it.id.id }.shouldContain("nestedServiceTaskInterlaced")
}

@Test
fun `XML process with nested other subprocess elements that have interlaced subelems of same type should be parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("nested-interlaced.bpmn20.xml".asResource()!!)

processObject.shouldNotBeNull()
processObject.process.body!!.serviceTask!!.map { it.id.id }.shouldContainAll(arrayOf("parentInterlaceBeginServiceTask", "parentInterlaceEndServiceTask"))
processObject.process.children!![BpmnElementId("sid-0B5D0923-5542-44DA-B86D-C3E4B2883DC2")]!!.serviceTask!!.shouldHaveSize(2)
processObject.process.children!![BpmnElementId("sid-0B5D0923-5542-44DA-B86D-C3E4B2883DC2")]!!.serviceTask!!.map { it.id.id }.shouldContain("nestedServiceTaskInterlacedOther")
processObject.processes[0].body!!.serviceTask!!.map { it.id.id }.shouldContainAll(arrayOf("parentInterlaceBeginServiceTask", "parentInterlaceEndServiceTask"))
processObject.processes[0].children!![BpmnElementId("sid-0B5D0923-5542-44DA-B86D-C3E4B2883DC2")]!!.serviceTask!!.shouldHaveSize(2)
processObject.processes[0].children!![BpmnElementId("sid-0B5D0923-5542-44DA-B86D-C3E4B2883DC2")]!!.serviceTask!!.map { it.id.id }.shouldContain("nestedServiceTaskInterlacedOther")
}

@Test
fun `XML process with nested transactional subprocess elements that have interlaced subelems of same type should be parseable without error`() {
val processObject: BpmnProcessObject?
val processObject: BpmnFileObject?

processObject = ActivitiParser().parse("nested-interlaced.bpmn20.xml".asResource()!!)

processObject.shouldNotBeNull()
processObject.process.body!!.serviceTask!!.map { it.id.id }.shouldContainAll(arrayOf("parentInterlaceBeginServiceTask", "parentInterlaceEndServiceTask"))
processObject.process.children!![BpmnElementId("sid-77F95F37-ADC3-4EBB-8F21-AEF1C015D5EB")]!!.serviceTask!!.shouldHaveSize(2)
processObject.process.children!![BpmnElementId("sid-77F95F37-ADC3-4EBB-8F21-AEF1C015D5EB")]!!.serviceTask!!.map { it.id.id }.shouldContain("nestedServiceTaskInterlacedYetOther")
processObject.processes[0].body!!.serviceTask!!.map { it.id.id }.shouldContainAll(arrayOf("parentInterlaceBeginServiceTask", "parentInterlaceEndServiceTask"))
processObject.processes[0].children!![BpmnElementId("sid-77F95F37-ADC3-4EBB-8F21-AEF1C015D5EB")]!!.serviceTask!!.shouldHaveSize(2)
processObject.processes[0].children!![BpmnElementId("sid-77F95F37-ADC3-4EBB-8F21-AEF1C015D5EB")]!!.serviceTask!!.map { it.id.id }.shouldContain("nestedServiceTaskInterlacedYetOther")
}

@Test
Expand Down Expand Up @@ -223,7 +223,7 @@ internal class ActivityParserDumbTest {

updated.shouldNotBeNull()
val updatedProcess = ActivitiParser().parse(updated)
updatedProcess.process.children!![BpmnElementId("sid-1334170C-BA4D-4387-99BD-44229D18942C")]!!.sequenceFlow!!.map { it.id }.shouldContain(newId)
updatedProcess.processes[0].children!![BpmnElementId("sid-1334170C-BA4D-4387-99BD-44229D18942C")]!!.sequenceFlow!!.map { it.id }.shouldContain(newId)
}

@Test
Expand Down Expand Up @@ -258,7 +258,7 @@ internal class ActivityParserDumbTest {

updated.shouldNotBeNull()
val processObject = ActivitiParser().parse(updated)
processObject.process.body!!.transaction!!.map { it.id.id }.shouldContain("sid-9DBEBCA6-7BE8-4170-ACC3-4548A2244C40")
processObject.processes[0].body!!.transaction!!.map { it.id.id }.shouldContain("sid-9DBEBCA6-7BE8-4170-ACC3-4548A2244C40")
}

@Test
Expand All @@ -280,7 +280,7 @@ internal class ActivityParserDumbTest {

updated.shouldNotBeNull()
val updatedProcess = ActivitiParser().parse(updated)
val sequenceFlow = updatedProcess.process.body!!.sequenceFlow!!.filter { it.id.id == "sid-2CF229A2-6399-4510-AED6-45B5C553458C"}.shouldHaveSingleItem()
val sequenceFlow = updatedProcess.processes[0].body!!.sequenceFlow!!.filter { it.id.id == "sid-2CF229A2-6399-4510-AED6-45B5C553458C"}.shouldHaveSingleItem()
sequenceFlow.conditionExpression!!.text.shouldBeNull()
}

Expand All @@ -293,7 +293,7 @@ internal class ActivityParserDumbTest {

updated.shouldNotBeNull()
val updatedProcess = ActivitiParser().parse(updated)
val sequenceFlow = updatedProcess.process.body!!.sequenceFlow!!.filter { it.id.id == "sid-BFF510EA-1AD5-4353-AB11-DF8B2090A9FD"}.shouldHaveSingleItem()
val sequenceFlow = updatedProcess.processes[0].body!!.sequenceFlow!!.filter { it.id.id == "sid-BFF510EA-1AD5-4353-AB11-DF8B2090A9FD"}.shouldHaveSingleItem()
sequenceFlow.conditionExpression!!.text.shouldBeNull()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
package com.valb3r.bpmn.intellij.plugin.activiti.parser

import com.valb3r.bpmn.intellij.plugin.bpmn.api.BpmnProcessObject
import com.valb3r.bpmn.intellij.plugin.bpmn.api.BpmnFileObject
import com.valb3r.bpmn.intellij.plugin.bpmn.api.events.EventPropagatableToXml
import org.amshove.kluent.shouldNotBeNull
import java.nio.charset.StandardCharsets

fun String.asResource(): String? = object {}::class.java.classLoader.getResource(this)?.readText(StandardCharsets.UTF_8)

fun readAndUpdateProcess(parser: ActivitiParser, event: EventPropagatableToXml): BpmnProcessObject {
fun readAndUpdateProcess(parser: ActivitiParser, event: EventPropagatableToXml): BpmnFileObject {
return readAndUpdateProcess(parser, "simple-nested.bpmn20.xml", event)
}

fun readAndUpdateProcess(parser: ActivitiParser, processName: String, event: EventPropagatableToXml): BpmnProcessObject {
fun readAndUpdateProcess(parser: ActivitiParser, processName: String, event: EventPropagatableToXml): BpmnFileObject {
return readAndUpdateProcess(parser, processName, listOf(event))
}

fun readAndUpdateProcess(parser: ActivitiParser, processName: String, events: List<EventPropagatableToXml>): BpmnProcessObject {
fun readAndUpdateProcess(parser: ActivitiParser, processName: String, events: List<EventPropagatableToXml>): BpmnFileObject {
val updated = updateBpmnFile(parser, processName, events)
return parser.parse(updated)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class WindowsEncodingAndCrLfTest {
val updateNameTo = "提交请假"
val ActivityParser = ActivitiParser()
val updated = ActivityParser.update(initial, listOf(StringValueUpdatedEvent(BpmnElementId("empty-process-name"), PropertyType.NAME, updateNameTo)))
ActivityParser.parse(updated).process.name.shouldBeEqualTo(updateNameTo)
ActivityParser.parse(updated).processes[0].name.shouldBeEqualTo(updateNameTo)
}

private fun setKoi8DefaultEncoding() {
Expand Down
Loading