Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
ade2f55
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 16, 2025
dfd9dc1
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 16, 2025
acdf0c1
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 16, 2025
35907bb
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 16, 2025
cbf2bc1
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 20, 2025
e04adf2
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 20, 2025
4022c5b
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 20, 2025
7982327
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 21, 2025
f9adc7f
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 22, 2025
0edc172
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 22, 2025
6b12025
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 22, 2025
69baaf6
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 22, 2025
5e7d29d
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 22, 2025
0e36c5f
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 22, 2025
eb619db
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 28, 2025
da52d1a
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 28, 2025
f9caa87
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
01fc5fe
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
40db1c3
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
565d170
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
321fb22
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
d5e6b99
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
0ba39e2
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
f7e99cb
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 29, 2025
2e9045d
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
b6cc621
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
0ef5039
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
149c400
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
c803e1a
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
c7ba6ad
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
78b7dff
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
e5f9969
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
aa2c1dd
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 30, 2025
bb99bcc
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 31, 2025
b97f5a7
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 31, 2025
2b272ec
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 31, 2025
0783725
Merge remote-tracking branch 'origin/release/7.0.0-rev9' into NAE-2235
Retoocs Oct 31, 2025
a3cc876
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Oct 31, 2025
c442350
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 3, 2025
8ada786
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 3, 2025
f870c04
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 3, 2025
6514393
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 3, 2025
a16849f
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 13, 2025
406cafb
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 13, 2025
b9616a9
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 13, 2025
c97efa0
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 13, 2025
449051b
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
7263d4e
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
51b200b
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
d163493
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
10f6aa9
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
2a0d305
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
ab50f49
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
2deef9c
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
a86d7d9
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
a0eb9f2
[NAE-2235] Improve Efficiency of Database Reads and Saves
Retoocs Nov 14, 2025
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 @@ -4,6 +4,7 @@ import com.netgrif.application.engine.auth.service.UserService
import com.netgrif.application.engine.objects.auth.domain.ActorTransformer
import com.netgrif.application.engine.objects.petrinet.domain.PetriNet
import com.netgrif.application.engine.objects.petrinet.domain.VersionType
import com.netgrif.application.engine.petrinet.params.ImportPetriNetParams
import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome
import groovy.util.logging.Slf4j
Expand All @@ -24,42 +25,47 @@ class ActionMigration {
private UserService userService;

void migrateActions(String petriNetPath) {
InputStream netStream = new ClassPathResource(petriNetPath).inputStream
ImportPetriNetEventOutcome newPetriNet = petriNetService.importPetriNet(netStream, VersionType.MAJOR, ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()))
List<PetriNet> oldPetriNets
try (InputStream netStream = new ClassPathResource(petriNetPath).inputStream) {
ImportPetriNetEventOutcome newPetriNet = petriNetService.importPetriNet(ImportPetriNetParams.with()
.xmlFile(netStream)
.releaseType(VersionType.MAJOR)
.author(ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()))
.build())
List<PetriNet> oldPetriNets

if(newPetriNet.getNet() != null) {
String message = "Petri net from file [" + petriNetPath + "] was not imported"
log.error(message)
throw new IllegalArgumentException(message)
} else {
oldPetriNets = petriNetService.getByIdentifier(newPetriNet.getNet().importId)
.stream().filter({ net -> (net.version != newPetriNet.getNet().version)})
.collect(Collectors.toList())
}
if (newPetriNet.getNet() == null) {
String message = "Petri net from file [" + petriNetPath + "] was not imported"
log.error(message)
throw new IllegalArgumentException(message)
} else {
oldPetriNets = petriNetService.getByIdentifier(newPetriNet.getNet().importId)
.stream().filter({ net -> (net.version != newPetriNet.getNet().version)})
.collect(Collectors.toList())
}

if(oldPetriNets.size() == 0){
String message = "Older version of Petri net with ID [" + newPetriNet.getNet().importId + "] is not present in MongoDB."
log.error(message)
throw new IllegalArgumentException(message)
} else {
oldPetriNets.each {net ->
migrateDataSetActions(newPetriNet.getNet(), net)
migrateDataRefActions(newPetriNet.getNet(), net)
petriNetService.save(net)
if (oldPetriNets.size() == 0){
String message = "Older version of Petri net with ID [" + newPetriNet.getNet().importId + "] is not present in MongoDB."
log.error(message)
throw new IllegalArgumentException(message)
} else {
oldPetriNets.each {net ->
migrateDataSetActions(newPetriNet.getNet(), net)
migrateDataRefActions(newPetriNet.getNet(), net)
petriNetService.save(net)
}
}
}
}

private void migrateDataSetActions(PetriNet newPetriNet, PetriNet oldPetriNet) {
private static void migrateDataSetActions(PetriNet newPetriNet, PetriNet oldPetriNet) {
newPetriNet.dataSet.each { key, data ->
if (data.events != null && data.events.size() > 0) {
oldPetriNet.dataSet[key].events = data.events
}
}
}

private void migrateDataRefActions(PetriNet newPetriNet, PetriNet oldPetriNet) {
private static void migrateDataRefActions(PetriNet newPetriNet, PetriNet oldPetriNet) {
newPetriNet.transitions.each { transKey, trans ->
trans.dataSet.each { dataKey, data ->
if (data.events != null && data.events.size() > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ import com.netgrif.application.engine.objects.utils.MenuItemUtils
import com.netgrif.application.engine.objects.workflow.domain.Case
import com.netgrif.application.engine.objects.workflow.domain.Task
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.EventOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.caseoutcomes.ChangeCasePropertyOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.dataoutcomes.GetDataEventOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.taskoutcomes.AssignTaskEventOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.taskoutcomes.FinishTaskEventOutcome
import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome
import com.netgrif.application.engine.objects.workflow.domain.menu.FilterBody
import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody
Expand All @@ -70,7 +72,11 @@ import com.netgrif.application.engine.plugin.meta.PluginHolder
import com.netgrif.application.engine.startup.ImportHelper
import com.netgrif.application.engine.startup.runner.DefaultFiltersRunner
import com.netgrif.application.engine.startup.runner.FilterRunner
import com.netgrif.application.engine.startup.runner.MenuProcessRunner
import com.netgrif.application.engine.utils.FullPageRequest
import com.netgrif.application.engine.workflow.params.CreateCaseParams
import com.netgrif.application.engine.workflow.params.DeleteCaseParams
import com.netgrif.application.engine.workflow.params.TaskParams
import com.netgrif.application.engine.workflow.service.FileFieldInputStream
import com.netgrif.application.engine.workflow.service.InitValueExpressionEvaluator
import com.netgrif.application.engine.workflow.service.TaskService
Expand Down Expand Up @@ -627,9 +633,12 @@ class ActionDelegate {
}

private addTaskOutcomes(Task task, Map dataSet) {
this.outcomes.add(taskService.assignTask(task.stringId))
this.outcomes.add(dataService.setData(task.stringId, ImportHelper.populateDataset(dataSet as Map<String, Map<String, String>>)))
this.outcomes.add(taskService.finishTask(task.stringId))
AssignTaskEventOutcome assignOutcome = taskService.assignTask(new TaskParams(task.stringId))
this.outcomes.add(assignOutcome)
SetDataEventOutcome setDataOutcome = dataService.setData(assignOutcome.getTask(), ImportHelper.populateDataset(dataSet as Map<String, Map<String, String>>))
this.outcomes.add(setDataOutcome)
FinishTaskEventOutcome finishOutcome = taskService.finishTask(new TaskParams(setDataOutcome.getTask()))
this.outcomes.add(finishOutcome)
}

List<String> searchCases(Closure<Predicate> predicates) {
Expand Down Expand Up @@ -869,6 +878,8 @@ class ActionDelegate {
}
taskService.save(tasks)
}

outcomes.add(new ChangeCasePropertyOutcome(useCase))
}]
}

Expand Down Expand Up @@ -937,25 +948,57 @@ class ActionDelegate {
return workflowService.findOne(stringId)
}

Case createCase(String identifier, String title = null, String color = "", AbstractUser author = userService.loggedOrSystem, Locale locale = LocaleContextHolder.getLocale(), Map<String, String> params = [:]) {
return workflowService.createCaseByIdentifier(identifier, title, color, ActorTransformer.toLoggedUser(author), locale, params).getCase()
}

Case createCase(PetriNet net, String title = net.defaultCaseName.getTranslation(locale), String color = "", AbstractUser author = userService.loggedOrSystem, Locale locale = LocaleContextHolder.getLocale(), Map<String, String> params = [:]) {
CreateCaseEventOutcome outcome = workflowService.createCase(net.stringId, title, color, ActorTransformer.toLoggedUser(author), params)
Case createCase(String identifier, String title = null, String color = "", AbstractUser author = userService.loggedOrSystem,
Locale locale = LocaleContextHolder.getLocale(), Map<String, String> params = [:]) {
return workflowService.createCase(CreateCaseParams.with()
.processIdentifier(identifier)
.title(title)
.color(color)
.author(ActorTransformer.toLoggedUser(author))
.locale(locale)
.params(params)
.build()).getCase()
}

Case createCase(PetriNet net, String title = net.defaultCaseName.getTranslation(locale), String color = "",
AbstractUser author = userService.loggedOrSystem, Locale locale = LocaleContextHolder.getLocale(), Map<String, String> params = [:]) {
CreateCaseEventOutcome outcome = workflowService.createCase(CreateCaseParams.with()
.process(net)
.title(title)
.color(color)
.author(ActorTransformer.toLoggedUser(author))
.locale(locale)
.params(params)
.build())
this.outcomes.add(outcome)
return outcome.getCase()
}

Case deleteCase(Case useCase) {
return workflowService.deleteCase(new DeleteCaseParams(useCase)).case
}

Case deleteCase(String caseId) {
return workflowService.deleteCase(new DeleteCaseParams(caseId)).case
}

Task assignTask(String transitionId, Case aCase = useCase, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
String taskId = getTaskId(transitionId, aCase)
AssignTaskEventOutcome outcome = taskService.assignTask(ActorTransformer.toLoggedUser(user), taskId, params)
AssignTaskEventOutcome outcome = taskService.assignTask(TaskParams.with()
.taskId(taskId)
.user(user)
.params(params)
.build())
this.outcomes.add(outcome)
return outcome.getTask()
}

Task assignTask(Task task, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
return addTaskOutcomeAndReturnTask(taskService.assignTask(task, user, params))
return addTaskOutcomeAndReturnTask(taskService.assignTask(TaskParams.with()
.task(task)
.user(user)
.params(params)
.build()))
}

void assignTasks(List<Task> tasks, AbstractUser assignee = userService.loggedOrSystem, Map<String, String> params = [:]) {
Expand All @@ -964,11 +1007,19 @@ class ActionDelegate {

Task cancelTask(String transitionId, Case aCase = useCase, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
String taskId = getTaskId(transitionId, aCase)
return addTaskOutcomeAndReturnTask(taskService.cancelTask(ActorTransformer.toLoggedUser(user), taskId, params))
return addTaskOutcomeAndReturnTask(taskService.cancelTask(TaskParams.with()
.taskId(taskId)
.user(user)
.params(params)
.build()))
}

Task cancelTask(Task task, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
return addTaskOutcomeAndReturnTask(taskService.cancelTask(task, user, params))
return addTaskOutcomeAndReturnTask(taskService.cancelTask(TaskParams.with()
.task(task)
.user(user)
.params(params)
.build()))
}

void cancelTasks(List<Task> tasks, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
Expand All @@ -982,11 +1033,19 @@ class ActionDelegate {

void finishTask(String transitionId, Case aCase = useCase, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
String taskId = getTaskId(transitionId, aCase)
addTaskOutcomeAndReturnTask(taskService.finishTask(ActorTransformer.toLoggedUser(user), taskId, params))
addTaskOutcomeAndReturnTask(taskService.finishTask(TaskParams.with()
.taskId(taskId)
.user(user)
.params(params)
.build()))
}

void finishTask(Task task, AbstractUser user = userService.loggedOrSystem, Map<String, String> params = [:]) {
addTaskOutcomeAndReturnTask(taskService.finishTask(task, user, params))
addTaskOutcomeAndReturnTask(taskService.finishTask(TaskParams.with()
.task(task)
.user(user)
.params(params)
.build()))
}

void finishTasks(List<Task> tasks, AbstractUser finisher = userService.loggedOrSystem, Map<String, String> params = [:]) {
Expand Down Expand Up @@ -1078,6 +1137,7 @@ class ActionDelegate {
return addSetDataOutcomeToOutcomes(dataService.setData(taskId, ImportHelper.populateDataset(dataSet), params))
}

// todo: remove all deprecated
@Deprecated
SetDataEventOutcome setDataWithPropagation(String transitionId, Case caze, Map dataSet) {
Task task = taskService.findOne(caze.tasks.find { it.transition == transitionId }.task)
Expand Down Expand Up @@ -1120,8 +1180,7 @@ class ActionDelegate {

Map<String, Field> getData(String taskId, Map<String, String> params = [:]) {
Task task = taskService.findById(taskId)
def useCase = workflowService.findOne(task.caseId)
return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(task, useCase, params)))
return getData(task, params)
}

Map<String, Field> getData(Transition transition, Map<String, String> params = [:]) {
Expand Down Expand Up @@ -1321,8 +1380,11 @@ class ActionDelegate {
}

def changeUserByEmail(String email, String attribute, def cl) {
AbstractUser user = userService.findUserByUsername(email, null)
changeUser(user, attribute, cl)
Optional<AbstractUser> userOpt = userService.findUserByUsername(email, null)
if (userOpt.isEmpty()) {
throw new IllegalArgumentException("Such user with email %s does not exists.".formatted(email))
}
changeUser(userOpt.get(), attribute, cl)
}

def changeUser(String id, String attribute, def cl) {
Expand Down Expand Up @@ -1365,8 +1427,10 @@ class ActionDelegate {

void deleteUser(String email) {
AbstractUser user = userService.findByEmail(email, null)
if (user == null)
if (user == null) {
log.error("Cannot find user with email [" + email + "]")
return
}
deleteUser(user)
}

Expand All @@ -1384,12 +1448,12 @@ class ActionDelegate {
}

AbstractUser findUserByEmail(String email) {
AbstractUser user = userService.findUserByUsername(email, null)
if (user == null) {
Optional<AbstractUser> userOpt = userService.findUserByUsername(email, null)
if (userOpt.isEmpty()) {
log.error("Cannot find user with email [" + email + "]")
return null
} else {
return user
return userOpt.get()
}
}

Expand Down Expand Up @@ -1709,7 +1773,7 @@ class ActionDelegate {
* @return
*/
def deleteFilter(Case filter) {
workflowService.deleteCase(filter.stringId)
workflowService.deleteCase(new DeleteCaseParams(filter.stringId))
}

/**
Expand Down Expand Up @@ -1947,7 +2011,7 @@ class ActionDelegate {
*/
def deleteMenuItem(Case item) {
async.run {
workflowService.deleteCase(item.stringId)
workflowService.deleteCase(new DeleteCaseParams(item.stringId))
}
}

Expand Down Expand Up @@ -2736,12 +2800,12 @@ class ActionDelegate {

options.putAll(splitPathList.collectEntries { [(it): new I18nString(it)] })

Case caseByPath = findCaseElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.nodePath.textValue.keyword:\"$path\"")
Case caseByPath = findCaseElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.nodePath.textValue.keyword:\"$path\"")
Set<String> childrenIds = caseByPath.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as Set
if (!childrenIds.isEmpty()) {
for (String id : childrenIds) {
Case childFolderCase = workflowService.findOne(id)
options.put(childFolderCase.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS.value].value as String, new I18nString(childFolderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_NAME.value].value as String))
options.put(childFolderCase.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS.value].value as String, new I18nString(childFolderCase.dataSet[MenuItemConstants.FIELD_NODE_NAME.value].value as String))
}
}

Expand Down
Loading
Loading