diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index 57906d4a391..0ba8ed18add 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -34,10 +34,6 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 200 services: - mongo: - image: mongo:4.4 - ports: - - 27017:27017 redis: image: redis @@ -52,12 +48,45 @@ jobs: options: -e="discovery.type=single-node" -e="xpack.security.enabled=false" --health-cmd="curl http://localhost:9200/_cluster/health" --health-interval=10s --health-timeout=5s --health-retries=10 steps: + - name: Start MongoDB + uses: MongoCamp/mongodb-github-action@1.2.0 + with: + mongodb-version: 4.4 + mongodb-replica-set: rs0 + + - name: Wait for Elasticsearch to be ready + run: | + echo "Waiting for Elasticsearch to be ready..." + for i in {1..30}; do + if curl -fsSL http://localhost:9200/_cluster/health | grep '"status":"green"' &>/dev/null; then + echo "Elasticsearch is up" + break + fi + echo "Waiting for Elasticsearch..." + sleep 2 + done + + - name: Wait for MongoDB to be ready + run: | + echo "Waiting for MongoDB to be ready..." + for i in {1..30}; do + if mongo --eval "printjson(db.serverStatus())" &>/dev/null; then + echo "MongoDB is up" + break + fi + echo "Waiting for MongoDB..." + sleep 2 + done + - name: Test Database env: ELASTIC_SEARCH_URL: http://localhost:${{ job.services.elasticsearch.ports[9200] }} + MONGO_URL: http://localhost:27017 run: | echo $ELASTIC_SEARCH_URL + echo $MONGO_URL curl -fsSL "$ELASTIC_SEARCH_URL/_cat/health?h=status" + curl -fsSL "$MONGO_URL" - uses: actions/checkout@v3 with: @@ -86,7 +115,6 @@ jobs: - name: Generate certificates run: cd src/main/resources/certificates && openssl genrsa -out keypair.pem 4096 && openssl rsa -in keypair.pem -pubout -out public.crt && openssl pkcs8 -topk8 -inform PEM -outform DER -nocrypt -in keypair.pem -out private.der && cd ../../../.. - - name: Build run: mvn clean package install -DskipTests=true diff --git a/docker-compose.yml b/docker-compose.yml index e8f9e97c2c6..93cb61876f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,15 @@ version: "3.3" services: docker-mongo: image: mongo:4.4 + command: ["--replSet", "rs0", "--bind_ip_all", "--port", "27017"] + hostname: 127.0.0.1 ports: - "27017:27017" + healthcheck: + test: echo "try { rs.status() } catch (err) { rs.initiate({_id:'rs0',members:[{_id:0,host:'host.docker.internal:27017'}]}) }" | mongosh --port 27017 --quiet + interval: 5s + timeout: 30s + retries: 10 deploy: resources: limits: diff --git a/docs/_media/roles/usersRef_functions.groovy b/docs/_media/roles/usersRef_functions.groovy index 6effbe44b83..c2cc284feb9 100644 --- a/docs/_media/roles/usersRef_functions.groovy +++ b/docs/_media/roles/usersRef_functions.groovy @@ -1,5 +1,5 @@ Long getDummyUser() { - return userService.findByEmail("dummy@netgrif.com", true).id + return userService.findByEmail("dummy@netgrif.com").id } void debug() { diff --git a/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy b/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy index 20228cbce3d..ea2c95a34fe 100644 --- a/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy +++ b/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy @@ -3,8 +3,9 @@ package com.netgrif.application.engine.migration import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import groovy.util.logging.Slf4j import org.springframework.beans.factory.annotation.Autowired import org.springframework.core.io.ClassPathResource @@ -20,11 +21,12 @@ class ActionMigration { private IPetriNetService petriNetService @Autowired - private IUserService userService; + private IUserService userService void migrateActions(String petriNetPath) { InputStream netStream = new ClassPathResource(petriNetPath).inputStream - ImportPetriNetEventOutcome newPetriNet = petriNetService.importPetriNet(netStream, VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()) + ImportPetriNetEventOutcome newPetriNet = petriNetService.importPetriNet(new ImportPetriNetParams(netStream, + VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())) List oldPetriNets if(newPetriNet.getNet() != null) { @@ -50,7 +52,7 @@ class ActionMigration { } } - 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 @@ -58,7 +60,7 @@ class ActionMigration { } } - 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) { diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy index f00157c40fa..a7b8027b5b7 100644 --- a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy @@ -34,16 +34,24 @@ import com.netgrif.application.engine.petrinet.service.interfaces.IUriService import com.netgrif.application.engine.rules.domain.RuleRepository import com.netgrif.application.engine.startup.DefaultFiltersRunner import com.netgrif.application.engine.startup.FilterRunner +import com.netgrif.application.engine.transaction.NaeTransaction import com.netgrif.application.engine.utils.FullPageRequest import com.netgrif.application.engine.workflow.domain.* -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.AssignTaskEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CaseEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.AssignTaskEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.TaskEventOutcome import com.netgrif.application.engine.workflow.domain.menu.MenuItemBody import com.netgrif.application.engine.workflow.domain.menu.MenuItemConstants +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams +import com.netgrif.application.engine.workflow.domain.params.GetDataParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.FileFieldInputStream import com.netgrif.application.engine.workflow.service.TaskService import com.netgrif.application.engine.workflow.service.interfaces.* @@ -61,10 +69,11 @@ import org.springframework.context.i18n.LocaleContextHolder import org.springframework.data.domain.Page import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Pageable +import org.springframework.data.mongodb.MongoTransactionManager +import org.springframework.transaction.TransactionDefinition import java.text.Normalizer import java.util.stream.Collectors - /** * ActionDelegate class contains Actions API methods. */ @@ -177,6 +186,9 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { @Autowired PublicViewProperties publicViewProperties + @Autowired + MongoTransactionManager transactionManager + FrontendActionOutcome Frontend /** @@ -209,6 +221,94 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { this.Frontend = new FrontendActionOutcome(this.useCase, this.task, this.outcomes) } + /** + * Method runs provided code in database transaction. If the provided code fails, the rollback callback is called + * and no exception is thrown. If the callback fails the subject exception is thrown. + *
+ * Simple example: + *
+     *     trans: t.t1,
+     *     text: f.textId;
+     *
+     *     transactional {
+     *         change text value { "some text value" }
+     *         make text, visible on trans when { true }
+     *     }
+     *     createCase("my_process", "My case")
+     * 
+ * Complex example: + *
+     *     trans: t.t1,
+     *     result: f.resultId,
+     *     text: f.textId;
+     *
+     *     def myTransaction = transactional (
+     *          timeout: 1000,
+     *          forceCreation: true,
+     *          event: {
+     *              createCase("my_process", "My case")
+     *              change text value { "some text value" }
+     *          },
+     *          onCommit: {
+     *              make text, editable on trans when { true }
+     *          },
+     *          onRollBack: { error ->
+     *              handleError(error)
+     *          }
+     *     )
+     *     change result value { myTransaction.wasRolledBack }
+     * 
+ * + * @param timeout timeout in milliseconds. If the time is reached, transaction fails. The default value is + * {@link TransactionDefinition#TIMEOUT_DEFAULT} + * @param forceCreation if set to true, new transaction is created under any situation. If set to false new + * transaction is created only if none transaction is active + * @param event code to be run in transaction + * @param onCommit callback, that is called after the successful commit + * @param onRollBack callback, that is called after event failure + * + * @returns {@link NaeTransaction} with state after the commit and callback execution + * */ + @NamedVariant + NaeTransaction transaction(int timeout = TransactionDefinition.TIMEOUT_DEFAULT, boolean forceCreation = false, Closure event, + Closure onCommit = null, Closure onRollBack = null) { + def transactionBuilder = NaeTransaction.builder() + .timeout(timeout) + .forceCreation(forceCreation) + .event(event) + .onCommit(onCommit) + .onRollBack(onRollBack) + .transactionManager(transactionManager) + + NaeTransaction transaction = transactionBuilder.build() + executeTransaction(transaction) + throwIfCallBackFailed(transaction) + + return transaction + } + + /** + * Logs and throws an exception if the transaction failed on callback execution. + * + * @param transaction object after the commit / rollback + * */ + protected void throwIfCallBackFailed(NaeTransaction transaction) { + if (transaction.onCallBackException == null){ + return + } + log.error("Transaction synchronization call back execution failed with message: {} ", transaction.onCallBackException.getMessage()) + throw transaction.onCallBackException + } + + protected void executeTransaction(NaeTransaction transaction) { + try { + transaction.begin() + } catch (Exception e) { + log.warn("Transaction failed in action: $action.definition") + log.error("Transaction failed with error: {}", e.getMessage(), e) + } + } + void initFieldsMap(Map fieldIds, Case useCase) { fieldIds.each { name, id -> set(name, useCase.getDataSet().get(id)) @@ -430,9 +530,9 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { } SetDataEventOutcome setData(Field field, Map changes, IUser user = userService.loggedOrSystem) { - SetDataEventOutcome outcome = dataService.setData(useCase, new DataSet([ + SetDataEventOutcome outcome = dataService.setData(new SetDataParams(useCase, new DataSet([ (field.stringId): field.class.newInstance(changes) - ] as Map>), user) + ] as Map>), user)) this.outcomes.add(outcome) updateCase() return outcome @@ -510,9 +610,12 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { } private addTaskOutcomes(Task task, DataSet dataSet) { - this.outcomes.add(taskService.assignTask(task.stringId)) - this.outcomes.add(dataService.setData(task.stringId, dataSet, userService.loggedOrSystem)) - this.outcomes.add(taskService.finishTask(task.stringId)) + AssignTaskEventOutcome assignOutcome = taskService.assignTask(new TaskParams(task)) + this.outcomes.add(assignOutcome) + SetDataEventOutcome setDataOutcome = dataService.setData(new SetDataParams(assignOutcome.getTask(), dataSet, + userService.loggedOrSystem)) + this.outcomes.add(setDataOutcome) + this.outcomes.add(taskService.finishTask(new TaskParams(setDataOutcome.getTask()))) } List searchCases(Closure predicates) { @@ -710,25 +813,57 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { } Case createCase(String identifier, String title = null, String color = "", IUser author = userService.loggedOrSystem, Locale locale = LocaleContextHolder.getLocale(), Map params = [:]) { - return workflowService.createCaseByIdentifier(identifier, title, color, author.transformToLoggedUser(), locale, params).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNetIdentifier(identifier) + .title(title) + .color(color) + .loggedUser(author.transformToLoggedUser()) + .params(params) + .build() + return workflowService.createCase(createCaseParams).getCase() } Case createCase(PetriNet net, String title = net.defaultCaseName.getTranslation(locale), String color = "", IUser author = userService.loggedOrSystem, Locale locale = LocaleContextHolder.getLocale(), Map params = [:]) { - CreateCaseEventOutcome outcome = workflowService.createCase(net.stringId, title, color, author.transformToLoggedUser(), params) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title(title) + .color(color) + .loggedUser(author.transformToLoggedUser()) + .params(params) + .build() + CreateCaseEventOutcome outcome = workflowService.createCase(createCaseParams) this.outcomes.add(outcome) return outcome.getCase() } + Case deleteCase(Case useCase) { + DeleteCaseEventOutcome outcome = workflowService.deleteCase(new DeleteCaseParams(useCase)) + return outcome.case + } + + Case deleteCase(String caseId) { + DeleteCaseEventOutcome outcome = workflowService.deleteCase(new DeleteCaseParams(caseId)) + return outcome.case + } + Task assignTask(String transitionId, Case aCase = useCase, IUser user = userService.loggedOrSystem, Map params = [:]) { String taskId = getTaskId(transitionId, aCase) - AssignTaskEventOutcome outcome = taskService.assignTask(user.transformToLoggedUser(), taskId, params) - this.outcomes.add(outcome) - updateCase() - return outcome.getTask() + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .useCase(aCase) + .user(user) + .params(params) + .build() + return addTaskOutcomeAndReturnTask(taskService.assignTask(taskParams)) } Task assignTask(Task task, IUser user = userService.loggedOrSystem, Map params = [:]) { - return addTaskOutcomeAndReturnTask(taskService.assignTask(task, user, params)) + TaskParams taskParams = TaskParams.with() + .task(task) + .user(user) + .params(params) + .build() + return addTaskOutcomeAndReturnTask(taskService.assignTask(taskParams)) } void assignTasks(List tasks, IUser assignee = userService.loggedOrSystem, Map params = [:]) { @@ -737,11 +872,22 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { Task cancelTask(String transitionId, Case aCase = useCase, IUser user = userService.loggedOrSystem, Map params = [:]) { String taskId = getTaskId(transitionId, aCase) - return addTaskOutcomeAndReturnTask(taskService.cancelTask(user.transformToLoggedUser(), taskId, params)) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .useCase(aCase) + .user(user) + .params(params) + .build() + return addTaskOutcomeAndReturnTask(taskService.cancelTask(taskParams)) } Task cancelTask(Task task, IUser user = userService.loggedOrSystem, Map params = [:]) { - return addTaskOutcomeAndReturnTask(taskService.cancelTask(task, user, params)) + TaskParams taskParams = TaskParams.with() + .task(task) + .user(user) + .params(params) + .build() + return addTaskOutcomeAndReturnTask(taskService.cancelTask(taskParams)) } void cancelTasks(List tasks, IUser user = userService.loggedOrSystem, Map params = [:]) { @@ -756,11 +902,22 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { void finishTask(String transitionId, Case aCase = useCase, IUser user = userService.loggedOrSystem, Map params = [:]) { String taskId = getTaskId(transitionId, aCase) - addTaskOutcomeAndReturnTask(taskService.finishTask(user.transformToLoggedUser(), taskId, params)) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .useCase(aCase) + .user(user) + .params(params) + .build() + addTaskOutcomeAndReturnTask(taskService.finishTask(taskParams)) } void finishTask(Task task, IUser user = userService.loggedOrSystem, Map params = [:]) { - addTaskOutcomeAndReturnTask(taskService.finishTask(task, user, params)) + TaskParams taskParams = TaskParams.with() + .task(task) + .user(user) + .params(params) + .build() + addTaskOutcomeAndReturnTask(taskService.finishTask(taskParams)) } void finishTasks(List tasks, IUser finisher = userService.loggedOrSystem, Map params = [:]) { @@ -837,7 +994,7 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { // TODO: release/8.0.0 merge check, params x dataset SetDataEventOutcome setData(DataSet dataSet, IUser user = userService.loggedOrSystem) { - return addSetDataOutcomeToOutcomes(dataService.setData(useCase, dataSet, user)) + return addSetDataOutcomeToOutcomes(dataService.setData(new SetDataParams(useCase, dataSet, user))) } SetDataEventOutcome setData(Task task, DataSet dataSet, IUser user = userService.loggedOrSystem, Map params = [:]) { @@ -845,7 +1002,13 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { } SetDataEventOutcome setData(String taskId, DataSet dataSet, IUser user = userService.loggedOrSystem, Map params = [:]) { - return addSetDataOutcomeToOutcomes(dataService.setData(taskId, dataSet, user, params)) + SetDataParams setDataParams = SetDataParams.with() + .taskId(taskId) + .dataSet(dataSet) + .user(user) + .params(params) + .build() + return addSetDataOutcomeToOutcomes(dataService.setData(setDataParams)) } SetDataEventOutcome setData(Transition transition, DataSet dataSet, IUser user = userService.loggedOrSystem, Map params = [:]) { @@ -855,7 +1018,13 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { SetDataEventOutcome setData(String transitionId, Case useCase, DataSet dataSet, IUser user = userService.loggedOrSystem, Map params = [:]) { def predicate = QTask.task.caseId.eq(useCase.stringId) & QTask.task.transitionId.eq(transitionId) def task = taskService.searchOne(predicate) - return addSetDataOutcomeToOutcomes(dataService.setData(task.stringId, dataSet, user, params)) + SetDataParams setDataParams = SetDataParams.with() + .task(task) + .dataSet(dataSet) + .user(user) + .params(params) + .build() + return addSetDataOutcomeToOutcomes(dataService.setData(setDataParams)) } @Deprecated @@ -883,13 +1052,22 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { Map getData(Task task, IUser user = userService.loggedOrSystem, Map params = [:]) { def useCase = workflowService.findOne(task.caseId) - return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(task, useCase, user, params))) + GetDataParams getDataParams = GetDataParams.with() + .task(task) + .useCase(useCase) + .user(user) + .params(params) + .build() + return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(getDataParams))) } Map getData(String taskId, IUser user = userService.loggedOrSystem, Map params = [:]) { - Task task = taskService.findById(taskId) - def useCase = workflowService.findOne(task.caseId) - return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(task, useCase, user, params))) + GetDataParams getDataParams = GetDataParams.with() + .taskId(taskId) + .user(user) + .params(params) + .build() + return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(getDataParams))) } Map getData(Transition transition, IUser user = userService.loggedOrSystem, Map params = [:]) { @@ -902,7 +1080,13 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { if (!task) { return new HashMap() } - return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(task, useCase, user, params))) + GetDataParams getDataParams = GetDataParams.with() + .task(task) + .useCase(useCase) + .user(user) + .params(params) + .build() + return mapData(addGetDataOutcomeToOutcomesAndReturnData(dataService.getData(getDataParams))) } private List addGetDataOutcomeToOutcomesAndReturnData(GetDataEventOutcome outcome) { @@ -1054,7 +1238,7 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { void deleteUser(IUser user) { List tasks = taskService.findByUser(new FullPageRequest(), user).toList() if (tasks != null && tasks.size() > 0) - taskService.cancelTasks(tasks, user) + taskService.cancelTasks(tasks, user, params) QCase qCase = new QCase("case") List cases = workflowService.searchAll(qCase.author.eq(user.transformToAuthor())).toList() @@ -1413,7 +1597,10 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { * @return */ def deleteFilter(Case filter) { - workflowService.deleteCase(filter.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(filter) + .build() + workflowService.deleteCase(deleteCaseParams) } /** @@ -1732,7 +1919,10 @@ class ActionDelegate /*TODO: release/8.0.0: implements ActionAPI*/ { */ def deleteMenuItem(Case item) { async.run { - workflowService.deleteCase(item.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(item) + .build() + workflowService.deleteCase(deleteCaseParams) } } diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionRunner.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionRunner.groovy index 6c6aea0f0cc..3570419126b 100644 --- a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionRunner.groovy +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionRunner.groovy @@ -1,16 +1,19 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action - import com.netgrif.application.engine.petrinet.domain.Function import com.netgrif.application.engine.petrinet.domain.dataset.Field +import com.netgrif.application.engine.transaction.NaeTransaction import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome import com.netgrif.application.engine.workflow.service.interfaces.IFieldActionsCacheService import groovy.util.logging.Slf4j import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Lookup +import org.springframework.data.mongodb.MongoTransactionManager import org.springframework.stereotype.Component +import org.springframework.transaction.TransactionDefinition +import org.springframework.transaction.support.TransactionSynchronizationManager @Slf4j @Component @@ -23,6 +26,9 @@ abstract class ActionRunner { @Autowired private IFieldActionsCacheService actionsCacheService + @Autowired + private MongoTransactionManager transactionManager + private Map actionsCache = new HashMap<>() List run(Action action, Case useCase, Map params, List functions = []) { @@ -37,7 +43,16 @@ abstract class ActionRunner { def code = getActionCode(action, functions) try { code.init(action, useCase, task, changes, this, params) - code() + if (TransactionSynchronizationManager.isSynchronizationActive()) { + def transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(code) + .build() + transaction.setForceCreation(false) + transaction.begin() + } else { + code() + } } catch (Exception e) { log.error("Action: $action.definition") throw e diff --git a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FrontendActionOutcome.groovy b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FrontendActionOutcome.groovy index dc644ec4073..9ff4a063b1e 100644 --- a/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FrontendActionOutcome.groovy +++ b/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FrontendActionOutcome.groovy @@ -2,8 +2,8 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action import com.netgrif.application.engine.petrinet.domain.dataset.logic.FrontAction import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome class FrontendActionOutcome { diff --git a/src/main/groovy/com/netgrif/application/engine/startup/DefaultFiltersRunner.groovy b/src/main/groovy/com/netgrif/application/engine/startup/DefaultFiltersRunner.groovy index da3594dd345..8cef6b248a8 100644 --- a/src/main/groovy/com/netgrif/application/engine/startup/DefaultFiltersRunner.groovy +++ b/src/main/groovy/com/netgrif/application/engine/startup/DefaultFiltersRunner.groovy @@ -3,25 +3,23 @@ package com.netgrif.application.engine.startup import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.PetriNet -import com.netgrif.application.engine.petrinet.domain.dataset.EnumerationMapField -import com.netgrif.application.engine.petrinet.domain.dataset.Field -import com.netgrif.application.engine.petrinet.domain.dataset.FilterField -import com.netgrif.application.engine.petrinet.domain.dataset.NumberField -import com.netgrif.application.engine.petrinet.domain.dataset.TextField +import com.netgrif.application.engine.petrinet.domain.dataset.* import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QCase import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import com.netgrif.application.engine.workflow.web.responsebodies.DataSet -import groovy.transform.CompileStatic import lombok.extern.slf4j.Slf4j import org.springframework.beans.factory.annotation.Autowired -import org.springframework.stereotype.Component import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component @Slf4j @Component @@ -271,11 +269,17 @@ class DefaultFiltersRunner extends AbstractOrderedCommandLineRunner { } } - Case filterCase = this.workflowService.createCase(filterNet.getStringId(), title, null, loggedUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(filterNet) + .title(title) + .color(null) + .loggedUser(loggedUser.transformToLoggedUser()) + .build() + Case filterCase = this.workflowService.createCase(createCaseParams).getCase() filterCase.setIcon(icon) filterCase = this.workflowService.save(filterCase) Task newFilterTask = this.taskService.searchOne(QTask.task.transitionId.eq(AUTO_CREATE_TRANSITION).and(QTask.task.caseId.eq(filterCase.getStringId()))) - this.taskService.assignTask(newFilterTask, this.userService.getLoggedOrSystem()) + this.taskService.assignTask(new TaskParams(newFilterTask, this.userService.getLoggedOrSystem())) DataSet dataSet = new DataSet([ (FILTER_TYPE_FIELD_ID): new EnumerationMapField(rawValue: filterType), @@ -288,11 +292,11 @@ class DefaultFiltersRunner extends AbstractOrderedCommandLineRunner { } // TODO: release/8.0.0 join setData to one call - this.dataService.setData(newFilterTask, dataSet, superCreator.getSuperUser()) + this.dataService.setData(new SetDataParams(newFilterTask, dataSet, superCreator.getSuperUser())) if (isImported) { - this.dataService.setData(newFilterTask, new DataSet([ + this.dataService.setData(new SetDataParams(newFilterTask, new DataSet([ (IS_IMPORTED): new NumberField(rawValue: 1) - ] as Map>), superCreator.getSuperUser()) + ] as Map>), superCreator.getSuperUser())) } I18nString translatedTitle = new I18nString(title) @@ -302,7 +306,7 @@ class DefaultFiltersRunner extends AbstractOrderedCommandLineRunner { filterCase.dataSet.get(FILTER_I18N_TITLE_FIELD_ID).rawValue = translatedTitle workflowService.save(filterCase) - this.taskService.finishTask(newFilterTask, this.userService.getLoggedOrSystem()) + this.taskService.finishTask(new TaskParams(newFilterTask, this.userService.getLoggedOrSystem())) return Optional.of(this.workflowService.findOne(filterCase.getStringId())) } } diff --git a/src/main/groovy/com/netgrif/application/engine/startup/FilterRunner.groovy b/src/main/groovy/com/netgrif/application/engine/startup/FilterRunner.groovy index bf68e37691e..9bc56d24b0f 100644 --- a/src/main/groovy/com/netgrif/application/engine/startup/FilterRunner.groovy +++ b/src/main/groovy/com/netgrif/application/engine/startup/FilterRunner.groovy @@ -3,7 +3,6 @@ package com.netgrif.application.engine.startup import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import groovy.transform.CompileStatic import groovy.util.logging.Slf4j import org.springframework.beans.factory.annotation.Autowired diff --git a/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy b/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy index b03c6f26aa9..fd99fffa368 100644 --- a/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy +++ b/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy @@ -7,16 +7,21 @@ import com.netgrif.application.engine.orgstructure.groups.interfaces.INextGroupS import com.netgrif.application.engine.petrinet.domain.DataRef import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.ProcessRoleService import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.petrinet.service.interfaces.IUriService import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.AssignTaskEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.CancelTaskEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.FinishTaskEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.AssignTaskEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.CancelTaskEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.FinishTaskEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.GetDataParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService @@ -24,8 +29,6 @@ import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowServi import com.netgrif.application.engine.workflow.web.responsebodies.DataSet import com.netgrif.application.engine.workflow.web.responsebodies.TaskReference import groovy.util.logging.Slf4j -import org.slf4j.Logger -import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.core.io.ClassPathResource import org.springframework.core.io.ResourceLoader @@ -96,7 +99,7 @@ class ImportHelper { Optional createNet(String fileName, VersionType release = VersionType.MAJOR, LoggedUser author = userService.getSystem().transformToLoggedUser(), String uriNodeId = uriService.getRoot().stringId) { InputStream netStream = new ClassPathResource("petriNets/$fileName" as String).inputStream - PetriNet petriNet = petriNetService.importPetriNet(netStream, release, author, uriNodeId).getNet() + PetriNet petriNet = petriNetService.importPetriNet(new ImportPetriNetParams(netStream, release, author, uriNodeId)).getNet() log.info("Imported '${petriNet?.title?.defaultValue}' ['${petriNet?.identifier}', ${petriNet?.stringId}]") return Optional.of(petriNet) } @@ -109,12 +112,12 @@ class ImportHelper { return Optional.of(petriNet) } - ProcessRole getProcessRoleByImportId(PetriNet net, String roleId) { + static ProcessRole getProcessRoleByImportId(PetriNet net, String roleId) { ProcessRole role = net.roles.values().find { it -> it.importId == roleId } return role } - Map getProcessRolesByImportId(PetriNet net, Map importId) { + static Map getProcessRolesByImportId(PetriNet net, Map importId) { HashMap roles = new HashMap<>() importId.each { it -> roles.put(it.getKey(), getProcessRoleByImportId(net, it.getValue())) @@ -131,7 +134,7 @@ class ImportHelper { return map } - IUser createUser(User user, Authority[] authorities, ProcessRole[] roles) { + IUser createUser(IUser user, Authority[] authorities, ProcessRole[] roles) { authorities.each { user.addAuthority(it) } roles.each { user.addProcessRole(it) } user.state = UserState.ACTIVE @@ -141,7 +144,13 @@ class ImportHelper { } Case createCase(String title, PetriNet net, LoggedUser user) { - return workflowService.createCase(net.getStringId(), title, "", user).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title(title) + .color("") + .loggedUser(user) + .build() + return workflowService.createCase(createCaseParams).getCase() } Case createCase(String title, PetriNet net) { @@ -152,28 +161,28 @@ class ImportHelper { return createCase(title, net, superCreator.loggedSuper ?: userService.getSystem().transformToLoggedUser()) } - AssignTaskEventOutcome assignTask(String taskTitle, String caseId, LoggedUser author) { - return taskService.assignTask(author, getTaskId(taskTitle, caseId)) + AssignTaskEventOutcome assignTask(String taskTitle, String caseId, IUser author) { + return taskService.assignTask(new TaskParams(getTaskId(taskTitle, caseId), author)) } AssignTaskEventOutcome assignTaskToSuper(String taskTitle, String caseId) { - return assignTask(taskTitle, caseId, superCreator.loggedSuper ?: userService.getSystem().transformToLoggedUser()) + return assignTask(taskTitle, caseId, superCreator.superUser ?: userService.getSystem()) } - FinishTaskEventOutcome finishTask(String taskTitle, String caseId, LoggedUser author) { - return taskService.finishTask(author, getTaskId(taskTitle, caseId)) + FinishTaskEventOutcome finishTask(String taskTitle, String caseId, IUser author) { + return taskService.finishTask(new TaskParams(getTaskId(taskTitle, caseId), author)) } FinishTaskEventOutcome finishTaskAsSuper(String taskTitle, String caseId) { - return finishTask(taskTitle, caseId, superCreator.loggedSuper ?: userService.getSystem().transformToLoggedUser()) + return finishTask(taskTitle, caseId, superCreator.superUser ?: userService.getSystem()) } - CancelTaskEventOutcome cancelTask(String taskTitle, String caseId, LoggedUser user) { - return taskService.cancelTask(user, getTaskId(taskTitle, caseId)) + CancelTaskEventOutcome cancelTask(String taskTitle, String caseId, IUser user) { + return taskService.cancelTask(new TaskParams(getTaskId(taskTitle, caseId), user)) } CancelTaskEventOutcome cancelTaskAsSuper(String taskTitle, String caseId) { - return cancelTask(taskTitle, caseId, superCreator.loggedSuper ?: userService.getSystem().transformToLoggedUser()) + return cancelTask(taskTitle, caseId, superCreator.superUser ?: userService.getSystem()) } String getTaskId(String taskTitle, String caseId) { @@ -182,7 +191,7 @@ class ImportHelper { } SetDataEventOutcome setTaskData(String taskId, DataSet dataSet) { - dataService.setData(taskId, dataSet, superCreator.getSuperUser()) + dataService.setData(new SetDataParams(taskId, dataSet, superCreator.getSuperUser())) } SetDataEventOutcome setTaskData(String taskTitle, String caseId, DataSet data) { @@ -190,10 +199,10 @@ class ImportHelper { } List getTaskData(String taskTitle, String caseId) { - return dataService.getData(getTaskId(taskTitle, caseId), superCreator.getSuperUser()).getData() + return dataService.getData(new GetDataParams(getTaskId(taskTitle, caseId), superCreator.getSuperUser())).getData() } void updateSuperUser() { - superCreator.setAllToSuperUser(); + superCreator.setAllToSuperUser() } } diff --git a/src/main/java/com/netgrif/application/engine/ApplicationEngine.java b/src/main/java/com/netgrif/application/engine/ApplicationEngine.java index df9f639a77e..06f79fd8047 100644 --- a/src/main/java/com/netgrif/application/engine/ApplicationEngine.java +++ b/src/main/java/com/netgrif/application/engine/ApplicationEngine.java @@ -18,6 +18,7 @@ import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.hateoas.config.EnableHypermediaSupport; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.transaction.annotation.EnableTransactionManagement; import java.util.ArrayList; import java.util.List; @@ -25,6 +26,7 @@ @EnableCaching @EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL) @EnableGlobalMethodSecurity(prePostEnabled = true) +@EnableTransactionManagement @EnableAspectJAutoProxy @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableMongoAuditing diff --git a/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java b/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java index dbd923e5a51..9d960678b72 100644 --- a/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java +++ b/src/main/java/com/netgrif/application/engine/configuration/ElasticsearchConfiguration.java @@ -75,8 +75,4 @@ public ElasticsearchOperations elasticsearchTemplate() { return new ElasticsearchRestTemplate(client()); } - @Bean - public CaseEventHandler caseEventHandler() { - return new CaseEventHandler(); - } } diff --git a/src/main/java/com/netgrif/application/engine/configuration/mongo/MongoConfig.java b/src/main/java/com/netgrif/application/engine/configuration/mongo/MongoConfig.java new file mode 100644 index 00000000000..6ee9d750588 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/configuration/mongo/MongoConfig.java @@ -0,0 +1,26 @@ +package com.netgrif.application.engine.configuration.mongo; + +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.mongo.MongoProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.MongoTransactionManager; +import org.springframework.data.mongodb.MongoDatabaseFactory; +import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; + +@Configuration +@RequiredArgsConstructor +public class MongoConfig extends AbstractMongoClientConfiguration { + + private final MongoProperties properties; + + @Bean + public MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { + return new MongoTransactionManager(dbFactory); + } + + @Override + protected String getDatabaseName() { + return properties.getDatabase(); + } +} diff --git a/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java b/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java index 023b877ccad..e9afe7a221e 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java +++ b/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java @@ -13,4 +13,6 @@ public interface ElasticPetriNetRepository extends ElasticsearchRepository findAllByUriNodeId(String uriNodeId); void deleteAllByStringId(String id); + + List findAllByIdentifier(String identifier); } diff --git a/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java b/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java index 3777f1ddb86..dcae951d8ec 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java +++ b/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java @@ -89,4 +89,10 @@ public List findAllByUriNodeId(String uriNodeId) { List elasticPetriNets = repository.findAllByUriNodeId(uriNodeId); return petriNetService.findAllById(elasticPetriNets.stream().map(ElasticPetriNet::getStringId).collect(Collectors.toList())); } + + @Override + public List findAllByIdentifier(String identifier) { + List elasticPetriNets = repository.findAllByIdentifier(identifier); + return petriNetService.findAllById(elasticPetriNets.stream().map(ElasticPetriNet::getStringId).collect(Collectors.toList())); + } } diff --git a/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java b/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java index 6be7daaf0a3..a0e83c8dfb8 100644 --- a/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java +++ b/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java @@ -19,4 +19,6 @@ public interface IElasticPetriNetService { List findAllByUriNodeId(String uriNodeId); + List findAllByIdentifier(String identifier); + } diff --git a/src/main/java/com/netgrif/application/engine/importer/service/Importer.java b/src/main/java/com/netgrif/application/engine/importer/service/Importer.java index 3edff43175f..eef9032a52d 100644 --- a/src/main/java/com/netgrif/application/engine/importer/service/Importer.java +++ b/src/main/java/com/netgrif/application/engine/importer/service/Importer.java @@ -725,7 +725,7 @@ protected void addDataWithDefaultGroup(Transition transition, DataRef dataRef) t protected void addDataGroup(Transition transition, com.netgrif.application.engine.importer.model.DataGroup importDataGroup, int index) throws MissingIconKeyException { DataGroup dataGroup = new DataGroup(); - if (importDataGroup.getId() != null && importDataGroup.getId().length() > 0) { + if (importDataGroup.getId() != null && !importDataGroup.getId().isEmpty()) { dataGroup.setImportId(importDataGroup.getId()); } else { dataGroup.setImportId(transition.getImportId() + "_dg_" + index); @@ -1321,9 +1321,7 @@ protected void setMetaData() throws MissingPetriNetMetaDataException { protected Map buildTagsMap(List tagsList) { Map tags = new HashMap<>(); if (tagsList != null) { - tagsList.forEach(tag -> { - tags.put(tag.getKey(), tag.getValue()); - }); + tagsList.forEach(tag -> tags.put(tag.getKey(), tag.getValue())); } return tags; } diff --git a/src/main/java/com/netgrif/application/engine/orgstructure/groups/NextGroupService.java b/src/main/java/com/netgrif/application/engine/orgstructure/groups/NextGroupService.java index 06cff1ebf5c..d72836f87af 100644 --- a/src/main/java/com/netgrif/application/engine/orgstructure/groups/NextGroupService.java +++ b/src/main/java/com/netgrif/application/engine/orgstructure/groups/NextGroupService.java @@ -11,7 +11,6 @@ import com.netgrif.application.engine.mail.interfaces.IMailService; import com.netgrif.application.engine.orgstructure.groups.interfaces.INextGroupService; import com.netgrif.application.engine.petrinet.domain.I18nString; -import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.dataset.EnumerationMapField; import com.netgrif.application.engine.petrinet.domain.dataset.MapOptionsField; import com.netgrif.application.engine.petrinet.domain.throwable.TransitionNotExecutableException; @@ -20,12 +19,14 @@ import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.QCase; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.SetDataParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import com.netgrif.application.engine.workflow.web.responsebodies.DataSet; -import com.netgrif.application.engine.workflow.web.responsebodies.TaskDataSets; import com.netgrif.application.engine.workflow.web.responsebodies.TaskReference; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; @@ -106,16 +107,21 @@ public CreateCaseEventOutcome createGroup(String title, IUser author) { if (userDefaultGroup != null && userDefaultGroup.getTitle().equals(title)) { return null; } - PetriNet orgGroupNet = petriNetService.getNewestVersionByIdentifier(GROUP_NET_IDENTIFIER); - CreateCaseEventOutcome outcome = workflowService.createCase(orgGroupNet.getStringId(), title, "", author.transformToLoggedUser()); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(petriNetService.getNewestVersionByIdentifier(GROUP_NET_IDENTIFIER)) + .title(title) + .color("") + .loggedUser(author.transformToLoggedUser()) + .build(); + CreateCaseEventOutcome outcome = workflowService.createCase(createCaseParams); DataSet taskData = getInitialGroupData(author, title, outcome.getCase()); Task initTask = getGroupInitTask(outcome.getCase()); - dataService.setData(initTask.getStringId(), taskData, author); + dataService.setData(new SetDataParams(initTask, taskData, author)); try { - taskService.assignTask(author.transformToLoggedUser(), initTask.getStringId()); - taskService.finishTask(author.transformToLoggedUser(), initTask.getStringId()); + taskService.assignTask(new TaskParams(initTask, author)); + taskService.finishTask(new TaskParams(initTask, author)); } catch (TransitionNotExecutableException e) { log.error(e.getMessage()); } diff --git a/src/main/java/com/netgrif/application/engine/orgstructure/groups/interfaces/INextGroupService.java b/src/main/java/com/netgrif/application/engine/orgstructure/groups/interfaces/INextGroupService.java index 448d79ba1dc..f31ef0030c7 100644 --- a/src/main/java/com/netgrif/application/engine/orgstructure/groups/interfaces/INextGroupService.java +++ b/src/main/java/com/netgrif/application/engine/orgstructure/groups/interfaces/INextGroupService.java @@ -3,7 +3,7 @@ import com.netgrif.application.engine.auth.domain.IUser; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; import com.querydsl.core.types.Predicate; import java.util.*; diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/PetriNet.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/PetriNet.java index 0c97c3c2668..92a71349192 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/domain/PetriNet.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/PetriNet.java @@ -390,6 +390,10 @@ public boolean hasDynamicCaseName() { return defaultCaseNameExpression != null; } + public boolean hasDefaultCaseName() { + return defaultCaseName != null; + } + @Override public String getStringId() { return id.toString(); diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/params/DeletePetriNetParams.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/params/DeletePetriNetParams.java new file mode 100644 index 00000000000..5ebc8a1255b --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/params/DeletePetriNetParams.java @@ -0,0 +1,23 @@ +package com.netgrif.application.engine.petrinet.domain.params; + + +import com.netgrif.application.engine.auth.domain.LoggedUser; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@AllArgsConstructor +@Builder(builderMethodName = "with") +public class DeletePetriNetParams { + + private String petriNetId; + private LoggedUser loggedUser; + @Builder.Default + private boolean isTransactional = false; + + public DeletePetriNetParams(String petriNetId, LoggedUser loggedUser) { + this.petriNetId = petriNetId; + this.loggedUser = loggedUser; + } +} diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/params/ImportPetriNetParams.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/params/ImportPetriNetParams.java new file mode 100644 index 00000000000..8095c6bd08f --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/params/ImportPetriNetParams.java @@ -0,0 +1,39 @@ +package com.netgrif.application.engine.petrinet.domain.params; + +import com.netgrif.application.engine.auth.domain.LoggedUser; +import com.netgrif.application.engine.petrinet.domain.VersionType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +@Data +@AllArgsConstructor +@Builder(builderMethodName = "with") +public class ImportPetriNetParams { + + private InputStream xmlFile; + private String uriNodeId; + private VersionType releaseType; + private LoggedUser author; + @Builder.Default + private boolean isTransactional = false; + @Builder.Default + private Map params = new HashMap<>(); + + public ImportPetriNetParams(InputStream xmlFile, VersionType releaseType, LoggedUser author, String uriNodeId) { + this.xmlFile = xmlFile; + this.releaseType = releaseType; + this.author = author; + this.uriNodeId = uriNodeId; + } + + public ImportPetriNetParams(InputStream xmlFile, VersionType releaseType, LoggedUser author) { + this.xmlFile = xmlFile; + this.releaseType = releaseType; + this.author = author; + } +} diff --git a/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRolePermission.java b/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRolePermission.java index fb76dff6b2c..69facc652ba 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRolePermission.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRolePermission.java @@ -11,4 +11,8 @@ public enum ProcessRolePermission { public String value() { return super.name().toLowerCase(); } + + public static ProcessRolePermission fromValue(String v) { + return valueOf(v); + } } diff --git a/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetEventHandler.java b/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetEventHandler.java index cacc8b352f2..4698e59020d 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetEventHandler.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetEventHandler.java @@ -1,27 +1,40 @@ package com.netgrif.application.engine.petrinet.service; +import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetMappingService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetService; import com.netgrif.application.engine.petrinet.domain.PetriNet; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent; +import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; @Slf4j @Component -public class PetriNetEventHandler extends AbstractMongoEventListener { +@RequiredArgsConstructor +public class PetriNetEventHandler { - @Autowired - private IElasticPetriNetService service; + private final IElasticPetriNetService service; + private final IElasticPetriNetMappingService petriNetMappingService; - @Override + @TransactionalEventListener(fallbackExecution = true, condition = "#event.collectionName == 'petriNet'") + public void onAfterSave(AfterSaveEvent event) { + PetriNet net = event.getSource(); + try { + service.indexNow(petriNetMappingService.transform(net)); + } catch (Exception e) { + log.error("Indexing failed [{}]", net.getStringId(), e); + } + } + + @TransactionalEventListener(fallbackExecution = true, condition = "#event.collectionName == 'petriNet'") public void onAfterDelete(AfterDeleteEvent event) { Document document = event.getDocument(); - if (document == null) { - log.warn("Trying to delete null document!"); + if (document == null || document.isEmpty()) { + log.warn("Trying to delete null or empty document!"); return; } diff --git a/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java b/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java index bb46f0af89a..f7a198d9c1f 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java @@ -5,7 +5,6 @@ import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserService; import com.netgrif.application.engine.configuration.properties.CacheProperties; -import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetMappingService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetService; import com.netgrif.application.engine.history.domain.petrinetevents.DeletePetriNetEventLog; import com.netgrif.application.engine.history.domain.petrinetevents.ImportPetriNetEventLog; @@ -19,10 +18,11 @@ import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.domain.Transition; -import com.netgrif.application.engine.petrinet.domain.VersionType; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.Action; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionRunner; import com.netgrif.application.engine.petrinet.domain.events.EventPhase; +import com.netgrif.application.engine.petrinet.domain.params.DeletePetriNetParams; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.domain.version.Version; @@ -32,12 +32,14 @@ import com.netgrif.application.engine.petrinet.web.responsebodies.*; import com.netgrif.application.engine.rules.domain.facts.NetImportedFact; import com.netgrif.application.engine.rules.service.interfaces.IRuleEngine; +import com.netgrif.application.engine.transaction.NaeTransaction; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.FileStorageConfiguration; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import com.netgrif.application.engine.workflow.service.interfaces.IEventService; import com.netgrif.application.engine.workflow.service.interfaces.IFieldActionsCacheService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; +import groovy.lang.Closure; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.bson.Document; @@ -47,6 +49,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.core.io.FileSystemResource; import org.springframework.data.domain.*; +import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; @@ -54,14 +57,14 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionSynchronizationManager; import javax.annotation.Resource; import javax.inject.Provider; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; @@ -125,10 +128,10 @@ public class PetriNetService implements IPetriNetService { private IPetriNetService self; @Autowired - private IElasticPetriNetMappingService petriNetMappingService; + private IUriService uriService; @Autowired - private IUriService uriService; + private MongoTransactionManager transactionManager; private IElasticPetriNetService elasticPetriNetService; @@ -184,70 +187,106 @@ public PetriNet clone(ObjectId petriNetId) { return self.get(petriNetId).clone(); } - @Override - @Deprecated - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser author) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, VersionType.valueOf(releaseType.trim().toUpperCase()), author, uriService.getRoot().getStringId()); - } - - @Override - @Deprecated - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser author, String uriNodeId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, VersionType.valueOf(releaseType.trim().toUpperCase()), author, uriNodeId); - } - - @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, releaseType, author, uriService.getRoot().getStringId()); - } - - @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, releaseType, author, uriService.getRoot().getStringId(), params); - } - - @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String uriNodeId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, releaseType, author, uriNodeId, new HashMap<>()); + /** + * Creates {@link PetriNet} and saves it into database. + * + * @param importPetriNetParams parameters for PetriNet creation + *
+ * Required parameters + *
    + *
  • xmlFile
  • + *
  • releaseType
  • + *
  • author
  • + *
+ * + * @return outcome containing the created PetriNet + * */ + @Override + public ImportPetriNetEventOutcome importPetriNet(ImportPetriNetParams importPetriNetParams) throws IOException, + MissingPetriNetMetaDataException, MissingIconKeyException { + fillMissingAttributes(importPetriNetParams); + + if (importPetriNetParams.isTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public ImportPetriNetEventOutcome call() { + try { + return doImportPetriNet(importPetriNetParams); + } catch (MissingPetriNetMetaDataException | IOException e) { + throw new RuntimeException(e); + } + } + }) + .build(); + transaction.begin(); + return (ImportPetriNetEventOutcome) transaction.getResultOfEvent(); + } else { + return doImportPetriNet(importPetriNetParams); + } } - @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String uriNodeId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + private ImportPetriNetEventOutcome doImportPetriNet(ImportPetriNetParams importPetriNetParams) throws MissingPetriNetMetaDataException, IOException { ImportPetriNetEventOutcome outcome = new ImportPetriNetEventOutcome(); ByteArrayOutputStream xmlCopy = new ByteArrayOutputStream(); - IOUtils.copy(xmlFile, xmlCopy); + IOUtils.copy(importPetriNetParams.getXmlFile(), xmlCopy); Optional imported = getImporter().importPetriNet(new ByteArrayInputStream(xmlCopy.toByteArray())); if (imported.isEmpty()) { return outcome; } PetriNet net = imported.get(); - net.setUriNodeId(uriNodeId); + net.setUriNodeId(importPetriNetParams.getUriNodeId()); - // TODO: release/8.0.0 fix cacheable - PetriNet existingNet = getNewestVersionByIdentifier(net.getIdentifier()); + PetriNet existingNet = self.getNewestVersionByIdentifier(net.getIdentifier()); if (existingNet != null) { net.setVersion(existingNet.getVersion()); - net.incrementVersion(releaseType); + net.incrementVersion(importPetriNetParams.getReleaseType()); } processRoleService.saveAll(net.getRoles().values()); - net.setAuthor(author.transformToAuthor()); + net.setAuthor(importPetriNetParams.getAuthor().transformToAuthor()); functionCacheService.cachePetriNetFunctions(net); Path savedPath = getImporter().saveNetFile(net, new ByteArrayInputStream(xmlCopy.toByteArray())); xmlCopy.close(); - log.info("Petri net {} ({} v{}) imported successfully and saved in a folder: {}", net.getTitle(), net.getInitials(), net.getVersion(), savedPath.toString()); + log.info("Petri net {} ({} v{}) imported successfully and saved in a folder: {}", net.getTitle(), net.getInitials(), + net.getVersion(), savedPath.toString()); + + outcome.setOutcomes(eventService.runActions(net.getPreUploadActions(), null, Optional.empty(), + importPetriNetParams.getParams())); + boolean wasSaved = evaluateRules(net, EventPhase.PRE); - outcome.setOutcomes(eventService.runActions(net.getPreUploadActions(), null, Optional.empty(), params)); - evaluateRules(net, EventPhase.PRE); historyService.save(new ImportPetriNetEventLog(null, EventPhase.PRE, net.getObjectId())); - save(net); - outcome.setOutcomes(eventService.runActions(net.getPostUploadActions(), null, Optional.empty(), params)); + + if (!wasSaved) { + save(net); + } + + outcome.setOutcomes(eventService.runActions(net.getPostUploadActions(), null, Optional.empty(), + importPetriNetParams.getParams())); evaluateRules(net, EventPhase.POST); + historyService.save(new ImportPetriNetEventLog(null, EventPhase.POST, net.getObjectId())); + addMessageToOutcome(net, ProcessEventType.UPLOAD, outcome); outcome.setNet(imported.get()); return outcome; } + private void fillMissingAttributes(ImportPetriNetParams importPetriNetParams) throws IllegalArgumentException { + if (importPetriNetParams.getXmlFile() == null) { + throw new IllegalArgumentException("No Petriflow source file provided."); + } + if (importPetriNetParams.getAuthor() == null) { + throw new IllegalArgumentException("No author of PetriNet provided."); + } + if (importPetriNetParams.getReleaseType() == null) { + throw new IllegalArgumentException("Version type is null."); + } + if (importPetriNetParams.getUriNodeId() == null) { + importPetriNetParams.setUriNodeId(uriService.getRoot().getStringId()); + } + } + private ImportPetriNetEventOutcome addMessageToOutcome(PetriNet net, ProcessEventType type, ImportPetriNetEventOutcome outcome) { if (net.getProcessEvents().containsKey(type)) { outcome.setMessage(net.getProcessEvents().get(type).getMessage()); @@ -255,11 +294,16 @@ private ImportPetriNetEventOutcome addMessageToOutcome(PetriNet net, ProcessEven return outcome; } - protected void evaluateRules(PetriNet net, EventPhase phase) { + /** + * @return true if the net was saved + * */ + private boolean evaluateRules(PetriNet net, EventPhase phase) { int rulesExecuted = ruleEngine.evaluateRules(net, new NetImportedFact(net.getStringId(), phase)); if (rulesExecuted > 0) { save(net); + return true; } + return false; } @Override @@ -268,12 +312,6 @@ public Optional save(PetriNet petriNet) { this.evictCache(petriNet); petriNet = repository.save(petriNet); - try { - elasticPetriNetService.indexNow(this.petriNetMappingService.transform(petriNet)); - } catch (Exception e) { - log.error("Indexing failed [{}]", petriNet.getStringId(), e); - } - return Optional.of(petriNet); } @@ -282,7 +320,7 @@ public Optional save(PetriNet petriNet) { public PetriNet getPetriNet(String id) { Optional net = repository.findById(id); if (net.isEmpty()) { - throw new IllegalArgumentException("No Petri net with id: " + id + " was found."); + throw new IllegalArgumentException("Petri net with id [" + id + "] was found."); } net.get().initializeArcs(); return net.get(); @@ -358,9 +396,7 @@ public PetriNetImportReference getNetFromCase(String caseId) { PetriNetImportReference pn = new PetriNetImportReference(); useCase.getPetriNet().getTransitions().forEach((key, value) -> pn.getTransitions().add(new TransitionImportReference(value))); useCase.getPetriNet().getPlaces().forEach((key, value) -> pn.getPlaces().add(new PlaceImportReference(value))); - useCase.getPetriNet().getArcs().forEach((key, arcs) -> { - arcs.forEach(arc -> pn.getArcs().add(new ArcImportReference(arc))); - }); + useCase.getPetriNet().getArcs().forEach((key, arcs) -> arcs.forEach(arc -> pn.getArcs().add(new ArcImportReference(arc)))); pn.getAssignedTasks().addAll(historyService.findAllAssignTaskEventLogsByCaseId(caseId) .stream().map(TaskEventLog::getTransitionId).filter(Objects::nonNull).distinct().collect(Collectors.toList())); pn.getFinishedTasks().addAll(historyService.findAllFinishTaskEventLogsByCaseId(caseId) @@ -466,7 +502,8 @@ public List getDataFieldReferences(List @Override public Optional findByImportId(String id) { - return Optional.of(repository.findByImportId(id)); + PetriNet net = repository.findByImportId(id); + return net == null ? Optional.empty() : Optional.of(net); } @Override @@ -527,11 +564,40 @@ private void addValueCriteria(Query query, Query queryTotal, Criteria criteria) queryTotal.addCriteria(criteria); } - @Override - @Transactional - public void deletePetriNet(String processId, LoggedUser loggedUser) { + /** + * Removes {@link PetriNet} along with its Cases and roles + * + * @param deletePetriNetParams parameters for PetriNet removal + *
+ * Required parameters + *
    + *
  • petriNetId
  • + *
+ * */ + @Override + public void deletePetriNet(DeletePetriNetParams deletePetriNetParams) { + if (deletePetriNetParams.isTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure<>(null) { + @Override + public Object call() { + doDeletePetriNet(deletePetriNetParams); + return null; + } + }) + .build(); + transaction.begin(); + } else { + doDeletePetriNet(deletePetriNetParams); + } + } + + private void doDeletePetriNet(DeletePetriNetParams deletePetriNetParams) { + String processId = deletePetriNetParams.getPetriNetId(); + Optional petriNetOptional = repository.findById(processId); - if (!petriNetOptional.isPresent()) { + if (petriNetOptional.isEmpty()) { throw new IllegalArgumentException("Could not find process with id [" + processId + "]"); } @@ -540,7 +606,7 @@ public void deletePetriNet(String processId, LoggedUser loggedUser) { this.userService.removeRoleOfDeletedPetriNet(petriNet); this.workflowService.deleteInstancesOfPetriNet(petriNet); - this.processRoleService.deleteRolesOfNet(petriNet, loggedUser); + this.processRoleService.deleteRolesOfNet(petriNet, deletePetriNetParams.getLoggedUser()); try { ldapGroupService.deleteProcessRoleByPetrinet(petriNet.getStringId()); } catch (NullPointerException e) { @@ -549,8 +615,8 @@ public void deletePetriNet(String processId, LoggedUser loggedUser) { log.error("LdapGroup", ex); } - - log.info("[{}]: User [{}] is deleting Petri net {} version {}", processId, userService.getLoggedOrSystem().getStringId(), petriNet.getIdentifier(), petriNet.getVersion().toString()); + log.info("[{}]: User [{}] is deleting Petri net {} version {}", processId, userService.getLoggedOrSystem().getStringId(), + petriNet.getIdentifier(), petriNet.getVersion().toString()); this.repository.deleteById(petriNet.getObjectId()); this.evictCache(petriNet); // net functions must be removed from cache after it was deleted from repository @@ -567,9 +633,7 @@ private Criteria getProcessRolesCriteria(LoggedUser user) { public void runActions(List actions, PetriNet petriNet) { log.info("Running actions of net [{}]", petriNet.getStringId()); - actions.forEach(action -> { - actionsRunner.run(action, null, new HashMap<>(), petriNet.getFunctions()); - }); + actions.forEach(action -> actionsRunner.run(action, null, new HashMap<>(), petriNet.getFunctions())); } protected T requireNonNull(T obj, Object... item) { diff --git a/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java b/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java index 9f03b747219..b9fba5a7244 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java @@ -5,23 +5,23 @@ import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.domain.Transition; -import com.netgrif.application.engine.petrinet.domain.VersionType; import com.netgrif.application.engine.petrinet.domain.dataset.Field; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.Action; +import com.netgrif.application.engine.petrinet.domain.params.DeletePetriNetParams; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.domain.version.Version; import com.netgrif.application.engine.petrinet.web.responsebodies.DataFieldReference; import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetImportReference; import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference; import com.netgrif.application.engine.petrinet.web.responsebodies.TransitionReference; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import org.bson.types.ObjectId; import org.springframework.core.io.FileSystemResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import java.io.IOException; -import java.io.InputStream; import java.util.*; public interface IPetriNetService { @@ -44,19 +44,7 @@ static DataFieldReference transformToReference(PetriNet net, Transition transiti PetriNet clone(ObjectId petriNetId); - @Deprecated - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser user) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - - @Deprecated - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser user, String uriNodeId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user, String uriNodeId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user, String uriNodeId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; + ImportPetriNetEventOutcome importPetriNet(ImportPetriNetParams importPetriNetParams) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; Optional save(PetriNet petriNet); @@ -104,7 +92,7 @@ static DataFieldReference transformToReference(PetriNet net, Transition transiti List get(List petriNetIds); - void deletePetriNet(String id, LoggedUser loggedUser); + void deletePetriNet(DeletePetriNetParams deletePetriNetParams); void runActions(List actions, PetriNet petriNet); diff --git a/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java b/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java index 32435667252..4eacba1cebc 100644 --- a/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java +++ b/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java @@ -7,15 +7,16 @@ import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.DeletePetriNetParams; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.domain.version.StringToVersionConverter; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService; import com.netgrif.application.engine.petrinet.web.responsebodies.*; -import com.netgrif.application.engine.workflow.domain.FileStorageConfiguration; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessage; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessageResource; import com.netgrif.application.engine.workflow.web.responsebodies.MessageResource; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -62,9 +63,6 @@ @Tag(name = "PetriNet") public class PetriNetController { - @Autowired - private FileStorageConfiguration fileStorageConfiguration; - @Autowired private IPetriNetService service; @@ -94,7 +92,13 @@ public EntityModel importPetriNet( Authentication auth, Locale locale) throws MissingPetriNetMetaDataException, MissingIconKeyException { try { VersionType release = releaseType == null ? VersionType.MAJOR : VersionType.valueOf(releaseType.trim().toUpperCase()); - ImportPetriNetEventOutcome importPetriNetOutcome = service.importPetriNet(multipartFile.getInputStream(), release, (LoggedUser) auth.getPrincipal(), uriNodeId); + ImportPetriNetParams importPetriNetParams = ImportPetriNetParams.with() + .xmlFile(multipartFile.getInputStream()) + .releaseType(release) + .author((LoggedUser) auth.getPrincipal()) + .uriNodeId(uriNodeId) + .build(); + ImportPetriNetEventOutcome importPetriNetOutcome = service.importPetriNet(importPetriNetParams); return EventOutcomeWithMessageResource.successMessage("Petri net " + multipartFile.getOriginalFilename() + " imported successfully", importPetriNetOutcome); } catch (IOException e) { log.error("Importing Petri net failed: ", e); @@ -198,7 +202,7 @@ public MessageResource deletePetriNet(@PathVariable("id") String processId, Auth return MessageResource.errorMessage("Deleting Petri net " + processId + " failed!"); } LoggedUser user = (LoggedUser) auth.getPrincipal(); - asyncRunner.execute(() -> this.service.deletePetriNet(decodedProcessId, user)); + asyncRunner.execute(() -> this.service.deletePetriNet(new DeletePetriNetParams(decodedProcessId, user))); return MessageResource.successMessage("Petri net " + decodedProcessId + " is being deleted"); } diff --git a/src/main/java/com/netgrif/application/engine/rules/config/RuleProperties.java b/src/main/java/com/netgrif/application/engine/rules/config/RuleProperties.java new file mode 100644 index 00000000000..fce6ce08387 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/rules/config/RuleProperties.java @@ -0,0 +1,15 @@ +package com.netgrif.application.engine.rules.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "rule-engine") +public class RuleProperties { + + private boolean enabled = false; + private boolean rethrowExceptions = false; + +} diff --git a/src/main/java/com/netgrif/application/engine/rules/service/RuleEngine.java b/src/main/java/com/netgrif/application/engine/rules/service/RuleEngine.java index b0fb56e444f..ad5d0d32d74 100644 --- a/src/main/java/com/netgrif/application/engine/rules/service/RuleEngine.java +++ b/src/main/java/com/netgrif/application/engine/rules/service/RuleEngine.java @@ -1,6 +1,7 @@ package com.netgrif.application.engine.rules.service; import com.netgrif.application.engine.petrinet.domain.PetriNet; +import com.netgrif.application.engine.rules.config.RuleProperties; import com.netgrif.application.engine.rules.domain.RuleRepository; import com.netgrif.application.engine.rules.domain.facts.CaseCreatedFact; import com.netgrif.application.engine.rules.domain.facts.NetImportedFact; @@ -9,11 +10,10 @@ import com.netgrif.application.engine.rules.service.interfaces.IRuleEngine; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.kie.api.runtime.KieSession; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Lookup; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -21,14 +21,12 @@ @Slf4j @Service +@RequiredArgsConstructor public abstract class RuleEngine implements IRuleEngine { - // TODO: release/8.0.0 properties - @Value("${rule-engine.rethrow-exceptions:#{false}}") - protected boolean rethrowExceptions; + private final RuleRepository ruleRepository; - @Autowired - private RuleRepository ruleRepository; + private final RuleProperties properties; @Lookup protected abstract KieSession ruleEngine(); @@ -59,7 +57,7 @@ public int evaluateRules(PetriNet petriNet, ScheduledRuleFact scheduledRuleFact) } private int evaluateWithFacts(List facts) { - if (ruleRepository.count() == 0) { + if (!properties.isEnabled() || ruleRepository.count() == 0) { return 0; } KieSession session = null; @@ -70,7 +68,7 @@ private int evaluateWithFacts(List facts) { numberOfRulesExecuted = session.fireAllRules(); } catch (Exception e) { log.error("Rule engine failure", e); - if (rethrowExceptions) { + if (properties.isRethrowExceptions()) { throw e; } } finally { diff --git a/src/main/java/com/netgrif/application/engine/transaction/NaeTransaction.java b/src/main/java/com/netgrif/application/engine/transaction/NaeTransaction.java new file mode 100644 index 00000000000..8cb7f46d85a --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/transaction/NaeTransaction.java @@ -0,0 +1,181 @@ +package com.netgrif.application.engine.transaction; + +import groovy.lang.Closure; +import lombok.Builder; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.mongodb.MongoTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.TransactionTimedOutException; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.support.*; +import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionDelegate; + +import java.util.Date; + +import static org.springframework.transaction.support.TransactionSynchronization.STATUS_COMMITTED; +import static org.springframework.transaction.support.TransactionSynchronization.STATUS_ROLLED_BACK; + + +@Data +@Slf4j +@Builder +public class NaeTransaction { + + /** + * Timeout for the transaction in milliseconds. When the timeout is reached, transaction fails on commit. + * */ + @Builder.Default + private int timeout = TransactionDefinition.TIMEOUT_DEFAULT; + /** + * If set to true, new transaction is created in any situation (uses {@link Propagation#REQUIRES_NEW}). If set to + * false, transaction is created only if none exists (uses {@link Propagation#REQUIRED}). + * */ + @Builder.Default + private boolean forceCreation = false; + /** + * Transaction code to be executed under transaction. + * */ + private Closure event; + /** + * Return value of the {@link #event} + * */ + private Object resultOfEvent; + /** + * Callback, that is called when {@link NaeTransaction#event} is successful. + * */ + private Closure onCommit; + /** + * Callback, that is called when {@link NaeTransaction#event} fails. The closure can contain input attribute. If so, + * the input attribute is initialized by the subject exception ({@link NaeTransaction#onEventException}) + * */ + private Closure onRollBack; + + private Exception onCallBackException; + private Exception onEventException; + @Builder.Default + private Propagation propagation = Propagation.REQUIRED; + private Date deadline; + private boolean wasRolledBack; + + /** + * Singleton bean of Mongo transaction manager provided from {@link ActionDelegate#getTransactionManager} + * */ + private final MongoTransactionManager transactionManager; + + /** + * Does additional setups for transaction by {@link TransactionTemplate} and executes provided {@link NaeTransaction#event}. + *
+ * If the execution is successful callback {@link NaeTransaction#onCommit} is called. Otherwise {@link NaeTransaction#onRollBack} + * is called. If any of the callback fails, exception isn't thrown, but saved in {@link NaeTransaction#onCallBackException} + * */ + public void begin() { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(propagation.value()); + setTimeoutInMillis(timeout); + + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + protected void doInTransactionWithoutResult(TransactionStatus status) { + try { + registerTransactionCallBacks(); + resultOfEvent = event.call(); + throwIfDeadlineReached(); // Transaction API does not check the timeout declared in transaction template + } catch (Exception rethrow) { + onEventException = rethrow; + throw rethrow; + } + } + }); + } + + /** + * Registers callbacks for the active transaction. Must be called under active transaction. Callbacks are registered + * by {@link TransactionSynchronizationManager#registerSynchronization(TransactionSynchronization)}. If any of the + * callbacks fails the exception is not thrown. It's saved in {@link NaeTransaction#onCallBackException}. + * */ + private void registerTransactionCallBacks() { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){ + public void afterCompletion(int status) { + if (canCallOnCommit(status)) { + runTransactionCallBack(onCommit); + } else if (canCallOnRollBack(status)) { + wasRolledBack = true; + if (onEventException != null) { + onRollBack = onRollBack.curry(onEventException); + } + runTransactionCallBack(onRollBack); + } + } + }); + } + + private boolean canCallOnCommit(int status) { + return status == STATUS_COMMITTED && onCommit != null; + } + + private boolean canCallOnRollBack(int status) { + return status == STATUS_ROLLED_BACK && onRollBack != null; + } + + /** + * Runs the provided callback. If the callback fails, the exception is saved in {@link NaeTransaction#onCallBackException} + * and thrown. + * + * @param callBack callback to be executed + * */ + private void runTransactionCallBack(Closure callBack) { + try { + callBack.run(); + } catch (Exception e) { + // Transaction manager API swallows the exception + onCallBackException = e; + throw e; + } + } + + /** + * Initializes the {@link NaeTransaction#deadline} field by the provided timeout in milliseconds. + * + * @param millis timeout in milliseconds. Can be {@link TransactionDefinition#TIMEOUT_DEFAULT} or positive number + * */ + private void setTimeoutInMillis(long millis) throws IllegalArgumentException { + if (timeout == TransactionDefinition.TIMEOUT_DEFAULT) { + return; + } + if (timeout <= 0) { + throw new IllegalArgumentException(String.format("Timeout can be %s or positive number to represent millis.", + TransactionDefinition.TIMEOUT_DEFAULT)); + } + this.deadline = new Date(System.currentTimeMillis() + millis); + } + + /** + * Throws the {@link TransactionTimedOutException} if the {@link NaeTransaction#deadline} is reached + */ + private void throwIfDeadlineReached() throws TransactionTimedOutException { + if (this.deadline == null) { + return; + } + long timeToLive = this.deadline.getTime() - System.currentTimeMillis(); + if (timeToLive <= 0) { + throw new TransactionTimedOutException("Transaction timed out: deadline was " + this.deadline); + } + } + + /** + * Builder extension of the {@link Builder} implementation for {@link }. Containing additional logic over the native builder + * implementation + * */ + public static class NaeTransactionBuilder { + public NaeTransactionBuilder forceCreation(boolean forceCreation) { + this.propagation$set = true; + this.propagation$value = forceCreation ? Propagation.REQUIRES_NEW : Propagation.REQUIRED; + + this.forceCreation$set = true; + this.forceCreation$value = forceCreation; + + return this; + } + } +} diff --git a/src/main/java/com/netgrif/application/engine/transaction/configuration/NaeTransactionProperties.java b/src/main/java/com/netgrif/application/engine/transaction/configuration/NaeTransactionProperties.java new file mode 100644 index 00000000000..81643889ddc --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/transaction/configuration/NaeTransactionProperties.java @@ -0,0 +1,16 @@ +package com.netgrif.application.engine.transaction.configuration; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Configuration +@ConfigurationProperties(prefix = "nae.transaction") +public class NaeTransactionProperties { + private boolean createCaseTransactional = true; + private boolean deleteCaseTransactional = true; + private boolean setDataTransactional = true; + private boolean getDataTransactional = true; + private boolean taskEventTransactional = true; +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/Case.java b/src/main/java/com/netgrif/application/engine/workflow/domain/Case.java index 48cb9e903f5..941d32daa47 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/Case.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/Case.java @@ -179,6 +179,13 @@ public void addTask(Task task) { this.tasks.put(task.getTransitionId(), new TaskPair(task)); } + public void addTasks(Collection tasks) { + if (tasks == null) { + return; + } + tasks.forEach(this::addTask); + } + public void removeTasks(List tasks) { tasks.forEach(task -> this.tasks.remove(task.getTransitionId()) diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/IllegalArgumentWithChangedFieldsException.java b/src/main/java/com/netgrif/application/engine/workflow/domain/IllegalArgumentWithChangedFieldsException.java index 47d5a184d3b..c5d50e77698 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/IllegalArgumentWithChangedFieldsException.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/IllegalArgumentWithChangedFieldsException.java @@ -1,6 +1,6 @@ package com.netgrif.application.engine.workflow.domain; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/CreateTasksOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/CreateTasksOutcome.java new file mode 100644 index 00000000000..1a43a4a0db5 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/CreateTasksOutcome.java @@ -0,0 +1,14 @@ +package com.netgrif.application.engine.workflow.domain.outcomes; + +import com.netgrif.application.engine.workflow.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.List; + +@Data +@AllArgsConstructor +public class CreateTasksOutcome { + private List tasks; + private Task autoTriggerTask; +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/DoEventTaskOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/DoEventTaskOutcome.java new file mode 100644 index 00000000000..bb8b676154e --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/DoEventTaskOutcome.java @@ -0,0 +1,14 @@ +package com.netgrif.application.engine.workflow.domain.outcomes; + +import com.netgrif.application.engine.workflow.domain.Case; +import com.netgrif.application.engine.workflow.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class DoEventTaskOutcome { + + private Task task; + private Case useCase; +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/UpdateTaskStateOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/UpdateTaskStateOutcome.java new file mode 100644 index 00000000000..822c1392da7 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/UpdateTaskStateOutcome.java @@ -0,0 +1,12 @@ +package com.netgrif.application.engine.workflow.domain.outcomes; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UpdateTaskStateOutcome { + + private boolean wasChanged; + private boolean mustBeExecuted; +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/EventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/EventOutcome.java similarity index 94% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/EventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/EventOutcome.java index ba2310a190c..c97dd82e9e6 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/EventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/EventOutcome.java @@ -1,4 +1,4 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.petrinet.domain.dataset.logic.FrontAction; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/CaseEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/CaseEventOutcome.java similarity index 77% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/CaseEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/CaseEventOutcome.java index 485d46fa3f7..c9bf8f44ffd 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/CaseEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/CaseEventOutcome.java @@ -1,9 +1,9 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.PetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.PetriNetEventOutcome; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/CreateCaseEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/CreateCaseEventOutcome.java similarity index 79% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/CreateCaseEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/CreateCaseEventOutcome.java index 972f9e4757d..ee83e5cddf2 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/CreateCaseEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/CreateCaseEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/DeleteCaseEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/DeleteCaseEventOutcome.java similarity index 78% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/DeleteCaseEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/DeleteCaseEventOutcome.java index 344b50a02b1..a7ed0c8b76f 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/caseoutcomes/DeleteCaseEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/caseoutcomes/DeleteCaseEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/GetDataEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/GetDataEventOutcome.java similarity index 70% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/GetDataEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/GetDataEventOutcome.java index 9eba59cc505..c5b42af440e 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/GetDataEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/GetDataEventOutcome.java @@ -1,12 +1,11 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes; import com.netgrif.application.engine.petrinet.domain.DataRef; import com.netgrif.application.engine.petrinet.domain.I18nString; -import com.netgrif.application.engine.petrinet.domain.dataset.Field; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.TaskEventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/GetDataGroupsEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/GetDataGroupsEventOutcome.java similarity index 77% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/GetDataGroupsEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/GetDataGroupsEventOutcome.java index 896e04ebbc4..cdd958d106c 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/GetDataGroupsEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/GetDataGroupsEventOutcome.java @@ -1,11 +1,11 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes; import com.netgrif.application.engine.petrinet.domain.DataGroup; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.TaskEventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/SetDataEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/SetDataEventOutcome.java similarity index 76% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/SetDataEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/SetDataEventOutcome.java index f64439e90fe..77bdf255214 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/dataoutcomes/SetDataEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/dataoutcomes/SetDataEventOutcome.java @@ -1,10 +1,10 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes; import com.netgrif.application.engine.petrinet.domain.dataset.Field; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.TaskEventOutcome; import com.netgrif.application.engine.workflow.web.responsebodies.DataSet; import lombok.Data; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/petrinetoutcomes/ImportPetriNetEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/petrinetoutcomes/ImportPetriNetEventOutcome.java similarity index 77% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/petrinetoutcomes/ImportPetriNetEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/petrinetoutcomes/ImportPetriNetEventOutcome.java index a5e94680e3b..7a7230340df 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/petrinetoutcomes/ImportPetriNetEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/petrinetoutcomes/ImportPetriNetEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.petrinet.domain.PetriNet; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/petrinetoutcomes/PetriNetEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/petrinetoutcomes/PetriNetEventOutcome.java similarity index 81% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/petrinetoutcomes/PetriNetEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/petrinetoutcomes/PetriNetEventOutcome.java index 135a0a2367d..566d0a54a72 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/petrinetoutcomes/PetriNetEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/petrinetoutcomes/PetriNetEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.petrinet.domain.PetriNet; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/response/EventOutcomeWithMessage.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/response/EventOutcomeWithMessage.java similarity index 84% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/response/EventOutcomeWithMessage.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/response/EventOutcomeWithMessage.java index 95e602ab640..046f9ec272d 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/response/EventOutcomeWithMessage.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/response/EventOutcomeWithMessage.java @@ -1,6 +1,6 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.response; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import com.netgrif.application.engine.workflow.web.responsebodies.ResponseMessage; import lombok.Data; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/response/EventOutcomeWithMessageResource.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/response/EventOutcomeWithMessageResource.java similarity index 80% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/response/EventOutcomeWithMessageResource.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/response/EventOutcomeWithMessageResource.java index ab740543f6f..4e392cc21ef 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/response/EventOutcomeWithMessageResource.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/response/EventOutcomeWithMessageResource.java @@ -1,6 +1,6 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.response; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import org.springframework.hateoas.EntityModel; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/AssignTaskEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/AssignTaskEventOutcome.java similarity index 75% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/AssignTaskEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/AssignTaskEventOutcome.java index 03e403ec311..feaa3f26d54 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/AssignTaskEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/AssignTaskEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/CancelTaskEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/CancelTaskEventOutcome.java similarity index 75% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/CancelTaskEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/CancelTaskEventOutcome.java index 022f901a20a..52862b1dd9a 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/CancelTaskEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/CancelTaskEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/DelegateTaskEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/DelegateTaskEventOutcome.java similarity index 75% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/DelegateTaskEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/DelegateTaskEventOutcome.java index fbecc39e2d0..87a97589508 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/DelegateTaskEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/DelegateTaskEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/FinishTaskEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/FinishTaskEventOutcome.java similarity index 75% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/FinishTaskEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/FinishTaskEventOutcome.java index 9fd45065606..f3f2725fbf7 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/FinishTaskEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/FinishTaskEventOutcome.java @@ -1,8 +1,8 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; import lombok.Data; import java.util.List; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/TaskEventOutcome.java b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/TaskEventOutcome.java similarity index 74% rename from src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/TaskEventOutcome.java rename to src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/TaskEventOutcome.java index 2c605138fdc..9228da6e699 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/domain/eventoutcomes/taskoutcomes/TaskEventOutcome.java +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/outcomes/eventoutcomes/taskoutcomes/TaskEventOutcome.java @@ -1,10 +1,10 @@ -package com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes; +package com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CaseEventOutcome; import lombok.Data; import lombok.Getter; diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/params/CreateCaseParams.java b/src/main/java/com/netgrif/application/engine/workflow/domain/params/CreateCaseParams.java new file mode 100644 index 00000000000..ff2201dd247 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/params/CreateCaseParams.java @@ -0,0 +1,57 @@ +package com.netgrif.application.engine.workflow.domain.params; + +import com.netgrif.application.engine.auth.domain.LoggedUser; +import com.netgrif.application.engine.petrinet.domain.PetriNet; +import com.netgrif.application.engine.workflow.domain.Case; +import lombok.Builder; +import lombok.Data; +import org.springframework.context.i18n.LocaleContextHolder; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.function.Function; + + +@Data +@Builder(builderMethodName = "with") +public class CreateCaseParams { + + private String petriNetId; + private String petriNetIdentifier; + private PetriNet petriNet; + private String title; + private Function makeTitle; + private String color; + private LoggedUser loggedUser; + @Builder.Default + private Locale locale = LocaleContextHolder.getLocale(); + private Boolean isTransactional; + @Builder.Default + private Map params = new HashMap<>(); + + public static class CreateCaseParamsBuilder { + /** + * Sets the {@link #title} and {@link #makeTitle} as well + * */ + public CreateCaseParams.CreateCaseParamsBuilder title(String title) { + this.title = title; + if (title != null) { + this.makeTitle = (u) -> title; + } else { + this.makeTitle = null; + } + return this; + } + + /** + * Sets the {@link #petriNet} as clone, {@link #petriNetIdentifier} and {@link #petriNetId} + * */ + public CreateCaseParams.CreateCaseParamsBuilder petriNet(PetriNet petriNet) { + this.petriNet = petriNet.clone(); + this.petriNetIdentifier = petriNet.getIdentifier(); + this.petriNetId = petriNet.getStringId(); + return this; + } + } +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/params/DeleteCaseParams.java b/src/main/java/com/netgrif/application/engine/workflow/domain/params/DeleteCaseParams.java new file mode 100644 index 00000000000..23774afab35 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/params/DeleteCaseParams.java @@ -0,0 +1,45 @@ +package com.netgrif.application.engine.workflow.domain.params; + +import com.netgrif.application.engine.workflow.domain.Case; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +@AllArgsConstructor +@Builder(builderMethodName = "with") +public class DeleteCaseParams { + + private String useCaseId; + private Case useCase; + private Boolean isTransactional; + @Builder.Default + private Map params = new HashMap<>(); + + public DeleteCaseParams(Case useCase) { + this.useCase = useCase; + if (useCase != null) { + this.useCaseId = useCase.getStringId(); + } + } + + public DeleteCaseParams(String useCaseId) { + this.useCaseId = useCaseId; + } + + public static class DeleteCaseParamsBuilder { + /** + * Sets the {@link #useCase} and {@link #useCaseId} + * */ + public DeleteCaseParams.DeleteCaseParamsBuilder useCase(Case useCase) { + this.useCase = useCase; + if (useCase != null) { + this.useCaseId = useCase.getStringId(); + } + return this; + } + } +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/params/GetDataParams.java b/src/main/java/com/netgrif/application/engine/workflow/domain/params/GetDataParams.java new file mode 100644 index 00000000000..0ce5aca41b6 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/params/GetDataParams.java @@ -0,0 +1,36 @@ +package com.netgrif.application.engine.workflow.domain.params; + +import com.netgrif.application.engine.auth.domain.IUser; +import com.netgrif.application.engine.workflow.domain.Case; +import com.netgrif.application.engine.workflow.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +@AllArgsConstructor +@Builder(builderMethodName = "with") +public class GetDataParams { + + private String taskId; + private Task task; + private IUser user; + private Case useCase; + private Boolean isTransactional; + @Builder.Default + private Map params = new HashMap<>(); + + public GetDataParams(Task task, Case useCase, IUser user) { + this.task = task; + this.useCase = useCase; + this.user = user; + } + + public GetDataParams(String taskId, IUser user) { + this.taskId = taskId; + this.user = user; + } +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/params/SetDataParams.java b/src/main/java/com/netgrif/application/engine/workflow/domain/params/SetDataParams.java new file mode 100644 index 00000000000..d5a1d52ec91 --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/params/SetDataParams.java @@ -0,0 +1,45 @@ +package com.netgrif.application.engine.workflow.domain.params; + +import com.netgrif.application.engine.auth.domain.IUser; +import com.netgrif.application.engine.workflow.domain.Case; +import com.netgrif.application.engine.workflow.domain.Task; +import com.netgrif.application.engine.workflow.web.responsebodies.DataSet; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +@AllArgsConstructor +@Builder(builderMethodName = "with") +public class SetDataParams { + + private Task task; + private String taskId; + private Case useCase; + private DataSet dataSet; + private IUser user; + private Boolean isTransactional; + @Builder.Default + private Map params = new HashMap<>(); + + public SetDataParams(Task task, DataSet dataSet, IUser user) { + this.task = task; + this.dataSet = dataSet; + this.user = user; + } + + public SetDataParams(String taskId, DataSet dataSet, IUser user) { + this.taskId = taskId; + this.dataSet = dataSet; + this.user = user; + } + + public SetDataParams(Case useCase, DataSet dataSet, IUser user) { + this.useCase = useCase; + this.dataSet = dataSet; + this.user = user; + } +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/domain/params/TaskParams.java b/src/main/java/com/netgrif/application/engine/workflow/domain/params/TaskParams.java new file mode 100644 index 00000000000..d71fd9a116c --- /dev/null +++ b/src/main/java/com/netgrif/application/engine/workflow/domain/params/TaskParams.java @@ -0,0 +1,43 @@ +package com.netgrif.application.engine.workflow.domain.params; + +import com.netgrif.application.engine.auth.domain.IUser; +import com.netgrif.application.engine.workflow.domain.Case; +import com.netgrif.application.engine.workflow.domain.Task; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +@AllArgsConstructor +@Builder(builderMethodName = "with") +public class TaskParams { + + private String taskId; + private Task task; + private Case useCase; + private IUser user; + private Boolean isTransactional; + @Builder.Default + private Map params = new HashMap<>(); + + public TaskParams(Task task) { + this.task = task; + } + + public TaskParams(Task task, IUser user) { + this.task = task; + this.user = user; + } + + public TaskParams(String taskId) { + this.taskId = taskId; + } + + public TaskParams(String taskId, IUser user) { + this.taskId = taskId; + this.user = user; + } +} diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/CaseEventHandler.java b/src/main/java/com/netgrif/application/engine/workflow/service/CaseEventHandler.java index b188442fa20..88c21abdc66 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/CaseEventHandler.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/CaseEventHandler.java @@ -1,27 +1,41 @@ package com.netgrif.application.engine.workflow.service; +import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseMappingService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService; import com.netgrif.application.engine.workflow.domain.Case; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent; +import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; @Slf4j @Component -public class CaseEventHandler extends AbstractMongoEventListener { +@RequiredArgsConstructor +public class CaseEventHandler { - @Autowired - private IElasticCaseService service; + private final IElasticCaseService service; + private final IElasticCaseMappingService caseMappingService; - @Override + @TransactionalEventListener(fallbackExecution = true, condition = "#event.collectionName == 'case'") + public void onAfterSave(AfterSaveEvent event) { + Case useCase = event.getSource(); + try { + useCase.resolveImmediateDataFields(); + service.indexNow(caseMappingService.transform(useCase)); + } catch (Exception e) { + log.error("Indexing failed [{}]", useCase.getStringId(), e); + } + } + + @TransactionalEventListener(fallbackExecution = true, condition = "#event.collectionName == 'case'") public void onAfterDelete(AfterDeleteEvent event) { Document document = event.getDocument(); - if (document == null) { - log.warn("Trying to delete null document!"); + if (document == null || document.isEmpty()) { + log.warn("Trying to delete null or empty document!"); return; } diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java b/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java index fe5e93bf263..24ba670fb76 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java @@ -9,7 +9,6 @@ import com.netgrif.application.engine.importer.model.DataEventType; import com.netgrif.application.engine.importer.model.DataType; import com.netgrif.application.engine.importer.model.LayoutType; -import com.netgrif.application.engine.importer.service.FieldFactory; import com.netgrif.application.engine.petrinet.domain.Component; import com.netgrif.application.engine.petrinet.domain.*; import com.netgrif.application.engine.petrinet.domain.dataset.*; @@ -17,22 +16,26 @@ import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionRunner; import com.netgrif.application.engine.petrinet.domain.events.DataEvent; import com.netgrif.application.engine.petrinet.domain.events.EventPhase; -import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; +import com.netgrif.application.engine.transaction.NaeTransaction; +import com.netgrif.application.engine.transaction.configuration.NaeTransactionProperties; import com.netgrif.application.engine.validation.service.interfaces.IValidationService; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.DataFieldBehavior; import com.netgrif.application.engine.workflow.domain.EventNotExecutableException; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.TaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.GetDataParams; +import com.netgrif.application.engine.workflow.domain.params.SetDataParams; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.IEventService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import com.netgrif.application.engine.workflow.web.responsebodies.DataSet; +import groovy.lang.Closure; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.pdfbox.pdmodel.PDDocument; @@ -41,9 +44,11 @@ import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; +import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; @@ -60,62 +65,81 @@ public class DataService implements IDataService { @Autowired - protected ApplicationEventPublisher publisher; + private ITaskService taskService; @Autowired - protected ITaskService taskService; + private IWorkflowService workflowService; @Autowired - protected IWorkflowService workflowService; + private IUserService userService; @Autowired - protected IUserService userService; + private ActionRunner actionsRunner; @Autowired - protected FieldFactory fieldFactory; + private IEventService eventService; @Autowired - protected ActionRunner actionsRunner; + private IHistoryService historyService; @Autowired - protected IEventService eventService; + private MongoTransactionManager transactionManager; @Autowired - protected IHistoryService historyService; + private IValidationService validation; @Autowired - protected IPetriNetService petriNetService; - - @Autowired - protected IValidationService validation; + private NaeTransactionProperties transactionProperties; @Value("${nae.image.preview.scaling.px:400}") - protected int imageScale; + private int imageScale; @Value("${nae.validation.setData.enable:false}") - protected boolean validationEnable; - - @Override - public GetDataEventOutcome getData(String taskId, IUser user) { - return getData(taskId, user, new HashMap<>()); - } + private boolean validationEnable; + + /** + * Gets the data of the {@link Task} provided by {@link GetDataParams} + * + * @param getDataParams parameters where the Task is specified + *
+ * Required parameters + *
    + *
  • taskId or task
  • + *
  • user
  • + *
+ * + * @return outcome containing the fields present in Task + * */ + @Override + public GetDataEventOutcome getData(GetDataParams getDataParams) { + fillMissingAttributes(getDataParams); + + Case useCase = getDataParams.getUseCase(); + Task task = getDataParams.getTask(); - @Override - public GetDataEventOutcome getData(String taskId, IUser user, Map params) { - Task task = taskService.findOne(taskId); - Case useCase = workflowService.findOne(task.getCaseId()); - - return getData(task, useCase, user, params); - } + log.info("[{}]: Getting data of task {} [{}]", useCase.getStringId(), task.getTransitionId(), task.getStringId()); - @Override - public GetDataEventOutcome getData(Task task, Case useCase, IUser user) { - return getData(task, useCase, user, new HashMap<>()); + if (getDataParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public GetDataEventOutcome call() { + return doGetData(getDataParams); + } + }) + .build(); + transaction.begin(); + return (GetDataEventOutcome) transaction.getResultOfEvent(); + } else { + return doGetData(getDataParams); + } } - @Override - public GetDataEventOutcome getData(Task task, Case useCase, IUser user, Map params) { - log.info("[{}]: Getting data of task {} [{}]", useCase.getStringId(), task.getTransitionId(), task.getStringId()); + private GetDataEventOutcome doGetData(GetDataParams getDataParams) { + Case useCase = getDataParams.getUseCase(); + Task task = getDataParams.getTask(); + IUser user = getDataParams.getUser(); Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); Map dataRefs = transition.getDataSet(); List dataSetFields = new ArrayList<>(); @@ -128,7 +152,9 @@ public GetDataEventOutcome getData(Task task, Case useCase, IUser user, Map()); - } - - @Override - public SetDataEventOutcome setData(String taskId, DataSet dataSet, IUser user, Map params) { - Task task = taskService.findOne(taskId); - return setData(task, dataSet, user, params); - } - - @Override - public SetDataEventOutcome setData(String taskId, DataSet values, LoggedUser loggedUser) { - return setData(taskId, values, loggedUser, new HashMap<>()); - } - - @Override - public SetDataEventOutcome setData(String taskId, DataSet dataSet, LoggedUser loggedUser, Map params) { - IUser user = userService.getUserFromLoggedUser(loggedUser); - return setData(taskId, dataSet, user, params); - } - - @Override - public SetDataEventOutcome setData(Case target, DataSet dataSet, IUser user) { - return setData(target, dataSet, user, new HashMap<>()); + private void fillMissingAttributes(GetDataParams getDataParams) throws IllegalArgumentException { + if (getDataParams.getUser() == null) { + throw new IllegalArgumentException("User must be provided on get data."); + } + if (getDataParams.getTask() == null) { + Task task = taskService.findOne(getDataParams.getTaskId()); + getDataParams.setTask(task); + } + if (getDataParams.getUseCase() == null) { + Case useCase = workflowService.findOne(getDataParams.getTask().getCaseId()); + getDataParams.setUseCase(useCase); + } + if (getDataParams.getIsTransactional() == null) { + getDataParams.setIsTransactional(transactionProperties.isGetDataTransactional()); + } } + /** + * Sets the provided data by {@link SetDataParams} + * + * @param setDataParams parameters containing the data to be set within the {@link Case} or {@link Task} object + *
+ * Required parameters + *
    + *
  • taskId or task or useCase
  • + *
  • user
  • + *
+ * + * @return outcome containing changed fields, updated Task and Case + * */ @Override - public SetDataEventOutcome setData(Case target, DataSet dataSet, IUser user, Map params) { - Task fake = Task.with().id(new ObjectId()).caseId(target.getStringId()).title(new I18nString("Fake")).transitionId("fake").build(); - return setData(fake, dataSet, user, params); - } + public SetDataEventOutcome setData(SetDataParams setDataParams) { + fillMissingAttributes(setDataParams); - @Override - public SetDataEventOutcome setData(Task task, DataSet dataSet, IUser user) { - return setData(task, dataSet, user, new HashMap<>()); - } + Task task = setDataParams.getTask(); - @Override - public SetDataEventOutcome setData(Task task, DataSet dataSet, IUser user, Map params) { log.info("[{}]: Setting data of task {} [{}]", task.getStringId(), task.getTransitionId(), task.getStringId()); if (task.getUserId() != null) { task.setUser(userService.findById(task.getUserId())); } + + if (setDataParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public SetDataEventOutcome call() { + return doSetData(setDataParams); + } + }) + .build(); + transaction.begin(); + return (SetDataEventOutcome) transaction.getResultOfEvent(); + } else { + return doSetData(setDataParams); + } + } + + private SetDataEventOutcome doSetData(SetDataParams setDataParams) { + Task task = setDataParams.getTask(); List outcomes = new ArrayList<>(); - for (Map.Entry> stringFieldEntry : dataSet.getFields().entrySet()) { + for (Map.Entry> stringFieldEntry : setDataParams.getDataSet().getFields().entrySet()) { String fieldId = stringFieldEntry.getKey(); Field newDataField = stringFieldEntry.getValue(); - outcomes.add(setDataField(task, fieldId, newDataField, user)); + SetDataEventOutcome setDataEventOutcome = setDataField(task, fieldId, newDataField, setDataParams.getUser()); + outcomes.add(setDataEventOutcome); } Case useCase = workflowService.findOne(task.getCaseId()); return new SetDataEventOutcome(useCase, task, outcomes); } + private void fillMissingAttributes(SetDataParams setDataParams) { + if (setDataParams.getUser() == null) { + throw new IllegalArgumentException("User must be provided on set data."); + } + if (setDataParams.getTask() == null) { + if (setDataParams.getTaskId() != null) { + Task task = taskService.findOne(setDataParams.getTaskId()); + setDataParams.setTask(task); + } else if (setDataParams.getUseCase() != null) { + Task fakeTask = Task.with() + .id(new ObjectId()) + .caseId(setDataParams.getUseCase().getStringId()) + .title(new I18nString("Fake")) + .transitionId("fake") + .build(); + setDataParams.setTask(fakeTask); + } else { + throw new IllegalArgumentException("Cannot set data without provided task."); + } + } + if (setDataParams.getIsTransactional() == null) { + setDataParams.setIsTransactional(transactionProperties.isSetDataTransactional()); + } + } + @Override public SetDataEventOutcome setDataField(Task task, String fieldId, Field newDataField, IUser user) { return setDataField(task, fieldId, newDataField, user, new HashMap<>()); @@ -219,9 +289,14 @@ public SetDataEventOutcome setDataField(Task task, String fieldId, Field newD } Field field = fieldOptional.get(); // PRE - outcome.addOutcomes(resolveDataEvents(field, DataEventType.SET, EventPhase.PRE, useCase, task, newDataField, params)); - useCase = workflowService.findOne(task.getCaseId()); + List preSetOutcomes = resolveDataEvents(field, DataEventType.SET, EventPhase.PRE, useCase, task, + newDataField, params); + if (!preSetOutcomes.isEmpty()) { + outcome.addOutcomes(preSetOutcomes); + useCase = workflowService.findOne(task.getCaseId()); + } historyService.save(new SetDataEventLog(task, useCase, EventPhase.PRE, DataSet.of(fieldId, newDataField), user)); + // EXECUTION if (outcome.getMessage() == null) { setOutcomeMessage(task, useCase, outcome, fieldId, field, DataEventType.SET); @@ -233,10 +308,16 @@ public SetDataEventOutcome setDataField(Task task, String fieldId, Field newD useCase = workflowService.save(useCase); outcome.addChangedField(fieldId, newDataField); historyService.save(new SetDataEventLog(task, useCase, EventPhase.EXECUTION, DataSet.of(fieldId, newDataField), user)); + // POST - outcome.addOutcomes(resolveDataEvents(field, DataEventType.SET, EventPhase.POST, useCase, task, newDataField, params)); - useCase = workflowService.findOne(task.getCaseId()); + List postSetOutcomes = resolveDataEvents(field, DataEventType.SET, EventPhase.POST, useCase, task, + newDataField, params); + if (!postSetOutcomes.isEmpty()) { + outcome.addOutcomes(postSetOutcomes); + useCase = workflowService.findOne(task.getCaseId()); + } historyService.save(new SetDataEventLog(task, useCase, EventPhase.POST, DataSet.of(fieldId, newDataField), user)); + useCase = applyFieldConnectedChanges(useCase, field); outcome.setCase(useCase); @@ -273,7 +354,7 @@ private GetDataGroupsEventOutcome getDataGroups(String taskId, Locale locale, Se GetDataGroupsEventOutcome outcome = new GetDataGroupsEventOutcome(useCase, task); log.info("Getting groups of task " + taskId + " in case " + useCase.getTitle() + " level: " + level); List resultDataGroups = new ArrayList<>(); - List data = getData(task, useCase, user).getData(); + List data = getData(new GetDataParams(task, useCase, user)).getData(); Map dataFieldMap = data.stream().collect(Collectors.toMap(DataRef::getFieldId, field -> field)); List dataGroups = transition.getDataGroups().values().stream().map(DataGroup::clone).collect(Collectors.toList()); for (DataGroup dataGroup : dataGroups) { @@ -661,19 +742,19 @@ private void writeFile(MultipartFile multipartFile, File file) throws IOExceptio fout.close(); } - protected boolean upload(Case useCase, FileField field, MultipartFile multipartFile) { + private boolean upload(Case useCase, FileField field, MultipartFile multipartFile) { throw new UnsupportedOperationException("Upload new file to the remote storage is not implemented yet."); } - protected boolean upload(Case useCase, FileListField field, MultipartFile[] multipartFiles) { + private boolean upload(Case useCase, FileListField field, MultipartFile[] multipartFiles) { throw new UnsupportedOperationException("Upload new files to the remote storage is not implemented yet."); } - protected boolean deleteRemote(Case useCase, FileField field) { + private boolean deleteRemote(Case useCase, FileField field) { throw new UnsupportedOperationException("Delete file from the remote storage is not implemented yet."); } - protected boolean deleteRemote(Case useCase, FileListField field, String name) { + private boolean deleteRemote(Case useCase, FileListField field, String name) { throw new UnsupportedOperationException("Delete file from the remote storage is not implemented yet."); } diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java b/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java index 8c5e7de5eff..7f92455f938 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java @@ -2,6 +2,7 @@ import com.netgrif.application.engine.importer.model.DataEventType; import com.netgrif.application.engine.petrinet.domain.DataRef; +import com.netgrif.application.engine.petrinet.domain.Function; import com.netgrif.application.engine.petrinet.domain.Transition; import com.netgrif.application.engine.petrinet.domain.dataset.Field; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.Action; @@ -9,9 +10,10 @@ import com.netgrif.application.engine.petrinet.domain.events.EventPhase; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; import com.netgrif.application.engine.workflow.service.interfaces.IEventService; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -21,14 +23,11 @@ @Slf4j @Lazy @Service +@RequiredArgsConstructor public class EventService implements IEventService { private final ActionRunner actionsRunner; - public EventService(ActionRunner actionsRunner) { - this.actionsRunner = actionsRunner; - } - @Override public List runActions(List actions, Case useCase, Task task, Transition transition, Map params) { log.info("[" + useCase.getStringId() + "]: Running actions of transition " + transition.getStringId()); @@ -43,9 +42,11 @@ public List runActions(List actions, Map p @Override public List runActions(List actions, Case useCase, Optional task, Map params) { List allOutcomes = new ArrayList<>(); + List functions = useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions(); actions.forEach(action -> { - List outcomes = actionsRunner.run(action, useCase, task, null, params, useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions()); - outcomes.stream().filter(SetDataEventOutcome.class::isInstance) + List outcomes = actionsRunner.run(action, useCase, task, null, params, functions); + outcomes.stream() + .filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().getFields().isEmpty()) { return; @@ -58,12 +59,15 @@ public List runActions(List actions, Case useCase, Optiona } @Override - public List runEventActions(Case useCase, Task task, Field newDataField, List actions, DataEventType trigger, Map params) { + public List runEventActions(Case useCase, Task task, Field newDataField, List actions, + DataEventType trigger, Map params) { List allOutcomes = new ArrayList<>(); + List functions = useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions(); + Optional taskOpt = task == null ? Optional.empty() : Optional.of(task); actions.stream() .filter(a -> a.getSetDataType().isTriggered(newDataField)) .forEach(action -> { - List outcomes = actionsRunner.run(action, useCase, task == null ? Optional.empty() : Optional.of(task), newDataField, params, useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions()); + List outcomes = actionsRunner.run(action, useCase, taskOpt, newDataField, params, functions); outcomes.stream() .filter(SetDataEventOutcome.class::isInstance) .filter(outcome -> !((SetDataEventOutcome) outcome).getChangedFields().getFields().isEmpty()) @@ -74,7 +78,8 @@ public List runEventActions(Case useCase, Task task, Field newD } @Override - public List processDataEvents(Field field, DataEventType actionTrigger, EventPhase phase, Case useCase, Task task, Field newDataField, Map params) { + public List processDataEvents(Field field, DataEventType actionTrigger, EventPhase phase, Case useCase, + Task task, Field newDataField, Map params) { LinkedList fieldActions = new LinkedList<>(); if (field.getEvents() != null && field.getEvents().containsKey(actionTrigger)) { fieldActions.addAll(DataRef.getEventAction(field.getEvents().get(actionTrigger), phase)); @@ -108,7 +113,7 @@ public void runEventActionsOnChanged(Task task, SetDataEventOutcome outcome, Dat .forEach(entry -> { String fieldId = entry.getKey(); Field field = outcome.getCase().getDataSet().get(fieldId); - log.info("[" + outcome.getCase().getStringId() + "] " + outcome.getCase().getTitle() + ": Running actions on changed field " + fieldId); + log.info("[{}] {}: Running actions on changed field {}", outcome.getCase().getStringId(), outcome.getCase().getTitle(), fieldId); // TODO: release/8.0.0 changed fields outcome.addOutcomes(processDataEvents(field, trigger, EventPhase.PRE, outcome.getCase(), outcome.getTask(), null, params)); outcome.addOutcomes(processDataEvents(field, trigger, EventPhase.POST, outcome.getCase(), outcome.getTask(), null, params)); diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/FilterImportExportService.java b/src/main/java/com/netgrif/application/engine/workflow/service/FilterImportExportService.java index c57344f216f..3ce4f04e138 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/FilterImportExportService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/FilterImportExportService.java @@ -18,6 +18,7 @@ import com.netgrif.application.engine.workflow.domain.*; import com.netgrif.application.engine.workflow.domain.filter.FilterImportExport; import com.netgrif.application.engine.workflow.domain.filter.FilterImportExportList; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.IFilterImportExportService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; @@ -86,12 +87,24 @@ public class FilterImportExportService implements IFilterImportExportService { @Override public void createFilterImport(IUser author) { - workflowService.createCaseByIdentifier(IMPORT_NET_IDENTIFIER, "Import filters " + author.getFullName(), "", author.transformToLoggedUser()); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNetIdentifier(IMPORT_NET_IDENTIFIER) + .title("Import filters " + author.getFullName()) + .color("") + .loggedUser(author.transformToLoggedUser()) + .build(); + workflowService.createCase(createCaseParams); } @Override public void createFilterExport(IUser author) { - workflowService.createCaseByIdentifier(EXPORT_NET_IDENTIFIER, "Export filters " + author.getFullName(), "", author.transformToLoggedUser()); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNetIdentifier(EXPORT_NET_IDENTIFIER) + .title("Export filters " + author.getFullName()) + .color("") + .loggedUser(author.transformToLoggedUser()) + .build(); + workflowService.createCase(createCaseParams); } /** @@ -236,7 +249,8 @@ protected Map performImport(FilterImportExportList filterList) t // filterCase.get().getDataSet().get(FIELD_FILTER).addBehavior(IMPORT_FILTER_TRANSITION, Collections.singleton(FieldBehavior.VISIBLE)); workflowService.save(filterCase.get()); }); - taskService.assignTasks(taskService.findAllById(new ArrayList<>(importedFilterTaskIds.values())), userService.getLoggedUser()); + taskService.assignTasks(taskService.findAllById(new ArrayList<>(importedFilterTaskIds.values())), + userService.getLoggedUser(), new HashMap<>()); changeFilterField(importedFilterTaskIds.values()); return importedFilterTaskIds; } diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/MenuImportExportService.java b/src/main/java/com/netgrif/application/engine/workflow/service/MenuImportExportService.java index f40c05a0397..625c9ab2fe3 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/MenuImportExportService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/MenuImportExportService.java @@ -19,12 +19,14 @@ import com.netgrif.application.engine.workflow.domain.menu.MenuAndFilters; import com.netgrif.application.engine.workflow.domain.menu.MenuEntry; import com.netgrif.application.engine.workflow.domain.menu.MenuEntryRole; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.SetDataParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.service.interfaces.*; import com.netgrif.application.engine.workflow.web.responsebodies.DataSet; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import javax.xml.XMLConstants; import javax.xml.transform.stream.StreamSource; @@ -149,7 +151,7 @@ public List importMenu(List menuItemCases, FileFieldValue ffv, Str Case caseToRemove = workflowService.findOne(id); QTask qTask = new QTask("task"); Task task = taskService.searchOne(qTask.transitionId.eq("view").and(qTask.caseId.eq(caseToRemove.getStringId()))); - dataService.setData(task, caseToRemoveData, userService.getLoggedOrSystem()); + dataService.setData(new SetDataParams(task, caseToRemoveData, userService.getLoggedOrSystem())); }); //Import filters @@ -171,15 +173,15 @@ public List importMenu(List menuItemCases, FileFieldValue ffv, Str // DataField groupImportResultMessage = new DataField(); // groupImportResultMessage.setValue(resultMessage.toString()); // groupData.getFields().put("import_results", groupImportResultMessage); - dataService.setData(task, groupData, userService.getLoggedOrSystem()); + dataService.setData(new SetDataParams(task, groupData, userService.getLoggedOrSystem())); }); importedFilterTaskIds.values().forEach(taskId -> { Task importedFilterTask = taskService.findOne(taskId); Case filterCase = workflowService.findOne(importedFilterTask.getCaseId()); try { - taskService.assignTask(importedFilterTask.getStringId()); - taskService.finishTask(importedFilterTask.getStringId()); + taskService.assignTask(new TaskParams(importedFilterTask)); + taskService.finishTask(new TaskParams(importedFilterTask)); workflowService.save(filterCase); } catch (TransitionNotExecutableException e) { log.error("Failed to execute \"import_filter\" task with id: " + taskId, e); @@ -246,17 +248,18 @@ public String createMenuItemCase(StringBuilder resultMessage, MenuEntry item, St }); } //Creating new Case of preference_filter_item net and setting its data... - Case menuItemCase = workflowService.createCase( - petriNetService.getNewestVersionByIdentifier("preference_filter_item").getStringId(), - item.getEntryName() + "_" + menuIdentifier, - "", - userService.getSystem().transformToLoggedUser() - ).getCase(); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(petriNetService.getNewestVersionByIdentifier("preference_filter_item")) + .title(item.getEntryName() + "_" + menuIdentifier) + .color("") + .loggedUser(userService.getSystem().transformToLoggedUser()) + .build(); + Case menuItemCase = workflowService.createCase(createCaseParams).getCase(); QTask qTask = new QTask("task"); Task task = taskService.searchOne(qTask.transitionId.eq("init").and(qTask.caseId.eq(menuItemCase.getStringId()))); try { - taskService.assignTask(task, userService.getLoggedUser()); + taskService.assignTask(new TaskParams(task, userService.getLoggedUser())); // TODO: release/8.0.0 // menuItemCase.getDataSet().get(MENU_IDENTIFIER).setValue(menuIdentifier); // menuItemCase.getDataSet().get(PARENT_ID).setValue(parentId); @@ -273,8 +276,7 @@ public String createMenuItemCase(StringBuilder resultMessage, MenuEntry item, St return task.getCaseId() + "," + filterCase.getStringId() + "," + item.getUseIcon().toString(); } - @Transactional - protected MenuAndFilters loadFromXML(FileFieldValue ffv) throws IOException, IllegalMenuFileException { + private MenuAndFilters loadFromXML(FileFieldValue ffv) throws IOException, IllegalMenuFileException { File f = new File(ffv.getPath()); validateFilterXML(new FileInputStream(f)); SimpleModule module = new SimpleModule().addDeserializer(Object.class, FilterDeserializer.getInstance()); @@ -283,8 +285,7 @@ protected MenuAndFilters loadFromXML(FileFieldValue ffv) throws IOException, Ill return xmlMapper.readValue(xml, MenuAndFilters.class); } - @Transactional - protected FileFieldValue createXML(MenuAndFilters menuAndFilters, String parentId, FileField fileField) throws IOException { + private FileFieldValue createXML(MenuAndFilters menuAndFilters, String parentId, FileField fileField) throws IOException { FileFieldValue ffv = new FileFieldValue(); try { ffv.setName("menu_" + userService.getLoggedUser().getFullName().replaceAll("\\s+", "") + ".xml"); diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/TaskEventHandler.java b/src/main/java/com/netgrif/application/engine/workflow/service/TaskEventHandler.java index 2291db40ca4..879387dfca3 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/TaskEventHandler.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/TaskEventHandler.java @@ -3,37 +3,33 @@ import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskMappingService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskService; import com.netgrif.application.engine.workflow.domain.Task; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.bson.types.ObjectId; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent; import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; @Slf4j @Component -public class TaskEventHandler extends AbstractMongoEventListener { +@RequiredArgsConstructor +public class TaskEventHandler { - @Autowired - private IElasticTaskService service; + private final IElasticTaskService service; + private final IElasticTaskMappingService taskMappingService; - @Autowired - private IElasticTaskMappingService taskMappingService; - - @Async - @Override + @TransactionalEventListener(fallbackExecution = true, condition = "#event.collectionName == 'task'") public void onAfterSave(AfterSaveEvent event) { service.index(this.taskMappingService.transform(event.getSource())); } - @Override + @TransactionalEventListener(fallbackExecution = true, condition = "#event.collectionName == 'task'") public void onAfterDelete(AfterDeleteEvent event) { Document document = event.getDocument(); - if (document == null) { - log.warn("Trying to delete null document!"); + if (document == null || document.isEmpty()) { + log.warn("Trying to delete null or empty document!"); return; } diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index b8045e2533c..d8278df783f 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -4,8 +4,6 @@ import com.netgrif.application.engine.auth.domain.IUser; import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserService; -import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskMappingService; -import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskService; import com.netgrif.application.engine.history.domain.taskevents.AssignTaskEventLog; import com.netgrif.application.engine.history.domain.taskevents.CancelTaskEventLog; import com.netgrif.application.engine.history.domain.taskevents.DelegateTaskEventLog; @@ -29,16 +27,20 @@ import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService; import com.netgrif.application.engine.rules.domain.facts.TransitionEventFact; import com.netgrif.application.engine.rules.service.interfaces.IRuleEngine; +import com.netgrif.application.engine.transaction.NaeTransaction; +import com.netgrif.application.engine.transaction.configuration.NaeTransactionProperties; import com.netgrif.application.engine.utils.DateUtils; import com.netgrif.application.engine.utils.FullPageRequest; -import com.netgrif.application.engine.validation.service.interfaces.IValidationService; -import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.State; -import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.TaskNotFoundException; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.*; +import com.netgrif.application.engine.workflow.domain.*; +import com.netgrif.application.engine.workflow.domain.outcomes.DoEventTaskOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.UpdateTaskStateOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.CreateTasksOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.*; +import com.netgrif.application.engine.workflow.domain.params.GetDataParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.domain.repositories.TaskRepository; import com.netgrif.application.engine.workflow.domain.triggers.AutoTrigger; import com.netgrif.application.engine.workflow.domain.triggers.TimeTrigger; @@ -49,18 +51,21 @@ import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import com.netgrif.application.engine.workflow.web.requestbodies.TaskSearchRequest; import com.netgrif.application.engine.workflow.web.responsebodies.TaskReference; +import groovy.lang.Closure; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.scheduling.TaskScheduler; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionSynchronizationManager; import java.time.LocalDateTime; import java.util.*; @@ -74,313 +79,455 @@ public class TaskService implements ITaskService { @Autowired - protected ApplicationEventPublisher publisher; + private TaskRepository taskRepository; @Autowired - protected TaskRepository taskRepository; + private IUserService userService; @Autowired - protected IUserService userService; + private MongoTemplate mongoTemplate; @Autowired - protected MongoTemplate mongoTemplate; - - @Autowired - protected TaskSearchService searchService; + private TaskSearchService searchService; @Autowired @Qualifier("taskScheduler") - protected TaskScheduler scheduler; + private TaskScheduler scheduler; @Autowired - protected IWorkflowService workflowService; + private IWorkflowService workflowService; @Autowired - protected IDataService dataService; + private IDataService dataService; @Autowired - protected IProcessRoleService processRoleService; + private IProcessRoleService processRoleService; @Autowired - protected IElasticTaskMappingService taskMappingService; - - @Autowired - protected IEventService eventService; - - protected IElasticTaskService elasticTaskService; + private IEventService eventService; @Autowired - protected IHistoryService historyService; + private IHistoryService historyService; @Autowired - protected IValidationService validation; + private IRuleEngine ruleEngine; @Autowired - public void setElasticTaskService(IElasticTaskService elasticTaskService) { - this.elasticTaskService = elasticTaskService; - } + private MongoTransactionManager transactionManager; @Autowired - private IRuleEngine ruleEngine; + private NaeTransactionProperties transactionProperties; + /** + * Executes provided {@link Task} in provided {@link Case} + * + * @param task Task to be executed + * @param useCase Case where the task exists + * + * @return list of outcomes from the triggered events during the task execution + * */ @Override - public List assignTasks(List tasks, IUser user) throws TransitionNotExecutableException { - return assignTasks(tasks, user, new HashMap<>()); + public List executeTask(Task task, Case useCase) { + log.info("[{}]: executeTask [{}] in case [{}]", useCase.getStringId(), task.getTransitionId(), useCase.getTitle()); + List outcomes = new ArrayList<>(); + try { + log.info("assignTask [{}] in case [{}]", task.getTitle(), useCase.getTitle()); + AssignTaskEventOutcome assignOutcome = assignTask(new TaskParams(task)); + outcomes.add(assignOutcome); + log.info("getData [{}] in case [{}]", task.getTitle(), useCase.getTitle()); + GetDataEventOutcome getDataOutcome = dataService.getData(new GetDataParams(assignOutcome.getTask(), + assignOutcome.getCase(), userService.getSystem())); + outcomes.add(getDataOutcome); + log.info("finishTask [{}] in case [{}]", task.getTitle(), useCase.getTitle()); + outcomes.add(finishTask(new TaskParams(getDataOutcome.getTask()))); + } catch (TransitionNotExecutableException e) { + log.error("execution of task [{}] in case [{}] failed: ", task.getTitle(), useCase.getTitle(), e); + } + return outcomes; } + /** + * Assigns all provided tasks by provided user. + * + * @param tasks list of tasks to be assigned + * @param user assignee of the tasks + * @param params additional parameters for the assign task event + * + * @return list of outcomes of the assign events. The order is the same as the order of the provided list of tasks + * */ @Override public List assignTasks(List tasks, IUser user, Map params) throws TransitionNotExecutableException { List outcomes = new ArrayList<>(); for (Task task : tasks) { - outcomes.add(assignTask(task, user, params)); + outcomes.add( + assignTask(TaskParams.with() + .task(task) + .user(user) + .params(params) + .build()) + ); } return outcomes; } + /** + * Assigns the {@link Task} by provided parameters + * + * @param taskParams parameters to determine the Task to be assigned + *
+ * Required parameters + *
    + *
  • taskId or task
  • + *
  • user
  • + *
+ * + * @return outcome of the assign event + * */ @Override - public AssignTaskEventOutcome assignTask(String taskId) throws TransitionNotExecutableException { - return assignTask(taskId, new HashMap<>()); + public AssignTaskEventOutcome assignTask(TaskParams taskParams) throws TransitionNotExecutableException { + fillMissingAttributes(taskParams); + + if (taskParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public AssignTaskEventOutcome call() { + try { + return doAssignTask(taskParams); + } catch (TransitionNotExecutableException e) { + throw new RuntimeException(e); + } + } + }) + .build(); + transaction.begin(); + return (AssignTaskEventOutcome) transaction.getResultOfEvent(); + } else { + return doAssignTask(taskParams); + } } - @Override - public AssignTaskEventOutcome assignTask(String taskId, Map params) throws TransitionNotExecutableException { - LoggedUser user = userService.getLoggedOrSystem().transformToLoggedUser(); - return assignTask(user, taskId, params); - } + private AssignTaskEventOutcome doAssignTask(TaskParams taskParams) throws TransitionNotExecutableException { + Task task = taskParams.getTask(); + Case useCase = taskParams.getUseCase(); + IUser user = taskParams.getUser(); - @Override - public AssignTaskEventOutcome assignTask(LoggedUser loggedUser, String taskId) throws TransitionNotExecutableException { - return assignTask(loggedUser, taskId, new HashMap<>()); - } + Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); - @Override - public AssignTaskEventOutcome assignTask(LoggedUser loggedUser, String taskId, Map params) throws TransitionNotExecutableException, TaskNotFoundException { - Optional taskOptional = taskRepository.findById(taskId); - if (taskOptional.isEmpty()) { - throw new TaskNotFoundException("Could not find task with id [" + taskId + "]"); + List outcomes = new ArrayList<>(eventService.runActions(transition.getPreAssignActions(), useCase, + task, transition, taskParams.getParams())); + + if (!outcomes.isEmpty()) { + useCase = workflowService.findOne(task.getCaseId()); + task = findOne(task.getStringId()); } - IUser user = userService.getUserFromLoggedUser(loggedUser); - return assignTask(taskOptional.get(), user, params); - } - @Override - public AssignTaskEventOutcome assignTask(Task task, IUser user) throws TransitionNotExecutableException { - return assignTask(task, user, new HashMap<>()); - } + useCase = evaluateRules(useCase, task, EventType.ASSIGN, EventPhase.PRE); + DoEventTaskOutcome doOutcome = doAssignTaskToUser(user, task, transition, useCase); + useCase = doOutcome.getUseCase(); + task = doOutcome.getTask(); - @Override - public AssignTaskEventOutcome assignTask(Task task, IUser user, Map params) throws TransitionNotExecutableException { - Case useCase = workflowService.findOne(task.getCaseId()); - Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); - List outcomes = new ArrayList<>(eventService.runActions(transition.getPreAssignActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); - useCase = workflowService.findOne(task.getCaseId()); - task = findOne(task.getStringId()); - evaluateRules(useCase.getStringId(), task, EventType.ASSIGN, EventPhase.PRE); - useCase = workflowService.findOne(task.getCaseId()); - assignTaskToUser(user, task, useCase.getStringId()); - useCase = workflowService.findOne(task.getCaseId()); historyService.save(new AssignTaskEventLog(task, useCase, EventPhase.PRE, user)); - outcomes.addAll((eventService.runActions(transition.getPostAssignActions(), workflowService.findOne(task.getCaseId()), task, transition, params))); - useCase = workflowService.findOne(task.getCaseId()); - evaluateRules(useCase.getStringId(), task, EventType.ASSIGN, EventPhase.POST); - useCase = workflowService.findOne(task.getCaseId()); + + List postEventOutcomes = eventService.runActions(transition.getPostAssignActions(), useCase, task, + transition, taskParams.getParams()); + if (!postEventOutcomes.isEmpty()) { + outcomes.addAll(postEventOutcomes); + useCase = workflowService.findOne(useCase.getStringId()); + } + + useCase = evaluateRules(useCase, task, EventType.ASSIGN, EventPhase.POST); + historyService.save(new AssignTaskEventLog(task, useCase, EventPhase.POST, user)); - AssignTaskEventOutcome outcome = new AssignTaskEventOutcome(workflowService.findOne(task.getCaseId()), task, outcomes); + AssignTaskEventOutcome outcome = new AssignTaskEventOutcome(useCase, task, outcomes); addMessageToOutcome(transition, EventType.ASSIGN, outcome); - log.info("[{}]: Task [{}] in case [{}] assigned to [{}]", useCase.getStringId(), task.getTitle(), useCase.getTitle(), user.getSelfOrImpersonated().getEmail()); + log.info("[{}]: Task [{}] in case [{}] assigned to [{}]", useCase.getStringId(), task.getTitle(), useCase.getTitle(), + user.getSelfOrImpersonated().getEmail()); return outcome; } - protected Case assignTaskToUser(IUser user, Task task, String useCaseId) throws TransitionNotExecutableException { - Case useCase = workflowService.findOne(useCaseId); - useCase.getPetriNet().initializeArcs(); + private DoEventTaskOutcome doAssignTaskToUser(IUser user, Task task, Case useCase) throws TransitionNotExecutableException { Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); + return doAssignTaskToUser(user, task, transition, useCase); + } - log.info("[{}]: Assigning task [{}] to user [{}]", useCaseId, task.getTitle(), user.getSelfOrImpersonated().getEmail()); + private DoEventTaskOutcome doAssignTaskToUser(IUser user, Task task, Transition transition, Case useCase) throws TransitionNotExecutableException { + useCase.getPetriNet().initializeArcs(); + + log.info("[{}]: Assigning task [{}] to user [{}]", useCase.getStringId(), task.getTitle(), user.getSelfOrImpersonated().getEmail()); startExecution(transition, useCase); task.setUserId(user.getSelfOrImpersonated().getStringId()); task.setLastAssigned(LocalDateTime.now()); task.setUser(user.getSelfOrImpersonated()); - workflowService.save(useCase); + useCase = workflowService.save(useCase); save(task); - reloadTasks(workflowService.findOne(useCase.getStringId())); - return workflowService.findOne(useCase.getStringId()); - } - @Override - public List finishTasks(List tasks, IUser user) throws TransitionNotExecutableException { - return finishTasks(tasks, user, new HashMap<>()); + boolean anyTaskExecuted = reloadTasks(useCase); + if (anyTaskExecuted) { + useCase = workflowService.findOne(useCase.getStringId()); + } + return new DoEventTaskOutcome(task, useCase); } + /** + * Finishes all provided tasks by provided user. + * + * @param tasks list of tasks to be finished + * @param user assignee of the tasks + * @param params additional parameters for the finish task event + * + * @return list of outcomes of the finish events. The order is the same as the order of the provided list of tasks + * */ @Override public List finishTasks(List tasks, IUser user, Map params) throws TransitionNotExecutableException { List outcomes = new ArrayList<>(); for (Task task : tasks) { - outcomes.add(finishTask(task, user, params)); + outcomes.add( + finishTask(TaskParams.with() + .task(task) + .user(user) + .params(params) + .build()) + ); } return outcomes; } + /** + * Finishes the {@link Task} by provided parameters + * + * @param taskParams parameters to determine the Task to be finished + *
+ * Required parameters + *
    + *
  • taskId or task
  • + *
  • user
  • + *
+ * + * @return outcome of the finish event + * */ @Override - public FinishTaskEventOutcome finishTask(String taskId) throws IllegalArgumentException, TransitionNotExecutableException { - return finishTask(taskId, new HashMap<>()); - } - - @Override - public FinishTaskEventOutcome finishTask(String taskId, Map params) throws IllegalArgumentException, TransitionNotExecutableException { - LoggedUser user = userService.getLoggedOrSystem().transformToLoggedUser(); - return finishTask(user, taskId, params); + public FinishTaskEventOutcome finishTask(TaskParams taskParams) throws TransitionNotExecutableException { + fillMissingAttributes(taskParams); + + if (taskParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public FinishTaskEventOutcome call() { + try { + return doFinishTask(taskParams); + } catch (TransitionNotExecutableException e) { + throw new RuntimeException(e); + } + } + }) + .build(); + transaction.begin(); + return (FinishTaskEventOutcome) transaction.getResultOfEvent(); + } else { + return doFinishTask(taskParams); + } } - @Override - public FinishTaskEventOutcome finishTask(LoggedUser loggedUser, String taskId) throws IllegalArgumentException, TransitionNotExecutableException { - return finishTask(loggedUser, taskId, new HashMap<>()); - } - - @Override - public FinishTaskEventOutcome finishTask(LoggedUser loggedUser, String taskId, Map params) throws IllegalArgumentException, TransitionNotExecutableException { - Optional taskOptional = taskRepository.findById(taskId); - if (taskOptional.isEmpty()) { - throw new IllegalArgumentException("Could not find task with id [" + taskId + "]"); - } - Task task = taskOptional.get(); - IUser user = userService.getUserFromLoggedUser(loggedUser); + private FinishTaskEventOutcome doFinishTask(TaskParams taskParams) throws TransitionNotExecutableException { + Task task = taskParams.getTask(); + Case useCase = taskParams.getUseCase(); + IUser user = taskParams.getUser(); + LoggedUser loggedUser = user.transformToLoggedUser(); // for anonymous user validation if (task.getUserId() == null) { - throw new IllegalArgumentException("Task with id=" + taskId + " is not assigned to any user."); + throw new IllegalArgumentException("Task with id=" + task.getUserId() + " is not assigned to any user."); } // TODO: 14. 4. 2017 replace with @PreAuthorize if (!task.getUserId().equals(user.getSelfOrImpersonated().getStringId()) && !loggedUser.isAnonymous()) { throw new IllegalArgumentException("User that is not assigned tried to finish task"); } - return finishTask(task, user, params); - } - - @Override - public FinishTaskEventOutcome finishTask(Task task, IUser user) throws TransitionNotExecutableException { - return finishTask(task, user, new HashMap<>()); - } - - @Override - public FinishTaskEventOutcome finishTask(Task task, IUser user, Map params) throws TransitionNotExecutableException { - Case useCase = workflowService.findOne(task.getCaseId()); Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); log.info("[{}]: Finishing task [{}] to user [{}]", useCase.getStringId(), task.getTitle(), user.getSelfOrImpersonated().getEmail()); validateData(transition, useCase); - List outcomes = new ArrayList<>(eventService.runActions(transition.getPreFinishActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); - useCase = workflowService.findOne(task.getCaseId()); - task = findOne(task.getStringId()); - evaluateRules(useCase.getStringId(), task, EventType.FINISH, EventPhase.PRE); - useCase = workflowService.findOne(task.getCaseId()); + List outcomes = new ArrayList<>(eventService.runActions(transition.getPreFinishActions(), useCase, + task, transition, taskParams.getParams())); + if (!outcomes.isEmpty()) { + useCase = workflowService.findOne(task.getCaseId()); + task = findOne(task.getStringId()); + } + + useCase = evaluateRules(useCase, task, EventType.FINISH, EventPhase.PRE); + DoEventTaskOutcome doOutcome = doFinishTaskByAssignedUser(task, transition, useCase); + useCase = doOutcome.getUseCase(); + task = doOutcome.getTask(); - finishExecution(transition, useCase.getStringId()); - task.setLastFinished(LocalDateTime.now()); - task.setFinishedBy(task.getUserId()); - task.setUserId(null); - save(task); - reloadTasks(workflowService.findOne(task.getCaseId())); - useCase = workflowService.findOne(task.getCaseId()); historyService.save(new FinishTaskEventLog(task, useCase, EventPhase.PRE, user)); - outcomes.addAll(eventService.runActions(transition.getPostFinishActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); - useCase = workflowService.findOne(task.getCaseId()); - evaluateRules(useCase.getStringId(), task, EventType.FINISH, EventPhase.POST); - useCase = workflowService.findOne(task.getCaseId()); - FinishTaskEventOutcome outcome = new FinishTaskEventOutcome(workflowService.findOne(task.getCaseId()), task, outcomes); - addMessageToOutcome(transition, EventType.FINISH, outcome); + + List postFinishOutcomes = eventService.runActions(transition.getPostFinishActions(), useCase, task, + transition, taskParams.getParams()); + if (!postFinishOutcomes.isEmpty()) { + outcomes.addAll(postFinishOutcomes); + useCase = workflowService.findOne(task.getCaseId()); + } + + useCase = evaluateRules(useCase, task, EventType.FINISH, EventPhase.POST); + historyService.save(new FinishTaskEventLog(task, useCase, EventPhase.POST, user)); - log.info("[{}]: Task [{}] in case [{}] assigned to [{}] was finished", useCase.getStringId(), task.getTitle(), useCase.getTitle(), user.getSelfOrImpersonated().getEmail()); + FinishTaskEventOutcome outcome = new FinishTaskEventOutcome(useCase, task, outcomes); + addMessageToOutcome(transition, EventType.FINISH, outcome); + + log.info("[{}]: Task [{}] in case [{}] assigned to [{}] was finished", useCase.getStringId(), task.getTitle(), + useCase.getTitle(), user.getSelfOrImpersonated().getEmail()); return outcome; } - @Override - public List cancelTasks(List tasks, IUser user) { - return cancelTasks(tasks, user, new HashMap<>()); + private DoEventTaskOutcome doFinishTaskByAssignedUser(Task task, Transition transition, Case useCase) throws TransitionNotExecutableException { + useCase = finishExecution(transition, useCase); + + task.setLastFinished(LocalDateTime.now()); + task.setFinishedBy(task.getUserId()); + task.setUserId(null); + save(task); + + boolean anyTaskExecuted = reloadTasks(useCase); + if (anyTaskExecuted) { + useCase = workflowService.findOne(useCase.getStringId()); + } + return new DoEventTaskOutcome(task, useCase); } + /** + * Cancels all provided tasks by provided user. + * + * @param tasks list of tasks to be canceled + * @param user by which the task is canceled + * @param params additional parameters for the cancel task event + * + * @return list of outcomes of the cancel events. The order is the same as the order of the provided list of tasks + * */ @Override public List cancelTasks(List tasks, IUser user, Map params) { List outcomes = new ArrayList<>(); for (Task task : tasks) { - outcomes.add(cancelTask(task, user, params)); + outcomes.add( + cancelTask(TaskParams.with() + .task(task) + .user(user) + .params(params) + .build()) + ); } return outcomes; } + /** + * Cancels the {@link Task} by provided parameters + * + * @param taskParams parameters to determine the Task to be canceled + *
+ * Required parameters + *
    + *
  • taskId or task
  • + *
  • user
  • + *
+ * + * @return outcome of the cancel event + * */ @Override - public CancelTaskEventOutcome cancelTask(LoggedUser loggedUser, String taskId) { - return cancelTask(loggedUser, taskId, new HashMap<>()); - } - - @Override - public CancelTaskEventOutcome cancelTask(LoggedUser loggedUser, String taskId, Map params) { - Optional taskOptional = taskRepository.findById(taskId); - if (taskOptional.isEmpty()) { - throw new IllegalArgumentException("Could not find task with id [" + taskId + "]"); + public CancelTaskEventOutcome cancelTask(TaskParams taskParams) { + fillMissingAttributes(taskParams); + + if (taskParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public CancelTaskEventOutcome call() { + return doCancelTask(taskParams); + } + }) + .build(); + transaction.begin(); + return (CancelTaskEventOutcome) transaction.getResultOfEvent(); + } else { + return doCancelTask(taskParams); } - IUser user = userService.getUserFromLoggedUser(loggedUser); - return cancelTask(taskOptional.get(), user, params); } - @Override - public CancelTaskEventOutcome cancelTask(Task task, IUser user) { - return cancelTask(task, user, new HashMap<>()); - } + private CancelTaskEventOutcome doCancelTask(TaskParams taskParams) { + Task task = taskParams.getTask(); + IUser user = taskParams.getUser(); + Case useCase = taskParams.getUseCase(); - @Override - public CancelTaskEventOutcome cancelTask(Task task, IUser user, Map params) { - Case useCase = workflowService.findOne(task.getCaseId()); Transition transition = useCase.getPetriNet().getTransition(task.getTransitionId()); log.info("[{}]: Canceling task [{}] to user [{}]", useCase.getStringId(), task.getTitle(), user.getSelfOrImpersonated().getEmail()); - List outcomes = new ArrayList<>(eventService.runActions(transition.getPreCancelActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); - useCase = workflowService.findOne(task.getCaseId()); - task = findOne(task.getStringId()); - evaluateRules(useCase.getStringId(), task, EventType.CANCEL, EventPhase.PRE); - useCase = workflowService.findOne(task.getCaseId()); - task = returnTokens(task, useCase.getStringId()); - reloadTasks(workflowService.findOne(task.getCaseId())); - useCase = workflowService.findOne(task.getCaseId()); + List outcomes = new ArrayList<>(eventService.runActions(transition.getPreCancelActions(), useCase, + task, transition, taskParams.getParams())); + if (!outcomes.isEmpty()) { + useCase = workflowService.findOne(task.getCaseId()); + task = findOne(task.getStringId()); + } + + useCase = evaluateRules(useCase, task, EventType.CANCEL, EventPhase.PRE); + DoEventTaskOutcome doOutcome = doCancelTaskToUser(task, useCase); + useCase = doOutcome.getUseCase(); + task = doOutcome.getTask(); + historyService.save(new CancelTaskEventLog(task, useCase, EventPhase.PRE, user)); - outcomes.addAll(eventService.runActions(transition.getPostCancelActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); - useCase = workflowService.findOne(task.getCaseId()); - evaluateRules(useCase.getStringId(), task, EventType.CANCEL, EventPhase.POST); - useCase = workflowService.findOne(task.getCaseId()); - CancelTaskEventOutcome outcome = new CancelTaskEventOutcome(workflowService.findOne(task.getCaseId()), task); + + List postEventOutcomes = eventService.runActions(transition.getPostCancelActions(), useCase, task, + transition, taskParams.getParams()); + if (!postEventOutcomes.isEmpty()) { + outcomes.addAll(postEventOutcomes); + useCase = workflowService.findOne(task.getCaseId()); + } + + useCase = evaluateRules(useCase, task, EventType.CANCEL, EventPhase.POST); + + CancelTaskEventOutcome outcome = new CancelTaskEventOutcome(useCase, task); outcome.setOutcomes(outcomes); addMessageToOutcome(transition, EventType.CANCEL, outcome); historyService.save(new CancelTaskEventLog(task, useCase, EventPhase.POST, user)); - log.info("[{}]: Task [{}] in case [{}] assigned to [{}] was cancelled", useCase.getStringId(), task.getTitle(), useCase.getTitle(), user.getSelfOrImpersonated().getEmail()); + + log.info("[{}]: Task [{}] in case [{}] assigned to [{}] was cancelled", useCase.getStringId(), task.getTitle(), + useCase.getTitle(), user.getSelfOrImpersonated().getEmail()); return outcome; } - private Task returnTokens(Task task, String useCaseId) { - Case useCase = workflowService.findOne(useCaseId); + private DoEventTaskOutcome doCancelTaskToUser(Task task, Case useCase) { PetriNet net = useCase.getPetriNet(); + Case finalUseCase = useCase; net.getArcsOfTransition(task.getTransitionId()).stream() .filter(arc -> arc.getSource() instanceof Place) .forEach(arc -> { - arc.rollbackExecution(useCase.getConsumedTokens().get(arc.getStringId())); - useCase.getConsumedTokens().remove(arc.getStringId()); + arc.rollbackExecution(finalUseCase.getConsumedTokens().get(arc.getStringId())); + finalUseCase.getConsumedTokens().remove(arc.getStringId()); }); workflowService.updateMarking(useCase); task.setUserId(null); // TODO: NAE-1848 should this be null? task.setLastAssigned(null); + task = save(task); workflowService.save(useCase); - return task; + boolean anyTaskExecuted = reloadTasks(useCase); + if (anyTaskExecuted) { + useCase = workflowService.findOne(useCase.getStringId()); + } + + return new DoEventTaskOutcome(task, useCase); } @Override @@ -406,11 +553,11 @@ public DelegateTaskEventOutcome delegateTask(LoggedUser loggedUser, String deleg List outcomes = new ArrayList<>(eventService.runActions(transition.getPreDelegateActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); task = findOne(task.getStringId()); - evaluateRules(useCase.getStringId(), task, EventType.DELEGATE, EventPhase.PRE); + evaluateRules(workflowService.findOne(useCase.getStringId()), task, EventType.DELEGATE, EventPhase.PRE); delegate(delegatedUser, task, useCase); historyService.save(new DelegateTaskEventLog(task, useCase, EventPhase.PRE, delegateUser, delegatedUser.getStringId())); outcomes.addAll(eventService.runActions(transition.getPostDelegateActions(), workflowService.findOne(task.getCaseId()), task, transition, params)); - evaluateRules(useCase.getStringId(), task, EventType.DELEGATE, EventPhase.POST); + evaluateRules(workflowService.findOne(useCase.getStringId()), task, EventType.DELEGATE, EventPhase.POST); reloadTasks(workflowService.findOne(task.getCaseId())); @@ -422,18 +569,35 @@ public DelegateTaskEventOutcome delegateTask(LoggedUser loggedUser, String deleg return outcome; } - protected void delegate(IUser delegated, Task task, Case useCase) throws TransitionNotExecutableException { + private void delegate(IUser delegated, Task task, Case useCase) throws TransitionNotExecutableException { if (task.getUserId() != null) { task.setUserId(delegated.getStringId()); task.setUser(delegated); save(task); } else { - assignTaskToUser(delegated, task, useCase.getStringId()); + doAssignTaskToUser(delegated, task, useCase); } } - protected Case evaluateRules(String caseId, Task task, EventType eventType, EventPhase eventPhase) { - Case useCase = workflowService.findOne(caseId); + private void fillMissingAttributes(TaskParams taskParams) { + if (taskParams.getTask() == null) { + Task task = findOne(taskParams.getTaskId()); + taskParams.setTask(task); + } + if (taskParams.getUseCase() == null) { + Case useCase = workflowService.findOne(taskParams.getTask().getCaseId()); + taskParams.setUseCase(useCase); + } + if (taskParams.getUser() == null) { + IUser user = userService.getLoggedOrSystem(); + taskParams.setUser(user); + } + if (taskParams.getIsTransactional() == null) { + taskParams.setIsTransactional(transactionProperties.isTaskEventTransactional()); + } + } + + private Case evaluateRules(Case useCase, Task task, EventType eventType, EventPhase eventPhase) { log.info("[{}]: Task [{}] in case [{}] evaluating rules of event {} of phase {}", useCase.getStringId(), task.getTitle(), useCase.getTitle(), eventType.name(), eventPhase.name()); int rulesExecuted = ruleEngine.evaluateRules(useCase, task, TransitionEventFact.of(task, eventType, eventPhase)); if (rulesExecuted == 0) { @@ -443,53 +607,166 @@ protected Case evaluateRules(String caseId, Task task, EventType eventType, Even } /** - * Reloads all unassigned tasks of given case: - * - * - * - * - * - * - * - * - * - * - *
Task is presentTask is not present
Transition executableno actioncreate task
Transition not executabledestroy taskno action
+ * Updates the {@link State} of all the {@link Task} objects of the provided {@link Case} + * + * @param useCase Case where the tasks exist, which are updated + * + * @return true if at least one auto-trigger Task was executed. */ - @SuppressWarnings("StatementWithEmptyBody") @Override - public void reloadTasks(Case useCase) { + public boolean reloadTasks(Case useCase) { log.info("[{}]: Reloading tasks in [{}]", useCase.getStringId(), useCase.getTitle()); - PetriNet net = useCase.getPetriNet(); - List tasks; - // create tasks on first reload (create case) - if (useCase.getTasks().isEmpty()) { - tasks = net.getTransitions().values().stream() - .map(transition -> createFromTransition(transition, useCase)) - .collect(Collectors.toList()); + List taskIds = useCase.getTasks().values().stream() + .map(taskPair -> taskPair.getTaskId().toString()) + .collect(Collectors.toList()); + + Optional autoTriggerTaskOpt = reloadAndSaveTasks((List) taskRepository.findAllById(taskIds), useCase); + + if (autoTriggerTaskOpt.isPresent()) { + executeTask(autoTriggerTaskOpt.get(), workflowService.findOne(useCase.getStringId())); + return true; } else { - tasks = taskRepository.findAllByCaseId(useCase.getStringId()); + return false; } - // update tasks state + } + + /** + * Updates {@link State} of the provided tasks, that exist in provided {@link Case}. Only tasks with the changed + * state are updated in database. + * + * @param tasks list of tasks to be updated + * @param useCase Case object where the tasks exist + * + * @return optional auto-trigger task, that is not yet executed. + * */ + private Optional reloadAndSaveTasks(List tasks, Case useCase) { Task autoTriggered = null; + PetriNet net = useCase.getPetriNet(); + List changedTasks = new ArrayList<>(); for (Task task : tasks) { Transition transition = net.getTransition(task.getTransitionId()); - if (isExecutable(transition, net)) { - task.setState(State.ENABLED); - if (task.isAutoTriggered()) { - autoTriggered = task; - } - } else { - task.setState(State.DISABLED); + UpdateTaskStateOutcome updateTaskStateOutcome = updateStateOfTask(task, transition, net); + if (updateTaskStateOutcome.isMustBeExecuted()) { + autoTriggered = task; + } + if (updateTaskStateOutcome.isWasChanged()) { + changedTasks.add(task); + } + } + save(changedTasks); + + return autoTriggered == null ? Optional.empty() : Optional.of(autoTriggered); + } + + /** + * For every {@link Transition} in {@link PetriNet} is created {@link Task} and saved into provided {@link Case}. + * Tasks are saved into database by {@link #reloadAndSaveTasks(List, Case)}. UseCase is not saved into database by + * this method. + * + * @param useCase Case object, where the new tasks are saved. It must contain {@link Case#getPetriNet()} initialized. + * + * @return created tasks and auto-trigger task as optional. Auto-trigger task is within the tasks collection + * */ + @Override + public CreateTasksOutcome createAndSetTasksInCase(Case useCase) { + List tasks = useCase.getPetriNet().getTransitions().values().stream() + .map(transition -> createTaskFromTransition(transition, useCase)) + .collect(Collectors.toList()); + + useCase.addTasks(tasks); + + Optional autoTriggerTaskOpt = reloadAndSaveTasks(tasks, useCase); + + return new CreateTasksOutcome(tasks, autoTriggerTaskOpt.orElse(null)); + } + + /** + * Creates the {@link Task} object by the provided {@link Transition} and {@link Case}. Task is not saved in database + * and Case object. + * + * @param transition transition, from which the Task is created + * @param useCase Case, where the created Task should be later saved + * + * @return created Task + * */ + private Task createTaskFromTransition(Transition transition, Case useCase) { + final Task task = Task.with() + .title(transition.getTitle()) + .processId(useCase.getPetriNetId()) + .caseId(useCase.getId().toString()) + .transitionId(transition.getImportId()) + .layout(transition.getLayout()) + .tags(transition.getTags()) + .caseColor(useCase.getColor()) + .caseTitle(useCase.getTitle()) + .priority(transition.getPriority()) + .icon(transition.getIcon() == null ? useCase.getIcon() : transition.getIcon()) + .immediateDataFields(transition.getImmediateData()) + .assignPolicy(transition.getAssignPolicy()) + .dataFocusPolicy(transition.getDataFocusPolicy()) + .finishPolicy(transition.getFinishPolicy()) + .build(); + transition.getEvents().forEach((type, event) -> task.addEventTitle(type, event.getTitle())); + task.addAssignedUserPolicy(transition.getAssignedUserPolicy()); + for (Trigger trigger : transition.getTriggers()) { + Trigger taskTrigger = trigger.clone(); + task.addTrigger(taskTrigger); + + if (taskTrigger instanceof TimeTrigger) { + TimeTrigger timeTrigger = (TimeTrigger) taskTrigger; + scheduleTaskExecution(task, timeTrigger.getStartDate(), useCase); + } else if (taskTrigger instanceof AutoTrigger) { + task.setUserId(userService.getSystem().getStringId()); } - save(task); } - if (autoTriggered != null) { - executeTransition(autoTriggered, workflowService.findOne(useCase.getStringId())); + ProcessRole defaultRole = processRoleService.defaultRole(); + ProcessRole anonymousRole = processRoleService.anonymousRole(); + for (Map.Entry> entry : transition.getRoles().entrySet()) { + if (useCase.getEnabledRoles().contains(entry.getKey()) + || defaultRole.getStringId().equals(entry.getKey()) + || anonymousRole.getStringId().equals(entry.getKey())) { + task.addRole(entry.getKey(), entry.getValue()); + } } + transition.getNegativeViewRoles().forEach(task::addNegativeViewRole); + + for (Map.Entry> entry : transition.getUserRefs().entrySet()) { + task.addUserRef(entry.getKey(), entry.getValue()); + } + task.resolveViewRoles(); + task.resolveViewUserRefs(); + + Transaction transaction = useCase.getPetriNet().getTransactionByTransition(transition); + if (transaction != null) { + task.setTransactionId(transaction.getStringId()); + } + + return task; } - boolean isExecutable(Transition transition, PetriNet net) { + + /** + * Updates the {@link State} of provided {@link Task}. The state depends on {@link #isExecutable(Transition, PetriNet)} + * + * @param task Task, where the state might be updated + * @param transition transition, by which the execution is determined + * @param net petriNet, by which the execution is determined + * + * @return boolean value if the state was updated and if the task must be executed + * */ + private UpdateTaskStateOutcome updateStateOfTask(Task task, Transition transition, PetriNet net) { + if (isExecutable(transition, net)) { + boolean willBeChanged = task.getState() != State.ENABLED; + task.setState(State.ENABLED); + return new UpdateTaskStateOutcome(willBeChanged, task.isAutoTriggered()); + } else { + boolean willBeChanged = task.getState() != State.DISABLED; + task.setState(State.DISABLED); + return new UpdateTaskStateOutcome(willBeChanged, false); + } + } + + private boolean isExecutable(Transition transition, PetriNet net) { Collection arcsOfTransition = net.getArcsOfTransition(transition); if (arcsOfTransition == null) { @@ -501,21 +778,20 @@ boolean isExecutable(Transition transition, PetriNet net) { .allMatch(Arc::isExecutable); } - void finishExecution(Transition transition, String useCaseId) throws TransitionNotExecutableException { - Case useCase = workflowService.findOne(useCaseId); - log.info("[{}]: Finish execution of task [{}] in case [{}]", useCaseId, transition.getTitle(), useCase.getTitle()); + private Case finishExecution(Transition transition, Case useCase) throws TransitionNotExecutableException { + log.info("[{}]: Finish execution of task [{}] in case [{}]", useCase.getStringId(), transition.getTitle(), useCase.getTitle()); execute(transition, useCase, arc -> arc.getSource().equals(transition)); Supplier> arcStreamSupplier = () -> useCase.getPetriNet().getArcsOfTransition(transition.getStringId()).stream(); arcStreamSupplier.get().filter(arc -> useCase.getConsumedTokens().containsKey(arc.getStringId())).forEach(arc -> useCase.getConsumedTokens().remove(arc.getStringId())); - workflowService.save(useCase); + return workflowService.save(useCase); } - public void startExecution(Transition transition, Case useCase) throws TransitionNotExecutableException { + private void startExecution(Transition transition, Case useCase) throws TransitionNotExecutableException { log.info("[{}]: Start execution of {} in case {}", useCase.getStringId(), transition.getTitle(), useCase.getTitle()); execute(transition, useCase, arc -> arc.getDestination().equals(transition)); } - protected void execute(Transition transition, Case useCase, Predicate predicate) throws TransitionNotExecutableException { + private void execute(Transition transition, Case useCase, Predicate predicate) throws TransitionNotExecutableException { Supplier> filteredSupplier = () -> useCase.getPetriNet().getArcsOfTransition(transition.getStringId()).stream().filter(predicate); if (!filteredSupplier.get().allMatch(Arc::isExecutable)) { @@ -535,23 +811,7 @@ protected void execute(Transition transition, Case useCase, Predicate predi workflowService.updateMarking(useCase); } - protected List executeTransition(Task task, Case useCase) { - log.info("[{}]: executeTransition [{}] in case [{}]", useCase.getStringId(), task.getTransitionId(), useCase.getTitle()); - List outcomes = new ArrayList<>(); - try { - log.info("assignTask [{}] in case [{}]", task.getTitle(), useCase.getTitle()); - outcomes.add(assignTask(task.getStringId())); - log.info("getData [{}] in case [{}]", task.getTitle(), useCase.getTitle()); - outcomes.add(dataService.getData(task.getStringId(), userService.getSystem())); - log.info("finishTask [{}] in case [{}]", task.getTitle(), useCase.getTitle()); - outcomes.add(finishTask(task.getStringId())); - } catch (TransitionNotExecutableException e) { - log.error("execution of task [{}] in case [{}] failed: ", task.getTitle(), useCase.getTitle(), e); - } - return outcomes; - } - - void validateData(Transition transition, Case useCase) { + private void validateData(Transition transition, Case useCase) { // TODO: release/8.0.0 fix validation // for (Map.Entry entry : transition.getDataSet().entrySet()) { // if (useCase.getPetriNet().getDataSet().get(entry.getKey()) != null @@ -575,11 +835,11 @@ void validateData(Transition transition, Case useCase) { // } } - protected void scheduleTaskExecution(Task task, LocalDateTime time, Case useCase) { + private void scheduleTaskExecution(Task task, LocalDateTime time, Case useCase) { log.info("[{}]: Task {} scheduled to run at {}", useCase.getStringId(), task.getTitle(), time.toString()); scheduler.schedule(() -> { try { - executeTransition(task, useCase); + executeTask(task, useCase); } catch (Exception e) { log.info("[{}]: Scheduled task [{}] of case [{}] could not be executed: {}", useCase.getStringId(), task.getTitle(), useCase.getTitle(), e.toString()); } @@ -718,14 +978,12 @@ public List findAllByCase(String caseId) { @Override public Task save(Task task) { task = taskRepository.save(task); - elasticTaskService.index(this.taskMappingService.transform(task)); return task; } @Override public List save(List tasks) { tasks = taskRepository.saveAll(tasks); - tasks.forEach(task -> elasticTaskService.index(this.taskMappingService.transform(task))); return tasks; } @@ -747,9 +1005,9 @@ public Task resolveUserRef(Task task, Case useCase) { return; } List userIds = getExistingUsers(userListField.getValue().getValue()); - if (userIds != null && userIds.size() != 0 && permission.containsKey(RolePermission.VIEW) && !permission.get(RolePermission.VIEW)) { + if (userIds != null && !userIds.isEmpty() && permission.containsKey(RolePermission.VIEW) && !permission.get(RolePermission.VIEW)) { task.getNegativeViewUsers().addAll(userIds); - } else if (userIds != null && userIds.size() != 0) { + } else if (userIds != null && !userIds.isEmpty()) { task.addUsers(new HashSet<>(userIds), permission); } }); @@ -769,67 +1027,6 @@ private List getExistingUsers(UserListFieldValue userListValue) { .collect(Collectors.toList()); } - private Task createFromTransition(Transition transition, Case useCase) { - final Task task = Task.with() - .title(transition.getTitle()) - .processId(useCase.getPetriNetId()) - .caseId(useCase.getId().toString()) - .transitionId(transition.getImportId()) - .layout(transition.getLayout()) - .tags(transition.getTags()) - .caseColor(useCase.getColor()) - .caseTitle(useCase.getTitle()) - .priority(transition.getPriority()) - .icon(transition.getIcon() == null ? useCase.getIcon() : transition.getIcon()) - .immediateDataFields(transition.getImmediateData()) - .assignPolicy(transition.getAssignPolicy()) - .dataFocusPolicy(transition.getDataFocusPolicy()) - .finishPolicy(transition.getFinishPolicy()) - .build(); - transition.getEvents().forEach((type, event) -> task.addEventTitle(type, event.getTitle())); - task.addAssignedUserPolicy(transition.getAssignedUserPolicy()); - for (Trigger trigger : transition.getTriggers()) { - Trigger taskTrigger = trigger.clone(); - task.addTrigger(taskTrigger); - - if (taskTrigger instanceof TimeTrigger) { - TimeTrigger timeTrigger = (TimeTrigger) taskTrigger; - scheduleTaskExecution(task, timeTrigger.getStartDate(), useCase); - } else if (taskTrigger instanceof AutoTrigger) { - task.setUserId(userService.getSystem().getStringId()); - } - } - ProcessRole defaultRole = processRoleService.defaultRole(); - ProcessRole anonymousRole = processRoleService.anonymousRole(); - for (Map.Entry> entry : transition.getRoles().entrySet()) { - if (useCase.getEnabledRoles().contains(entry.getKey()) - || defaultRole.getStringId().equals(entry.getKey()) - || anonymousRole.getStringId().equals(entry.getKey())) { - task.addRole(entry.getKey(), entry.getValue()); - } - } - transition.getNegativeViewRoles().forEach(task::addNegativeViewRole); - - for (Map.Entry> entry : transition.getUserRefs().entrySet()) { - task.addUserRef(entry.getKey(), entry.getValue()); - } - task.resolveViewRoles(); - task.resolveViewUserRefs(); - - Transaction transaction = useCase.getPetriNet().getTransactionByTransition(transition); - if (transaction != null) { - task.setTransactionId(transaction.getStringId()); - } - - Task savedTask = save(task); - - useCase.addTask(savedTask); - // TODO: release/8.0.0 remove? - workflowService.resolveUserRef(useCase); - - return savedTask; - } - private Page loadUsers(Page tasks) { Map users = new HashMap<>(); tasks.forEach(task -> { @@ -851,7 +1048,6 @@ public void delete(List tasks, Case useCase) { workflowService.removeTasksFromCase(tasks, useCase); log.info("[{}]: Tasks of case {} are being deleted", useCase.getStringId(), useCase.getTitle()); taskRepository.deleteAll(tasks); - tasks.forEach(t -> elasticTaskService.remove(t.getStringId())); } @Override @@ -859,7 +1055,6 @@ public void delete(List tasks, String caseId) { workflowService.removeTasksFromCase(tasks, caseId); log.info("[{}]: Tasks of case are being deleted", caseId); taskRepository.deleteAll(tasks); - tasks.forEach(t -> elasticTaskService.remove(t.getStringId())); } @Override diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index 808e6bc574a..78bd1c4fb26 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -1,55 +1,58 @@ package com.netgrif.application.engine.workflow.service; import com.google.common.collect.Ordering; +import com.netgrif.application.engine.auth.domain.IUser; import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserService; -import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseMappingService; import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService; import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest; import com.netgrif.application.engine.history.domain.caseevents.CreateCaseEventLog; import com.netgrif.application.engine.history.domain.caseevents.DeleteCaseEventLog; import com.netgrif.application.engine.history.service.IHistoryService; import com.netgrif.application.engine.importer.model.CaseEventType; -import com.netgrif.application.engine.importer.service.FieldFactory; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.dataset.*; -import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionRunner; import com.netgrif.application.engine.petrinet.domain.events.EventPhase; import com.netgrif.application.engine.petrinet.domain.roles.ProcessRolePermission; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService; import com.netgrif.application.engine.rules.domain.facts.CaseCreatedFact; import com.netgrif.application.engine.rules.service.interfaces.IRuleEngine; import com.netgrif.application.engine.security.service.EncryptionService; +import com.netgrif.application.engine.transaction.NaeTransaction; +import com.netgrif.application.engine.transaction.configuration.NaeTransactionProperties; import com.netgrif.application.engine.utils.FullPageRequest; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.DataFieldValue; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.CreateTasksOutcome; +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams; import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository; import com.netgrif.application.engine.workflow.service.initializer.DataSetInitializer; import com.netgrif.application.engine.workflow.service.interfaces.IEventService; import com.netgrif.application.engine.workflow.service.interfaces.IInitValueExpressionEvaluator; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; import com.querydsl.core.types.Predicate; +import groovy.lang.Closure; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Lazy; -import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.util.Pair; import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionSynchronizationManager; import java.time.LocalDateTime; import java.util.*; @@ -62,43 +65,28 @@ public class WorkflowService implements IWorkflowService { @Autowired - protected CaseRepository repository; + private CaseRepository repository; @Autowired - protected MongoTemplate mongoTemplate; + private MongoTemplate mongoTemplate; @Autowired - protected IPetriNetService petriNetService; + private IPetriNetService petriNetService; @Autowired - protected IProcessRoleService processRoleService; + private ITaskService taskService; @Autowired - protected ITaskService taskService; + private EncryptionService encryptionService; @Autowired - protected ApplicationEventPublisher publisher; + private IRuleEngine ruleEngine; @Autowired - protected EncryptionService encryptionService; + private IUserService userService; @Autowired - protected FieldFactory fieldFactory; - - @Autowired - protected IRuleEngine ruleEngine; - - @Autowired - protected ActionRunner actionsRunner; - - @Autowired - protected IUserService userService; - - @Autowired - protected IInitValueExpressionEvaluator initValueExpressionEvaluator; - - @Autowired - protected IElasticCaseMappingService caseMappingService; + private IInitValueExpressionEvaluator initValueExpressionEvaluator; @Lazy @Autowired @@ -107,11 +95,17 @@ public class WorkflowService implements IWorkflowService { @Autowired private IHistoryService historyService; - protected IElasticCaseService elasticCaseService; + private IElasticCaseService elasticCaseService; @Autowired private DataSetInitializer dataSetInitializer; + @Autowired + private MongoTransactionManager transactionManager; + + @Autowired + private NaeTransactionProperties transactionProperties; + @Autowired public void setElasticCaseService(IElasticCaseService elasticCaseService) { this.elasticCaseService = elasticCaseService; @@ -124,12 +118,7 @@ public Case save(Case useCase) { } encryptDataSet(useCase); useCase = repository.save(useCase); - try { - useCase.resolveImmediateDataFields(); - elasticCaseService.indexNow(this.caseMappingService.transform(useCase)); - } catch (Exception e) { - log.error("Indexing failed [{}]", useCase.getStringId(), e); - } + return useCase; } @@ -143,14 +132,10 @@ public Case findOne(String caseId) { @Override public Case findOneNoNet(String caseId) { Optional caseOptional = repository.findById(caseId); - if (caseOptional.isEmpty()) { - throw new IllegalArgumentException("Could not find Case with id [" + caseId + "]"); - } - // TODO: release/8.0.0 get or throw? - return caseOptional.get(); + return caseOptional.orElseThrow(() -> new IllegalArgumentException("Could not find Case with id [" + caseId + "]")); } - protected void initialize(Case useCase) { + private void initialize(Case useCase) { setPetriNet(useCase); decryptDataSet(useCase); useCase.resolveImmediateDataFields(); @@ -224,119 +209,146 @@ private List getExistingUsers(UserListFieldValue userListValue) { .collect(Collectors.toList()); } + /** + * Create {@link Case} object as {@link CreateCaseEventOutcome} by provided parameters as {@link CreateCaseParams}. + * Created object is saved into database along with the tasks. Any {@link Task}, that should be executed at the + * object creation is executed (auto-trigger tasks). + * + * @param createCaseParams parameters for {@link Case} creation + *
+ * Required parameters: + *
    + *
  • petriNet or petriNetIdentifier or petriNetId
  • + *
  • loggedUser
  • + *
+ * + * @return outcome with up to date {@link} Case object containing sub-outcomes as result of triggered events + * */ @Override - public CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user, Locale locale, Map params) { - if (locale == null) { - locale = LocaleContextHolder.getLocale(); - } - if (title == null) { - return this.createCase(netId, resolveDefaultCaseTitle(netId, locale, params), color, user, params); + public CreateCaseEventOutcome createCase(CreateCaseParams createCaseParams) { + fillMissingAttributes(createCaseParams); + + if (createCaseParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public CreateCaseEventOutcome call() { + return doCreateCase(createCaseParams); + } + }) + .build(); + transaction.begin(); + return (CreateCaseEventOutcome) transaction.getResultOfEvent(); + } else { + return doCreateCase(createCaseParams); } - return this.createCase(netId, title, color, user, params); } - @Override - public CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user, Locale locale) { - return this.createCase(netId, title, color, user, locale, new HashMap<>()); - } + private CreateCaseEventOutcome doCreateCase(CreateCaseParams createCaseParams) { + Case useCase = createCaseObject(createCaseParams); + CreateTasksOutcome createTasksOutcome = taskService.createAndSetTasksInCase(useCase); + save(useCase); // must be after tasks creation for effectivity reasons - @Override - public CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user, Map params) { - return createCase(netId, (u) -> title, color, user, params); - } + PetriNet petriNet = createCaseParams.getPetriNet(); + CreateCaseEventOutcome outcome = new CreateCaseEventOutcome(); - @Override - public CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user) { - return this.createCase(netId, (u) -> title, color, user); - } + outcome.addOutcomes(eventService.runActions(petriNet.getPreCreateActions(), null, Optional.empty(), + createCaseParams.getParams())); - @Override - public CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user, Locale locale, Map params) { - PetriNet net = petriNetService.getNewestVersionByIdentifier(identifier); - if (net == null) { - throw new IllegalArgumentException("Petri net with identifier [" + identifier + "] does not exist."); + int rulesExecuted = ruleEngine.evaluateRules(useCase, new CaseCreatedFact(useCase.getStringId(), EventPhase.PRE)); + if (rulesExecuted > 0) { + useCase = save(useCase); } - return this.createCase(net.getStringId(), title != null && !title.equals("") ? title : net.getDefaultCaseName().getTranslation(locale), color, user, params); - } - - @Override - public CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user, Locale locale) { - return this.createCaseByIdentifier(identifier, title, color, user, locale, new HashMap<>()); - } - @Override - public CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user, Map params) { - PetriNet net = petriNetService.getNewestVersionByIdentifier(identifier); - if (net == null) { - throw new IllegalArgumentException("Petri net with identifier [" + identifier + "] does not exist."); - } - return this.createCase(net.getStringId(), title, color, user, params); - } + historyService.save(new CreateCaseEventLog(useCase, EventPhase.PRE)); - @Override - public CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user) { - PetriNet net = petriNetService.getNewestVersionByIdentifier(identifier); - if (net == null) { - throw new IllegalArgumentException("Petri net with identifier [" + identifier + "] does not exist."); + if (createTasksOutcome.getAutoTriggerTask() != null) { + taskService.executeTask(createTasksOutcome.getAutoTriggerTask(), useCase); + useCase = findOne(useCase.getStringId()); } - return this.createCase(net.getStringId(), title, color, user); - } - public CreateCaseEventOutcome createCase(String netId, Function makeTitle, String color, LoggedUser user) { - return this.createCase(netId, makeTitle, color, user, new HashMap<>()); - } + // TODO release/8.0.0 resolving init of taskRefs is going to be done differently + // resolveTaskRefs(useCase); - public CreateCaseEventOutcome createCase(String netId, Function makeTitle, String color, LoggedUser user, Map params) { - LoggedUser loggedOrImpersonated = user.getSelfOrImpersonated(); - PetriNet petriNet = petriNetService.clone(new ObjectId(netId)); - int rulesExecuted; - Case useCase = new Case(petriNet); - dataSetInitializer.populateDataSet(useCase, params); - useCase.setColor(color); - useCase.setAuthor(loggedOrImpersonated.transformToAuthor()); - useCase.setCreationDate(LocalDateTime.now()); - useCase.setTitle(makeTitle.apply(useCase)); - // TODO: release/7.0.0 6.2.5 - // TODO: release/8.0.0 useCase.setUriNodeId(petriNet.getUriNodeId()); -// UriNode uriNode = uriService.getOrCreate(petriNet, UriContentType.CASE); -// useCase.setUriNodeId(uriNode.getId()); - - CreateCaseEventOutcome outcome = new CreateCaseEventOutcome(); - outcome.addOutcomes(eventService.runActions(petriNet.getPreCreateActions(), null, Optional.empty(), params)); - rulesExecuted = ruleEngine.evaluateRules(useCase, new CaseCreatedFact(useCase.getStringId(), EventPhase.PRE)); - if (rulesExecuted > 0) { - useCase = save(useCase); + List eventPostOutcomes = eventService.runActions(petriNet.getPostCreateActions(), useCase, Optional.empty(), + createCaseParams.getParams()); + if (!eventPostOutcomes.isEmpty()) { + outcome.addOutcomes(eventPostOutcomes); + useCase = findOne(useCase.getStringId()); } - historyService.save(new CreateCaseEventLog(useCase, EventPhase.PRE)); - log.info("[{}]: Case {} created", useCase.getStringId(), useCase.getTitle()); - - useCase.getPetriNet().initializeArcs(useCase.getDataSet()); - taskService.reloadTasks(useCase); - useCase = findOne(useCase.getStringId()); - resolveTaskRefs(useCase); - - useCase = findOne(useCase.getStringId()); - outcome.addOutcomes(eventService.runActions(petriNet.getPostCreateActions(), useCase, Optional.empty(), params)); - useCase = findOne(useCase.getStringId()); rulesExecuted = ruleEngine.evaluateRules(useCase, new CaseCreatedFact(useCase.getStringId(), EventPhase.POST)); if (rulesExecuted > 0) { useCase = save(useCase); } historyService.save(new CreateCaseEventLog(useCase, EventPhase.POST)); + + log.info("[{}]: Case {} created", useCase.getStringId(), useCase.getTitle()); + outcome.setCase(useCase); addMessageToOutcome(petriNet, CaseEventType.CREATE, outcome); return outcome; } - protected Function resolveDefaultCaseTitle(String netId, Locale locale, Map params) { - PetriNet petriNet = petriNetService.clone(new ObjectId(netId)); + /** + * Creates pure {@link Case} object without any {@link Task} object initialized. + * + * @param createCaseParams parameters for object creation + * + * @return created {@link Case} object + * */ + private Case createCaseObject(CreateCaseParams createCaseParams) { + LoggedUser loggedOrImpersonated = createCaseParams.getLoggedUser().getSelfOrImpersonated(); + + Case useCase = new Case(createCaseParams.getPetriNet()); + dataSetInitializer.populateDataSet(useCase, createCaseParams.getParams()); + useCase.setColor(createCaseParams.getColor()); + useCase.setAuthor(loggedOrImpersonated.transformToAuthor()); + useCase.setCreationDate(LocalDateTime.now()); + useCase.setTitle(createCaseParams.getMakeTitle().apply(useCase)); + useCase.setUriNodeId(createCaseParams.getPetriNet().getUriNodeId()); + + useCase.getPetriNet().initializeArcs(useCase.getDataSet()); + + return useCase; + } + + private void fillMissingAttributes(CreateCaseParams createCaseParams) throws IllegalArgumentException { + if (createCaseParams.getLoggedUser() == null) { + throw new IllegalArgumentException("Logged user cannot be null on Case creation."); + } + if (createCaseParams.getIsTransactional() == null) { + createCaseParams.setIsTransactional(transactionProperties.isCreateCaseTransactional()); + } + if (createCaseParams.getPetriNet() == null) { + PetriNet petriNet; + if (createCaseParams.getPetriNetId() != null) { + petriNet = petriNetService.get(new ObjectId(createCaseParams.getPetriNetId())).clone(); + } else if (createCaseParams.getPetriNetIdentifier() != null) { + petriNet = petriNetService.getNewestVersionByIdentifier(createCaseParams.getPetriNetIdentifier()).clone(); + } else { + throw new IllegalArgumentException("Could not find the PetriNet for the Case from provided inputs on case creation."); + } + createCaseParams.setPetriNet(petriNet); + } + if (createCaseParams.getMakeTitle() == null && createCaseParams.getPetriNet() != null) { + createCaseParams.setMakeTitle(resolveDefaultCaseTitle(createCaseParams)); + } + } + + private Function resolveDefaultCaseTitle(CreateCaseParams createCaseParams) { + Locale locale = createCaseParams.getLocale(); + PetriNet petriNet = createCaseParams.getPetriNet(); Function makeTitle; if (petriNet.hasDynamicCaseName()) { - makeTitle = (u) -> initValueExpressionEvaluator.evaluateCaseName(u, petriNet.getDefaultCaseNameExpression(), params).getTranslation(locale); - } else { + makeTitle = (u) -> initValueExpressionEvaluator.evaluateCaseName(u, petriNet.getDefaultCaseNameExpression(), + createCaseParams.getParams()).getTranslation(locale); + } else if (petriNet.hasDefaultCaseName()) { makeTitle = (u) -> petriNet.getDefaultCaseName().getTranslation(locale); + } else { + makeTitle = (u) -> null; } return makeTitle; } @@ -352,58 +364,105 @@ public Page findAllByAuthor(String authorId, String petriNet, Pageable pag return new PageImpl<>(cases, pageable, mongoTemplate.count(new BasicQuery(queryString, "{id:1}"), Case.class)); } + /** + * Deletes the {@link Case} object from database by provided parameters as {@link DeleteCaseParams} + * + * @param deleteCaseParams parameters to determine the object to be deleted + *
+ * Required parameters + *
    + *
  • useCaseId or useCase
  • + *
+ * + * @return outcome with the removed {@link Case} object and sub-outcomes as result of triggered events + * */ @Override - public DeleteCaseEventOutcome deleteCase(String caseId) { - return deleteCase(caseId, new HashMap<>()); + public DeleteCaseEventOutcome deleteCase(DeleteCaseParams deleteCaseParams) { + fillMissingAttributes(deleteCaseParams); + + if (deleteCaseParams.getIsTransactional() && !TransactionSynchronizationManager.isSynchronizationActive()) { + NaeTransaction transaction = NaeTransaction.builder() + .transactionManager(transactionManager) + .event(new Closure(null) { + @Override + public DeleteCaseEventOutcome call() { + return doDeleteCase(deleteCaseParams); + } + }) + .build(); + transaction.begin(); + return (DeleteCaseEventOutcome) transaction.getResultOfEvent(); + } else { + return doDeleteCase(deleteCaseParams); + } } - @Override - public DeleteCaseEventOutcome deleteCase(String caseId, Map params) { - Case useCase = findOne(caseId); - return deleteCase(useCase, params); - } + private DeleteCaseEventOutcome doDeleteCase(DeleteCaseParams deleteCaseParams) { + Case useCase = deleteCaseParams.getUseCase(); + + List preEventOutcomes = eventService.runActions(useCase.getPetriNet().getPreDeleteActions(), + useCase, Optional.empty(), deleteCaseParams.getParams()); - @Override - public DeleteCaseEventOutcome deleteCase(Case useCase, Map params) { - DeleteCaseEventOutcome outcome = new DeleteCaseEventOutcome(useCase, eventService.runActions(useCase.getPetriNet().getPreDeleteActions(), useCase, Optional.empty(), params)); historyService.save(new DeleteCaseEventLog(useCase, EventPhase.PRE)); - log.info("[{}]: User [{}] is deleting case {}", useCase.getStringId(), userService.getLoggedOrSystem().getStringId(), useCase.getTitle()); + + log.info("[{}]: User [{}] is deleting case {}", useCase.getStringId(), userService.getLoggedOrSystem().getStringId(), + useCase.getTitle()); taskService.deleteTasksByCase(useCase.getStringId()); repository.delete(useCase); - outcome.addOutcomes(eventService.runActions(useCase.getPetriNet().getPostDeleteActions(), null, Optional.empty(), params)); + DeleteCaseEventOutcome outcome = new DeleteCaseEventOutcome(useCase, preEventOutcomes); + outcome.addOutcomes(eventService.runActions(useCase.getPetriNet().getPostDeleteActions(), null, + Optional.empty(), deleteCaseParams.getParams())); addMessageToOutcome(useCase.getPetriNet(), CaseEventType.DELETE, outcome); + historyService.save(new DeleteCaseEventLog(useCase, EventPhase.POST)); + return outcome; } - @Override - public DeleteCaseEventOutcome deleteCase(Case useCase) { - return deleteCase(useCase, new HashMap<>()); + private void fillMissingAttributes(DeleteCaseParams deleteCaseParams) throws IllegalArgumentException { + if (deleteCaseParams.getUseCase() == null) { + if (deleteCaseParams.getUseCaseId() != null) { + deleteCaseParams.setUseCase(findOne(deleteCaseParams.getUseCaseId())); + } else { + throw new IllegalArgumentException("At least case id must be provided on case removal."); + } + } + if (deleteCaseParams.getIsTransactional() == null) { + deleteCaseParams.setIsTransactional(transactionProperties.isDeleteCaseTransactional()); + } } @Override public void deleteInstancesOfPetriNet(PetriNet net) { - log.info("[{}]: User {} is deleting all cases and tasks of Petri net {} version {}", net.getStringId(), userService.getLoggedOrSystem().getStringId(), net.getIdentifier(), net.getVersion().toString()); + final IUser user = userService.getLoggedOrSystem(); + final LoggedUser loggedUser = user.transformToLoggedUser(); + + log.info("[{}]: User {} is deleting all cases and tasks of Petri net {} version {}", net.getStringId(), + user.getStringId(), net.getIdentifier(), net.getVersion().toString()); taskService.deleteTasksByPetriNetId(net.getStringId()); + CaseSearchRequest request = new CaseSearchRequest(); CaseSearchRequest.PetriNet netRequest = new CaseSearchRequest.PetriNet(); netRequest.processId = net.getStringId(); request.process = Collections.singletonList(netRequest); - long countCases = elasticCaseService.count(Collections.singletonList(request), userService.getLoggedOrSystem().transformToLoggedUser(), Locale.getDefault(), false); - log.info("[{}]: User {} is deleting {} cases of Petri net {} version {}", net.getStringId(), userService.getLoggedOrSystem().getStringId(), countCases, net.getIdentifier(), net.getVersion().toString()); + long countCases = elasticCaseService.count(Collections.singletonList(request), loggedUser, Locale.getDefault(), false); + + log.info("[{}]: User {} is deleting {} cases of Petri net {} version {}", net.getStringId(), user.getStringId(), + countCases, net.getIdentifier(), net.getVersion().toString()); + long pageCount = (countCases / 100) + 1; LongStream.range(0, pageCount) .forEach(i -> elasticCaseService.search( Collections.singletonList(request), - userService.getLoggedOrSystem().transformToLoggedUser(), + loggedUser, PageRequest.of((int) i, 100), Locale.getDefault(), false) .getContent() - .forEach(this::deleteCase)); + .forEach(useCase -> deleteCase(new DeleteCaseParams(useCase)))); } @Override @@ -412,7 +471,8 @@ public DeleteCaseEventOutcome deleteSubtreeRootedAt(String subtreeRootCaseId) { if (subtreeRoot.getImmediateDataFields().contains("treeChildCases")) { ((List) subtreeRoot.getDataSet().get("treeChildCases").getValue()).forEach(this::deleteSubtreeRootedAt); } - return deleteCase(subtreeRootCaseId); + + return deleteCase(new DeleteCaseParams(subtreeRoot)); } @Override diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java index 30ff05446da..c3ac066de71 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IDataService.java @@ -2,21 +2,19 @@ import com.netgrif.application.engine.auth.domain.IUser; import com.netgrif.application.engine.auth.domain.LoggedUser; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.netgrif.application.engine.petrinet.domain.Component; import com.netgrif.application.engine.petrinet.domain.dataset.Field; import com.netgrif.application.engine.petrinet.domain.dataset.FileField; import com.netgrif.application.engine.petrinet.domain.dataset.FileListField; import com.netgrif.application.engine.petrinet.domain.dataset.UserFieldValue; import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.QTask; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.GetDataParams; +import com.netgrif.application.engine.workflow.domain.params.SetDataParams; import com.netgrif.application.engine.workflow.service.FileFieldInputStream; import com.netgrif.application.engine.workflow.web.responsebodies.DataSet; -import com.querydsl.core.types.Predicate; import org.springframework.data.domain.Page; import org.springframework.web.multipart.MultipartFile; @@ -29,29 +27,9 @@ public interface IDataService { - GetDataEventOutcome getData(String taskId, IUser user); + GetDataEventOutcome getData(GetDataParams getDataParams); - GetDataEventOutcome getData(String taskId, IUser user, Map params); - - GetDataEventOutcome getData(Task task, Case useCase, IUser user); - - GetDataEventOutcome getData(Task task, Case useCase, IUser user, Map params); - - SetDataEventOutcome setData(String taskId, DataSet values, IUser user); - - SetDataEventOutcome setData(String taskId, DataSet values, IUser user, Map params); - - SetDataEventOutcome setData(String taskId, DataSet values, LoggedUser loggedUser); - - SetDataEventOutcome setData(String taskId, DataSet values, LoggedUser loggedUser, Map params); - - SetDataEventOutcome setData(Case useCase, DataSet dataSet, IUser user); - - SetDataEventOutcome setData(Case useCase, DataSet dataSet, IUser user, Map params); - - SetDataEventOutcome setData(Task task, DataSet values, IUser user); - - SetDataEventOutcome setData(Task task, DataSet values, IUser user, Map params); + SetDataEventOutcome setData(SetDataParams setDataParams); SetDataEventOutcome setDataField(Task task, String fieldId, Field newDataField, IUser user); diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java index dbdc45649f4..054371eeb55 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java @@ -7,8 +7,8 @@ import com.netgrif.application.engine.petrinet.domain.events.EventPhase; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/ITaskService.java b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/ITaskService.java index 31fd7c66c95..5dc7c1c032e 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/ITaskService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/ITaskService.java @@ -5,27 +5,29 @@ import com.netgrif.application.engine.petrinet.domain.throwable.TransitionNotExecutableException; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.TaskNotFoundException; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.AssignTaskEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.CancelTaskEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.DelegateTaskEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.FinishTaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.EventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.AssignTaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.CancelTaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.DelegateTaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.FinishTaskEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.CreateTasksOutcome; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.web.requestbodies.TaskSearchRequest; import com.netgrif.application.engine.workflow.web.responsebodies.TaskReference; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Set; // TODO: release/8.0.0 remove LoggedUser, create TaskEventContext class to merge all params public interface ITaskService { - void reloadTasks(Case useCase); + boolean reloadTasks(Case useCase); + + CreateTasksOutcome createAndSetTasksInCase(Case useCase); Task findOne(String taskId); @@ -51,49 +53,19 @@ public interface ITaskService { Task searchOne(com.querydsl.core.types.Predicate predicate); - List finishTasks(List tasks, IUser user) throws TransitionNotExecutableException; + List executeTask(Task task, Case useCase); List finishTasks(List tasks, IUser user, Map params) throws TransitionNotExecutableException; - FinishTaskEventOutcome finishTask(Task task, IUser user) throws TransitionNotExecutableException; - - FinishTaskEventOutcome finishTask(Task task, IUser user, Map params) throws TransitionNotExecutableException; - - FinishTaskEventOutcome finishTask(LoggedUser loggedUser, String taskId) throws IllegalArgumentException, TransitionNotExecutableException; - - FinishTaskEventOutcome finishTask(LoggedUser loggedUser, String taskId, Map params) throws IllegalArgumentException, TransitionNotExecutableException; - - FinishTaskEventOutcome finishTask(String taskId) throws IllegalArgumentException, TransitionNotExecutableException; - - FinishTaskEventOutcome finishTask(String taskId, Map params) throws IllegalArgumentException, TransitionNotExecutableException; - - List assignTasks(List tasks, IUser user) throws TransitionNotExecutableException; + FinishTaskEventOutcome finishTask(TaskParams taskParams) throws TransitionNotExecutableException; List assignTasks(List tasks, IUser user, Map params) throws TransitionNotExecutableException; - AssignTaskEventOutcome assignTask(Task task, IUser user) throws TransitionNotExecutableException; - - AssignTaskEventOutcome assignTask(Task task, IUser user, Map params) throws TransitionNotExecutableException; - - AssignTaskEventOutcome assignTask(LoggedUser loggedUser, String taskId) throws TransitionNotExecutableException, TaskNotFoundException; - - AssignTaskEventOutcome assignTask(LoggedUser loggedUser, String taskId, Map params) throws TransitionNotExecutableException, TaskNotFoundException; - - AssignTaskEventOutcome assignTask(String taskId) throws TransitionNotExecutableException; - - AssignTaskEventOutcome assignTask(String taskId, Map params) throws TransitionNotExecutableException; - - List cancelTasks(List tasks, IUser user); + AssignTaskEventOutcome assignTask(TaskParams taskParams) throws TransitionNotExecutableException; List cancelTasks(List tasks, IUser user, Map params); - CancelTaskEventOutcome cancelTask(Task task, IUser user); - - CancelTaskEventOutcome cancelTask(Task task, IUser user, Map params); - - CancelTaskEventOutcome cancelTask(LoggedUser loggedUser, String taskId); - - CancelTaskEventOutcome cancelTask(LoggedUser loggedUser, String taskId, Map params); + CancelTaskEventOutcome cancelTask(TaskParams taskParams); // TODO: release/8.0.0 delegate is deprecated DelegateTaskEventOutcome delegateTask(LoggedUser loggedUser, String delegatedId, String taskId) throws TransitionNotExecutableException; diff --git a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java index 875fe09f89f..47a8b63f241 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java +++ b/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java @@ -1,19 +1,18 @@ package com.netgrif.application.engine.workflow.service.interfaces; -import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.petrinet.domain.I18nString; import com.netgrif.application.engine.petrinet.domain.PetriNet; -import com.netgrif.application.engine.petrinet.domain.dataset.Field; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams; import com.querydsl.core.types.Predicate; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import java.util.List; -import java.util.Locale; import java.util.Map; public interface IWorkflowService { @@ -28,35 +27,15 @@ public interface IWorkflowService { Page getAll(Pageable pageable); - Case resolveUserRef(Case useCase); - - CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user, Locale locale, Map params); - - CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user, Locale locale); - - CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user, Map params); - - CreateCaseEventOutcome createCase(String netId, String title, String color, LoggedUser user); - - CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user, Map params); - - CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user); - - CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user, Locale locale, Map params); - - CreateCaseEventOutcome createCaseByIdentifier(String identifier, String title, String color, LoggedUser user, Locale locale); - Page findAllByAuthor(String authorId, String petriNet, Pageable pageable); - DeleteCaseEventOutcome deleteCase(String caseId, Map params); - - DeleteCaseEventOutcome deleteCase(String caseId); + Case resolveUserRef(Case useCase); - DeleteCaseEventOutcome deleteSubtreeRootedAt(String caseId); + CreateCaseEventOutcome createCase(CreateCaseParams createCaseParams); - DeleteCaseEventOutcome deleteCase(Case useCase, Map params); + DeleteCaseEventOutcome deleteCase(DeleteCaseParams deleteCaseParams); - DeleteCaseEventOutcome deleteCase(Case useCase); + DeleteCaseEventOutcome deleteSubtreeRootedAt(String caseId); void deleteInstancesOfPetriNet(PetriNet net); diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java b/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java index bdbb309c038..ac1af9a0d68 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/AbstractTaskController.java @@ -7,10 +7,12 @@ import com.netgrif.application.engine.workflow.domain.IllegalArgumentWithChangedFieldsException; import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.GetDataGroupsEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessage; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.params.SetDataParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.service.FileFieldInputStream; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; @@ -89,7 +91,11 @@ public TaskResource getOne(String taskId, Locale locale) { public EntityModel assign(LoggedUser loggedUser, String taskId) { try { - return EventOutcomeWithMessageResource.successMessage("LocalisedTask " + taskId + " assigned to " + loggedUser.getFullName(), taskService.assignTask(loggedUser, taskId)); + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(loggedUser.transformToUser()) + .build(); + return EventOutcomeWithMessageResource.successMessage("LocalisedTask " + taskId + " assigned to " + loggedUser.getFullName(), taskService.assignTask(taskParams)); } catch (TransitionNotExecutableException e) { log.error("Assigning task [{}] failed: ", taskId, e); return EventOutcomeWithMessageResource.errorMessage("LocalisedTask " + taskId + " cannot be assigned"); @@ -107,7 +113,11 @@ public EntityModel delegate(LoggedUser loggedUser, Stri public EntityModel finish(LoggedUser loggedUser, String taskId) { try { - return EventOutcomeWithMessageResource.successMessage("LocalisedTask " + taskId + " finished", taskService.finishTask(loggedUser, taskId)); + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(loggedUser.transformToUser()) + .build(); + return EventOutcomeWithMessageResource.successMessage("LocalisedTask " + taskId + " finished", taskService.finishTask(taskParams)); } catch (Exception e) { log.error("Finishing task [{}] failed: ", taskId, e); if (e instanceof IllegalArgumentWithChangedFieldsException) { @@ -120,7 +130,11 @@ public EntityModel finish(LoggedUser loggedUser, String public EntityModel cancel(LoggedUser loggedUser, String taskId) { try { - return EventOutcomeWithMessageResource.successMessage("LocalisedTask " + taskId + " canceled", taskService.cancelTask(loggedUser, taskId)); + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(loggedUser.transformToUser()) + .build(); + return EventOutcomeWithMessageResource.successMessage("LocalisedTask " + taskId + " canceled", taskService.cancelTask(taskParams)); } catch (Exception e) { log.error("Canceling task [{}] failed: ", taskId, e); if (e instanceof IllegalArgumentWithChangedFieldsException) { @@ -200,7 +214,8 @@ public EntityModel getData(String taskId, Locale locale public EntityModel setData(String taskId, TaskDataSets dataBody, Authentication auth) { try { Map outcomes = new HashMap<>(); - dataBody.getBody().forEach((task, dataSet) -> outcomes.put(task, dataService.setData(task, dataSet, (LoggedUser) auth.getPrincipal()))); + dataBody.getBody().forEach((task, dataSet) -> outcomes.put(task, dataService.setData(new SetDataParams(task, + dataSet, ((LoggedUser) auth.getPrincipal()).transformToUser())))); SetDataEventOutcome mainOutcome = taskService.getMainOutcome(outcomes, taskId); return EventOutcomeWithMessageResource.successMessage("Data field values have been successfully set", mainOutcome); } catch (IllegalArgumentWithChangedFieldsException e) { diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java b/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java index 724f7c9302c..61e73dda53a 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/PublicTaskController.java @@ -3,7 +3,7 @@ import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserService; import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessage; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.web.requestbodies.file.FileFieldRequest; diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/PublicWorkflowController.java b/src/main/java/com/netgrif/application/engine/workflow/web/PublicWorkflowController.java index 801ca6f5cd7..6b18e7efc43 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/PublicWorkflowController.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/PublicWorkflowController.java @@ -2,9 +2,10 @@ import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserService; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessage; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import com.netgrif.application.engine.workflow.web.requestbodies.CreateCaseBody; import io.swagger.v3.oas.annotations.Operation; @@ -47,7 +48,14 @@ public PublicWorkflowController(IWorkflowService workflowService, IUserService u public EntityModel createCase(@RequestBody CreateCaseBody body, Locale locale) { LoggedUser loggedUser = userService.getAnonymousLogged(); try { - CreateCaseEventOutcome outcome = this.workflowService.createCase(body.netId, body.title, body.color, loggedUser, locale); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNetId(body.netId) + .title(body.title) + .color(body.color) + .loggedUser(loggedUser) + .locale(locale) + .build(); + CreateCaseEventOutcome outcome = this.workflowService.createCase(createCaseParams); return EventOutcomeWithMessageResource.successMessage("Case created successfully", outcome); } catch (Exception e) { log.error("Creating case failed:" + e.getMessage(), e); diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/TaskController.java b/src/main/java/com/netgrif/application/engine/workflow/web/TaskController.java index 2713d655813..1abe294dfce 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/TaskController.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/TaskController.java @@ -5,7 +5,7 @@ import com.netgrif.application.engine.elastic.web.requestbodies.singleaslist.SingleElasticTaskSearchRequestAsList; import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessage; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.web.requestbodies.file.FileFieldRequest; diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java b/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java index 628fa7e3fa9..5d30b3ebb1c 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java @@ -6,10 +6,12 @@ import com.netgrif.application.engine.elastic.web.requestbodies.singleaslist.SingleCaseSearchRequestAsList; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.MergeFilterOperation; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.DeleteCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessage; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.response.EventOutcomeWithMessageResource; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams; import com.netgrif.application.engine.workflow.service.FileFieldInputStream; import com.netgrif.application.engine.workflow.service.interfaces.IDataService; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; @@ -76,7 +78,14 @@ public WorkflowController(IWorkflowService workflowService, ITaskService taskSer public EntityModel createCase(@RequestBody CreateCaseBody body, Authentication auth, Locale locale) { LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); try { - CreateCaseEventOutcome outcome = workflowService.createCase(body.netId, body.title, body.color, loggedUser, locale); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNetId(body.netId) + .title(body.title) + .color(body.color) + .loggedUser(loggedUser) + .locale(locale) + .build(); + CreateCaseEventOutcome outcome = workflowService.createCase(createCaseParams); return EventOutcomeWithMessageResource.successMessage("Case with id " + outcome.getCase().getStringId() + " was created succesfully", outcome); } catch (Exception e) { // TODO: 5. 2. 2017 change to custom exception log.error("Creating case failed:", e); @@ -179,7 +188,7 @@ public EntityModel deleteCase(Authentication auth, @Pat if (deleteSubtree) { outcome = workflowService.deleteSubtreeRootedAt(caseId); } else { - outcome = workflowService.deleteCase(caseId); + outcome = workflowService.deleteCase(new DeleteCaseParams(caseId)); } return EventOutcomeWithMessageResource.successMessage("Case " + caseId + " was deleted", outcome); } diff --git a/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskDataSets.java b/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskDataSets.java index dd47c1b2065..bdb3632b2a8 100644 --- a/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskDataSets.java +++ b/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/TaskDataSets.java @@ -11,6 +11,9 @@ @NoArgsConstructor public class TaskDataSets { + /** + * Key is taskId, value is DataSet + * */ private Map body; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 65eacce38f7..29af990d9d6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,7 +21,7 @@ spring.servlet.multipart.max-request-size=50MB nae.uri.index=${DATABASE_NAME:nae}_uri # MongoDB -spring.data.mongodb.uri=${MONGO_URI:mongodb://localhost:27017} +spring.data.mongodb.uri=${MONGO_URI:mongodb://localhost:27017/?replicaSet=rs0} #spring.data.mongodb.host=${MONGO_HOST:localhost} #spring.data.mongodb.port=${MONGO_PORT:27017} spring.data.mongodb.database=${DATABASE_NAME:nae} diff --git a/src/main/resources/petriNets/engine-processes/import_filters.xml b/src/main/resources/petriNets/engine-processes/import_filters.xml index ba4f173f298..34029835e88 100644 --- a/src/main/resources/petriNets/engine-processes/import_filters.xml +++ b/src/main/resources/petriNets/engine-processes/import_filters.xml @@ -22,7 +22,7 @@ importedFilters: f.imported_filters; taskService.findAllById(importedFilters.value).forEach({filterTask -> - workflowService.deleteCase(filterTask.caseId) + deleteCase(filterTask.caseId) }) change importedFilters value { return [] }
@@ -136,7 +136,7 @@ importedFilters: f.imported_filters; - taskService.finishTasks(taskService.findAllById(importedFilters.value), userService.getLoggedUser()) + taskService.finishTasks(taskService.findAllById(importedFilters.value), userService.getLoggedUser(), new HashMap<>()) change importedFilters value { [] } @@ -148,7 +148,7 @@ importedFilters: f.imported_filters; taskService.findAllById(importedFilters.value).forEach({filterTask -> - workflowService.deleteCase(filterTask.caseId) + deleteCase(filterTask.caseId) }) change importedFilters value { [] }
diff --git a/src/main/resources/petriNets/engine-processes/preference_filter_item.xml b/src/main/resources/petriNets/engine-processes/preference_filter_item.xml index 19e478ba7bd..2af10fcbea8 100644 --- a/src/main/resources/petriNets/engine-processes/preference_filter_item.xml +++ b/src/main/resources/petriNets/engine-processes/preference_filter_item.xml @@ -116,7 +116,7 @@ ]) setDataWithPropagation(parentTask, dataSet) async.run { - workflowService.deleteCase(useCase.stringId) + deleteCase(useCase) }
diff --git a/src/main/resources/petriNets/engine-processes/preference_item.xml b/src/main/resources/petriNets/engine-processes/preference_item.xml index bd83d21b85d..adca329eec2 100644 --- a/src/main/resources/petriNets/engine-processes/preference_item.xml +++ b/src/main/resources/petriNets/engine-processes/preference_item.xml @@ -61,7 +61,7 @@ def childCases = workflowService.findAllById(childCaseIds) async.run { childCases.each { - workflowService.deleteCase(it) + deleteCase(it) } } } diff --git a/src/test/groovy/com/netgrif/application/engine/Async.groovy b/src/test/groovy/com/netgrif/application/engine/Async.groovy index fa7758e6bd7..37b7f027c4b 100644 --- a/src/test/groovy/com/netgrif/application/engine/Async.groovy +++ b/src/test/groovy/com/netgrif/application/engine/Async.groovy @@ -3,11 +3,11 @@ package com.netgrif.application.engine import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.workflow.domain.State import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.junit.Ignore import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired @@ -44,8 +44,8 @@ class Async { def t1Id = $case.getTaskStringId("t1") - taskService.assignTask(t1Id) - taskService.finishTask(t1Id) + taskService.assignTask(new TaskParams(t1Id)) + taskService.finishTask(new TaskParams(t1Id)) $case = workflowService.findOne($case.stringId) List tasks = taskService.findAllByCase($case.stringId) diff --git a/src/test/groovy/com/netgrif/application/engine/action/ActionDelegateTest.groovy b/src/test/groovy/com/netgrif/application/engine/action/ActionDelegateTest.groovy index 4183e5134a9..b0d0bd8c8d2 100644 --- a/src/test/groovy/com/netgrif/application/engine/action/ActionDelegateTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/action/ActionDelegateTest.groovy @@ -65,15 +65,15 @@ class ActionDelegateTest { void deleteUser(){ GreenMail smtpServer = new GreenMail(new ServerSetup(2525, null, "smtp")) smtpServer.start() - String mail = "test@netgrif.com"; + String mail = "test@netgrif.com" MessageResource messageResource = actionDelegate.inviteUser(mail) assert messageResource.getContent().success - IUser user = userService.findByEmail(mail, false) + IUser user = userService.findByEmail(mail) assert user != null MimeMessage[] messages = smtpServer.getReceivedMessages() assert messages actionDelegate.deleteUser(mail) - IUser user2 = userService.findByEmail(mail, false) + IUser user2 = userService.findByEmail(mail) assert user2 == null smtpServer.stop() } diff --git a/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy b/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy index f67f8f90585..d4cbe9f23e8 100644 --- a/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy @@ -8,6 +8,7 @@ import com.netgrif.application.engine.auth.domain.repositories.UserRepository import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService @@ -25,7 +26,6 @@ import org.springframework.hateoas.MediaTypes import org.springframework.http.MediaType import org.springframework.mock.web.MockHttpServletRequest import org.springframework.security.authentication.UsernamePasswordAuthenticationToken -import org.springframework.security.core.Authentication import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors import org.springframework.security.web.authentication.WebAuthenticationDetails import org.springframework.test.context.ActiveProfiles @@ -36,7 +36,6 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers import org.springframework.test.web.servlet.setup.MockMvcBuilders import org.springframework.web.context.WebApplicationContext -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity @ExtendWith(SpringExtension.class) @@ -103,10 +102,12 @@ class AssignActionTest { } private void createMainAndSecondaryNet() { - def mainNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/assignRoleMainNet_test_.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def mainNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/assignRoleMainNet_test_.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert mainNet.getNet() != null - def secondaryNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/assignRoleSecondaryNet_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def secondaryNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/assignRoleSecondaryNet_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert secondaryNet.getNet() != null this.mainNet = mainNet.getNet() @@ -118,7 +119,7 @@ class AssignActionTest { User user = userRepository.findByEmail(USER_EMAIL) authentication = new UsernamePasswordAuthenticationToken(USER_EMAIL, USER_PASSWORD) - authentication.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())); + authentication.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())) String roleIdInMainNet = mainNet.getRoles().find { it.value.name.defaultValue == "admin_main" }.key diff --git a/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy b/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy index b5ed186ce48..827b8eaca49 100644 --- a/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy @@ -3,12 +3,15 @@ package com.netgrif.application.engine.action import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic @@ -65,18 +68,28 @@ class AssignRemoveTest { @Test @Disabled("Create functions or update test") void testAssignAndRemoveRole() throws MissingPetriNetMetaDataException, IOException { - ImportPetriNetEventOutcome netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/role_assign_remove_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/role_assign_remove_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null def net = netOptional.getNet() def roleCount = userService.system.processRoles.size() // create - Case caze = workflowService.createCase(net.stringId, 'TEST', '', userService.getLoggedOrSystem().transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("TEST") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case caze = workflowService.createCase(createCaseParams).getCase() assert userService.system.processRoles.size() == roleCount + 4 // delete - workflowService.deleteCase(caze.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(caze) + .build() + workflowService.deleteCase(deleteCaseParams) assert userService.system.processRoles.size() == roleCount } } diff --git a/src/test/groovy/com/netgrif/application/engine/action/FilterApiTest.groovy b/src/test/groovy/com/netgrif/application/engine/action/FilterApiTest.groovy index 4e9a86aaf92..8d4d1a937cc 100644 --- a/src/test/groovy/com/netgrif/application/engine/action/FilterApiTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/action/FilterApiTest.groovy @@ -12,6 +12,7 @@ import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QCase +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import com.netgrif.application.engine.workflow.web.responsebodies.DataSet @@ -104,7 +105,7 @@ class FilterApiTest { "icon" : new TextField(rawValue: ""), "create_filter_and_menu": new ButtonField(rawValue: 0) ] as Map>) - dataService.setData(caze.getTaskStringId("t1"), dataSet, superCreator.getLoggedSuper()) + dataService.setData(new SetDataParams(caze.getTaskStringId("t1"), dataSet, superCreator.getSuperUser())) caze = workflowService.findOne(caze.stringId) Case item = getMenuItem(caze) Case filter = getFilter(caze) @@ -128,7 +129,7 @@ class FilterApiTest { DataSet dataSet = new DataSet([ "delete_filter_and_menu": new ButtonField(rawValue: 0) ] as Map>) - dataService.setData(caze.getTaskStringId("t1"), dataSet, superCreator.getLoggedSuper()) + dataService.setData(new SetDataParams(caze.getTaskStringId("t1"), dataSet, superCreator.getSuperUser())) workflowService.findOne(caze.stringId) Case defGroup = nextGroupService.findDefaultGroup() List taskIds = (defGroup.dataSet.get(ActionDelegate.ORG_GROUP_FIELD_FILTER_TASKS).value.value ?: []) as List @@ -150,7 +151,7 @@ class FilterApiTest { DataSet dataSet = new DataSet([ "find_filter": new ButtonField(rawValue: 0) ] as Map>) - dataService.setData(caze.getTaskStringId("t1"), dataSet, superCreator.getLoggedSuper()) + dataService.setData(new SetDataParams(caze.getTaskStringId("t1"), dataSet, superCreator.getSuperUser())) caze = workflowService.findOne(caze.stringId) assert caze.dataSet.get("found_filter").rawValue == filter.stringId } @@ -167,7 +168,7 @@ class FilterApiTest { "icon" : new TextField(rawValue: "device_hub"), "create_filter_and_menu": new ButtonField(rawValue: 0) ] as Map>) - dataService.setData(caze.getTaskStringId("t1"), dataSet, superCreator.getLoggedSuper()) + dataService.setData(new SetDataParams(caze.getTaskStringId("t1"), dataSet, superCreator.getSuperUser())) caze = workflowService.findOne(caze.stringId) return caze } diff --git a/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy b/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy index 3be69d0475e..90d2c70b6de 100644 --- a/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy @@ -17,6 +17,9 @@ import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QCase import com.netgrif.application.engine.workflow.domain.menu.MenuItemConstants +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -244,26 +247,26 @@ class MenuItemApiTest { String newIdentifier = "new_identifier" String duplicateTaskId = testFolder.tasks.find { it.transition == "duplicate_item" }.task - taskService.assignTask(duplicateTaskId) + taskService.assignTask(new TaskParams(duplicateTaskId)) assertThrows(IllegalArgumentException.class, () -> { testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value = new I18nString("") testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value = newIdentifier testFolder = workflowService.save(testFolder) - taskService.finishTask(duplicateTaskId) + taskService.finishTask(new TaskParams(duplicateTaskId)) }) assertThrows(IllegalArgumentException.class, () -> { testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value = new I18nString(newTitle) testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value = "new_menu_item" testFolder = workflowService.save(testFolder) - taskService.finishTask(duplicateTaskId) + taskService.finishTask(new TaskParams(duplicateTaskId)) }) testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value = new I18nString(newTitle) testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value = newIdentifier testFolder = workflowService.save(testFolder) - taskService.finishTask(duplicateTaskId) + taskService.finishTask(new TaskParams(duplicateTaskId)) Case duplicated = workflowService.searchOne(QCase.case$.processIdentifier.eq("preference_item").and(QCase.case$.dataSet.get(MenuItemConstants.PREFERENCE_ITEM_FIELD_IDENTIFIER.attributeId).value.eq(newIdentifier))) assert duplicated != null @@ -320,7 +323,10 @@ class MenuItemApiTest { assert workflowService.findOne(testFolder.stringId) != null assert workflowService.findOne(leafItemId) != null - workflowService.deleteCase(testFolder) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(testFolder) + .build() + workflowService.deleteCase(deleteCaseParams) sleep(2000) netgrifFolder = workflowService.findOne(netgrifFolderId) assert !(netgrifFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList).contains(testFolder.stringId) @@ -345,7 +351,7 @@ class MenuItemApiTest { } def setData(Case caze, DataSet dataSet) { - dataService.setData(caze.tasks["t1"].taskStringId, dataSet, superCreator.superUser) + dataService.setData(new SetDataParams(caze.tasks["t1"].taskStringId, dataSet, superCreator.superUser)) return workflowService.findOne(caze.stringId) } } diff --git a/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy b/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy index c599bbc6d33..9697ee1b644 100644 --- a/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy @@ -10,6 +10,7 @@ import com.netgrif.application.engine.configuration.properties.SuperAdminConfigu import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService @@ -105,7 +106,8 @@ class RemoveActionTest { .apply(springSecurity()) .build() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/removeRole_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/removeRole_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.petriNet = net.getNet() diff --git a/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy b/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy index ecee3d32bfd..c3f1dc46bef 100644 --- a/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy @@ -13,6 +13,7 @@ import com.netgrif.application.engine.auth.web.requestbodies.RegistrationRequest import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.mail.EmailType import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper @@ -80,7 +81,8 @@ class AuthenticationControllerTest { smtpServer = new GreenMail(new ServerSetup(2525, null, "smtp")) smtpServer.start() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/insurance_portal_demo_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/insurance_portal_demo_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null if (authorityRepository.count() == 0) { importHelper.createAuthority(Authority.user) diff --git a/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy b/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy index 46b67ba44cc..4e78be959fc 100644 --- a/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy @@ -9,23 +9,23 @@ import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionDelegate +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService import com.netgrif.application.engine.security.service.ISecurityContextService -import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.security.authentication.UsernamePasswordAuthenticationToken -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.context.ActiveProfiles; +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension -import java.util.stream.Collectors; +import java.util.stream.Collectors @ExtendWith(SpringExtension.class) @ActiveProfiles(["test"]) @@ -68,7 +68,8 @@ class SecurityContextTest { user = userService.save(new User('test@email.com', 'password', 'Test', 'User')) assert user != null - net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert net != null } @@ -76,7 +77,7 @@ class SecurityContextTest { void addRole() { Set roleIds = net.getRoles().keySet() - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.transformToLoggedUser(), user.transformToLoggedUser().getPassword(), user.transformToLoggedUser().getAuthorities()); + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.transformToLoggedUser(), user.transformToLoggedUser().getPassword(), user.transformToLoggedUser().getAuthorities()) SecurityContextHolder.getContext().setAuthentication(token) // situation 1 diff --git a/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy index 39540c970fe..d73118e7223 100644 --- a/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy @@ -6,20 +6,23 @@ import com.netgrif.application.engine.auth.domain.IUser import com.netgrif.application.engine.auth.domain.User import com.netgrif.application.engine.auth.domain.UserState import com.netgrif.application.engine.auth.service.interfaces.IUserService -import com.netgrif.application.engine.importer.service.AllDataConfiguration import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.UserListField import com.netgrif.application.engine.petrinet.domain.dataset.UserListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.TaskPair -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskAuthorizationService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService @@ -113,11 +116,13 @@ class TaskAuthorizationServiceTest { @BeforeEach void init() { testHelper.truncateDbs() - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/task_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/task_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.net = net.getNet() - ImportPetriNetEventOutcome netWithUserRefs = petriNetService.importPetriNet(new FileInputStream("src/test/resources/task_authorization_service_test_with_userRefs.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome netWithUserRefs = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/task_authorization_service_test_with_userRefs.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netWithUserRefs.getNet() != null this.netWithUserRefs = netWithUserRefs.getNet() @@ -275,134 +280,241 @@ class TaskAuthorizationServiceTest { void testCanAssign() { ProcessRole positiveRole = this.net.getRoles().values().find(v -> v.getImportId() == "assign_pos_role") userService.addRole(testUser, positiveRole.getStringId()) - Case case_ = workflowService.createCase(net.getStringId(), "Test assign", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test assign") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() assert taskAuthorizationService.canCallAssign(testUser.transformToLoggedUser(), case_.getTaskStringId("1")) userService.removeRole(testUser, positiveRole.getStringId()) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCanNotAssign() { ProcessRole negativeRole = this.net.getRoles().values().find(v -> v.getImportId() == "assign_neg_role") userService.addRole(testUser, negativeRole.getStringId()) - Case case_ = workflowService.createCase(net.getStringId(), "Test assign", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test assign") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() assert !taskAuthorizationService.canCallAssign(testUser.transformToLoggedUser(), case_.getTaskStringId("1")) userService.removeRole(testUser, negativeRole.getStringId()) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCanAssignWithUsersRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test assign", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test assign") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "assign_pos_ul":new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() workflowService.save(case_) sleep(4000) assert taskAuthorizationService.canCallAssign(testUser.transformToLoggedUser(), taskId) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCannotAssignWithUsersRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test assign", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test assign") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "assign_neg_ul": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() sleep(4000) assert !taskAuthorizationService.canCallAssign(testUser.transformToLoggedUser(), taskId) - workflowService.deleteCase(case_.stringId) + workflowService.deleteCase(new DeleteCaseParams(case_)) } @Test void testCanAssignWithNegRoleAndPosUsersRef() { ProcessRole positiveRole = this.netWithUserRefs.getRoles().values().find(v -> v.getImportId() == "assign_pos_role") userService.addRole(testUser, positiveRole.getStringId()) - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test assign", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test assign") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "assign_pos_ul": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getLoggedSuper()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() sleep(4000) assert taskAuthorizationService.canCallAssign(testUser.transformToLoggedUser(), taskId) userService.removeRole(testUser, positiveRole.getStringId()) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCanFinish() { ProcessRole positiveRole = this.netWithUserRefs.getRoles().values().find(v -> v.getImportId() == "finish_pos_role") userService.addRole(testUser, positiveRole.getStringId()) - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test Finish", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test Finish") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - taskService.assignTask(testUser.transformToLoggedUser(), taskId) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(testUser) + .build() + taskService.assignTask(taskParams) assert taskAuthorizationService.canCallFinish(testUser.transformToLoggedUser(), taskId) userService.removeRole(testUser, positiveRole.getStringId()) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCanNotFinish() { ProcessRole negativeRole = this.netWithUserRefs.getRoles().values().find(v -> v.getImportId() == "finish_neg_role") userService.addRole(testUser, negativeRole.getStringId()) - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test Finish", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test Finish") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - taskService.assignTask(testUser.transformToLoggedUser(), taskId) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(testUser) + .build() + taskService.assignTask(taskParams) assert !taskAuthorizationService.canCallFinish(testUser.transformToLoggedUser(), taskId) userService.removeRole(testUser, negativeRole.getStringId()) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCanFinishWithUsersRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test Finish", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test Finish") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "finish_pos_ul": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() sleep(4000) - taskService.assignTask(testUser.transformToLoggedUser(), taskId) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(testUser) + .build() + taskService.assignTask(taskParams) assert taskAuthorizationService.canCallFinish(testUser.transformToLoggedUser(), taskId) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCannotFinishWithUsersRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test Finish", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test Finish") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "finish_neg_ul": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() sleep(4000) - taskService.assignTask(testUser.transformToLoggedUser(), taskId) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(testUser) + .build() + taskService.assignTask(taskParams) assert !taskAuthorizationService.canCallFinish(testUser.transformToLoggedUser(), taskId) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testCanFinishWithNegRoleAndPosUsersRef() { ProcessRole positiveRole = this.netWithUserRefs.getRoles().values().find(v -> v.getImportId() == "finish_pos_role") userService.addRole(testUser, positiveRole.getStringId()) - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test Finish", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test Finish") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "finish_pos_ul": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() sleep(4000) - taskService.assignTask(testUser.transformToLoggedUser(), taskId) + TaskParams taskParams = TaskParams.with() + .taskId(taskId) + .user(testUser) + .build() + taskService.assignTask(taskParams) assert taskAuthorizationService.canCallFinish(testUser.transformToLoggedUser(), taskId) userService.removeRole(testUser, positiveRole.getStringId()) - workflowService.deleteCase(case_.stringId) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } } diff --git a/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy index 5ffca556d3f..8b6015e4765 100644 --- a/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy @@ -12,13 +12,16 @@ import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.UserListField import com.netgrif.application.engine.petrinet.domain.dataset.UserListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.ProcessRoleService import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowAuthorizationService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -113,11 +116,13 @@ class WorkflowAuthorizationServiceTest { .apply(springSecurity()) .build() - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/workflow_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/workflow_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.net = net.getNet() - ImportPetriNetEventOutcome netWithUserRefs = petriNetService.importPetriNet(new FileInputStream("src/test/resources/workflow_authorization_service_test_with_userRefs.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome netWithUserRefs = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/workflow_authorization_service_test_with_userRefs.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netWithUserRefs.getNet() != null this.netWithUserRefs = netWithUserRefs.getNet() @@ -209,7 +214,13 @@ class WorkflowAuthorizationServiceTest { void testCanCallDelete() { ProcessRole positiveDeleteRole = this.net.getRoles().values().find(v -> v.getImportId() == "delete_pos_role") userService.addRole(testUser, positiveDeleteRole.getStringId()) - Case case_ = workflowService.createCase(net.getStringId(), "Test delete", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test delete") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() assert workflowAuthorizationService.canCallDelete(testUser.transformToLoggedUser(), case_.getStringId()) userService.removeRole(testUser, positiveDeleteRole.getStringId()) } @@ -226,7 +237,13 @@ class WorkflowAuthorizationServiceTest { void testCanCallDeleteFalse() { ProcessRole deleteRole = this.net.getRoles().values().find(v -> v.getImportId() == "delete_neg_role") userService.addRole(testUser, deleteRole.getStringId()) - Case case_ = workflowService.createCase(net.getStringId(), "Test delete", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test delete") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() assert !workflowAuthorizationService.canCallDelete(testUser.transformToLoggedUser(), case_.getStringId()) userService.removeRole(testUser, deleteRole.getStringId()) } @@ -240,11 +257,17 @@ class WorkflowAuthorizationServiceTest { userService.addRole(testUser, posDeleteRole.getStringId()) userService.addRole(testUser, negDeleteRole.getStringId()) - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test delete", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test delete") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "pos_user_list": new UserListField(rawValue: new UserListFieldValue(userValues: [dataService.makeUserFieldValue(testUser.stringId)])), - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() workflowService.save(case_) assert workflowAuthorizationService.canCallDelete(testUser.transformToLoggedUser(), case_.getStringId()) @@ -261,12 +284,18 @@ class WorkflowAuthorizationServiceTest { userService.addRole(testUser, posDeleteRole.getStringId()) userService.addRole(testUser, negDeleteRole.getStringId()) - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Test delete", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Test delete") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - case_ = dataService.setData(taskId, new DataSet([ + case_ = dataService.setData(new SetDataParams(taskId, new DataSet([ "pos_user_list": new UserListField(rawValue: new UserListFieldValue(userValues: [dataService.makeUserFieldValue(testUser.stringId)])), "neg_user_list": new UserListField(rawValue: new UserListFieldValue(userValues: [dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() assert !workflowAuthorizationService.canCallDelete(testUser.transformToLoggedUser(), case_.getStringId()) diff --git a/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy b/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy index 95fac47c82c..d0a636c2cd5 100644 --- a/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy @@ -18,12 +18,14 @@ import com.netgrif.application.engine.petrinet.domain.dataset.I18nField import com.netgrif.application.engine.petrinet.domain.dataset.TextField import com.netgrif.application.engine.petrinet.domain.dataset.UserFieldValue import com.netgrif.application.engine.petrinet.domain.dataset.UserListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -108,10 +110,11 @@ class DataSearchRequestTest { repository.deleteAll() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null - def users = userService.findAll(true) + def users = userService.findAll() assert users.size() >= 2 def testUser1 = users[0] def testUser2 = users[1] @@ -121,7 +124,7 @@ class DataSearchRequestTest { testUser2.processRoles = [] testUser2.authorities = [] - LocalDate date = LocalDate.of(2020, 7, 25); + LocalDate date = LocalDate.of(2020, 7, 25) Case _case = importHelper.createCase("correct", net.getNet()) _case.dataSet.get("number").rawValue = 7.0 as Double _case.dataSet.get("boolean").rawValue = true @@ -140,11 +143,11 @@ class DataSearchRequestTest { (_case.dataSet.get("i18n_divider") as I18nField).rawValue.defaultValue = "Modified i18n divider value" workflowService.save(_case) - Task actionTrigger = taskService.searchOne(QTask.task.caseId.eq(_case.stringId).and(QTask.task.transitionId.eq("2"))); + Task actionTrigger = taskService.searchOne(QTask.task.caseId.eq(_case.stringId).and(QTask.task.transitionId.eq("2"))) assert actionTrigger != null - dataService.setData(actionTrigger, new DataSet([ + dataService.setData(new SetDataParams(actionTrigger, new DataSet([ "testActionTrigger": new TextField(rawValue: "random value") - ] as Map>), superCreator.getSuperUser()) + ] as Map>), superCreator.getSuperUser())) 10.times { _case = importHelper.createCase("wrong${it}", net.getNet()) diff --git a/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy b/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy index 719f75665cc..f7e42930762 100644 --- a/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy @@ -1,13 +1,14 @@ package com.netgrif.application.engine.elastic -import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.ApplicationEngine +import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.domain.Authority import com.netgrif.application.engine.auth.domain.User import com.netgrif.application.engine.auth.domain.UserState import com.netgrif.application.engine.elastic.domain.ElasticCaseRepository import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.EnumerationField +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper @@ -17,7 +18,6 @@ import groovy.json.JsonOutput import groovy.json.JsonSlurper import groovy.util.logging.Slf4j import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired @@ -102,8 +102,10 @@ class ElasticSearchTest { .apply(springSecurity()) .build() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() - def net2 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + def net2 = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert net assert net2 @@ -115,7 +117,7 @@ class ElasticSearchTest { [auths.get("user")] as Authority[], [net.roles.values().find { it.importId == "process_role" }] as ProcessRole[]) auth = new UsernamePasswordAuthenticationToken(USER_EMAIL, USER_PASSW) - auth.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())); + auth.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())) CASE_NUMBER.times { def _case = importHelper.createCaseAsSuper("$it" as String, it % 2 == 0 ? net : net2) diff --git a/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy b/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy index 06ee0a5ec05..808bd708877 100644 --- a/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy @@ -7,6 +7,7 @@ import com.netgrif.application.engine.elastic.domain.ElasticTaskRepository import com.netgrif.application.engine.elastic.service.ReindexingTask import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskService import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -78,7 +79,8 @@ class ElasticTaskTest { @Test void taskReindexTest() { - def optional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def optional = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert optional.getNet() != null def net = optional.getNet() diff --git a/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy b/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy index db93093eb26..63ef323217f 100644 --- a/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy @@ -5,10 +5,12 @@ import com.netgrif.application.engine.elastic.service.ReindexingTask import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -50,14 +52,21 @@ class ReindexTest { @Test void reindexTest() { - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null int countTread = Thread.activeCount() List threads = [] List savedCase = [] + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net.getNet()) + .title("Test") + .color("color") + .loggedUser(superCreator.getLoggedSuper()) + .build() for (int i in 1..2000) { threads << Thread.start { - def useCase = workflowService.createCase(net.getNet().stringId, "Test", "color", superCreator.getLoggedSuper()).getCase() + def useCase = workflowService.createCase(createCaseParams).getCase() savedCase.add(useCase) } } @@ -69,7 +78,7 @@ class ReindexTest { threads = [] for (int i in 1..4000) { threads << Thread.start { - def useCase = workflowService.createCase(net.getNet().stringId, "Test", "color", superCreator.getLoggedSuper()).getCase() + def useCase = workflowService.createCase(createCaseParams).getCase() savedCase.add(useCase) } } diff --git a/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy b/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy index b5296effb6b..0dca4593f27 100644 --- a/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/event/GroovyShellFactoryTest.groovy @@ -84,7 +84,7 @@ class GroovyShellFactoryTest { void roleActionsTest() { userService.metaClass.groovyShellTestMethod = { String string, I18nString i18nString -> println("groovyShellTestMethod") } - def user = userService.findByEmail(userService.getSystem().getEmail(), false) + def user = userService.findByEmail(userService.getSystem().getEmail()) def processRoleCount = user.processRoles.size() def roles = roleService.findAll(net.getStringId()) assert roles.size() == 1 @@ -93,7 +93,7 @@ class GroovyShellFactoryTest { new HashSet(roles.collect { it.stringId } + user.processRoles.collect { it.stringId }), new LoggedUser("", "a", "", []) ) - user = userService.findByEmail(userService.getSystem().getEmail(), false) + user = userService.findByEmail(userService.getSystem().getEmail()) assert user.processRoles.size() == processRoleCount + 1 } diff --git a/src/test/groovy/com/netgrif/application/engine/export/service/ExportServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/export/service/ExportServiceTest.groovy index eebfcd33e69..5bcc9902d23 100644 --- a/src/test/groovy/com/netgrif/application/engine/export/service/ExportServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/export/service/ExportServiceTest.groovy @@ -1,6 +1,7 @@ package com.netgrif.application.engine.export.service import com.netgrif.application.engine.TestHelper +import com.netgrif.application.engine.auth.domain.IUser import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.elastic.web.requestbodies.ElasticTaskSearchRequest import com.netgrif.application.engine.export.service.interfaces.IExportService @@ -12,6 +13,7 @@ import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.domain.repositories.TaskRepository import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -24,7 +26,7 @@ import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.ActiveProfiles -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.SpringExtension @SpringBootTest @@ -79,14 +81,15 @@ class ExportServiceTest { @Order(2) void testCaseMongoExport() { String exportTask = mainCase.getTaskStringId("t1") - taskService.assignTask(userService.findByEmail("super@netgrif.com").transformToLoggedUser(), exportTask) + IUser user = userService.findByEmail("super@netgrif.com") + taskService.assignTask(new TaskParams(exportTask, user)) File csvFile = new File("src/test/resources/csv/case_mongo_export.csv") assert csvFile.readLines().size() == 11 String[] headerSplit = csvFile.readLines()[0].split(",") assert (headerSplit.contains("immediate_multichoice") && headerSplit.contains("immediate_number") && !headerSplit.contains("text")) - taskService.cancelTask(userService.getLoggedOrSystem().transformToLoggedUser(), exportTask) + taskService.cancelTask(new TaskParams(exportTask, user)) } @Test @@ -94,21 +97,23 @@ class ExportServiceTest { void testCaseElasticExport() { Thread.sleep(5000) //Elastic wait String exportTask = mainCase.getTaskStringId("t2") - taskService.assignTask(userService.findByEmail("super@netgrif.com").transformToLoggedUser(), exportTask) + IUser user = userService.findByEmail("super@netgrif.com") + taskService.assignTask(new TaskParams(exportTask, user)) File csvFile = new File("src/test/resources/csv/case_elastic_export.csv") assert csvFile.readLines().size() == 11 String[] headerSplit = csvFile.readLines()[0].split(",") assert (headerSplit.contains("text") && !headerSplit.contains("immediate_multichoice") && !headerSplit.contains("immediate_number")) - taskService.cancelTask(userService.getLoggedOrSystem().transformToLoggedUser(), exportTask) + taskService.cancelTask(new TaskParams(exportTask, userService.getLoggedOrSystem())) } @Test @Order(4) void testTaskMongoExport() { String exportTask = mainCase.getTaskStringId("t3") - taskService.assignTask(userService.findByEmail("super@netgrif.com").transformToLoggedUser(), exportTask) + IUser user = userService.findByEmail("super@netgrif.com") + taskService.assignTask(new TaskParams(exportTask, user)) File csvFile = new File("src/test/resources/csv/task_mongo_export.csv") assert csvFile.readLines().size() == 11 String[] headerSplit = csvFile.readLines()[0].split(",") @@ -116,7 +121,7 @@ class ExportServiceTest { && headerSplit.contains("immediate_number") && headerSplit.contains("text") && !headerSplit.contains("no_export")) - taskService.cancelTask(userService.getLoggedOrSystem().transformToLoggedUser(), exportTask) + taskService.cancelTask(new TaskParams(exportTask, userService.getLoggedOrSystem())) } @Test @@ -125,7 +130,8 @@ class ExportServiceTest { void testTaskElasticExport() { Thread.sleep(10000) //Elastic wait String exportTask = mainCase.getTaskStringId("t4") - taskService.assignTask(userService.findByEmail("super@netgrif.com").transformToLoggedUser(), exportTask) + IUser user = userService.findByEmail("super@netgrif.com") + taskService.assignTask(new TaskParams(exportTask, user)) Thread.sleep(20000) //Elastic wait def processId = petriNetService.getNewestVersionByIdentifier("export_test").stringId @@ -141,14 +147,15 @@ class ExportServiceTest { && headerSplit.contains("immediate_number") && !headerSplit.contains("text") && !headerSplit.contains("no_export")) - taskService.cancelTask(userService.findByEmail("super@netgrif.com").transformToLoggedUser(), exportTask) + taskService.cancelTask(new TaskParams(exportTask, user)) } @Test void buildDefaultCsvTaskHeaderTest(){ def processId = petriNetService.getNewestVersionByIdentifier("export_test").stringId String exportTask = mainCase.getTaskStringId("t4") - taskService.assignTask(userService.findByEmail("super@netgrif.com").transformToLoggedUser(), exportTask) + IUser user = userService.findByEmail("super@netgrif.com") + taskService.assignTask(new TaskParams(exportTask, user)) List task = taskRepository.findAll(QTask.task.processId.eq(processId).and(QTask.task.transitionId.eq("t4"))) as List Set header = exportService.buildDefaultCsvTaskHeader(task) assert header != null diff --git a/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy b/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy index bb9716a1deb..15c29ee90cf 100644 --- a/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy @@ -17,6 +17,8 @@ import com.netgrif.application.engine.startup.FilterRunner import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.workflow.domain.* import com.netgrif.application.engine.workflow.domain.filter.FilterImportExportList +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.UserFilterSearchService import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.IFilterImportExportService @@ -148,16 +150,16 @@ class FilterImportExportTest { validateFilterXML(new FileInputStream(exportedFiltersField.getPath())) importedTasksIds.forEach({ taskId -> Task filterTask = this.taskService.findOne(taskId) - this.dataService.setData(filterTask, new DataSet([ + this.dataService.setData(new SetDataParams(filterTask, new DataSet([ (VISIBILITY_FIELD): new EnumerationMapField(rawValue: FILTER_VISIBILITY_PRIVATE), (NEW_TITLE_FIELD) : new TextField(rawValue: this.workflowService.findOne(filterTask.caseId).title + " new") - ] as Map>)) + ] as Map>), dummyUser)) }) Task importTask = this.taskService.searchOne(QTask.task.caseId.eq(importCase.stringId).and(QTask.task.transitionId.eq("importFilter"))) - this.dataService.setData(importTask, new DataSet([ + this.dataService.setData(new SetDataParams(importTask, new DataSet([ (IMPORTED_FILTERS_FIELD): new TaskField(rawValue: importedTasksIds) - ] as Map>)) - this.taskService.finishTask(importTask, dummyUser) + ] as Map>), dummyUser)) + this.taskService.finishTask(new TaskParams(importTask, dummyUser)) Thread.sleep(1000) filterCases = this.userFilterSearchService.autocompleteFindFilters("") List filterCasesNames = filterCases.stream().map({ filterCase -> filterCase.title }).collect(Collectors.toList()) diff --git a/src/test/groovy/com/netgrif/application/engine/history/HistoryServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/history/HistoryServiceTest.groovy index 16943c2c091..9261d4b60d4 100644 --- a/src/test/groovy/com/netgrif/application/engine/history/HistoryServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/history/HistoryServiceTest.groovy @@ -6,11 +6,14 @@ import com.netgrif.application.engine.history.service.IHistoryService import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.NumberField +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -57,7 +60,8 @@ class HistoryServiceTest { @BeforeEach void init() { testHelper.truncateDbs() - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.net = net.getNet() @@ -65,35 +69,54 @@ class HistoryServiceTest { @Test void findAllAssignTaskEventLogsByCaseIdTest() { - Case caze = workflowService.createCase(net.getStringId(), "Test assign", "", superCreator.getLoggedSuper()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test assign") + .color("") + .loggedUser(superCreator.getLoggedSuper()) + .build() + Case caze = workflowService.createCase(createCaseParams).getCase() int count = historyService.findAllAssignTaskEventLogsByCaseId(caze.getStringId()).size() assert count == 0 String task = caze.tasks.values().find { it.transitionId == "1" }.taskStringId - taskService.assignTask(superCreator.getLoggedSuper(), task) + taskService.assignTask(new TaskParams(task, superCreator.getSuperUser())) Thread.sleep(1000) // HistoryService::save is @Async assert historyService.findAllAssignTaskEventLogsByCaseId(caze.getStringId()).size() == count + 2 // 2 PRE POST } @Test void findAllFinishTaskEventLogsByCaseId() { - Case caze = workflowService.createCase(net.getStringId(), "Test finish", "", superCreator.getLoggedSuper()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test finish") + .color("") + .loggedUser(superCreator.getLoggedSuper()) + .build() + Case caze = workflowService.createCase(createCaseParams).getCase() int count = historyService.findAllFinishTaskEventLogsByCaseId(caze.getStringId()).size() assert count == 0 String task = caze.tasks.values().find { it.transitionId == "1" }.taskStringId - taskService.assignTask(superCreator.getLoggedSuper(), task) + taskService.assignTask(new TaskParams(task, superCreator.getSuperUser())) assert historyService.findAllFinishTaskEventLogsByCaseId(caze.getStringId()).size() == count - taskService.finishTask(superCreator.getLoggedSuper(), task) + taskService.finishTask(new TaskParams(task, superCreator.getSuperUser())) Thread.sleep(1000) // HistoryService::save is @Async assert historyService.findAllFinishTaskEventLogsByCaseId(caze.getStringId()).size() == count + 2 // 2 PRE POST } @Test void findAllSetDataEventLogsByCaseId() { - Case caze = workflowService.createCase(net.getStringId(), "Test set data", "", superCreator.getLoggedSuper()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test set data") + .color("") + .loggedUser(superCreator.getLoggedSuper()) + .build() + Case caze = workflowService.createCase(createCaseParams).getCase() int count = historyService.findAllSetDataEventLogsByCaseId(caze.getStringId()).size() assert count == 0 String task = caze.tasks.values().find { it.transitionId == "1" }.taskStringId - dataService.setData(task, DataSet.of("number", new NumberField(rawValue: 110101116103114105102)), userService.loggedOrSystem) + dataService.setData(new SetDataParams(task, DataSet.of("number", new NumberField(rawValue: 110101116103114105102)), + userService.loggedOrSystem)) Thread.sleep(1000) // HistoryService::save is @Async assert historyService.findAllSetDataEventLogsByCaseId(caze.getStringId()).size() == count + 3 // 3 PRE EXECUTION POST } diff --git a/src/test/groovy/com/netgrif/application/engine/impersonation/ImpersonationServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/impersonation/ImpersonationServiceTest.groovy index e0578a3d8a0..8e25ee82ab4 100644 --- a/src/test/groovy/com/netgrif/application/engine/impersonation/ImpersonationServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/impersonation/ImpersonationServiceTest.groovy @@ -22,6 +22,7 @@ import com.netgrif.application.engine.startup.ImpersonationRunner import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.* import com.netgrif.application.engine.workflow.web.requestbodies.TaskSearchRequest import com.netgrif.application.engine.workflow.web.requestbodies.taskSearch.TaskSearchCaseRequest @@ -119,7 +120,7 @@ class ImpersonationServiceTest { void before() { testHelper.truncateDbs() - SessionRepositoryFilter filter = wac.getBean(SessionRepositoryFilter.class); + SessionRepositoryFilter filter = wac.getBean(SessionRepositoryFilter.class) mvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(filter).apply(springSecurity()).build() testNet = helper.createNet("impersonation_test.xml").get() @@ -218,7 +219,11 @@ class ImpersonationServiceTest { assert tasks.content[0].stringId == testTask1.stringId assert taskAuthorizationService.canCallAssign(userService.loggedUserFromContext, testTask1.stringId) - taskService.assignTask(userService.loggedUser.transformToLoggedUser(), testTask1.stringId) + TaskParams taskParams = TaskParams.with() + .taskId(testTask1.stringId) + .user(userService.loggedUser) + .build() + taskService.assignTask(taskParams) testTask1 = reloadTask(testTask1) assert testTask1.userId == user2.stringId @@ -226,7 +231,11 @@ class ImpersonationServiceTest { assert taskAuthorizationService.canCallSaveFile(userService.loggedUserFromContext, testTask1.stringId) assert taskAuthorizationService.canCallFinish(userService.loggedUserFromContext, testTask1.stringId) - taskService.finishTask(userService.loggedUser.transformToLoggedUser(), testTask1.stringId) + taskParams = TaskParams.with() + .taskId(testTask1.stringId) + .user(userService.loggedUser) + .build() + taskService.finishTask(taskParams) } @Test @@ -317,8 +326,16 @@ class ImpersonationServiceTest { ((MultichoiceMapField) caze.dataSet.get("impersonated_authorities")).options = (caze.dataSet.get("impersonated_authorities").rawValue as List).collectEntries { [(it): new I18nString(it as String)] } as Map caze = workflowService.save(caze) def initTask = caze.getTaskStringId("t2") - taskService.assignTask(userService.system.transformToLoggedUser(), initTask) - taskService.finishTask(userService.system.transformToLoggedUser(), initTask) + TaskParams taskParams = TaskParams.with() + .taskId(initTask) + .user(userService.system) + .build() + taskService.assignTask(taskParams) + taskParams = TaskParams.with() + .taskId(initTask) + .user(userService.system) + .build() + taskService.finishTask(taskParams) return workflowService.findOne(caze.stringId) } diff --git a/src/test/groovy/com/netgrif/application/engine/importer/AllDataTransitionTest.groovy b/src/test/groovy/com/netgrif/application/engine/importer/AllDataTransitionTest.groovy index cf72ca4ca40..63fc0c00b12 100644 --- a/src/test/groovy/com/netgrif/application/engine/importer/AllDataTransitionTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/importer/AllDataTransitionTest.groovy @@ -5,10 +5,11 @@ import com.netgrif.application.engine.importer.service.AllDataConfiguration import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.Transition import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -48,8 +49,9 @@ class AllDataTransitionTest { @Test void testAllData() throws MissingPetriNetMetaDataException, IOException { - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(resourceFile.inputStream, VersionType.MAJOR, superCreator.getLoggedSuper()); - assert outcome.getNet() != null; + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + resourceFile.inputStream, VersionType.MAJOR, superCreator.getLoggedSuper())) + assert outcome.getNet() != null PetriNet net = outcome.getNet() assert net.transitions.size() == 3 diff --git a/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy b/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy index 86ef94f0e88..f271067fa15 100644 --- a/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy @@ -5,6 +5,7 @@ import com.netgrif.application.engine.importer.service.AllDataConfiguration import com.netgrif.application.engine.importer.service.RoleFactory import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRolePermission import com.netgrif.application.engine.petrinet.domain.roles.RolePermission import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService @@ -13,8 +14,9 @@ import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task import com.netgrif.application.engine.workflow.domain.TaskPair -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic @@ -114,7 +116,7 @@ class PredefinedRolesPermissionsTest { private String ANONYMOUS_ROLE_ID @BeforeEach - public void before() { + void before() { testHelper.truncateDbs() assert processRoleService.defaultRole() != null DEFAULT_ROLE_ID = processRoleService.defaultRole().stringId @@ -227,7 +229,7 @@ class PredefinedRolesPermissionsTest { void reservedDefaultRole() { assertThrows(IllegalArgumentException.class, () -> { importAndCreate(reservedDefaultRoleNet) - }); + }) } @Test() @@ -356,7 +358,7 @@ class PredefinedRolesPermissionsTest { void reservedAnonymousRole() { assertThrows(IllegalArgumentException.class, () -> { importAndCreate(reservedAnonymousRoleNet) - }); + }) } @Test() @@ -426,8 +428,8 @@ class PredefinedRolesPermissionsTest { NetCaseTask instances = importAndCreate(model) String netRoleId = instances.net.getRoles().keySet().find({ it -> it != DEFAULT_ROLE_ID && it != ANONYMOUS_ROLE_ID }) - Map> processPerms = transformProcessRolePermissionMap(processPermissions, netRoleId); - Map> taskPerms = transformRolePermissionMap(taskPermissions, netRoleId); + Map> processPerms = transformProcessRolePermissionMap(processPermissions, netRoleId) + Map> taskPerms = transformRolePermissionMap(taskPermissions, netRoleId) def negativeProcessView = processPerms.findAll { it -> it.value.containsKey(ProcessRolePermission.VIEW) && !it.value.get(ProcessRolePermission.VIEW) }.collect { it -> it.key } def negativeTaskView = taskPerms.findAll { it -> it.value.containsKey(RolePermission.VIEW) && !it.value.get(RolePermission.VIEW) }.collect { it -> it.key } @@ -450,13 +452,20 @@ class PredefinedRolesPermissionsTest { } private NetCaseTask importAndCreate(Resource model) { - ImportPetriNetEventOutcome importOutcome = petriNetService.importPetriNet(model.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + ImportPetriNetEventOutcome importOutcome = petriNetService.importPetriNet(new ImportPetriNetParams( + model.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) assert importOutcome.getNet() != null PetriNet net = importOutcome.getNet() - CreateCaseEventOutcome createCaseOutcome = workflowService.createCase(net.stringId, '', '', superCreator.loggedSuper) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("") + .color("") + .loggedUser(superCreator.loggedSuper) + .build() + CreateCaseEventOutcome createCaseOutcome = workflowService.createCase(createCaseParams) assert createCaseOutcome.getCase() != null Case aCase = createCaseOutcome.getCase() diff --git a/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy b/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy index 8c05133e2e0..9fdfcc9dd1f 100644 --- a/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy @@ -6,15 +6,16 @@ import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.UserFieldValue import com.netgrif.application.engine.petrinet.domain.dataset.UserListField import com.netgrif.application.engine.petrinet.domain.dataset.UserListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService -import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.utils.FullPageRequest import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QCase import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService @@ -37,22 +38,22 @@ import java.util.stream.Collectors class UserListTest { @Autowired - private TestHelper testHelper; + private TestHelper testHelper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator @Autowired - private CaseRepository caseRepository; + private CaseRepository caseRepository @Autowired - private IDataService dataService; + private IDataService dataService @Autowired - private ITaskService taskService; + private ITaskService taskService @BeforeEach void before() { @@ -61,19 +62,20 @@ class UserListTest { @Test void testUserList() throws MissingPetriNetMetaDataException, IOException { - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/user_list.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/user_list.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) - assert net.getNet() != null; - Optional caseOpt = caseRepository.findOne(QCase.case$.title.eq("User List")); + assert net.getNet() != null + Optional caseOpt = caseRepository.findOne(QCase.case$.title.eq("User List")) - assert caseOpt.isPresent(); - assert caseOpt.get().getDataSet().get("text").getRawValue() == "Its working..."; + assert caseOpt.isPresent() + assert caseOpt.get().getDataSet().get("text").getRawValue() == "Its working..." Task task = taskService.findByCases(new FullPageRequest(), Collections.singletonList(caseOpt.get().getStringId())).stream().collect(Collectors.toList()).get(0) - dataService.setData(task.stringId, new DataSet([ + dataService.setData(new SetDataParams(task.stringId, new DataSet([ "users_1": new UserListField(rawValue: new UserListFieldValue(new UserFieldValue(superCreator.getSuperUser()))) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) assert taskService.findById(task.stringId).users.get(superCreator.getSuperUser().getStringId()) assert caseRepository.findById(caseOpt.get().stringId).get().users.get(superCreator.getSuperUser().getStringId()) diff --git a/src/test/groovy/com/netgrif/application/engine/insurance/EncryptionTest.groovy b/src/test/groovy/com/netgrif/application/engine/insurance/EncryptionTest.groovy index e31d83ac9b4..d60d3e070f3 100644 --- a/src/test/groovy/com/netgrif/application/engine/insurance/EncryptionTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/insurance/EncryptionTest.groovy @@ -6,10 +6,12 @@ import com.netgrif.application.engine.auth.service.interfaces.IAuthorityService import com.netgrif.application.engine.configuration.properties.SuperAdminConfiguration import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.TaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -32,7 +34,7 @@ class EncryptionTest { private CaseRepository caseRepository @Autowired - private IWorkflowService workflowService; + private IWorkflowService workflowService @Autowired private Importer importer @@ -82,9 +84,16 @@ class EncryptionTest { } private String createCase() { - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/mapping_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/mapping_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null - def useCase = workflowService.createCase(net.getNet().stringId, "Encryption test", "color", mockLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net.getNet()) + .title("Encryption test") + .color("color") + .loggedUser(mockLoggedUser()) + .build() + def useCase = workflowService.createCase(createCaseParams).getCase() def nameField = useCase.petriNet.dataSet.values().find { v -> v.name.defaultValue == FIELD_NAME } // TODO: release/8.0.0 // useCase.dataSet.put(nameField.stringId, new DataField(FIELD_VALUE)) diff --git a/src/test/groovy/com/netgrif/application/engine/insurance/mvc/InsuranceTest.groovy b/src/test/groovy/com/netgrif/application/engine/insurance/mvc/InsuranceTest.groovy index 438f8fe0222..897a25cb5ce 100644 --- a/src/test/groovy/com/netgrif/application/engine/insurance/mvc/InsuranceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/insurance/mvc/InsuranceTest.groovy @@ -12,6 +12,7 @@ import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.* +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService @@ -133,7 +134,8 @@ class InsuranceTest { .apply(springSecurity()) .build() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/insurance_portal_demo_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/insurance_portal_demo_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null netId = net.getNet().getStringId() @@ -144,10 +146,10 @@ class InsuranceTest { [auths.get("user"), auths.get("admin")] as Authority[], [processRoles.get("agent"), processRoles.get("company")] as ProcessRole[]) List roles = processRoleService.findAll(netId) - processRoleService.assignRolesToUser(userService.findByEmail(USER_EMAIL, false).stringId, roles.findAll { it.importId in ["1", "2"] }.collect { it.stringId } as Set, userService.getLoggedOrSystem().transformToLoggedUser()) + processRoleService.assignRolesToUser(userService.findByEmail(USER_EMAIL).stringId, roles.findAll { it.importId in ["1", "2"] }.collect { it.stringId } as Set, userService.getLoggedOrSystem().transformToLoggedUser()) auth = new UsernamePasswordAuthenticationToken(USER_EMAIL, "password") - auth.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())); + auth.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())) objectWriter = objectMapper.writer().withDefaultPrettyPrinter() } diff --git a/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy b/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy index 00152437996..81753892e46 100644 --- a/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy @@ -3,6 +3,7 @@ package com.netgrif.application.engine.ipc import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -34,10 +35,10 @@ class AssignCancelFinishWithCaseTest { private TestHelper testHelper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator private boolean initialised = false @@ -57,7 +58,8 @@ class AssignCancelFinishWithCaseTest { @Test void testAssignCancelFinish() { - def testNet = petriNetService.importPetriNet(stream(ASSIGN_CANCEL_FINISH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(ASSIGN_CANCEL_FINISH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null diff --git a/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy b/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy index 673f585d081..91e47527a19 100644 --- a/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy @@ -3,11 +3,12 @@ package com.netgrif.application.engine.ipc import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -55,7 +56,8 @@ class CaseApiTest { @Test void testCreate() { - testNet = petriNetService.importPetriNet(stream(CREATE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CREATE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null @@ -72,7 +74,8 @@ class CaseApiTest { void testSearch() { testHelper.truncateDbs() - testNet = petriNetService.importPetriNet(stream(SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null diff --git a/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy b/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy index f2714cc937f..69b4c0255c9 100644 --- a/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy @@ -10,6 +10,7 @@ import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.NumberField import com.netgrif.application.engine.petrinet.domain.dataset.TextField +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -57,7 +58,7 @@ class TaskApiTest { private TestHelper testHelper @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator private def stream = { String name -> return TaskApiTest.getClassLoader().getResourceAsStream(name) @@ -77,7 +78,8 @@ class TaskApiTest { @Test @Disabled("GroovyRuntime Could not find matching constructor") void testTaskSearch() { - def netOptional = petriNetService.importPetriNet(stream(TASK_SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(TASK_SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null @@ -108,7 +110,8 @@ class TaskApiTest { @Test @Disabled() void testTaskEventActions() { - def netOptional = petriNetService.importPetriNet(stream(TASK_EVENTS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(TASK_EVENTS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null @@ -141,8 +144,10 @@ class TaskApiTest { @Test @Disabled("spusta 2 krat") void testTaskExecution() { - def limitsNetOptional = petriNetService.importPetriNet(stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) - def leasingNetOptional = petriNetService.importPetriNet(stream(LEASING_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def limitsNetOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) + def leasingNetOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(LEASING_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert limitsNetOptional.getNet() != null assert leasingNetOptional.getNet() != null @@ -216,7 +221,8 @@ class TaskApiTest { @Test void testTaskBulkActions() { - def netOptional = petriNetService.importPetriNet(stream(TASK_BULK_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(TASK_BULK_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null PetriNet net = netOptional.getNet() @@ -241,7 +247,8 @@ class TaskApiTest { @Test void testGetData() { - def netOptional = petriNetService.importPetriNet(stream(TASK_GETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(TASK_GETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null PetriNet net = netOptional.getNet() @@ -270,7 +277,8 @@ class TaskApiTest { @Test void testSetData() { - def netOptional = petriNetService.importPetriNet(stream(TASK_SETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(TASK_SETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null PetriNet net = netOptional.getNet() diff --git a/src/test/groovy/com/netgrif/application/engine/menu/MenuImportExportTest.groovy b/src/test/groovy/com/netgrif/application/engine/menu/MenuImportExportTest.groovy index 2ddad1eab53..dea75379724 100644 --- a/src/test/groovy/com/netgrif/application/engine/menu/MenuImportExportTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/menu/MenuImportExportTest.groovy @@ -14,8 +14,9 @@ import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QCase import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome import com.netgrif.application.engine.workflow.domain.menu.MenuAndFilters +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.UserFilterSearchService import com.netgrif.application.engine.workflow.service.interfaces.IDataService @@ -207,7 +208,7 @@ class MenuImportExportTest { private SetDataEventOutcome setData(task, Map> values) { - return dataService.setData(task, ImportHelper.populateDataset(values)) + return dataService.setData(new SetDataParams(task, ImportHelper.populateDataset(values), superCreator.getSuperUser())) } diff --git a/src/test/groovy/com/netgrif/application/engine/orgstructure/groups/NextGroupServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/orgstructure/groups/NextGroupServiceTest.groovy index 43133d77fcd..838c653ff4a 100644 --- a/src/test/groovy/com/netgrif/application/engine/orgstructure/groups/NextGroupServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/orgstructure/groups/NextGroupServiceTest.groovy @@ -80,7 +80,7 @@ class NextGroupServiceTest { } Case createGroup() { - return nextGroupService.createGroup("CUSTOM_GROUP_1", userService.findByEmail(DUMMY_USER_MAIL, false)).getCase() + return nextGroupService.createGroup("CUSTOM_GROUP_1", userService.findByEmail(DUMMY_USER_MAIL)).getCase() } List findGroup() { @@ -95,15 +95,15 @@ class NextGroupServiceTest { Case addUser() { QCase qCase = new QCase("case") Case group = nextGroupService.findByPredicate(qCase.title.eq("CUSTOM_GROUP_1")).get(0) - nextGroupService.addUser(userService.findByEmail(CUSTOMER_USER_MAIL, false), group) - nextGroupService.addUser(userService.findByEmail("engine@netgrif.com", false), group) + nextGroupService.addUser(userService.findByEmail(CUSTOMER_USER_MAIL), group) + nextGroupService.addUser(userService.findByEmail("engine@netgrif.com"), group) return group } Case removeUser() { QCase qCase = new QCase("case") Case group = nextGroupService.findByPredicate(qCase.title.eq("CUSTOM_GROUP_1")).get(0) - nextGroupService.removeUser(userService.findByEmail(CUSTOMER_USER_MAIL, false), group) + nextGroupService.removeUser(userService.findByEmail(CUSTOMER_USER_MAIL), group) return group } } diff --git a/src/test/groovy/com/netgrif/application/engine/permissions/ElasticSearchViewPermissionTest.groovy b/src/test/groovy/com/netgrif/application/engine/permissions/ElasticSearchViewPermissionTest.groovy index 0704ddb4991..cb62cbaa518 100644 --- a/src/test/groovy/com/netgrif/application/engine/permissions/ElasticSearchViewPermissionTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/permissions/ElasticSearchViewPermissionTest.groovy @@ -15,12 +15,16 @@ import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.UserListField import com.netgrif.application.engine.petrinet.domain.dataset.UserListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -84,11 +88,13 @@ class ElasticSearchViewPermissionTest { @BeforeEach void inti() { testHelper.truncateDbs() - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/view_permission_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/view_permission_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.net = net.getNet() - ImportPetriNetEventOutcome netWithUserRefs = petriNetService.importPetriNet(new FileInputStream("src/test/resources/view_permission_with_userRefs_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome netWithUserRefs = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/view_permission_with_userRefs_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netWithUserRefs.getNet() != null this.netWithUserRefs = netWithUserRefs.getNet() @@ -100,19 +106,34 @@ class ElasticSearchViewPermissionTest { @Test void testSearchElasticViewWithUserWithoutRole() { - Case case_ = workflowService.createCase(net.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() CaseSearchRequest caseSearchRequest = new CaseSearchRequest() caseSearchRequest.process = [new CaseSearchRequest.PetriNet("vpt")] as List Page casePage = elasticCaseService.search([caseSearchRequest] as List, testUser.transformToLoggedUser(), PageRequest.of(0, 20), LocaleContextHolder.getLocale(), false) assert casePage.getContent().size() == 0 - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testSearchElasticViewWithUserWithPosRole() { - Case case_ = workflowService.createCase(net.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() ProcessRole posViewRole = this.net.getRoles().values().find(v -> v.getImportId() == "view_pos_role") userService.addRole(testUser, posViewRole.getStringId()) @@ -125,12 +146,21 @@ class ElasticSearchViewPermissionTest { assert casePage.getContent().size() == 1 assert casePage.getContent()[0].stringId == case_.stringId userService.removeRole(testUser, posViewRole.getStringId()) - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testSearchElasticViewWithUserWithNegRole() { - Case case_ = workflowService.createCase(net.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() ProcessRole negViewRole = this.net.getRoles().values().find(v -> v.getImportId() == "view_neg_role") userService.addRole(testUser, negViewRole.getStringId()) @@ -140,28 +170,46 @@ class ElasticSearchViewPermissionTest { assert casePage.getContent().size() == 0 && case_.negativeViewRoles.contains(negViewRole.stringId) userService.removeRole(testUser, negViewRole.getStringId()) - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testSearchElasticViewWithUserWithoutUserRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() CaseSearchRequest caseSearchRequest = new CaseSearchRequest() caseSearchRequest.process = [new CaseSearchRequest.PetriNet(netWithUserRefs.getIdentifier())] as List Page casePage = elasticCaseService.search([caseSearchRequest] as List, testUser.transformToLoggedUser(), PageRequest.of(0, 20), LocaleContextHolder.getLocale(), false) assert casePage.getContent().size() == 0 - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testSearchElasticViewWithUserWithPosUserRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - dataService.setData(taskId, new DataSet([ + dataService.setData(new SetDataParams(taskId, new DataSet([ "view_ul_pos": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()) + ] as Map>), superCreator.getSuperUser())) case_ = workflowService.findOne(case_.stringId) sleep(4000) @@ -170,16 +218,25 @@ class ElasticSearchViewPermissionTest { Page casePage = elasticCaseService.search([caseSearchRequest] as List, testUser.transformToLoggedUser(), PageRequest.of(0, 20), LocaleContextHolder.getLocale(), false) assert casePage.getContent().size() == 1 && casePage.getContent()[0].stringId == case_.stringId && case_.viewUsers.contains(testUser.getStringId()) - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testSearchElasticViewWithUserWithNegUserRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() String taskId = case_.getTaskStringId("1") - dataService.setData(taskId, new DataSet([ + dataService.setData(new SetDataParams(taskId, new DataSet([ "view_ul_neg": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()) + ] as Map>), superCreator.getSuperUser())) case_ = workflowService.findOne(case_.stringId) sleep(4000) @@ -188,18 +245,27 @@ class ElasticSearchViewPermissionTest { Page casePage = elasticCaseService.search([caseSearchRequest] as List, testUser.transformToLoggedUser(), PageRequest.of(0, 20), LocaleContextHolder.getLocale(), false) assert casePage.getContent().size() == 0 && case_.negativeViewUsers.contains(testUser.getStringId()) - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } @Test void testSearchElasticViewWithUserWithNegativeRoleAndPosUserRef() { - Case case_ = workflowService.createCase(netWithUserRefs.getStringId(), "Permission test", "", testUser.transformToLoggedUser()).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(netWithUserRefs) + .title("Permission test") + .color("") + .loggedUser(testUser.transformToLoggedUser()) + .build() + Case case_ = workflowService.createCase(createCaseParams).getCase() ProcessRole negViewRole = this.net.getRoles().values().find(v -> v.getImportId() == "view_neg_role") userService.addRole(testUser, negViewRole.getStringId()) String taskId = case_.getTaskStringId("1") - dataService.setData(taskId, new DataSet([ + dataService.setData(new SetDataParams(taskId, new DataSet([ "view_ul_pos": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(testUser.stringId)])) - ] as Map>), superCreator.getSuperUser()) + ] as Map>), superCreator.getSuperUser())) case_ = workflowService.findOne(case_.stringId) sleep(4000) @@ -209,6 +275,9 @@ class ElasticSearchViewPermissionTest { assert casePage.getContent().size() == 1 && case_.viewUsers.contains(testUser.stringId) userService.removeRole(testUser, negViewRole.getStringId()) - workflowService.deleteCase(case_.getStringId()) + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .useCase(case_) + .build() + workflowService.deleteCase(deleteCaseParams) } } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy index 274811c005e..6f87a264dcd 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy @@ -2,6 +2,7 @@ package com.netgrif.application.engine.petrinet.domain import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.domain.repositories.UserRepository +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator @@ -40,7 +41,7 @@ class ActionRefTest { private SuperCreator superCreator @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired private UserRepository userRepository @@ -57,7 +58,8 @@ class ActionRefTest { @Disabled("TODO: deprecated action ref") void testEventImport() { - PetriNet net = petriNetService.importPetriNet(new FileInputStream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert net.dataSet.get("text_1").events.size() == 8 assert net.transitions.get("task").dataSet.get("text_1").events.size() == 8 diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy index 87eabc8fb30..dcdc8db3806 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy @@ -4,6 +4,7 @@ import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.arcs.ArcOrderComparator import com.netgrif.application.engine.petrinet.domain.arcs.ResetArc +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -30,7 +31,7 @@ class ArcOrderTest { private ImportHelper helper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired private SuperCreator superCreator @@ -50,7 +51,8 @@ class ArcOrderTest { @Test void testOrder() { - def net = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() def arcs = net.getArcsOfTransition(NET_TASK) def sorted = arcs.sort { a1, a2 -> ArcOrderComparator.getInstance().compare(a1, a2) } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy index 039547d2014..ea9f7423c90 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy @@ -49,6 +49,6 @@ class ArcReferenceTest { void testInvalidReference() { assertThrows(IllegalArgumentException.class, () -> { importer.importPetriNet(stream(NET_INVALID_FILE)).get() - }); + }) } } \ No newline at end of file diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy index e5fd604d828..636e5b07d45 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy @@ -4,6 +4,7 @@ import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.domain.repositories.UserRepository import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.ipc.TaskApiTest +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.DefaultRoleRunner @@ -11,8 +12,8 @@ import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.startup.SystemUserRunner import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.taskoutcomes.TaskEventOutcome import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.domain.repositories.TaskRepository import com.netgrif.application.engine.workflow.service.TaskService @@ -73,7 +74,7 @@ class EventTest { private SystemUserRunner userRunner @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired private TestHelper testHelper @@ -88,7 +89,8 @@ class EventTest { void testEventImport() { testHelper.truncateDbs() - PetriNet net = petriNetService.importPetriNet(stream(EVENT_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(EVENT_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() instance = helper.createCase(EVENT_NET_CASE, net) outcome = helper.assignTaskToSuper(EVENT_NET_TASK, instance.stringId) diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy index 9ad9061ecb6..bdf7c84bab4 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy @@ -4,9 +4,13 @@ import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.domain.IUser import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.dataset.* +import com.netgrif.application.engine.petrinet.domain.params.DeletePetriNetParams +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -89,32 +93,53 @@ class FunctionsTest { void testNamespaceFunction() { assert userService.findByEmail("test@test.com") == null - def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionResNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() + def functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionResNet assert functionTestNet - Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet(["createUser": new BooleanField(rawValue: true)] as Map>), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet(["createUser": new BooleanField(rawValue: true)] as Map>), superCreator.getSuperUser())) IUser user = userService.findByEmail("test@test.com") assert user userService.deleteUser(user) - petriNetService.deletePetriNet(functionResNet.stringId, userService.getLoggedOrSystem().transformToLoggedUser()) - petriNetService.deletePetriNet(functionTestNet.stringId, userService.getLoggedOrSystem().transformToLoggedUser()) + petriNetService.deletePetriNet(new DeletePetriNetParams(functionResNet.stringId, + userService.getLoggedOrSystem().transformToLoggedUser())) + petriNetService.deletePetriNet(new DeletePetriNetParams(functionTestNet.stringId, + userService.getLoggedOrSystem().transformToLoggedUser())) } @Test void testProcessFunctions() { - def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionResNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() + def functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionResNet assert functionTestNet - Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["enum": new EnumerationField(rawValue: new I18nString("ano"))] as Map>)), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["enum": new EnumerationField(rawValue: new I18nString("ano"))] as Map>)), + superCreator.getSuperUser())) aCase = workflowService.findOne(aCase.getStringId()) NumberField field = aCase.getDataSet().get("number") as NumberField @@ -122,27 +147,38 @@ class FunctionsTest { def fieldBehavior = field.behaviors assert fieldBehavior.get("1").behavior == EDITABLE - petriNetService.deletePetriNet(functionTestNet.stringId, userService.getLoggedOrSystem().transformToLoggedUser()) + petriNetService.deletePetriNet(new DeletePetriNetParams(functionTestNet.stringId, + userService.getLoggedOrSystem().transformToLoggedUser())) } @Test void testNamespaceFunctionException() { assertThrows(NullPointerException.class, () -> { - def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionResNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionResNet def nets = petriNetService.getByIdentifier(FUNCTION_RES_IDENTIFIER) if (nets) { nets.each { - petriNetService.deletePetriNet(it.getStringId(), userService.getLoggedOrSystem().transformToLoggedUser()) + petriNetService.deletePetriNet(new DeletePetriNetParams(it.getStringId(), + userService.getLoggedOrSystem().transformToLoggedUser())) } } - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionTestNet - Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getSuperUser())) }) } @@ -152,52 +188,82 @@ class FunctionsTest { def nets = petriNetService.getByIdentifier(FUNCTION_TEST_IDENTIFIER) if (nets) { nets.each { - petriNetService.deletePetriNet(it.getStringId(), userService.getLoggedOrSystem().transformToLoggedUser()) + petriNetService.deletePetriNet(new DeletePetriNetParams(it.getStringId(), + userService.getLoggedOrSystem().transformToLoggedUser())) } } - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionTestNet - Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["text": new TextField(rawValue: "20")] as Map>)), superCreator.getLoggedSuper()) - - functionTestNet = petriNetService.importPetriNet(functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["text": new TextField(rawValue: "20")] as Map>)), superCreator.getSuperUser())) + + functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionTestNet - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["text": new TextField(rawValue: "20")] as Map>)), superCreator.getLoggedSuper()) + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["text": new TextField(rawValue: "20")] as Map>)), superCreator.getSuperUser())) }) } @Test void testProcessFunctionException() { assertThrows(MissingMethodException.class, () -> { - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionTestNet - Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["number3": new NumberField(rawValue: 20d)] as Map>)), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["number3": new NumberField(rawValue: 20d)] as Map>)), superCreator.getSuperUser())) }) } @Test void testNewVersionOfNamespaceFunction() { - def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def functionResNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionResNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() + def functionTestNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionResNet assert functionTestNet - Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getSuperUser())) aCase = workflowService.findOne(aCase.getStringId()) assert aCase.getDataSet().get("number2").rawValue == 20 + 20 - functionResNet = petriNetService.importPetriNet(functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + functionResNet = petriNetService.importPetriNet(new ImportPetriNetParams( + functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert functionResNet - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getLoggedSuper()) + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getSuperUser())) aCase = workflowService.findOne(aCase.getStringId()) assert aCase.getDataSet().get("number2").rawValue == 20 * 20 @@ -206,17 +272,27 @@ class FunctionsTest { @Test void testNamespaceMethodOverloadingFail() { assertThrows(IllegalArgumentException.class, () -> { - petriNetService.importPetriNet(functionOverloadingFailNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()) + petriNetService.importPetriNet(new ImportPetriNetParams( + functionOverloadingFailNetResource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())) }) } @Test void testNamespaceUseCaseUpdate() { - def functionResV2Net = petriNetService.importPetriNet(functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() - def functionTestV2Net = petriNetService.importPetriNet(functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() - - Case aCase = workflowService.createCase(functionTestV2Net.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("0"), new DataSet((["updateOtherField": new BooleanField(rawValue: true)] as Map>)), superCreator.getLoggedSuper()) + def functionResV2Net = petriNetService.importPetriNet(new ImportPetriNetParams( + functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() + def functionTestV2Net = petriNetService.importPetriNet(new ImportPetriNetParams( + functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() + + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(functionTestV2Net) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("0"), + new DataSet((["updateOtherField": new BooleanField(rawValue: true)] as Map>)), superCreator.getSuperUser())) aCase = workflowService.findOne(aCase.stringId) assert aCase.getDataSet().get("toBeUpdated").rawValue == 1.0 @@ -231,7 +307,8 @@ class FunctionsTest { @Test void testProcessMethodOverloadingFail() { assertThrows(IllegalArgumentException.class, () -> { - petriNetService.importPetriNet(functionOverloadingFailNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()) + petriNetService.importPetriNet(new ImportPetriNetParams( + functionOverloadingFailNetResourceV2.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())) }) } @@ -241,11 +318,19 @@ class FunctionsTest { } private void testMethodOverloading(Resource resource) { - def petriNet = petriNetService.importPetriNet(resource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser()).getNet() + def petriNet = petriNetService.importPetriNet(new ImportPetriNetParams( + resource.inputStream, VersionType.MAJOR, userService.getLoggedOrSystem().transformToLoggedUser())).getNet() assert petriNet - Case aCase = workflowService.createCase(petriNet.stringId, "Test", "", userService.getLoggedOrSystem().transformToLoggedUser()).getCase() - dataService.setData(aCase.getTaskStringId("1"), new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(petriNet) + .title("Test") + .color("") + .loggedUser(userService.getLoggedOrSystem().transformToLoggedUser()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + dataService.setData(new SetDataParams(aCase.getTaskStringId("1"), + new DataSet((["number": new NumberField(rawValue: 20d)] as Map>)), superCreator.getSuperUser())) aCase = workflowService.findOne(aCase.getStringId()) NumberField numberField2 = aCase.dataSet.get("number2") as NumberField TextField textField = aCase.dataSet.get("text") as TextField diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy index ea9e4facb1b..7b20da328c0 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy @@ -5,6 +5,7 @@ import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.dataset.ChoiceField import com.netgrif.application.engine.petrinet.domain.dataset.MultichoiceField import com.netgrif.application.engine.petrinet.domain.dataset.logic.FieldBehavior +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService @@ -12,6 +13,8 @@ import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.DataFieldBehavior +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic @@ -85,11 +88,11 @@ class ImporterTest { @Test void importTest() { long beforeImportNet = processRoleRepository.count() - def netOptional = petriNetService.importPetriNet( + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( firstVersionResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper - ) + )) assert netOptional.getNet() != null assert processRoleRepository.count() == beforeImportNet + 2 long statusImportRole = processRoleRepository.count() @@ -171,11 +174,11 @@ class ImporterTest { } assert net.places.size() == 0 - def netOptional2 = petriNetService.importPetriNet( + def netOptional2 = petriNetService.importPetriNet(new ImportPetriNetParams( secondVersionResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper - ) + )) assert processRoleRepository.count() == statusImportRole + 1 assert netOptional2.getNet() != null @@ -289,11 +292,18 @@ class ImporterTest { @Test void thisKeywordInDataEventsTest() { - PetriNet net = petriNetService.importPetriNet(new ClassPathResource("/this_kw_test.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new ClassPathResource("/this_kw_test.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert net != null - Case testCase = workflowService.createCase(net.stringId, "Test case", "", superCreator.loggedSuper).getCase() - taskService.assignTask(testCase.getTaskStringId("t1")) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test case") + .color("") + .loggedUser(superCreator.loggedSuper) + .build() + Case testCase = workflowService.createCase(createCaseParams).getCase() + taskService.assignTask(new TaskParams(testCase.getTaskStringId("t1"))) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.getDataSet().get("text_field").getRawValue() == "Hello world!" assert testCase.getDataSet().get("tester_text_field").getRawValue() == "Hello world!" @@ -301,10 +311,17 @@ class ImporterTest { @Test void initialBehaviorTest() { - PetriNet net = petriNetService.importPetriNet(new ClassPathResource("/initial_behavior.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new ClassPathResource("/initial_behavior.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert net - Case testCase = workflowService.createCase(net.stringId, "Test case", "", superCreator.loggedSuper).getCase() + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test case") + .color("") + .loggedUser(superCreator.loggedSuper) + .build() + Case testCase = workflowService.createCase(createCaseParams).getCase() assertBehaviors(testCase.dataSet.get(NUMBER_FIELD).behaviors.get("1"), FORBIDDEN) assertBehaviors(testCase.dataSet.get(TEXT_FIELD).behaviors.get("1"), HIDDEN) @@ -331,7 +348,8 @@ class ImporterTest { @Test void enumerationMultichoiceOptionsTest() throws IOException, MissingPetriNetMetaDataException { - PetriNet net = petriNetService.importPetriNet(new ClassPathResource("/enumeration_multichoice_options.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new ClassPathResource("/enumeration_multichoice_options.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert net != null @@ -352,10 +370,10 @@ class ImporterTest { @Test void testDataGroupImportWithoutId() { - def netOutcome = petriNetService.importPetriNet( + def netOutcome = petriNetService.importPetriNet(new ImportPetriNetParams( new FileInputStream("src/test/resources/datagroup_no_id_test.xml"), VersionType.MAJOR, - superCreator.loggedSuper) + superCreator.loggedSuper)) assert netOutcome.getNet() != null @@ -367,7 +385,8 @@ class ImporterTest { @Test void createTransitionNoLabel() { - PetriNet net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/importTest/NoLabel.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/importTest/NoLabel.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert net PetriNet importNet = petriNetService.findByImportId(net.getImportId()).get() assert importNet @@ -376,7 +395,7 @@ class ImporterTest { assert importNet.getTransition("layout").getTitle().defaultValue == "" } - private boolean equalSet(Set first, Set second) { + private static boolean equalSet(Set first, Set second) { return first.every { second.any { that -> it.defaultValue == that.defaultValue } } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy index 7ffc62b6f05..359f96b5fe0 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy @@ -6,6 +6,7 @@ import com.netgrif.application.engine.petrinet.domain.arcs.Arc import com.netgrif.application.engine.petrinet.domain.arcs.InhibitorArc import com.netgrif.application.engine.petrinet.domain.arcs.ReadArc import com.netgrif.application.engine.petrinet.domain.arcs.ResetArc +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference @@ -55,9 +56,10 @@ class PetriNetTest { @Test void testClone() { - int beforeImportNet = processRoleRepository.count() + long beforeImportNet = processRoleRepository.count() - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) assert netOptional.getNet() != null @@ -78,15 +80,18 @@ class PetriNetTest { @Test void testVersioning() { - def outcome1 = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def outcome1 = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) PetriNet net1 = outcome1.getNet() assert net1 - def outcome2 = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def outcome2 = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) PetriNet net2 = outcome2.getNet() assert net2 - def outcome3 = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def outcome3 = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) PetriNet net3 = outcome3.getNet() assert net3 diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy index 1c02d8ce630..772b0c157b2 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy @@ -3,11 +3,12 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.ipc.TaskApiTest import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import com.netgrif.application.engine.workflow.web.responsebodies.DataSet @@ -63,7 +64,8 @@ class CaseFieldTest { @Test void testAllowedNets() { - def testNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null Case aCase = importHelper.createCase("Case 1", testNet.getNet()) @@ -113,7 +115,8 @@ class CaseFieldTest { @Test void testImmediateAllowedNets() { - def testNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null Case aCase = importHelper.createCase("Case 1", testNet.getNet()) @@ -159,10 +162,12 @@ class CaseFieldTest { @Test void testChangeValueAction() { - def notAllowedNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def notAllowedNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert notAllowedNet.getNet() != null - def testNet = petriNetService.importPetriNet(stream(CHANGE_VALUE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CHANGE_VALUE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null Case aCase = importHelper.createCase("Case 1", testNet.getNet()) diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeBehaviorTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeBehaviorTest.groovy index 019e46c1bde..fe416f79505 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeBehaviorTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeBehaviorTest.groovy @@ -5,13 +5,14 @@ import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType -import com.netgrif.application.engine.petrinet.domain.dataset.logic.FieldBehavior +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -76,7 +77,8 @@ class ChangeBehaviorTest { @BeforeEach void initNet() { testHelper.truncateDbs() - net = petriNetService.importPetriNet(new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()).getNet() + net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())).getNet() assert net != null } @@ -87,9 +89,9 @@ class ChangeBehaviorTest { Task mainTask = taskService.searchOne(QTask.task.transitionId.eq(MAIN_TRANSITION) & QTask.task.caseId.eq(testCase.stringId)) assert mainTask - dataService.setData(mainTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(mainTask.stringId, new DataSet([ "boolean_0": new BooleanField(rawValue: true) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.dataSet.get(BOOLEAN_0_FIELD_ID).rawValue == true @@ -110,9 +112,9 @@ class ChangeBehaviorTest { Task otherTask2 = taskService.searchOne(QTask.task.transitionId.eq(TEST_TRANSITION_2) & QTask.task.caseId.eq(testCase.stringId)) assert otherTask2 - dataService.setData(mainTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(mainTask.stringId, new DataSet([ "boolean_1": new BooleanField(rawValue: true) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.dataSet.get(BOOLEAN_1_FIELD_ID).rawValue == true @@ -136,9 +138,9 @@ class ChangeBehaviorTest { Task otherTask = taskService.searchOne(QTask.task.transitionId.eq(TEST_TRANSITION_1) & QTask.task.caseId.eq(testCase.stringId)) assert otherTask - dataService.setData(mainTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(mainTask.stringId, new DataSet([ "boolean_2": new BooleanField(rawValue: true) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.dataSet.get(BOOLEAN_2_FIELD_ID).rawValue == true @@ -157,9 +159,9 @@ class ChangeBehaviorTest { Task otherTask = taskService.searchOne(QTask.task.transitionId.eq(TEST_TRANSITION_1) & QTask.task.caseId.eq(testCase.stringId)) assert otherTask - dataService.setData(mainTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(mainTask.stringId, new DataSet([ "boolean_3": new BooleanField(rawValue: true) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.dataSet.get(BOOLEAN_3_FIELD_ID).rawValue == true @@ -178,18 +180,18 @@ class ChangeBehaviorTest { Task mainTask = taskService.searchOne(QTask.task.transitionId.eq(MAIN_TRANSITION) & QTask.task.caseId.eq(testCase.stringId)) assert mainTask - dataService.setData(mainTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(mainTask.stringId, new DataSet([ "boolean_0": new BooleanField(rawValue: true) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.dataSet.get(BOOLEAN_0_FIELD_ID).rawValue == true assert testCase.dataSet.get(TEXT_0_FIELD_ID).behaviors.get(MAIN_TRANSITION).behavior == EDITABLE assert testCase.dataSet.get(TEXT_0_FIELD_ID).behaviors.get(MAIN_TRANSITION).required == true - dataService.setData(mainTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(mainTask.stringId, new DataSet([ "boolean_0": new BooleanField(rawValue: false) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) assert testCase.dataSet.get(BOOLEAN_0_FIELD_ID).rawValue == false diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy index a8b8ab385c0..46cff4f2743 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy @@ -4,12 +4,15 @@ import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -61,7 +64,8 @@ class ChangeCasePropertyTest { @BeforeEach void initNet() { testHelper.truncateDbs() - net = petriNetService.importPetriNet(new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()).getNet() + net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())).getNet() assert net != null } @@ -74,8 +78,8 @@ class ChangeCasePropertyTest { Task testCaseTask = taskService.searchOne(QTask.task.caseTitle.eq(TEST_CASE_TITLE) & QTask.task.transitionId.eq(TEST_TRANSITION)) assert testCaseTask - taskService.assignTask(testCaseTask.getStringId()) - taskService.finishTask(testCaseTask.getStringId()) + taskService.assignTask(new TaskParams(testCaseTask)) + taskService.finishTask(new TaskParams(testCaseTask)) testCase = workflowService.findOne(testCase.getStringId()) testCaseTask = taskService.findOne(testCaseTask.getStringId()) @@ -93,11 +97,11 @@ class ChangeCasePropertyTest { Task testCaseTask = taskService.searchOne(QTask.task.caseTitle.eq(TEST_CASE_TITLE) & QTask.task.transitionId.eq(TEST_TRANSITION)) assert testCaseTask - taskService.assignTask(testCaseTask.getStringId()) - dataService.setData(testCaseTask.stringId, new DataSet([ + taskService.assignTask(new TaskParams(testCaseTask)) + dataService.setData(new SetDataParams(testCaseTask.stringId, new DataSet([ "bln": new BooleanField(rawValue: true) - ] as Map>), superCreator.getSuperUser()) - taskService.finishTask(testCaseTask.getStringId()) + ] as Map>), superCreator.getSuperUser())) + taskService.finishTask(new TaskParams(testCaseTask)) testCase = workflowService.findOne(testCase.getStringId()) testCaseTask = taskService.findOne(testCaseTask.getStringId()) diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy index c029fddfdee..10f5efc0544 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy @@ -2,13 +2,15 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import org.junit.jupiter.api.BeforeEach @@ -49,7 +51,8 @@ class ChangeFieldValueInitTest { @Test void testInitValues() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/change_field_value_init.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/change_field_value_init.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) Case useCase = importHelper.createCase("test", optNet.getNet()) assert useCase.dataSet.get("text_static").rawValue == "TEST VALUE" @@ -74,8 +77,8 @@ class ChangeFieldValueInitTest { Case execute(String trans, Case useCase) { Task task = taskService.searchOne(QTask.task.caseId.eq(useCase.getStringId()) & QTask.task.transitionId.eq(trans)) - taskService.assignTask(task.stringId) - taskService.finishTask(task.stringId) + taskService.assignTask(new TaskParams(task)) + taskService.finishTask(new TaskParams(task)) return reload(useCase) } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy index 1027972f9f7..352ecba1667 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy @@ -6,6 +6,7 @@ import com.netgrif.application.engine.ipc.TaskApiTest import com.netgrif.application.engine.petrinet.domain.DataRef import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -41,10 +42,10 @@ class ChoiceFieldTest { private TestHelper testHelper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator private Closure stream = { String name -> return TaskApiTest.getClassLoader().getResourceAsStream(name) @@ -57,7 +58,8 @@ class ChoiceFieldTest { @Test void testChoices() { - def netOptional = petriNetService.importPetriNet(stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null def net = netOptional.getNet() diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy index 01b714e2862..336efff5bc4 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy @@ -2,10 +2,12 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -39,11 +41,26 @@ class DynamicCaseNameTest { @Test void testInitValues() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_case_name_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) - Case useCase = workflowService.createCase(optNet.getNet().stringId, null, "", superCreator.loggedSuper, Locale.forLanguageTag("sk-SK")).getCase() + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/dynamic_case_name_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(optNet.getNet()) + .title(null) + .color("") + .loggedUser(superCreator.loggedSuper) + .locale(Locale.forLanguageTag("sk-SK")) + .build() + Case useCase = workflowService.createCase(createCaseParams).getCase() assert useCase.title == "SK text value 6" - Case useCase2 = workflowService.createCase(optNet.getNet().stringId, null, "", superCreator.loggedSuper, Locale.ENGLISH).getCase() + CreateCaseParams createCaseParams2 = CreateCaseParams.with() + .petriNet(optNet.getNet()) + .title(null) + .color("") + .loggedUser(superCreator.loggedSuper) + .locale(Locale.ENGLISH) + .build() + Case useCase2 = workflowService.createCase(createCaseParams2).getCase() assert useCase2.title == "EN text value 6" } } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy index 85f56582407..841b55a9e4e 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy @@ -2,10 +2,11 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService @@ -23,36 +24,37 @@ import org.springframework.test.context.junit.jupiter.SpringExtension class DynamicChoicesTest { @Autowired - private TestHelper testHelper; + private TestHelper testHelper @Autowired private ImportHelper importHelper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator @Autowired - private IDataService dataService; + private IDataService dataService @Autowired - private ITaskService taskService; + private ITaskService taskService @Autowired - private CaseRepository caseRepository; + private CaseRepository caseRepository @BeforeEach void before() { - testHelper.truncateDbs(); + testHelper.truncateDbs() } @Test void testDynamicEnum() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_choices.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/dynamic_choices.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) - assert optNet.getNet() != null; + assert optNet.getNet() != null def net = optNet.getNet() def aCase = importHelper.createCase("Case", net) diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy index 89c02c355dc..998d0cdeaac 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy @@ -2,11 +2,12 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -41,7 +42,8 @@ class DynamicDefaultValueTest { @Test void testInitValues() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_init.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/dynamic_init.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) Case useCase = importHelper.createCase("test", optNet.getNet()) assert useCase.dataSet.get("text").rawValue == superCreator.superUser.name diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy index 14fee16971f..9fa665c65b1 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy @@ -3,12 +3,14 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.utils.FullPageRequest import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService @@ -31,48 +33,49 @@ import java.util.stream.Collectors class DynamicEnumerationTest { @Autowired - private TestHelper testHelper; + private TestHelper testHelper @Autowired private ImportHelper importHelper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator @Autowired - private IDataService dataService; + private IDataService dataService @Autowired - private ITaskService taskService; + private ITaskService taskService @Autowired - private CaseRepository caseRepository; + private CaseRepository caseRepository @BeforeEach - public void before() { - testHelper.truncateDbs(); + void before() { + testHelper.truncateDbs() } @Test void testDynamicEnum() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/test_autocomplete_dynamic.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/test_autocomplete_dynamic.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) - assert optNet.getNet() != null; + assert optNet.getNet() != null def net = optNet.getNet() def aCase = importHelper.createCase("Case", net) assert aCase != null - Task task = taskService.findByCases(new FullPageRequest(), Collections.singletonList(aCase.getStringId())).stream().collect(Collectors.toList()).get(0); - importHelper.assignTask("Autocomplete", aCase.getStringId(), superCreator.getLoggedSuper()) + Task task = taskService.findByCases(new FullPageRequest(), Collections.singletonList(aCase.getStringId())).stream().collect(Collectors.toList()).get(0) + importHelper.assignTask("Autocomplete", aCase.getStringId(), superCreator.getSuperUser()) def dataSet = new DataSet([ "autocomplete": new EnumerationField(rawValue: new I18nString("Case")) ] as Map>) - dataService.setData(task.stringId, dataSet, superCreator.getSuperUser()) + dataService.setData(new SetDataParams(task.stringId, dataSet, superCreator.getSuperUser())) def caseOpt = caseRepository.findById(aCase.stringId) assert caseOpt.isPresent() diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy index a3992a8c08a..40729a6fe1f 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy @@ -2,12 +2,14 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.GetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -61,8 +63,10 @@ class DynamicValidationPerformanceTest { @Test void testValidations() { // TODO: release/8.0.0 Object f.text_valid_switch does not exists - ImportPetriNetEventOutcome optNet1 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) - ImportPetriNetEventOutcome optNet2 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome optNet1 = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) + ImportPetriNetEventOutcome optNet2 = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) def aCase1 = importHelper.createCase("Case 1", optNet1.getNet()) def aCase2 = importHelper.createCase("Case 2", optNet2.getNet()) @@ -77,7 +81,7 @@ class DynamicValidationPerformanceTest { Map getData(Case useCase) { Task task = task(useCase) - return dataService.getData(task, useCase, superCreator.getSuperUser()).getData().collectEntries { [(it.fieldId): (it)] } + return dataService.getData(new GetDataParams(task, useCase, superCreator.getSuperUser())).getData().collectEntries { [(it.fieldId): (it)] } } Task task(Case useCase) { diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy index 3f2a1f5479c..6fc924a7313 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy @@ -1,20 +1,13 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper -import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.Task -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest @@ -49,7 +42,7 @@ class DynamicValidationTest { @BeforeEach void before() { - testHelper.truncateDbs(); + testHelper.truncateDbs() } // @Test diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy index 633d1f9db26..d72f65fdbd9 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy @@ -8,10 +8,12 @@ import com.netgrif.application.engine.configuration.properties.SuperAdminConfigu import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -68,10 +70,10 @@ class FileFieldTest { private WebApplicationContext context @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator private MockMvc mockMvc @@ -85,7 +87,8 @@ class FileFieldTest { } PetriNet getNet() { - def netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/remoteFileField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/remoteFileField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null return netOptional.getNet() } @@ -101,11 +104,17 @@ class FileFieldTest { void downloadFileByCase() { PetriNet net = getNet() - IUser user = userService.findByEmail(configuration.email, true) + IUser user = userService.findByEmail(configuration.email) assert user != null - Case useCase = workflowService.createCase(net.getStringId(), "Test file download", "black", user.transformToLoggedUser()).getCase() - importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user.transformToLoggedUser()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test file download") + .color("black") + .loggedUser(user.transformToLoggedUser()) + .build() + Case useCase = workflowService.createCase(createCaseParams).getCase() + importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user) mockMvc.perform(get("/api/workflow/case/" + useCase.getStringId() + "/file") .param("fieldId", FIELD_ID) @@ -121,11 +130,17 @@ class FileFieldTest { void downloadFileByTask() { PetriNet net = getNet() - IUser user = userService.findByEmail(configuration.email, true) + IUser user = userService.findByEmail(configuration.email) assert user != null - Case useCase = workflowService.createCase(net.getStringId(), "Test file download", "black", user.transformToLoggedUser()).getCase() - importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user.transformToLoggedUser()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test file download") + .color("black") + .loggedUser(user.transformToLoggedUser()) + .build() + Case useCase = workflowService.createCase(createCaseParams).getCase() + importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user) mockMvc.perform(get("/api/task/" + importHelper.getTaskId(TASK_TITLE, useCase.getStringId()) + "/file") .param("fieldId", FIELD_ID) diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy index ef480bce423..46e45741098 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy @@ -8,10 +8,12 @@ import com.netgrif.application.engine.configuration.properties.SuperAdminConfigu import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -25,7 +27,6 @@ import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.setup.MockMvcBuilders -import org.springframework.util.MultiValueMap import org.springframework.web.context.WebApplicationContext import static org.hamcrest.core.StringContains.containsString @@ -86,7 +87,8 @@ class FileListFieldTest { } PetriNet getNet() { - def netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/remoteFileListField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/remoteFileListField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert netOptional.getNet() != null return netOptional.getNet() } @@ -102,11 +104,17 @@ class FileListFieldTest { void downloadFileByCaseAndName() { PetriNet net = getNet() - IUser user = userService.findByEmail(configuration.email, true) + IUser user = userService.findByEmail(configuration.email) assert user != null - Case useCase = workflowService.createCase(net.getStringId(), "Test file from file list download", "black", user.transformToLoggedUser()).getCase() - importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user.transformToLoggedUser()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test file from file list download") + .color("black") + .loggedUser(user.transformToLoggedUser()) + .build() + Case useCase = workflowService.createCase(createCaseParams).getCase() + importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user) mockMvc.perform(get("/api/workflow/case/" + useCase.getStringId() + "/file/named") .param("fieldId", FIELD_ID) @@ -123,11 +131,17 @@ class FileListFieldTest { void downloadFileByTask() { PetriNet net = getNet() - IUser user = userService.findByEmail(configuration.email, true) + IUser user = userService.findByEmail(configuration.email) assert user != null - Case useCase = workflowService.createCase(net.getStringId(), "Test file from file list download", "black", user.transformToLoggedUser()).getCase() - importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user.transformToLoggedUser()) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test file from file list download") + .color("black") + .loggedUser(user.transformToLoggedUser()) + .build() + Case useCase = workflowService.createCase(createCaseParams).getCase() + importHelper.assignTask(TASK_TITLE, useCase.getStringId(), user) // TODO: release/8.0.0 '/test-file-list.txt' or "test-file.txt" ? mockMvc.perform(get("/api/task/" + importHelper.getTaskId(TASK_TITLE, useCase.getStringId()) + "/file/named") diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy index bd060368d2d..c698164e59a 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy @@ -2,6 +2,7 @@ package com.netgrif.application.engine.petrinet.domain.dataset import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -45,7 +46,8 @@ class MapFieldTest { @Test void testImport() { - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) assert netOptional.getNet() != null def net = netOptional.getNet() @@ -69,7 +71,8 @@ class MapFieldTest { @Test void testValue() { - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) assert netOptional.getNet() != null Case aCase = importHelper.createCase("Case", netOptional.getNet()) @@ -106,7 +109,8 @@ class MapFieldTest { @Test void testImportMultichoice() { - def netOptional = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) assert netOptional.getNet() != null def net = netOptional.getNet() @@ -130,7 +134,8 @@ class MapFieldTest { @Test void testValueMultichoice() { - def netOptional = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper)) assert netOptional.getNet() != null Case aCase = importHelper.createCase("Case", netOptional.getNet()) diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy index c7aea8a9d98..a667fc8e383 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy @@ -6,6 +6,7 @@ import com.netgrif.application.engine.auth.domain.User import com.netgrif.application.engine.auth.domain.UserState import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -66,13 +67,13 @@ class ProcessRoleTest { private ImportHelper importHelper @Autowired - private IPetriNetService petriNetService; + private IPetriNetService petriNetService @Autowired private ProcessRoleRepository userProcessRoleRepository @Autowired - private SuperCreator superCreator; + private SuperCreator superCreator @Autowired TestHelper testHelper @@ -86,7 +87,8 @@ class ProcessRoleTest { .apply(springSecurity()) .build() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/rolref_view.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/rolref_view.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null String netId = net.getNet().getStringId() diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/service/CachePetriNetServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/service/CachePetriNetServiceTest.groovy index 5c7d20bfe17..c68b9d600ac 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/service/CachePetriNetServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/service/CachePetriNetServiceTest.groovy @@ -9,11 +9,12 @@ import com.netgrif.application.engine.configuration.properties.CacheProperties import com.netgrif.application.engine.ipc.TaskApiTest import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -50,7 +51,7 @@ class CachePetriNetServiceTest { private CacheManager cacheManager @Autowired - private CacheProperties cacheProperties; + private CacheProperties cacheProperties private def stream = { String name -> return TaskApiTest.getClassLoader().getResourceAsStream(name) @@ -68,7 +69,8 @@ class CachePetriNetServiceTest { @Test void cacheTest() { assert cacheManager.getCache(cacheProperties.getPetriNetNewest()).get("processDeleteTest") == null - ImportPetriNetEventOutcome testNetOptional = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome testNetOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNetOptional.getNet() != null PetriNet testNet = testNetOptional.getNet() diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy index 3e241f6de76..0d6adae7bd0 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy @@ -10,6 +10,8 @@ import com.netgrif.application.engine.elastic.domain.ElasticPetriNet import com.netgrif.application.engine.elastic.domain.ElasticPetriNetRepository import com.netgrif.application.engine.ipc.TaskApiTest import com.netgrif.application.engine.petrinet.domain.* +import com.netgrif.application.engine.petrinet.domain.params.DeletePetriNetParams +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository @@ -18,7 +20,8 @@ import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetServi import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.QCase +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository import com.netgrif.application.engine.workflow.domain.repositories.TaskRepository import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -33,6 +36,8 @@ import org.springframework.data.domain.PageRequest import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension +import static org.junit.jupiter.api.Assertions.assertThrows + @ExtendWith(SpringExtension.class) @ActiveProfiles(["test"]) @SpringBootTest @@ -40,6 +45,9 @@ class PetriNetServiceTest { public static final String NET_FILE = "process_delete_test.xml" public static final String NET_SEARCH_FILE = "process_search_test.xml" + public static final String NET_IMPORT_FILE = "net_import_1.xml" + public static final String PETRINET_IMPORT_FAILURE_FILE = "petriNet_import_failure.xml" + public static final String PETRINET_IMPORT_FAILURE_IDENTIFIER = "petriNet_import_failure" public static final String CUSTOMER_USER_MAIL = "customer@netgrif.com" @Autowired @@ -101,7 +109,8 @@ class PetriNetServiceTest { long processCount = petriNetRepository.count() long taskCount = taskRepository.count() - ImportPetriNetEventOutcome testNetOptional = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome testNetOptional = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNetOptional.getNet() != null assert petriNetRepository.count() == processCount + 1 PetriNet testNet = testNetOptional.getNet() @@ -116,24 +125,24 @@ class PetriNetServiceTest { assert taskRepository.count() == taskCount + 3 assert processRoleRepository.count() == processRoleCount + 2 - def user = userService.findByEmail(CUSTOMER_USER_MAIL, false) + def user = userService.findByEmail(CUSTOMER_USER_MAIL) assert user != null assert user.processRoles.size() == 1 userService.addRole(user, testNet.roles.values().collect().get(0).stringId) - user = userService.findByEmail(CUSTOMER_USER_MAIL, false) + user = userService.findByEmail(CUSTOMER_USER_MAIL) assert user != null assert user.processRoles.size() == 2 assert petriNetService.get(new ObjectId(testNet.stringId)) != null - petriNetService.deletePetriNet(testNet.stringId, superCreator.getLoggedSuper()) + petriNetService.deletePetriNet(new DeletePetriNetParams(testNet.stringId, superCreator.getLoggedSuper())) assert petriNetRepository.count() == processCount Thread.sleep(5000) assert elasticPetriNetRepository.findByStringId(testNet.stringId) == null assert caseRepository.findAllByProcessIdentifier(testNetOptional.getNet().getImportId()).size() == 0 assert taskRepository.count() == taskCount assert processRoleRepository.count() == processRoleCount - user = userService.findByEmail(CUSTOMER_USER_MAIL, false) + user = userService.findByEmail(CUSTOMER_USER_MAIL) assert user != null assert user.processRoles.size() == 1 @@ -150,8 +159,10 @@ class PetriNetServiceTest { @Test void findAllByUriNodeIdTest() { UriNode myNode = uriService.getOrCreate("/test", UriContentType.DEFAULT) - petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), myNode.id.toString()) - petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), myNode.id.toString()) + petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), myNode.id.toString())) + petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), myNode.id.toString())) Thread.sleep(2000) @@ -163,10 +174,12 @@ class PetriNetServiceTest { void processSearch() { long processCount = petriNetRepository.count() - def user = userService.findByEmail(CUSTOMER_USER_MAIL, false) + def user = userService.findByEmail(CUSTOMER_USER_MAIL) assert user != null - petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) - petriNetService.importPetriNet(stream(NET_SEARCH_FILE), VersionType.MAJOR, user.transformToLoggedUser()) + petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) + petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_SEARCH_FILE), VersionType.MAJOR, user.transformToLoggedUser())) assert petriNetRepository.count() == processCount + 2 @@ -218,4 +231,39 @@ class PetriNetServiceTest { search8.setAuthor(author) assert petriNetService.search(search8, superCreator.getLoggedSuper(), PageRequest.of(0, 50), LocaleContextHolder.locale).getNumberOfElements() == 1 } + + @Test + void testTransactionalImportFailure() { + ImportPetriNetParams importPetriNetParams = ImportPetriNetParams.with() + .isTransactional(true) + .xmlFile(stream(PETRINET_IMPORT_FAILURE_FILE)) + .releaseType(VersionType.MAJOR) + .author(superCreator.getLoggedSuper()) + .build() + + assertThrows(RuntimeException.class, { petriNetService.importPetriNet(importPetriNetParams) }) + + assert petriNetService.findByImportId(PETRINET_IMPORT_FAILURE_IDENTIFIER).isEmpty() + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPre")) == null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPost")) == null + } + + @Test + void testNonTransactionalImportFailure() { + petriNetService.importPetriNet(new ImportPetriNetParams(stream(NET_IMPORT_FILE), VersionType.MAJOR, + superCreator.getLoggedSuper())) + + ImportPetriNetParams importPetriNetParams = ImportPetriNetParams.with() + .isTransactional(false) + .xmlFile(stream(PETRINET_IMPORT_FAILURE_FILE)) + .releaseType(VersionType.MAJOR) + .author(superCreator.getLoggedSuper()) + .build() + + assertThrows(RuntimeException.class, { petriNetService.importPetriNet(importPetriNetParams) }) + + assert petriNetService.findByImportId(PETRINET_IMPORT_FAILURE_IDENTIFIER).isPresent() + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPre")) != null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPost")) != null + } } diff --git a/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy b/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy index 177252290f8..7d4a5abe3a8 100644 --- a/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy @@ -7,6 +7,7 @@ import com.netgrif.application.engine.auth.domain.UserState import com.netgrif.application.engine.ipc.TaskApiTest import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper @@ -76,7 +77,8 @@ class PetriNetControllerTest { void before() { testHelper.truncateDbs() - def net = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.net = net.getNet() diff --git a/src/test/groovy/com/netgrif/application/engine/transaction/TransactionTest.groovy b/src/test/groovy/com/netgrif/application/engine/transaction/TransactionTest.groovy new file mode 100644 index 00000000000..50d31a3d5a0 --- /dev/null +++ b/src/test/groovy/com/netgrif/application/engine/transaction/TransactionTest.groovy @@ -0,0 +1,550 @@ +package com.netgrif.application.engine.transaction + +import com.netgrif.application.engine.TestHelper +import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService +import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetService +import com.netgrif.application.engine.elastic.service.interfaces.IElasticTaskService +import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest +import com.netgrif.application.engine.elastic.web.requestbodies.ElasticTaskSearchRequest +import com.netgrif.application.engine.petrinet.domain.PetriNet +import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.dataset.ButtonField +import com.netgrif.application.engine.petrinet.domain.dataset.Field +import com.netgrif.application.engine.petrinet.domain.dataset.TextField +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams +import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException +import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService +import com.netgrif.application.engine.startup.ImportHelper +import com.netgrif.application.engine.startup.SuperCreator +import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.QCase +import com.netgrif.application.engine.workflow.domain.QTask +import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.service.interfaces.IDataService +import com.netgrif.application.engine.workflow.service.interfaces.ITaskService +import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService +import com.netgrif.application.engine.workflow.web.responsebodies.DataSet +import com.netgrif.application.engine.workflow.web.responsebodies.TaskDataSets +import groovy.json.JsonOutput +import groovy.json.JsonSlurper +import groovy.time.TimeCategory +import groovy.time.TimeDuration +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Disabled +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.data.domain.Page +import org.springframework.data.domain.PageRequest +import org.springframework.data.util.Pair +import org.springframework.hateoas.MediaTypes +import org.springframework.mock.web.MockHttpServletRequest +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken +import org.springframework.security.core.Authentication +import org.springframework.security.web.authentication.WebAuthenticationDetails +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.MvcResult +import org.springframework.test.web.servlet.setup.MockMvcBuilders +import org.springframework.web.context.WebApplicationContext + +import java.nio.charset.StandardCharsets + +import static org.junit.jupiter.api.Assertions.assertThrows +import static org.springframework.http.MediaType.APPLICATION_JSON +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post + +@SpringBootTest +@ActiveProfiles(["test", "test-transaction"]) +class TransactionTest { + + @Autowired + private TestHelper testHelper + + @Autowired + private ImportHelper importHelper + + @Autowired + private IPetriNetService petriNetService + + @Autowired + private IDataService dataService + + @Autowired + private IWorkflowService workflowService + + @Autowired + private ITaskService taskService + + @Autowired + private IElasticPetriNetService elasticPetriNetService + + @Autowired + private IElasticCaseService elasticCaseService + + @Autowired + private IElasticTaskService elasticTaskService + + @Autowired + private SuperCreator superCreator + + @Autowired + private WebApplicationContext wac + + private PetriNet testNet + private Authentication auth + private MockMvc mvc + private static final String USER_EMAIL = "super@netgrif.com" + private static final String CASE_CREATE_URL = "/api/workflow/case" + private static final String ASSIGN_TASK_URL = "/api/task/assign/" + private static final String SET_GET_DATA_URL_TEMPLATE = "/api/task/%s/data" + private static final String FINISH_TASK_URL = "/api/task/finish/" + + @BeforeEach + void before() throws IOException, MissingPetriNetMetaDataException { + testHelper.truncateDbs() + testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/transaction/transaction_test.xml"), + VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + } + + @Test + void testBasicTransaction() { + Case useCase = importHelper.createCase("test", testNet) + useCase = dataService.setData(new SetDataParams(useCase, new DataSet(["testBasicTransaction": new ButtonField(rawValue: 1)] + as Map>), superCreator.getSuperUser())).case + + assert findAllByIdentifier("transaction_test").size() == 4 + + assert findCaseByTitle("onButton") + assert findTaskByCaseTitle("onButton") + + assert findCaseByTitle("onCommit") + assert findTaskByCaseTitle("onCommit") + + assert findCaseByTitle("onAlways") + assert findTaskByCaseTitle("onAlways") + + assert !findCaseByTitle("onRollBack") + assert !findTaskByCaseTitle("onRollBack") + + assert useCase.getDataSet().get("text_without_action").getValue().getValue() == "xxx" + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == false + } + + @Test + void testBasicTransactionWithFailure() { + importHelper.createCase("toBeRemoved", testNet) + Case useCase = createTestCaseAndSetButton("test", "testBasicTransactionWithFailure") + + assert findAllByIdentifier("transaction_test").size() == 4 + + assert !findCaseByTitle("onButton") + assert !findTaskByCaseTitle("onButton") + + assert !findCaseByTitle("onCommit") + assert !findTaskByCaseTitle("onCommit") + + assert findCaseByTitle("onAlways") + assert findTaskByCaseTitle("onAlways") + + assert findCaseByTitle("onRollBack") + assert findTaskByCaseTitle("onRollBack") + + assert findCaseByTitle("toBeRemoved") + assert findTaskByCaseTitle("toBeRemoved") + + assert useCase.getDataSet().get("text_without_action").getValue().getValue() != "xxx" + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true + } + + @Test + void testFailureInCallBackThrowsError() { + assertThrows(RuntimeException.class, { + createTestCaseAndSetButton("test", "testFailureInCallBackThrowsError") + }) + assert findAllByIdentifier("transaction_test").size() == 1 + assert !findCaseByTitle("onAlways") + assert !findTaskByCaseTitle("onAlways") + } + + @Test + void testTimeout() { + Case useCase = createTestCaseAndSetButton("test", "testTimeout") + + assert findAllByIdentifier("transaction_test").size() == 3 + + assert !findCaseByTitle("onButton") + assert !findTaskByCaseTitle("onButton") + + assert !findCaseByTitle("onCommit") + assert !findTaskByCaseTitle("onCommit") + + assert findCaseByTitle("onAlways") + assert findTaskByCaseTitle("onAlways") + + assert findCaseByTitle("onRollBack") + assert findTaskByCaseTitle("onRollBack") + + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true + } + + @Test + void testElasticIndexingOnTransactionFailure() { + Case useCase = createTestCaseAndSetButton("test", "testElasticIndexingOnTransactionFailure") + + Thread.sleep(2000) // wait for indexation + + assert findAllByIdentifier("transaction_test").size() == 3 + + assert !existPetriNetInElastic("transaction_test_secondary") + assert !existCaseInElastic("toBeRemoved") + assert !existCaseInElastic("toBeRemovedNestedOnFailure") + + assert !existCaseInElastic("onButton") + assert !existTaskInElastic("onButton") + + assert existCaseInElastic("onRollBack") + assert existTaskInElastic("onRollBack") + + assert existCaseInElastic("onAlways") + assert existTaskInElastic("onAlways") + + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true + } + + @Test + void testElasticIndexingOnTransactionSuccess() { + Case useCase = createTestCaseAndSetButton("test", "testElasticIndexingOnTransactionSuccess") + + Thread.sleep(2000) // wait for indexation + + assert findAllByIdentifier("transaction_test").size() == 5 + + assert existPetriNetInElastic("transaction_test_secondary") + assert !existCaseInElastic("toBeRemoved") + assert !existTaskInElastic("toBeRemoved") + assert existCaseInElastic("toBeRemovedNestedOnFailure") + assert existTaskInElastic("toBeRemovedNestedOnFailure") + + assert existCaseInElastic("onButton") + assert existTaskInElastic("onButton") + + assert existCaseInElastic("onCommit") + assert existTaskInElastic("onCommit") + + assert existCaseInElastic("onAlways") + assert existTaskInElastic("onAlways") + + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == false + } + + @Test + void testTransactionWriteConflict() { + Case useCase = createTestCaseAndSetButton("test", "testTransactionWriteConflict") + + assert findAllByIdentifier("transaction_test").size() == 5 + + assert findCaseByTitle("onRollBackNested") + assert findTaskByCaseTitle("onRollBackNested") + + assert !findCaseByTitle("onCommitNested") + assert !findTaskByCaseTitle("onCommitNested") + + assert findCaseByTitle("onAlwaysNested") + assert findTaskByCaseTitle("onAlwaysNested") + + assert findCaseByTitle("onCommit") + assert findTaskByCaseTitle("onCommit") + + assert findCaseByTitle("onAlways") + assert findTaskByCaseTitle("onAlways") + + useCase = workflowService.findOne(useCase.stringId) + assert useCase.getDataSet().get("text_without_action").getValue().getValue() == "not nested" + } + + @Test + void testNestedJoinedTransactions() { + Case useCase = createTestCaseAndSetButton("test", "testNestedJoinedTransactions") + + assert findAllByIdentifier("transaction_test").size() == 7 + assert findCaseByTitle("onButton") + assert findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert findCaseByTitle("onButtonNested") + assert findCaseByTitle("onCommitNested") + assert findCaseByTitle("onAlwaysNested") + assert !findCaseByTitle("onRollBack") + assert !findCaseByTitle("onRollBackNested") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == false + } + + @Test + void testNestedDifferentTransactions() { + Case useCase = createTestCaseAndSetButton("test", "testNestedDifferentTransactions") + + assert findAllByIdentifier("transaction_test").size() == 7 + assert findCaseByTitle("onButton") + assert findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert findCaseByTitle("onButtonNested") + assert findCaseByTitle("onCommitNested") + assert findCaseByTitle("onAlwaysNested") + assert !findCaseByTitle("onRollBack") + assert !findCaseByTitle("onRollBackNested") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == false + } + + @Test + void testNestedJoinedTransactionsWithFailureInParentTransaction() { + Case useCase = createTestCaseAndSetButton("test", "testNestedJoinedTransactionsWithFailureInParentTransaction") + + assert findAllByIdentifier("transaction_test").size() == 4 + assert !findCaseByTitle("onButton") + assert !findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert !findCaseByTitle("onButtonNested") + assert !findCaseByTitle("onCommitNested") + assert !findCaseByTitle("onAlwaysNested") + assert findCaseByTitle("onRollBack") + assert findCaseByTitle("onRollBackNested") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true + } + + @Test + void testNestedJoinedTransactionsWithFailureInNestedTransaction() { + Case useCase = createTestCaseAndSetButton("test", "testNestedJoinedTransactionsWithFailureInNestedTransaction") + + assert findAllByIdentifier("transaction_test").size() == 4 + assert !findCaseByTitle("onButton") + assert !findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert !findCaseByTitle("onButtonNested") + assert !findCaseByTitle("onCommitNested") + assert !findCaseByTitle("onAlwaysNested") + assert findCaseByTitle("onRollBack") + assert findCaseByTitle("onRollBackNested") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true + } + + @Test + void testNestedDifferentTransactionsWithFailureInParentTransaction() { + Case useCase = createTestCaseAndSetButton("test", "testNestedDifferentTransactionsWithFailureInParentTransaction") + + assert findAllByIdentifier("transaction_test").size() == 5 + assert !findCaseByTitle("onButton") + assert !findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert findCaseByTitle("onButtonNested") + assert findCaseByTitle("onCommitNested") + assert !findCaseByTitle("onAlwaysNested") + assert findCaseByTitle("onRollBack") + assert !findCaseByTitle("onRollBackNested") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true // is overridden from false to true + } + + @Test + void testNestedDifferentTransactionsWithFailureInNestedTransaction() { + Case useCase = createTestCaseAndSetButton("test", "testNestedDifferentTransactionsWithFailureInNestedTransaction") + + assert findAllByIdentifier("transaction_test").size() == 6 + assert findCaseByTitle("onButton") + assert findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert !findCaseByTitle("onButtonNested") + assert !findCaseByTitle("onCommitNested") + assert findCaseByTitle("onAlwaysNested") + assert !findCaseByTitle("onRollBack") + assert findCaseByTitle("onRollBackNested") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == false // is overridden from true to false + } + + @Test + void testRollBackErrorCurrying() { + Case useCase = createTestCaseAndSetButton("test", "testRollBackErrorCurrying") + + assert findAllByIdentifier("transaction_test").size() == 3 + assert !findCaseByTitle("onButton") + assert !findCaseByTitle("onCommit") + assert findCaseByTitle("onAlways") + assert findCaseByTitle("argument is initialized") + assert useCase.getDataSet().get("was_transaction_rolled_back").getValue().getValue() == true + } + + @Test + @Disabled + void testPerformance() { + beforeMvcTest() + + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/mortgage.xml"), + VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + + int iterations = 500 + long totalCreateCaseDuration = 0 + long totalAssignTaskDuration = 0 + long totalGetDataDuration = 0 + long totalSetDataDuration = 0 + long totalFinishTaskDuration = 0 + (0..iterations).each {idx -> + Pair createCasePair = createCase(net.stringId, "Case" + idx) + totalCreateCaseDuration += createCasePair.first.toMilliseconds() + String taskId = createCasePair.second["tasks"]["t2"]["taskStringId"] + Pair assignTaskPair = assignTask(taskId) + totalAssignTaskDuration += assignTaskPair.first.toMilliseconds() + TimeDuration getDataDuration = getData(taskId) + totalGetDataDuration += getDataDuration.toMilliseconds() + TimeDuration setDataDuration = setData(taskId, "surname", "xxxx") + totalSetDataDuration += setDataDuration.toMilliseconds() + // todo mvc.finishTask requires some additional changed due to problem with user.getLoggedUser() (password is not initialized) + Pair finishTaskPair = finishTask(taskId) + totalFinishTaskDuration += finishTaskPair.first.toMilliseconds() + } + + println("AVG for " + iterations + " iterations createCase is " + totalCreateCaseDuration / iterations + " ms") + println("AVG for " + iterations + " iterations assignTask is " + totalAssignTaskDuration / iterations + " ms") + println("AVG for " + iterations + " iterations getData is " + totalGetDataDuration / iterations + " ms") + println("AVG for " + iterations + " iterations setData is " + totalSetDataDuration / iterations + " ms") + println("AVG for " + iterations + " iterations finishTask is " + totalFinishTaskDuration / iterations + " ms") + } + + private Case createTestCaseAndSetButton(String title, String buttonFieldId) { + Case useCase = importHelper.createCase(title, testNet) + return dataService.setData(new SetDataParams(useCase, new DataSet([(buttonFieldId): new ButtonField(rawValue: 1)] + as Map>), superCreator.getSuperUser())).getCase() + } + + private Case findCaseByTitle(String title) { + Page caseAsPage = workflowService.search(QCase.case$.title.eq(title), PageRequest.of(0, 1)) + if (caseAsPage.totalElements > 0) { + return caseAsPage.first() + } else { + return null + } + } + + private Task findTaskByCaseTitle(String caseTitle) { + Page taskAsPage = taskService.search(QTask.task.caseTitle.eq(caseTitle), PageRequest.of(0, 1)) + if (taskAsPage.totalElements > 0) { + return taskAsPage.first() + } else { + return null + } + } + + private List findAllByIdentifier(String identifier) { + Page caseAsPage = workflowService.search(QCase.case$.processIdentifier.eq(identifier), PageRequest.of(0, Integer.MAX_VALUE)) + if (caseAsPage.totalElements > 0) { + return caseAsPage.getContent() + } else { + return List.of() + } + } + + private boolean existPetriNetInElastic(String identifier) { + return elasticPetriNetService.findAllByIdentifier(identifier).size() >= 1 + } + + private boolean existCaseInElastic(String title) { + return elasticCaseService.count( + List.of(CaseSearchRequest.builder().query("title:" + title).build()), + superCreator.getLoggedSuper(), + Locale.getDefault(), + false + ) >= 1 + } + + private boolean existTaskInElastic(String caseTitle) { + return elasticTaskService.count( + List.of(new ElasticTaskSearchRequest(Map.of("query", "caseTitle:" + caseTitle))), + superCreator.getLoggedSuper(), + Locale.getDefault(), + false + ) >= 1 + } + + private void beforeMvcTest() { + mvc = MockMvcBuilders + .webAppContextSetup(wac) + .apply(springSecurity()) + .build() + auth = new UsernamePasswordAuthenticationToken(USER_EMAIL, "password") + auth.setDetails(new WebAuthenticationDetails(new MockHttpServletRequest())) + } + + private Pair createCase(String petriNetStringId, String caseTitle) { + String content = JsonOutput.toJson([ + title: caseTitle, + netId: petriNetStringId, + color: "color" + ]) + Date startTime = new Date() + MvcResult result = mvc.perform(post(CASE_CREATE_URL) + .accept(MediaTypes.HAL_JSON_VALUE) + .content(content) + .contentType(APPLICATION_JSON) + .with(authentication(auth))) + .andReturn() + Date endTime = new Date() + return Pair.of(TimeCategory.minus( endTime, startTime ), parseResult(result).outcome.case) + } + + private Pair assignTask(String taskId) { + Date startTime = new Date() + MvcResult result = mvc.perform(get(ASSIGN_TASK_URL+taskId) + .accept(MediaTypes.HAL_JSON_VALUE) + .contentType(APPLICATION_JSON) + .with(authentication(auth))) + .andReturn() + Date endTime = new Date() + return Pair.of(TimeCategory.minus( endTime, startTime ), parseResult(result).outcome.task) + } + + private Pair finishTask(String taskId) { + Date startTime = new Date() + MvcResult result = mvc.perform(get(FINISH_TASK_URL+taskId) + .accept(MediaTypes.HAL_JSON_VALUE) + .contentType(APPLICATION_JSON) + .with(authentication(auth))) + .andReturn() + Date endTime = new Date() + return Pair.of(TimeCategory.minus( endTime, startTime ), parseResult(result).outcome.task) + } + + private TimeDuration getData(String taskId) { + Date startTime = new Date() + mvc.perform(get(String.format(SET_GET_DATA_URL_TEMPLATE, taskId)) + .contentType(APPLICATION_JSON) + .with(authentication(auth))) + Date endTime = new Date() + return TimeCategory.minus( endTime, startTime ) + } + + private TimeDuration setData(String taskId, String fieldId, String newValue) { + Field surnameField = new TextField() + surnameField.setRawValue(newValue) + + def body = [(taskId): new DataSet([(fieldId): (Field) surnameField])] + + String content = JsonOutput.toJson(new TaskDataSets(body)) + + Date startTime = new Date() + mvc.perform(post(String.format(SET_GET_DATA_URL_TEMPLATE, taskId)) + .content(content) + .contentType(APPLICATION_JSON) + .with(authentication(auth))) + Date endTime = new Date() + return TimeCategory.minus( endTime, startTime ) + } + + @SuppressWarnings("GrMethodMayBeStatic") + private def parseResult(MvcResult result) { + return (new JsonSlurper()).parseText(result.response.getContentAsString(StandardCharsets.UTF_8)) + } + +} diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/ChangedFieldsAllowedNetsTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/ChangedFieldsAllowedNetsTest.groovy index 2cb5c434987..357ac75a1de 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/ChangedFieldsAllowedNetsTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/ChangedFieldsAllowedNetsTest.groovy @@ -3,8 +3,6 @@ package com.netgrif.application.engine.workflow import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.startup.ImportHelper -import com.netgrif.application.engine.workflow.domain.eventoutcomes.EventOutcome -import com.netgrif.application.engine.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome import com.netgrif.application.engine.workflow.service.interfaces.IDataService import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/DataServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/DataServiceTest.groovy index e03ce2136cf..73a8b36b5a7 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/DataServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/DataServiceTest.groovy @@ -6,12 +6,19 @@ import com.netgrif.application.engine.petrinet.domain.DataGroup import com.netgrif.application.engine.petrinet.domain.DataRef import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.dataset.ButtonField +import com.netgrif.application.engine.petrinet.domain.dataset.Field +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.dataoutcomes.SetDataEventOutcome +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService +import com.netgrif.application.engine.workflow.web.responsebodies.DataSet import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Disabled @@ -23,15 +30,17 @@ import org.springframework.mock.web.MockMultipartFile import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension +import static org.junit.jupiter.api.Assertions.assertThrows + @ExtendWith(SpringExtension.class) @ActiveProfiles(["test"]) @SpringBootTest @CompileStatic class DataServiceTest { - private static final String TASK_TITLE = "Transition"; - private static final String FILE_FIELD_TITLE = "File"; - private static final String TEXT_FIELD_TITLE = "Result"; + private static final String TASK_TITLE = "Transition" + private static final String FILE_FIELD_TITLE = "File" + private static final String TEXT_FIELD_TITLE = "Result" @Autowired private ImportHelper importHelper @@ -58,20 +67,24 @@ class DataServiceTest { @BeforeEach void beforeAll() { testHelper.truncateDbs() - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/data_service_referenced.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/data_service_referenced.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null - net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/data_service_taskref.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/data_service_taskref.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert net.getNet() != null this.net = net.getNet() - ImportPetriNetEventOutcome agreementNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/agreement.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome agreementNet = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/agreement.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert agreementNet.getNet() != null this.agreementNet = agreementNet.getNet() - ImportPetriNetEventOutcome netoutcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/test_setData.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); - assert netoutcome.getNet() != null; - this.setDataNet = netoutcome.getNet(); + ImportPetriNetEventOutcome netoutcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/test_setData.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) + assert netoutcome.getNet() != null + this.setDataNet = netoutcome.getNet() } @Test @@ -120,6 +133,70 @@ class DataServiceTest { assert dataGroups.get(3).getParentTaskRefId() == "taskRef_0" } + @Test + void testTransactionalSetDataOutcomes() { + Case aCase = importHelper.createCase("Case", this.setDataNet) + ButtonField buttonWithValueOne = new ButtonField() + buttonWithValueOne.setRawValue(1) + + SetDataParams setDataParams = SetDataParams.with() + .useCase(aCase) + .user(superCreator.superUser) + .isTransactional(true) + .dataSet(new DataSet(Map.of( + "button_1", (Field) buttonWithValueOne, + "button_0", (Field) buttonWithValueOne + ))) + .build() + SetDataEventOutcome outcome = dataService.setData(setDataParams) + assert outcome + assert outcome.getOutcomes().size() == 2 + } + + @Test + void testTransactionalSetDataFailure() { + Case aCase = importHelper.createCase("Case", this.setDataNet) + ButtonField buttonWithValueOne = new ButtonField() + buttonWithValueOne.setRawValue(1) + + SetDataParams setDataParams = SetDataParams.with() + .useCase(aCase) + .user(superCreator.superUser) + .isTransactional(true) + .dataSet(new DataSet(Map.of( + "button_1", (Field) buttonWithValueOne, + "non_existing_button", (Field) buttonWithValueOne + ))) + .build() + assertThrows(IllegalArgumentException.class, { dataService.setData(setDataParams) }) + + aCase = workflowService.findOne(aCase.stringId) + assert aCase.getDataSet().get("button_1").getRawValue() != 1 + assert aCase.getDataSet().get("button_0").getRawValue() != 1337 // forbidden result of set action of button_1 + } + + @Test + void testNonTransactionalSetDataFailure() { + Case aCase = importHelper.createCase("Case", this.setDataNet) + ButtonField buttonWithValueOne = new ButtonField() + buttonWithValueOne.setRawValue(1) + + SetDataParams setDataParams = SetDataParams.with() + .useCase(aCase) + .user(superCreator.superUser) + .isTransactional(false) + .dataSet(new DataSet(Map.of( + "button_1", (Field) buttonWithValueOne, + "non_existing_button", (Field) buttonWithValueOne + ))) + .build() + assertThrows(IllegalArgumentException.class, { dataService.setData(setDataParams) }) + + aCase = workflowService.findOne(aCase.stringId) + assert aCase.getDataSet().get("button_1").getRawValue() == 1 + assert aCase.getDataSet().get("button_0").getRawValue() == 1337 // allowed result of set action of button_1 + } + // @Test // void testSetDataAllowednets() { // def aCase = importHelper.createCase("test allowed nets", setDataNet) diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/NewInitTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/NewInitTest.groovy index 9ab1c690868..062ed9d3dee 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/NewInitTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/NewInitTest.groovy @@ -6,10 +6,12 @@ import com.netgrif.application.engine.petrinet.domain.I18nString import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.FileFieldValue import com.netgrif.application.engine.petrinet.domain.dataset.FileListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach @@ -45,8 +47,15 @@ class NewInitTest { @Test void newInitTest() throws IOException, MissingIconKeyException, MissingPetriNetMetaDataException { - petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/nae_1276_Init_value_as_choice.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) - Case initTestCase = workflowService.createCase(petriNetService.getNewestVersionByIdentifier("new_init_test").stringId, "New init test", "", superCreator.getLoggedSuper()).getCase() + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/petriNets/nae_1276_Init_value_as_choice.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(petriNetService.getNewestVersionByIdentifier("new_init_test")) + .title("New init test") + .color("") + .loggedUser(superCreator.getLoggedSuper()) + .build() + Case initTestCase = workflowService.createCase(createCaseParams).getCase() // TODO: release/8.0.0 // assert (initTestCase.dataSet["new_init_multichoice"].value as List).stream().any { ((I18nString) it).defaultValue == "Bob" } // assert (initTestCase.dataSet["new_init_multichoice"].value as List).stream().any { ((I18nString) it).defaultValue == "Alice" } diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/SetDataOnButtonTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/SetDataOnButtonTest.groovy index 92bd8e54627..321171a3588 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/SetDataOnButtonTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/SetDataOnButtonTest.groovy @@ -7,12 +7,15 @@ import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.ButtonField import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.TextField +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.QTask import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.SetDataParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -76,7 +79,8 @@ class SetDataOnButtonTest { @BeforeEach void initNet() { testHelper.truncateDbs() - net = petriNetService.importPetriNet(new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()).getNet() + net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())).getNet() assert net != null } @@ -91,8 +95,8 @@ class SetDataOnButtonTest { Task parentTask = taskService.searchOne(QTask.task.caseTitle.eq(PARENT_CASE) & QTask.task.transitionId.eq(TEST_TRANSITION)) assert parentTask != null - taskService.assignTask(parentTask.getStringId()) - taskService.finishTask(parentTask.getStringId()) + taskService.assignTask(new TaskParams(parentTask)) + taskService.finishTask(new TaskParams(parentTask)) childCase = workflowService.findOne(childCase.getStringId()) assert childCase.dataSet.get(TEXT_0_FIELD_ID).rawValue.toString() == OUTPUT_TEXT_0 @@ -106,11 +110,11 @@ class SetDataOnButtonTest { Task testCaseTask = taskService.searchOne(QTask.task.caseTitle.eq(PARENT_CASE) & QTask.task.transitionId.eq(TEST_TRANSITION)) assert testCaseTask != null - dataService.setData(testCaseTask.stringId, new DataSet([ + dataService.setData(new SetDataParams(testCaseTask.stringId, new DataSet([ "button_0": new ButtonField(rawValue: 42), "button_1": new ButtonField(rawValue: 42), "button_2": new ButtonField(rawValue: 42) - ] as Map>), superCreator.getLoggedSuper()) + ] as Map>), superCreator.getSuperUser())) testCase = workflowService.findOne(testCase.getStringId()) diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefInitTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefInitTest.groovy index 3ee198fa4ff..3ec4eebe892 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefInitTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefInitTest.groovy @@ -5,6 +5,7 @@ import com.netgrif.application.engine.auth.service.interfaces.IUserService import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.TaskField +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.workflow.domain.Case @@ -47,8 +48,10 @@ class TaskRefInitTest { @BeforeEach void initNet() { testHelper.truncateDbs() - net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/taskref_init.xml"), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()).getNet() - autoTrigger = petriNetService.importPetriNet(new FileInputStream("src/test/resources/autotrigger_taskref.xml"), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()).getNet() + net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/taskref_init.xml"), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())).getNet() + autoTrigger = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/autotrigger_taskref.xml"), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())).getNet() assert net != null } diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefPropagationTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefPropagationTest.groovy index f1f817e4cb7..bfcd7126e70 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefPropagationTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/TaskRefPropagationTest.groovy @@ -3,6 +3,7 @@ package com.netgrif.application.engine.workflow import com.netgrif.application.engine.petrinet.domain.DataGroup import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator @@ -48,8 +49,10 @@ class TaskRefPropagationTest { @BeforeEach void beforeAll() { - def parent = petriNetService.importPetriNet(new FileInputStream("src/test/resources/taskRef_propagation_test_parent.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) - def child = petriNetService.importPetriNet(new FileInputStream("src/test/resources/taskRef_propagation_test_child.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def parent = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/taskRef_propagation_test_parent.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) + def child = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/taskRef_propagation_test_child.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())) assert parent.getNet() != null assert child.getNet() != null diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/TaskStateTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/TaskStateTest.groovy index fb997411a3b..d7b8f0aea49 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/TaskStateTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/TaskStateTest.groovy @@ -7,6 +7,8 @@ import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case import com.netgrif.application.engine.workflow.domain.Task +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.TaskParams import com.netgrif.application.engine.workflow.service.interfaces.ITaskService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic @@ -51,7 +53,13 @@ class TaskStateTest { assert netOptional.isPresent() PetriNet net = netOptional.get() - Case useCase = workflowService.createCase(net.stringId, "Test Case", "", superCreator.superUser.transformToLoggedUser())?.case + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test Case") + .color("") + .loggedUser(superCreator.superUser.transformToLoggedUser()) + .build() + Case useCase = workflowService.createCase(createCaseParams)?.case assert useCase List tasks = taskService.findAllByCase(useCase.stringId) @@ -66,7 +74,13 @@ class TaskStateTest { assert netOptional.isPresent() PetriNet net = netOptional.get() - Case useCase = workflowService.createCase(net.stringId, "Test Case", "", superCreator.superUser.transformToLoggedUser())?.case + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Test Case") + .color("") + .loggedUser(superCreator.superUser.transformToLoggedUser()) + .build() + Case useCase = workflowService.createCase(createCaseParams)?.case assert useCase 4.times { index -> @@ -76,12 +90,12 @@ class TaskStateTest { assert t.transitionId in [transitionId, allDataConfiguration.allData.id] ? t.state == ENABLED : t.state == DISABLED } Task task = tasks.find {it.transitionId == transitionId} - taskService.assignTask(task.stringId) + taskService.assignTask(new TaskParams(task)) tasks = taskService.findAllByCase(useCase.stringId) tasks.each { t-> assert t.transitionId in [allDataConfiguration.allData.id] ? t.state == ENABLED : t.state == DISABLED } - taskService.finishTask(task.stringId) + taskService.finishTask(new TaskParams(task)) } } } diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/UserRefsTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/UserRefsTest.groovy index 906bed48de0..e34bde2190f 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/UserRefsTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/UserRefsTest.groovy @@ -8,11 +8,12 @@ import com.netgrif.application.engine.petrinet.domain.VersionType import com.netgrif.application.engine.petrinet.domain.dataset.Field import com.netgrif.application.engine.petrinet.domain.dataset.UserListField import com.netgrif.application.engine.petrinet.domain.dataset.UserListFieldValue +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator import com.netgrif.application.engine.workflow.domain.Case -import com.netgrif.application.engine.workflow.domain.TaskPair +import com.netgrif.application.engine.workflow.domain.params.SetDataParams import com.netgrif.application.engine.workflow.service.interfaces.IDataService import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import com.netgrif.application.engine.workflow.web.responsebodies.DataSet @@ -69,7 +70,8 @@ class UserRefsTest { @BeforeEach void before() { helper.truncateDbs() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/userrefs_test.xml"), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser()).getNet() + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/userrefs_test.xml"), VersionType.MAJOR, userService.loggedOrSystem.transformToLoggedUser())).getNet() assert net netId = net.getStringId() def userEmails = [configuration.email, "engine@netgrif.com"] @@ -79,9 +81,9 @@ class UserRefsTest { def _case = importHelper.createCase("$it" as String, net) String id = userService.findByEmail(userEmails[it % 2]).getStringId() String taskId = _case.getTaskStringId("t1") - dataService.setData(taskId, new DataSet([ + dataService.setData(new SetDataParams(taskId, new DataSet([ "user_list_1": new UserListField(rawValue: new UserListFieldValue([dataService.makeUserFieldValue(id)])) - ] as Map>), superCreator.getLoggedSuper()).getCase() + ] as Map>), superCreator.getSuperUser())).getCase() userIds.add(id) } } diff --git a/src/test/groovy/com/netgrif/application/engine/workflow/WorkflowServiceTest.groovy b/src/test/groovy/com/netgrif/application/engine/workflow/WorkflowServiceTest.groovy index 03eee44a48c..ed1d128e3d5 100644 --- a/src/test/groovy/com/netgrif/application/engine/workflow/WorkflowServiceTest.groovy +++ b/src/test/groovy/com/netgrif/application/engine/workflow/WorkflowServiceTest.groovy @@ -2,12 +2,16 @@ package com.netgrif.application.engine.workflow import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.ipc.TaskApiTest +import com.netgrif.application.engine.petrinet.domain.PetriNet import com.netgrif.application.engine.petrinet.domain.VersionType +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.startup.SuperCreator -import com.netgrif.application.engine.utils.InputStreamToString import com.netgrif.application.engine.workflow.domain.Case +import com.netgrif.application.engine.workflow.domain.QCase +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams +import com.netgrif.application.engine.workflow.domain.params.DeleteCaseParams import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService import groovy.transform.CompileStatic import org.junit.jupiter.api.BeforeEach @@ -18,6 +22,9 @@ import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.ActiveProfiles import org.springframework.test.context.junit.jupiter.SpringExtension +import static com.netgrif.application.engine.workflow.domain.params.CreateCaseParams.with +import static org.junit.jupiter.api.Assertions.assertThrows + @ExtendWith(SpringExtension.class) @ActiveProfiles(["test"]) @SpringBootTest @@ -26,6 +33,8 @@ class WorkflowServiceTest { public static final String NET_FILE = "case_search_test.xml" public static final String CASE_LOCALE_NET_FILE = "create_case_locale.xml" + public static final String CREATE_CASE_FAILURE_NET_FILE = "create_case_failure.xml" + public static final String DELETE_CASE_FAILURE_NET_FILE = "delete_case_failure.xml" public static final String FIRST_AUTO_NET_FILE = "petriNets/NAE_1382_first_trans_auto.xml" public static final String SECOND_AUTO_NET_FILE = "petriNets/NAE_1382_first_trans_auto_2.xml" @@ -55,7 +64,8 @@ class WorkflowServiceTest { @Test void testFindOneImmediateData() { - def testNet = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null Case aCase = importHelper.createCase("Case 1", testNet.getNet()) @@ -69,13 +79,20 @@ class WorkflowServiceTest { @Test void testFirstTransitionAuto() { - def testNet = petriNetService.importPetriNet(stream(FIRST_AUTO_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(FIRST_AUTO_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() assert testNet def net = testNet - Case aCase = workflowService.createCase(net.stringId, "autoErr", "red", superCreator.getLoggedSuper()).getCase() - importHelper.assignTask("Manual", aCase.getStringId(), superCreator.getLoggedSuper()) - importHelper.finishTask("Manual", aCase.getStringId(), superCreator.getLoggedSuper()) + CreateCaseParams createCaseParams = with() + .petriNet(net) + .title("autoErr") + .color("red") + .loggedUser(superCreator.getLoggedSuper()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + importHelper.assignTask("Manual", aCase.getStringId(), superCreator.getSuperUser()) + importHelper.finishTask("Manual", aCase.getStringId(), superCreator.getSuperUser()) assert workflowService.findOne(aCase.stringId).getActivePlaces().containsKey("p3") assert workflowService.findOne(aCase.stringId).getActivePlaces().size() == 1 @@ -83,14 +100,21 @@ class WorkflowServiceTest { @Test void testSecondTransitionAuto() { - def net = petriNetService.importPetriNet(stream(SECOND_AUTO_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() - - Case aCase = workflowService.createCase(net.stringId, "autoErr", "red", superCreator.getLoggedSuper()).getCase() - importHelper.assignTask("Manual", aCase.getStringId(), superCreator.getLoggedSuper()) - importHelper.finishTask("Manual", aCase.getStringId(), superCreator.getLoggedSuper()) - - importHelper.assignTask("Manuel", aCase.getStringId(), superCreator.getLoggedSuper()) - importHelper.finishTask("Manuel", aCase.getStringId(), superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(SECOND_AUTO_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + + CreateCaseParams createCaseParams = with() + .petriNet(net) + .title("autoErr") + .color("red") + .loggedUser(superCreator.getLoggedSuper()) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() + importHelper.assignTask("Manual", aCase.getStringId(), superCreator.getSuperUser()) + importHelper.finishTask("Manual", aCase.getStringId(), superCreator.getSuperUser()) + + importHelper.assignTask("Manuel", aCase.getStringId(), superCreator.getSuperUser()) + importHelper.finishTask("Manuel", aCase.getStringId(), superCreator.getSuperUser()) assert workflowService.findOne(aCase.stringId).getActivePlaces().containsKey("p3") assert workflowService.findOne(aCase.stringId).getActivePlaces().size() == 1 @@ -98,18 +122,126 @@ class WorkflowServiceTest { @Test void createCaseWithLocale() { - def testNet = petriNetService.importPetriNet(stream(CASE_LOCALE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CASE_LOCALE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) assert testNet.getNet() != null def net = testNet.getNet() - Case aCase = workflowService.createCase(net.stringId, null, null, superCreator.getLoggedSuper(), new Locale('sk')).getCase() + CreateCaseParams createCaseParams = with() + .petriNet(net) + .title(null) + .color(null) + .loggedUser(superCreator.getLoggedSuper()) + .locale(new Locale('sk')) + .build() + Case aCase = workflowService.createCase(createCaseParams).getCase() assert aCase.title == "Slovenský preklad" - // TODO: release/8.0.0 fix uri nodes -// assert workflowService.findOne(aCase.stringId).uriNodeId == net.uriNodeId + assert workflowService.findOne(aCase.stringId).uriNodeId == net.uriNodeId - Case enCase = workflowService.createCase(net.stringId, null, null, superCreator.getLoggedSuper(), new Locale('en')).getCase() + createCaseParams = with() + .petriNet(net) + .title(null) + .color(null) + .loggedUser(superCreator.getLoggedSuper()) + .locale(new Locale('en')) + .build() + Case enCase = workflowService.createCase(createCaseParams).getCase() assert enCase.title == "English translation" } + + @Test + void testTransactionalCreateCaseFailure() { + petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CASE_LOCALE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CREATE_CASE_FAILURE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + + CreateCaseParams createCaseParams = with() + .isTransactional(true) + .petriNet(net) + .title("FailedCase") + .color(null) + .loggedUser(superCreator.getLoggedSuper()) + .build() + + assertThrows(RuntimeException.class, { workflowService.createCase(createCaseParams) }) + + assert workflowService.searchOne(QCase.case$.title.eq("FailedCase")) == null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPre")) == null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPost")) == null + } + + @Test + void testNonTransactionalCreateCaseFailure() { + petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CASE_LOCALE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())) + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(CREATE_CASE_FAILURE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + + CreateCaseParams createCaseParams = with() + .isTransactional(false) + .petriNet(net) + .title("FailedCase") + .color(null) + .loggedUser(superCreator.getLoggedSuper()) + .build() + + assertThrows(RuntimeException.class, { workflowService.createCase(createCaseParams) }) + + assert workflowService.searchOne(QCase.case$.title.eq("FailedCase")) != null // failure in post action + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPre")) != null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPost")) != null + } + + @Test + void testTransactionalDeleteCaseFailure() { + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(DELETE_CASE_FAILURE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + + CreateCaseParams createCaseParams = with() + .petriNet(net) + .title("CaseToRemove") + .color(null) + .loggedUser(superCreator.getLoggedSuper()) + .build() + + Case useCase = workflowService.createCase(createCaseParams).getCase() + + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .isTransactional(true) + .useCase(useCase) + .build() + assertThrows(RuntimeException.class, { workflowService.deleteCase(deleteCaseParams) }) + + assert workflowService.searchOne(QCase.case$.title.eq("CaseToRemove")) != null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPre")) == null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPost")) == null + } + + @Test + void testNonTransactionalDeleteCaseFailure() { + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + stream(DELETE_CASE_FAILURE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet() + + CreateCaseParams createCaseParams = with() + .petriNet(net) + .title("CaseToRemove") + .color(null) + .loggedUser(superCreator.getLoggedSuper()) + .build() + + Case useCase = workflowService.createCase(createCaseParams).getCase() + + DeleteCaseParams deleteCaseParams = DeleteCaseParams.with() + .isTransactional(false) + .useCase(useCase) + .build() + assertThrows(RuntimeException.class, { workflowService.deleteCase(deleteCaseParams) }) + + assert workflowService.searchOne(QCase.case$.title.eq("CaseToRemove")) == null // failure in post action + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPre")) != null + assert workflowService.searchOne(QCase.case$.title.eq("CaseFromPost")) != null + } } diff --git a/src/test/java/com/netgrif/application/engine/configuration/authentication/providers/NetgrifLdapAuthenticationProviderTest.java b/src/test/java/com/netgrif/application/engine/configuration/authentication/providers/NetgrifLdapAuthenticationProviderTest.java index 5f8ca432b04..59aa7f8c948 100644 --- a/src/test/java/com/netgrif/application/engine/configuration/authentication/providers/NetgrifLdapAuthenticationProviderTest.java +++ b/src/test/java/com/netgrif/application/engine/configuration/authentication/providers/NetgrifLdapAuthenticationProviderTest.java @@ -12,6 +12,7 @@ import com.netgrif.application.engine.orgstructure.web.responsebodies.LdapGroupResponseBody; import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.startup.SuperCreator; @@ -171,12 +172,14 @@ void searchGroups() { assert ldapGroupsTest.size() == 1; List ldapGroupsNothing = ldapGroupRefService.searchGroups("nothing"); - assert ldapGroupsNothing.size() == 0; + assert ldapGroupsNothing.isEmpty(); } @Test void assignRoleGroup() throws Exception { - PetriNet net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet(); + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper() + )).getNet(); assert net != null; Map roles = net.getRoles(); assert roles != null; @@ -184,9 +187,7 @@ void assignRoleGroup() throws Exception { List ldapGroupsTest = ldapGroupRefService.searchGroups("test1"); assert ldapGroupsTest.size() == 1; Set role = new HashSet<>(); - roles.forEach((k, v) -> { - role.add(v.getStringId()); - }); + roles.forEach((k, v) -> role.add(v.getStringId())); assert role.size() == roles.size(); ldapGroupRefService.setRoleToLdapGroup(ldapGroupsTest.get(0).getDn().toString(), role, superCreator.getLoggedSuper()); Set group = new HashSet<>(); @@ -211,7 +212,9 @@ void assignRoleGroupAndCheck() throws Exception { JSONArray countProcessRole = (JSONArray) json.get("processRoles"); assert countProcessRole.length() == 1; - PetriNet net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet(); + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper() + )).getNet(); assert net != null; Map roles = net.getRoles(); assert roles != null; @@ -219,9 +222,7 @@ void assignRoleGroupAndCheck() throws Exception { List ldapGroupsTest = ldapGroupRefService.searchGroups("test1"); assert ldapGroupsTest.size() == 1; Set role = new HashSet<>(); - roles.forEach((k, v) -> { - role.add(v.getStringId()); - }); + roles.forEach((k, v) -> role.add(v.getStringId())); assert role.size() == roles.size(); ldapGroupRefService.setRoleToLdapGroup(ldapGroupsTest.get(0).getDn().toString(), role, superCreator.getLoggedSuper()); @@ -265,7 +266,7 @@ void assignRoleGroupAndCheck() throws Exception { void getProcessRole() { Set findDn = Set.of("nothing"); Set processRoles = ldapGroupRefService.getProcessRoleByLdapGroup(findDn); - assert processRoles.size() == 0; + assert processRoles.isEmpty(); } @Test diff --git a/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java b/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java index 51cf5337193..f66f9c1a35e 100644 --- a/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java +++ b/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java @@ -3,12 +3,13 @@ import com.netgrif.application.engine.TestHelper; import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.startup.SuperCreator; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.QCase; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,7 +47,9 @@ public void before() { @Test public void testConstructorAndDestructor() throws MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/constructor_destructor.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/constructor_destructor.xml"), VersionType.MAJOR, superCreator.getLoggedSuper() + )); assert outcome.getNet() != null; Optional caseOpt = caseRepository.findOne(QCase.case$.title.eq("Construct")); diff --git a/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java b/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java index 8a360a5225e..afae222b207 100644 --- a/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java +++ b/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java @@ -6,13 +6,15 @@ import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.startup.SuperCreator; import com.netgrif.application.engine.utils.FullPageRequest; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,7 +30,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -65,35 +66,46 @@ public void before() { @Test public void importPetriNet() throws MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - petriNetService.importPetriNet(new FileInputStream("src/test/resources/prikladFM_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/prikladFM_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); assertNetProperlyImported(); } @Test public void priorityTest() throws MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/priority_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/priority_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); assert outcome.getNet() != null; - CreateCaseEventOutcome caseOutcome = workflowService.createCase(outcome.getNet().getStringId(), outcome.getNet().getTitle().getDefaultValue(), "color", superCreator.getLoggedSuper()); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(outcome.getNet()) + .title(outcome.getNet().getTitle().getDefaultValue()) + .color("color") + .loggedUser(superCreator.getLoggedSuper()) + .build(); + CreateCaseEventOutcome caseOutcome = workflowService.createCase(createCaseParams); assert caseOutcome.getCase() != null; } @Test public void dataGroupTest() throws MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/datagroup_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/datagroup_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); assert outcome.getNet() != null; } @Test public void readArcImportTest() throws MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - petriNetService.importPetriNet(new FileInputStream("src/test/resources/read_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/read_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); } @Test public void externalMappingTest() throws MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/mapping_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/mapping_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); assertExternalMappingImport(outcome.getNet()); } @@ -105,7 +117,7 @@ void importInvalidDataRefLayoutTest() throws FileNotFoundException { FileInputStream fileInputStream = new FileInputStream("src/test/resources/invalid_data_ref_layout.xml"); - assertThatThrownBy(() -> petriNetService.importPetriNet(fileInputStream, VersionType.MAJOR, loggedUser)) + assertThatThrownBy(() -> petriNetService.importPetriNet(new ImportPetriNetParams(fileInputStream, VersionType.MAJOR, loggedUser))) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("doesn't have a layout"); } diff --git a/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java b/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java index ab62d721947..828609c4811 100644 --- a/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java +++ b/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java @@ -2,12 +2,13 @@ import com.netgrif.application.engine.TestHelper; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService; import com.netgrif.application.engine.startup.SuperCreator; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -54,8 +55,10 @@ public void before() { void shouldFindAllProcessRoles() throws IOException, MissingPetriNetMetaDataException { List roles = processRoleService.findAll(); int originalRoles = roles.size(); - petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); - petriNetService.importPetriNet(new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); roles = processRoleService.findAll(); assertNotNull(roles); assertFalse(roles.isEmpty()); @@ -64,7 +67,8 @@ void shouldFindAllProcessRoles() throws IOException, MissingPetriNetMetaDataExce @Test void shouldFindAllProcessRolesByPetriNet() throws IOException, MissingPetriNetMetaDataException { - ImportPetriNetEventOutcome eventOutcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome eventOutcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); List roles = processRoleService.findAll(eventOutcome.getNet().getStringId()); assertNotNull(roles); assertFalse(roles.isEmpty()); @@ -91,7 +95,8 @@ void shouldGetAnonymousRole() { @Test void shouldFindAllProcessRolesByImportId() throws IOException, MissingPetriNetMetaDataException { - petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); Set roles = processRoleService.findAllByImportId(ROLE_IMPORT_ID); assertNotNull(roles); assertFalse(roles.isEmpty()); @@ -101,7 +106,8 @@ void shouldFindAllProcessRolesByImportId() throws IOException, MissingPetriNetMe @Test void shouldFindAllProcessRolesByName() throws IOException, MissingPetriNetMetaDataException { - petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); Set roles = processRoleService.findAllByDefaultName("Process role"); assertNotNull(roles); assertFalse(roles.isEmpty()); diff --git a/src/test/java/com/netgrif/application/engine/rules/service/RuleEngineTest.java b/src/test/java/com/netgrif/application/engine/rules/service/RuleEngineTest.java index 6bf60668eaf..a488d2c2358 100644 --- a/src/test/java/com/netgrif/application/engine/rules/service/RuleEngineTest.java +++ b/src/test/java/com/netgrif/application/engine/rules/service/RuleEngineTest.java @@ -5,9 +5,9 @@ import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.interfaces.IUserService; import com.netgrif.application.engine.configuration.drools.RefreshableKieBase; -import com.netgrif.application.engine.importer.model.EventType; import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.domain.throwable.TransitionNotExecutableException; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; @@ -17,8 +17,10 @@ import com.netgrif.application.engine.rules.domain.facts.*; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import lombok.extern.slf4j.Slf4j; @@ -99,7 +101,8 @@ void testNetImportRulePRE() throws IOException, MissingPetriNetMetaDataException .build(); ruleRepository.save(rule); - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser)); assert outcome.getNet() != null; assert outcome.getNet().getTitle().getDefaultValue().equals(NET_TITLE_PRE); @@ -136,7 +139,8 @@ void testNetImportRulePOST() throws IOException, MissingPetriNetMetaDataExceptio assert refreshableKieBase.shouldRefresh(); - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser)); assert !refreshableKieBase.shouldRefresh(); @@ -157,7 +161,8 @@ void testTransitionRules() throws IOException, MissingPetriNetMetaDataException, final String NEW_CASE_TITLE_2 = "new case title 2"; final String TEXT_VALUE = "TEXT FIELD VALUE"; - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser)); assert outcome != null; StoredRule rule = StoredRule.builder() @@ -197,13 +202,19 @@ void testTransitionRules() throws IOException, MissingPetriNetMetaDataException, ruleRepository.save(rule3); ruleRepository.save(rule4); - CreateCaseEventOutcome caseOutcome = workflowService.createCase(outcome.getNet().getStringId(), "Original title", "original color", superUser); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(outcome.getNet()) + .title("Original title") + .color("original color") + .loggedUser(superUser) + .build(); + CreateCaseEventOutcome caseOutcome = workflowService.createCase(createCaseParams); // TODO: release/8.0.0 AssertionError assert caseOutcome.getCase().getTitle().equals(NEW_CASE_TITLE); Task task = findTask(caseOutcome.getCase(), TRANS_1); - taskService.assignTask(task, superUser.transformToUser()); - taskService.finishTask(task, superUser.transformToUser()); + taskService.assignTask(new TaskParams(task, superUser.transformToUser())); + taskService.finishTask(new TaskParams(task, superUser.transformToUser())); Case newCase = workflowService.findOne(caseOutcome.getCase().getStringId()); assert newCase.getTitle().equals(NEW_CASE_TITLE); assert !newCase.getColor().equals(NEW_CASE_TITLE_2); @@ -213,8 +224,8 @@ void testTransitionRules() throws IOException, MissingPetriNetMetaDataException, assert facts.size() == 1 && facts.get(0) instanceof TestFact && ((TestFact) facts.get(0)).number == 1; Task task2 = findTask(newCase, TRANS_2); - taskService.assignTask(task2, superUser.transformToUser()); - taskService.finishTask(task2, superUser.transformToUser()); + taskService.assignTask(new TaskParams(task2, superUser.transformToUser())); + taskService.finishTask(new TaskParams(task2, superUser.transformToUser())); newCase = workflowService.findOne(newCase.getStringId()); assert newCase.getTitle().equals(NEW_CASE_TITLE_2); @@ -232,7 +243,7 @@ void assignRuleTest() throws IOException, MissingPetriNetMetaDataException, Tran assert caze != null; Task task = findTask(caze, TRANS_1); - taskService.assignTask(task, superUser.transformToUser()); + taskService.assignTask(new TaskParams(task, superUser.transformToUser())); caze = workflowService.findOne(caze.getStringId()); @@ -254,7 +265,7 @@ void testDelegate() throws IOException, MissingPetriNetMetaDataException, Transi Task task = findTask(caze, TRANS_1); IUser user = superUser.transformToUser(); - taskService.assignTask(task, user); + taskService.assignTask(new TaskParams(task, user)); taskService.delegateTask(user.transformToLoggedUser(), user.getStringId(), task.getStringId()); caze = workflowService.findOne(caze.getStringId()); @@ -275,8 +286,8 @@ void testFinish() throws IOException, MissingPetriNetMetaDataException, Transiti Task task = findTask(caze, TRANS_1); IUser user = superUser.transformToUser(); - taskService.assignTask(task, user); - taskService.finishTask(task, user); + taskService.assignTask(new TaskParams(task, user)); + taskService.finishTask(new TaskParams(task, user)); caze = workflowService.findOne(caze.getStringId()); assert caze.getDataSet().get("text_data").getValue().getValue().equals(TEXT_VALUE); @@ -297,8 +308,8 @@ void testCancel() throws IOException, MissingPetriNetMetaDataException, Transiti Task task = findTask(caze, TRANS_1); IUser user = superUser.transformToUser(); - taskService.assignTask(task, user); - taskService.cancelTask(task, user); + taskService.assignTask(new TaskParams(task, user)); + taskService.cancelTask(new TaskParams(task, user)); caze = workflowService.findOne(caze.getStringId()); assert caze.getDataSet().get("text_data").getValue().getValue().equals(TEXT_VALUE); @@ -374,8 +385,15 @@ private StoredRule rule(String when, String then) { } private Case newCase() throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser); - return workflowService.createCase(outcome.getNet().getStringId(), "Original title", "original color", superUser).getCase(); + ImportPetriNetEventOutcome outcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, superUser)); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(outcome.getNet()) + .title("Original title") + .color("original color") + .loggedUser(superUser) + .build(); + return workflowService.createCase(createCaseParams).getCase(); } private Task findTask(Case caze, String trans) { diff --git a/src/test/java/com/netgrif/application/engine/rules/service/RuleEvaluationScheduleServiceTest.java b/src/test/java/com/netgrif/application/engine/rules/service/RuleEvaluationScheduleServiceTest.java index 45d67650f99..73f7b2a9b29 100644 --- a/src/test/java/com/netgrif/application/engine/rules/service/RuleEvaluationScheduleServiceTest.java +++ b/src/test/java/com/netgrif/application/engine/rules/service/RuleEvaluationScheduleServiceTest.java @@ -4,6 +4,7 @@ import com.netgrif.application.engine.auth.domain.LoggedUser; import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.rules.domain.RuleRepository; @@ -13,8 +14,9 @@ import com.netgrif.application.engine.rules.service.throwable.RuleEvaluationScheduleException; import com.netgrif.application.engine.startup.SuperCreator; import com.netgrif.application.engine.workflow.domain.Case; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterEach; @@ -67,7 +69,8 @@ public void before() { @Disabled void testScheduledRule() throws IOException, MissingPetriNetMetaDataException, RuleEvaluationScheduleException, InterruptedException, MissingIconKeyException { LoggedUser user = superCreator.getLoggedSuper(); - ImportPetriNetEventOutcome importOutcome = petriNetService.importPetriNet(new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, user); + ImportPetriNetEventOutcome importOutcome = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/rule_engine_test.xml"), VersionType.MAJOR, user)); StoredRule rule = StoredRule.builder() .when("$case: Case() $event: ScheduledRuleFact(instanceId == $case.stringId, ruleIdentifier == \"rule2\")") @@ -78,7 +81,13 @@ void testScheduledRule() throws IOException, MissingPetriNetMetaDataException, R .build(); ruleRepository.save(rule); - CreateCaseEventOutcome caseOutcome = workflowService.createCase(importOutcome.getNet().getStringId(), "Original title", "original color", user); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(importOutcome.getNet()) + .title("Original title") + .color("original color") + .loggedUser(user) + .build(); + CreateCaseEventOutcome caseOutcome = workflowService.createCase(createCaseParams); ScheduleOutcome outcome = ruleEvaluationScheduleService.scheduleRuleEvaluationForCase(caseOutcome.getCase(), "rule2", TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(5))); assert outcome.getJobDetail() != null; diff --git a/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java b/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java index 59983f22c1f..3b33e8f0b08 100644 --- a/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java +++ b/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java @@ -10,6 +10,7 @@ import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; import com.netgrif.application.engine.petrinet.domain.PetriNet; import com.netgrif.application.engine.petrinet.domain.VersionType; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository; import com.netgrif.application.engine.petrinet.domain.throwable.MissingPetriNetMetaDataException; import com.netgrif.application.engine.petrinet.domain.throwable.TransitionNotExecutableException; @@ -18,8 +19,11 @@ import com.netgrif.application.engine.startup.SystemUserRunner; import com.netgrif.application.engine.startup.UriRunner; import com.netgrif.application.engine.workflow.domain.Case; +import com.netgrif.application.engine.workflow.domain.QCase; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository; import com.netgrif.application.engine.workflow.domain.repositories.TaskRepository; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; @@ -37,6 +41,9 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Collections; +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertThrows; @SpringBootTest @ActiveProfiles({"test"}) @@ -81,6 +88,8 @@ public class TaskServiceTest { @Autowired private SuperAdminConfiguration configuration; + @Autowired + private TaskService taskService; @BeforeEach public void setUp() throws Exception { @@ -89,16 +98,30 @@ public void setUp() throws Exception { userRunner.run(""); uriRunner.run(); - petriNetService.importPetriNet(new FileInputStream("src/test/resources/prikladFM.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/prikladFM.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())); PetriNet net = petriNetRepository.findAll().get(0); - workflowService.createCase(net.getStringId(), "Storage Unit", "color", mockLoggedUser()); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Storage Unit") + .color("color") + .loggedUser(mockLoggedUser()) + .build(); + workflowService.createCase(createCaseParams); } @Test public void resetArcTest() throws TransitionNotExecutableException, MissingPetriNetMetaDataException, IOException, MissingIconKeyException { - PetriNet net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/reset_inhibitor_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet(); + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream("src/test/resources/reset_inhibitor_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet(); LoggedUser loggedUser = mockLoggedUser(); - CreateCaseEventOutcome outcome = workflowService.createCase(net.getStringId(), "Reset test", "color", loggedUser); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .title("Reset test") + .color("color") + .loggedUser(loggedUser) + .build(); + CreateCaseEventOutcome outcome = workflowService.createCase(createCaseParams); User user = new User(); user.setName("name"); user.setPassword("password"); @@ -107,31 +130,173 @@ public void resetArcTest() throws TransitionNotExecutableException, MissingPetri user.setState(UserState.ACTIVE); user = userRepository.save(user); - assert outcome.getCase().getConsumedTokens().size() == 0; + assert outcome.getCase().getConsumedTokens().isEmpty(); assert outcome.getCase().getActivePlaces().size() == 1; - assert outcome.getCase().getActivePlaces().values().contains(5); + assert outcome.getCase().getActivePlaces().containsValue(5); Task task = taskRepository.findAll().stream().filter(t -> t.getTitle().getDefaultValue().equalsIgnoreCase("reset")).findFirst().orElse(null); assert task != null; - service.assignTask(user.transformToLoggedUser(), task.getStringId()); + service.assignTask(new TaskParams(task, user)); Case useCase = caseRepository.findById(outcome.getCase().getStringId()).get(); assert useCase.getConsumedTokens().size() == 1; - assert useCase.getConsumedTokens().values().contains(5); - assert useCase.getActivePlaces().size() == 0; + assert useCase.getConsumedTokens().containsValue(5); + assert useCase.getActivePlaces().isEmpty(); - service.cancelTask(user.transformToLoggedUser(), task.getStringId()); + service.cancelTask(new TaskParams(task, user)); useCase = caseRepository.findById(useCase.getStringId()).get(); - assert useCase.getConsumedTokens().size() == 0; + assert useCase.getConsumedTokens().isEmpty(); assert useCase.getActivePlaces().size() == 1; - assert useCase.getActivePlaces().values().contains(5); + assert useCase.getActivePlaces().containsValue(5); } public LoggedUser mockLoggedUser() { Authority authorityUser = authorityService.getOrCreate(Authority.user); return new LoggedUser(new ObjectId().toString(), configuration.getEmail(), configuration.getPassword(), Collections.singleton(authorityUser)); } + + @Test + public void testTransactionalAssignTaskFailure() throws IOException, MissingPetriNetMetaDataException { + String taskId = createCaseAndReturnTaskId("src/test/resources/transactional_task_event_test.xml", + "assignTest"); + + TaskParams taskParams = TaskParams.with() + .isTransactional(true) + .taskId(taskId) + .user(superCreator.getSuperUser()) + .build(); + + assertThrows(RuntimeException.class, () -> taskService.assignTask(taskParams)); + + Task aTask = taskService.findOne(taskId); + assert aTask.getUserId() == null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePre")) == null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePost")) == null; + } + + @Test + public void testNonTransactionalAssignTaskFailure() throws IOException, MissingPetriNetMetaDataException { + String taskId = createCaseAndReturnTaskId("src/test/resources/transactional_task_event_test.xml", + "assignTest"); + + TaskParams taskParams = TaskParams.with() + .isTransactional(false) + .taskId(taskId) + .user(superCreator.getSuperUser()) + .build(); + + assertThrows(RuntimeException.class, () -> taskService.assignTask(taskParams)); + + Task aTask = taskService.findOne(taskId); + assert aTask.getUserId() != null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePre")) != null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePost")) != null; + } + + @Test + public void testTransactionalCancelTaskFailure() throws IOException, MissingPetriNetMetaDataException, TransitionNotExecutableException { + String taskId = createCaseAndReturnTaskId("src/test/resources/transactional_task_event_test.xml", + "cancelTest"); + + TaskParams taskParams = TaskParams.with() + .isTransactional(false) + .taskId(taskId) + .user(superCreator.getSuperUser()) + .build(); + + Task aTask = taskService.assignTask(taskParams).getTask(); + assert Objects.equals(aTask.getUserId(), superCreator.getSuperUser().getStringId()); + + taskParams.setIsTransactional(true); + assertThrows(RuntimeException.class, () -> taskService.cancelTask(taskParams)); + + aTask = taskService.findOne(taskId); + assert Objects.equals(aTask.getUserId(), superCreator.getSuperUser().getStringId()); + assert workflowService.searchOne(QCase.case$.title.eq("CasePre")) == null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePost")) == null; + } + + @Test + public void testNonTransactionalCancelTaskFailure() throws IOException, MissingPetriNetMetaDataException, TransitionNotExecutableException { + String taskId = createCaseAndReturnTaskId("src/test/resources/transactional_task_event_test.xml", + "cancelTest"); + + TaskParams taskParams = TaskParams.with() + .isTransactional(false) + .taskId(taskId) + .user(superCreator.getSuperUser()) + .build(); + + Task aTask = taskService.assignTask(taskParams).getTask(); + assert Objects.equals(aTask.getUserId(), superCreator.getSuperUser().getStringId()); + + assertThrows(RuntimeException.class, () -> taskService.cancelTask(taskParams)); + + aTask = taskService.findOne(taskId); + assert aTask.getUserId() == null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePre")) != null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePost")) != null; + } + + @Test + public void testTransactionalFinishTaskFailure() throws IOException, MissingPetriNetMetaDataException, TransitionNotExecutableException { + String taskId = createCaseAndReturnTaskId("src/test/resources/transactional_task_event_test.xml", + "finishTest"); + + TaskParams taskParams = TaskParams.with() + .isTransactional(false) + .taskId(taskId) + .user(superCreator.getSuperUser()) + .build(); + + Task aTask = taskService.assignTask(taskParams).getTask(); + assert Objects.equals(aTask.getUserId(), superCreator.getSuperUser().getStringId()); + + taskParams.setIsTransactional(true); + assertThrows(RuntimeException.class, () -> taskService.finishTask(taskParams)); + + aTask = taskService.findOne(taskId); + assert Objects.equals(aTask.getUserId(), superCreator.getSuperUser().getStringId()); + assert aTask.getFinishedBy() == null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePre")) == null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePost")) == null; + } + + @Test + public void testNonTransactionalFinishTaskFailure() throws IOException, MissingPetriNetMetaDataException, TransitionNotExecutableException { + String taskId = createCaseAndReturnTaskId("src/test/resources/transactional_task_event_test.xml", + "finishTest"); + + TaskParams taskParams = TaskParams.with() + .isTransactional(false) + .taskId(taskId) + .user(superCreator.getSuperUser()) + .build(); + + Task aTask = taskService.assignTask(taskParams).getTask(); + assert Objects.equals(aTask.getUserId(), superCreator.getSuperUser().getStringId()); + + assertThrows(RuntimeException.class, () -> taskService.finishTask(taskParams)); + + aTask = taskService.findOne(taskId); + assert aTask.getUserId() == null; + assert aTask.getFinishedBy().equals(superCreator.getSuperUser().getStringId()); + assert workflowService.searchOne(QCase.case$.title.eq("CasePre")) != null; + assert workflowService.searchOne(QCase.case$.title.eq("CasePost")) != null; + } + + private String createCaseAndReturnTaskId(String filePath, String transId) throws IOException, MissingPetriNetMetaDataException { + PetriNet net = petriNetService.importPetriNet(new ImportPetriNetParams( + new FileInputStream(filePath), VersionType.MAJOR, superCreator.getLoggedSuper())).getNet(); + + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(net) + .loggedUser(superCreator.getLoggedSuper()) + .build(); + Case useCase = workflowService.createCase(createCaseParams).getCase(); + return useCase.getTaskStringId(transId); + } } \ No newline at end of file diff --git a/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java b/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java index 0de83af0a03..fea7316ee44 100644 --- a/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java +++ b/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java @@ -12,20 +12,22 @@ import com.netgrif.application.engine.petrinet.domain.VersionType; import com.netgrif.application.engine.petrinet.domain.arcs.Arc; import com.netgrif.application.engine.petrinet.domain.dataset.NumberField; +import com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams; import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository; import com.netgrif.application.engine.petrinet.domain.roles.ProcessRole; import com.netgrif.application.engine.petrinet.domain.throwable.TransitionNotExecutableException; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.petrinet.service.interfaces.IProcessRoleService; -import com.netgrif.application.engine.startup.DefaultRoleRunner; import com.netgrif.application.engine.startup.ImportHelper; import com.netgrif.application.engine.startup.SuperCreator; import com.netgrif.application.engine.startup.SystemUserRunner; import com.netgrif.application.engine.workflow.domain.Case; import com.netgrif.application.engine.workflow.domain.QTask; import com.netgrif.application.engine.workflow.domain.Task; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; -import com.netgrif.application.engine.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.caseoutcomes.CreateCaseEventOutcome; +import com.netgrif.application.engine.workflow.domain.outcomes.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.params.CreateCaseParams; +import com.netgrif.application.engine.workflow.domain.params.TaskParams; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; import com.netgrif.application.engine.workflow.web.responsebodies.TaskReference; @@ -101,7 +103,8 @@ public void before() throws Exception { repository.deleteAll(); assertNotNull(processRoleService.defaultRole()); testHelper.truncateDbs(); - ImportPetriNetEventOutcome outcome = service.importPetriNet(new FileInputStream(NET_PATH), VersionType.MAJOR, superCreator.getLoggedSuper()); + ImportPetriNetEventOutcome outcome = service.importPetriNet(new ImportPetriNetParams( + new FileInputStream(NET_PATH), VersionType.MAJOR, superCreator.getLoggedSuper())); assert outcome.getNet() != null; PetriNet net = outcome.getNet(); @@ -124,8 +127,14 @@ public void before() throws Exception { public void importTest() throws MissingIconKeyException { List arcs = this.loaded.getArcs().values().stream().flatMap(List::stream).collect(Collectors.toList()); - assert arcs.size() > 0; - CreateCaseEventOutcome caseOutcome = workflowService.createCase(this.loaded.getStringId(), "VARTEST", "red", mock.mockLoggedUser()); + assert !arcs.isEmpty(); + CreateCaseParams createCaseParams = CreateCaseParams.with() + .petriNet(this.loaded) + .title("VARTEST") + .color("red") + .loggedUser(mock.mockLoggedUser()) + .build(); + CreateCaseEventOutcome caseOutcome = workflowService.createCase(createCaseParams); assert caseOutcome.getCase().getPetriNet().getArcs() .values() @@ -148,11 +157,19 @@ public void finishTasksTest() throws TransitionNotExecutableException { private void assertInhibArcsFinishTask(List tasks) throws TransitionNotExecutableException { for (TaskReference taskRef : tasks) { Task task = taskService.findOne(taskRef.getStringId()); - taskService.assignTask(task, testUser); + TaskParams taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.assignTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert !finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_start") && !finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_res"); - taskService.finishTask(task, testUser); + taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.finishTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert !finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_start") && finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_res"); @@ -162,14 +179,21 @@ private void assertInhibArcsFinishTask(List tasks) throws Transit private void assertReadArcsFinishTask(List tasks) throws TransitionNotExecutableException { for (TaskReference taskRef : tasks) { Task task = taskService.findOne(taskRef.getStringId()); - int markingBeforeAssign = 0; - markingBeforeAssign = finishCase.getActivePlaces().get(task.getTitle().getDefaultValue() + "_start"); - taskService.assignTask(task, testUser); + int markingBeforeAssign = finishCase.getActivePlaces().get(task.getTitle().getDefaultValue() + "_start"); + TaskParams taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.assignTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert markingBeforeAssign == finishCase.getActivePlaces().get(task.getTitle().getDefaultValue() + "_start"); - taskService.finishTask(task, testUser); + taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.finishTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert markingBeforeAssign == finishCase.getActivePlaces().get(task.getTitle().getDefaultValue() + "_start") && @@ -181,13 +205,21 @@ private void assertFinishTasks(String arcType, List tasks) throws List filteredTasks = tasks.stream().filter(task -> task.getTitle().contains(arcType)).collect(Collectors.toList()); for (TaskReference taskRef : filteredTasks) { Task task = taskService.findOne(taskRef.getStringId()); - taskService.assignTask(task, testUser); + TaskParams taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.assignTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); // TODO: release/8.0.0 assert !finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_start"); - taskService.finishTask(task, testUser); + taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.finishTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert !finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_start") && @@ -199,12 +231,20 @@ private void assertOutArcsFinishTasks(List tasks) throws Transiti List filteredTasks = tasks.stream().filter(task -> task.getTitle().equals("var_arc_out") || task.getTitle().equals("place_var_arc_out")).collect(Collectors.toList()); for (TaskReference taskRef : filteredTasks) { Task task = taskService.findOne(taskRef.getStringId()); - taskService.assignTask(task, testUser); + TaskParams taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.assignTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert !finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_end"); - taskService.finishTask(task, testUser); + taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.finishTask(taskParams); finishCase = workflowService.findOne(task.getCaseId()); assert finishCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_end") && @@ -240,7 +280,11 @@ private void assertCancelTasks(String arcType, List tasks) throws if (!arcType.equals("inhib")) { tokensBeforeAssign = cancelCase.getActivePlaces().get(task.getTitle().getDefaultValue() + "_start"); } - taskService.assignTask(task, testUser); + TaskParams taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.assignTask(taskParams); cancelCase = workflowService.findOne(task.getCaseId()); assert !cancelCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_res"); if (arcType.equals("read")) { @@ -258,11 +302,23 @@ private void assertCancelTasks(String arcType, List tasks) throws if (task.getTitle().getDefaultValue().contains("ref")) { QTask qTask = new QTask("task"); Task addTokensTask = taskService.searchOne(qTask.transitionId.eq("add_tokens").and(qTask.caseId.eq(cancelCase.getStringId()))); - taskService.assignTask(testUser.transformToLoggedUser(), addTokensTask.getStringId()); - taskService.finishTask(addTokensTask, testUser); + taskParams = TaskParams.with() + .task(addTokensTask) + .user(testUser) + .build(); + taskService.assignTask(taskParams); + taskParams = TaskParams.with() + .task(addTokensTask) + .user(testUser) + .build(); + taskService.finishTask(taskParams); } int tokensAfterCancel = 0; - taskService.cancelTask(task, testUser); + taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.cancelTask(taskParams); cancelCase = workflowService.findOne(task.getCaseId()); if (!arcType.equals("inhib")) { tokensAfterCancel = cancelCase.getActivePlaces().get(task.getTitle().getDefaultValue() + "_start"); @@ -283,8 +339,16 @@ private void assertCancelTasks(String arcType, List tasks) throws if (task.getTitle().getDefaultValue().contains("ref")) { QTask qTask = new QTask("task"); Task removeTokensTask = taskService.searchOne(qTask.transitionId.eq("remove_tokens").and(qTask.caseId.eq(cancelCase.getStringId()))); - taskService.assignTask(testUser.transformToLoggedUser(), removeTokensTask.getStringId()); - taskService.finishTask(removeTokensTask, testUser); + taskParams = TaskParams.with() + .task(removeTokensTask) + .user(testUser) + .build(); + taskService.assignTask(taskParams); + taskParams = TaskParams.with() + .task(removeTokensTask) + .user(testUser) + .build(); + taskService.finishTask(taskParams); tasksAfterPlaceRefReset = taskService.findAllByCase(cancelCase.getStringId(), LocaleContextHolder.getLocale()); } } @@ -294,12 +358,20 @@ private void assertOutArcsCancelTasks(List tasks) throws Transiti List filteredTasks = tasks.stream().filter(task -> task.getTitle().equals("var_arc_out") || task.getTitle().equals("place_var_arc_out")).collect(Collectors.toList()); for (TaskReference taskRef : filteredTasks) { Task task = taskService.findOne(taskRef.getStringId()); - taskService.assignTask(task, testUser); + TaskParams taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.assignTask(taskParams); cancelCase = workflowService.findOne(task.getCaseId()); assert !cancelCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_end"); - taskService.cancelTask(task, testUser); + taskParams = TaskParams.with() + .task(task) + .user(testUser) + .build(); + taskService.cancelTask(taskParams); cancelCase = workflowService.findOne(task.getCaseId()); assert !cancelCase.getActivePlaces().containsKey(task.getTitle().getDefaultValue() + "_res"); diff --git a/src/test/resources/application-test-transaction.properties b/src/test/resources/application-test-transaction.properties new file mode 100644 index 00000000000..1f08f62e173 --- /dev/null +++ b/src/test/resources/application-test-transaction.properties @@ -0,0 +1,6 @@ +# Transactions for API +nae.transaction.create-case-transactional=false +nae.transaction.delete-case-transactional=false +nae.transaction.get-data-transactional=false +nae.transaction.set-data-transactional=false +nae.transaction.task-event-transactional=false \ No newline at end of file diff --git a/src/test/resources/application-test.properties b/src/test/resources/application-test.properties index 30bdd2a714b..50c737c41d1 100644 --- a/src/test/resources/application-test.properties +++ b/src/test/resources/application-test.properties @@ -20,6 +20,9 @@ nae.security.limits.login-timeout-unit=seconds # Storage nae.storage.clean=true +# Rule engine +rule-engine.enabled=true + nae.admin.password=password diff --git a/src/test/resources/create_case_failure.xml b/src/test/resources/create_case_failure.xml new file mode 100644 index 00000000000..1b5cd70d6e0 --- /dev/null +++ b/src/test/resources/create_case_failure.xml @@ -0,0 +1,23 @@ + + + create_case_failure + TST + Test + + + 123 + + + createCase("create_case_locale", "CaseFromPre") + + + + + createCase("create_case_locale", "CaseFromPost") + throw new RuntimeException("error on purpose") + + + + + \ No newline at end of file diff --git a/src/test/resources/create_case_locale.xml b/src/test/resources/create_case_locale.xml index 99fe3759b8a..8b8715ec589 100644 --- a/src/test/resources/create_case_locale.xml +++ b/src/test/resources/create_case_locale.xml @@ -1,7 +1,7 @@ - currency_test.xml + create_case_locale TST Test Slovenský preklad diff --git a/src/test/resources/delete_case_failure.xml b/src/test/resources/delete_case_failure.xml new file mode 100644 index 00000000000..49ccac387b7 --- /dev/null +++ b/src/test/resources/delete_case_failure.xml @@ -0,0 +1,23 @@ + + + delete_case_failure + TST + Test + + + 123 + + + createCase("delete_case_failure", "CaseFromPre") + + + + + createCase("delete_case_failure", "CaseFromPost") + throw new RuntimeException("error on purpose") + + + + + \ No newline at end of file diff --git a/src/test/resources/petriNet_import_failure.xml b/src/test/resources/petriNet_import_failure.xml new file mode 100644 index 00000000000..dac608920d9 --- /dev/null +++ b/src/test/resources/petriNet_import_failure.xml @@ -0,0 +1,23 @@ + + + petriNet_import_failure + TST + Test + + + 123 + + + createCase("new_model", "CaseFromPre") + + + + + createCase("new_model", "CaseFromPost") + throw new RuntimeException("error on purpose") + + + + + \ No newline at end of file diff --git a/src/test/resources/petriNets/dynamic_init.xml b/src/test/resources/petriNets/dynamic_init.xml index d7593bed06a..7aba8e7764a 100644 --- a/src/test/resources/petriNets/dynamic_init.xml +++ b/src/test/resources/petriNets/dynamic_init.xml @@ -8,13 +8,13 @@ text Text - userService.findByEmail("super@netgrif.com", true).name + userService.findByEmail("super@netgrif.com").name number number - userService.findByEmail("super@netgrif.com", true).name.length() + userService.findByEmail("super@netgrif.com").name.length() diff --git a/src/test/resources/petriNets/mortgage.xml b/src/test/resources/petriNets/mortgage.xml new file mode 100644 index 00000000000..ecbb49ad8cb --- /dev/null +++ b/src/test/resources/petriNets/mortgage.xml @@ -0,0 +1,1544 @@ + + mortgage + 1.0.0 + MTG + Mortgage + true + false + false + + + account_clerk + + true + + + + default + + true + + + + loan_officer + + true + + + + property_appraiser + + true + + + + author + + true + + + + account_clerk + Account clerk + + + loan_officer + Loan officer + + + property_appraiser + Property appraiser + + + system + System + + + account_number + Account number + Please enter your account number - IBAN + + + application_form + Mortgage application form + t24 + + + appraisal + Appraisal report + + + appraised_value + Appraised value + 0 + + + author + Author + + + calc + + <desc>Recalculate the monthly payment</desc> + <event type="set"> + <id>set_event_2</id> + <actions phase="post"> + <action id="action_2"> + <![CDATA[ + loan: f.loan_amount, + period: f.period, + monthly: f.monthly_payment; + change monthly value { return (loan.value+loan.value*0.02*period.value)/(period.value*12);} + ]]> + </action> + </actions> + </event> + </data> + <data type="enumeration"> + <id>city</id> + <title>City + + + confirm + Lien inscription confirmation + Please confirm the lien inscription + + + date_of_birth + Date of Birth + + + delete_instruction + Delete instruction + In order to delete press finish button + + + email + Email + + + first_name + Name + + + income + Monthly Income in EUR + Your average monthly income + + + insurance + Insurance + + + + + + + + Union + + + loan_amount + Loan amount in EUR + + + inrange 10000,1000000 + + + 100000 + + set_event_0 + + + + + + + + + monthly_payment + Monthly payment in EUR + 444 + + + period + Repayment period in years + + + inrange 1,30 + + + 30 + + set_event_1 + + + + + + + + + postal + Postal code + + set_event_3 + + + + + + + + + sign + Signing instruction + Please sign the mortgage by pressing finish button + + + status + Status + + + street + Street + + + streetnumber + Street Number + + + surname + Surname + + + text_2 + Mortgage approved by loan officer + Please confirm that you approve this mortgage request + + area + + + + text_3 + Mortgage rejected by loan officer + Please confirm that you reject this mortgage request + + area + + + + type + Property + + + + + + + House + + + t10 + 624 + 208 + + + 0 + + + property_appraiser + + true + + + + DataGroup + grid + + appraised_value + + editable + required + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + appraisal + + editable + + + 0 + 1 + 1 + 4 + 0 + + + + + + t10_finish + + + = loan_amount.value) { + change status value { return "Mortgage Approved"; } + async.run{ + assignTask("t11") + finishTask("t11") + } + } else { + change status value { return "Mortgage Rejected"; } + async.run{ + assignTask("t15") + finishTask("t15") + } + } + ]]> + + + + + + t11 + 880 + 208 + + + 0 + + + system + + true + + + + t11_finish + + + + + + + + + t15 + 752 + 336 + + + 0 + + + system + + true + + + + + t17 + 1136 + 208 + + + 0 + + + account_clerk + + false + + + + loan_officer + + false + + + + property_appraiser + + false + + + + system + + false + + + + author + + true + + + + DataGroup + grid + + account_number + + editable + required + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + sign + + visible + + + 0 + 1 + 1 + 4 + 0 + + outline + + + + + t17_finish + + + + + + + + + t19 + 1552 + 208 + + + 0 + + + account_clerk + + true + + + + DataGroup + grid + + account_number + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + loan_amount + + visible + + + 0 + 1 + 1 + 4 + 0 + + outline + + + + + t19_finish + + + + + + + + + t2 + 176 + 272 + + + 0 + + auto + + author + + true + + + + DataGroup + grid + + application_form + + editable + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + + t2_finish + + + + + + + + + t21 + 1328 + 272 + + + 0 + + + account_clerk + + false + + + + loan_officer + + false + + + + property_appraiser + + false + + + + system + + false + + + + author + + true + + + + DataGroup + grid + + insurance + + editable + required + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + + t21_finish + + + + + + + + + t23 + 1328 + 144 + + + 0 + + + loan_officer + + true + + + + DataGroup + grid + + confirm + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + account_number + + editable + required + + + 0 + 1 + 1 + 4 + 0 + + outline + + + + + t23_finish + + + + + + + + + t24 + 176 + 464 + + + 0 + + + system + + true + + + + DataGroup + grid + + first_name + + editable + + + 0 + 0 + 1 + 2 + 0 + + outline + + + + surname + + editable + + + 2 + 0 + 1 + 2 + 0 + + outline + + + + date_of_birth + + editable + + + 0 + 1 + 1 + 2 + 0 + + outline + + + + email + + editable + + + 2 + 1 + 1 + 2 + 0 + + outline + + + + streetnumber + + editable + + + 0 + 2 + 1 + 2 + 0 + + outline + + + + street + + editable + + + 2 + 2 + 1 + 2 + 0 + + outline + + + + postal + + editable + + + 0 + 3 + 1 + 2 + 0 + + outline + + + + city + + editable + + + 2 + 3 + 1 + 2 + 0 + + outline + + + + type + + editable + + + 0 + 4 + 1 + 4 + 0 + + outline + + + + income + + editable + + + 0 + 5 + 1 + 2 + 0 + + outline + + + + loan_amount + + editable + + + 2 + 5 + 1 + 2 + 0 + + outline + + + + period + + editable + + + 0 + 6 + 1 + 2 + 0 + + outline + + + + monthly_payment + + visible + + + 2 + 6 + 1 + 2 + 0 + + outline + + + + + + t25 + 48 + 144 + + + 0 + + + + system + + true + + + + author + + true + + + + t25_finish + + + + + + + + + t3 + 400 + 48 + + + 0 + + + loan_officer + + true + + + + property_appraiser + + true + + + + DataGroup + grid + + application_form + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + appraised_value + + hidden + + + 0 + 1 + 1 + 4 + 0 + + outline + + + + + + t4 + 464 + 560 + + + 0 + + + account_clerk + + false + + + + loan_officer + + false + + + + property_appraiser + + false + + + + system + + false + + + + author + + true + + + + DataGroup + grid + + status + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + application_form + + visible + + + 0 + 1 + 1 + 4 + 0 + + outline + + + + + + t5 + 624 + 464 + + + 0 + + + author + + true + + + + DataGroup + grid + + delete_instruction + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + + t5_finish + + + + + + + + + t7 + 368 + 336 + + + 0 + + + loan_officer + + true + + + + DataGroup + grid + + text_3 + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + + t7_finish + + + + + + + + + t8 + 368 + 208 + + + 0 + + + loan_officer + + true + + + + DataGroup + grid + + text_2 + + visible + + + 0 + 0 + 1 + 4 + 0 + + outline + + + + + t8_finish + + + + + + + + + p10 + 496 + 208 + 0 + false + + + p11 + 752 + 208 + 0 + false + + + p12 + 1008 + 208 + 0 + false + + + p13 + 624 + 336 + 0 + false + + + p16 + 1200 + 144 + 0 + false + + + p17 + 1456 + 144 + 0 + false + + + p18 + 1680 + 208 + 0 + false + + + p19 + 1200 + 272 + 0 + false + + + p2 + 48 + 272 + + 0 + false + + + p20 + 1456 + 272 + 0 + false + + + p23 + 752 + 560 + 0 + false + + + p24 + 48 + 48 + + 1 + false + + + p3 + 304 + 144 + 0 + false + + + p5 + 368 + 464 + 0 + false + + + p8 + 304 + 272 + 0 + false + + + a10 + read + p5 + t4 + 1 + + + a12 + regular + p5 + t5 + 1 + + + a15 + regular + t2 + p8 + 1 + + + a16 + regular + p8 + t7 + 1 + + + a18 + regular + p8 + t8 + 1 + + + a19 + regular + t8 + p10 + 1 + + + a21 + regular + p10 + t10 + 1 + + + a22 + regular + t10 + p11 + 1 + + + a23 + regular + p11 + t11 + 1 + + + a24 + regular + t11 + p12 + 1 + + + a26 + regular + t7 + p13 + 1 + + + a27 + regular + p13 + t5 + 1 + + + a3 + regular + p2 + t2 + 1 + + + a30 + regular + p11 + t15 + 1 + + + a31 + regular + t15 + p13 + 1 + + + a33 + regular + p12 + t17 + 1 + + + a34 + regular + t17 + p16 + 1 + + + a37 + regular + p17 + t19 + 1 + + + a38 + regular + t19 + p18 + 1 + + + a4 + regular + t2 + p3 + 1 + + + a40 + regular + t17 + p19 + 1 + + + a41 + regular + p19 + t21 + 1 + + + a42 + regular + t21 + p20 + 1 + + + a43 + regular + p20 + t19 + 1 + + + a45 + regular + p16 + t23 + 1 + + + a46 + regular + t23 + p17 + 1 + + + a48 + regular + t5 + p23 + 1 + + + a49 + regular + p24 + t25 + 1 + + + a50 + regular + t25 + p2 + 1 + + + a6 + read + p3 + t3 + 1 + + + a8 + regular + t2 + p5 + 1 + + \ No newline at end of file diff --git a/src/test/resources/petriNets/transaction/transaction_test.xml b/src/test/resources/petriNets/transaction/transaction_test.xml new file mode 100644 index 00000000000..db63f8b9146 --- /dev/null +++ b/src/test/resources/petriNets/transaction/transaction_test.xml @@ -0,0 +1,633 @@ + + transaction_test + 1.0.0 + TRN + transaction_test + device_hub + true + true + false + + + text_without_action + + </data> + + <data type="boolean"> + <id>was_transaction_rolled_back</id> + <title/> + </data> + + <data type="button"> + <id>testBasicTransaction</id> + <title/> + <event type="set"> + <id>testBasicTransaction</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + createCase("transaction_test", "onButton") + change text_without_action value { "xxx" } + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testBasicTransactionWithFailure</id> + <title/> + <event type="set"> + <id>testBasicTransactionWithFailure</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + deleteCase(findCase({it.title.eq("toBeRemoved")})) + createCase("transaction_test", "onButton") + change text_without_action value { "xxx" } + // not runtime exception on purpose + throw new IllegalAccessException("error") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testFailureInCallBackThrowsError</id> + <title/> + <event type="set"> + <id>testFailureInCallBackThrowsError</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + createCase("transaction_test", "onButton") + change text_without_action value { "xxx" } + throw new RuntimeException("error") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { + throw new RuntimeException("error") + createCase("transaction_test", "onRollBack") + } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testTimeout</id> + <title/> + <event type="set"> + <id>testTimeout</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + timeout: 1, // in millis + event: { + createCase("transaction_test", "onButton") + Thread.sleep(50) // make sure it will time-out + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testElasticIndexingOnTransactionFailure</id> + <title/> + <event type="set"> + <id>testElasticIndexingOnTransactionFailure</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + petriNetService.importPetriNet(new com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams( + new java.io.FileInputStream("src/test/resources/petriNets/transaction/transaction_test_secondary.xml"), + com.netgrif.application.engine.petrinet.domain.VersionType.MAJOR, + userService.getLoggedOrSystem().transformToLoggedUser())) + def toBeRemovedCase = createCase("transaction_test_secondary", "toBeRemoved") + assignTask("t1", toBeRemovedCase) + deleteCase(toBeRemovedCase) + + createCase("transaction_test", "onButton") + throw new RuntimeException("error") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testElasticIndexingOnTransactionSuccess</id> + <title/> + <event type="set"> + <id>testElasticIndexingOnTransactionSuccess</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + petriNetService.importPetriNet(new com.netgrif.application.engine.petrinet.domain.params.ImportPetriNetParams( + new java.io.FileInputStream("src/test/resources/petriNets/transaction/transaction_test_secondary.xml"), + com.netgrif.application.engine.petrinet.domain.VersionType.MAJOR, + userService.getLoggedOrSystem().transformToLoggedUser())) + def toBeRemovedCase = createCase("transaction_test_secondary", "toBeRemoved") + assignTask("t1", toBeRemovedCase) + deleteCase(toBeRemovedCase) + + createCase("transaction_test", "onButton") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testTransactionWriteConflict</id> + <title/> + <event type="set"> + <id>testTransactionWriteConflict</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testTransactionWriteConflictNested: f.testTransactionWriteConflictNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testTransactionWriteConflictNested value { "some text value" } + change text_without_action value { "not nested" } // should be conflicted + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testTransactionWriteConflictNested</id> + <title/> + <event type="set"> + <id>testTransactionWriteConflictNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testTransactionWriteConflictNested: f.testTransactionWriteConflictNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + forceCreation: true, + event: { + change text_without_action value { "nested" } + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testNestedJoinedTransactions</id> + <title/> + <event type="set"> + <id>testNestedJoinedTransactions</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testNestedJoinedTransactionsNested: f.testNestedJoinedTransactionsNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testNestedJoinedTransactionsNested value { "some text value" } + createCase("transaction_test", "onButton") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testNestedJoinedTransactionsNested</id> + <title/> + <event type="set"> + <id>testNestedJoinedTransactionsNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + createCase("transaction_test", "onButtonNested") + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testNestedDifferentTransactions</id> + <title/> + <event type="set"> + <id>testNestedDifferentTransactions</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testNestedDifferentTransactionsNested: f.testNestedDifferentTransactionsNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testNestedDifferentTransactionsNested value { "some text value" } + createCase("transaction_test", "onButton") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testNestedDifferentTransactionsNested</id> + <title/> + <event type="set"> + <id>testNestedDifferentTransactionsNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + forceCreation: true, + event: { + createCase("transaction_test", "onButtonNested") + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testNestedJoinedTransactionsWithFailureInParentTransaction</id> + <title/> + <event type="set"> + <id>testNestedJoinedTransactionsWithFailureInParentTransaction</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testNestedJoinedTransactionsWithFailureInParentTransactionNested: f.testNestedJoinedTransactionsWithFailureInParentTransactionNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testNestedJoinedTransactionsWithFailureInParentTransactionNested value { "some text value" } + createCase("transaction_test", "onButton") + throw new RuntimeException("error") // exception must be thrown after execution of nested action + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testNestedJoinedTransactionsWithFailureInParentTransactionNested</id> + <title/> + <event type="set"> + <id>testNestedJoinedTransactionsWithFailureInParentTransactionNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + createCase("transaction_test", "onButtonNested") + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testNestedJoinedTransactionsWithFailureInNestedTransaction</id> + <title/> + <event type="set"> + <id>testNestedJoinedTransactionsWithFailureInNestedTransaction</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testNestedJoinedTransactionsWithFailureInNestedTransactionNested: f.testNestedJoinedTransactionsWithFailureInNestedTransactionNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testNestedJoinedTransactionsWithFailureInNestedTransactionNested value { "some text value" } + createCase("transaction_test", "onButton") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testNestedJoinedTransactionsWithFailureInNestedTransactionNested</id> + <title/> + <event type="set"> + <id>testNestedJoinedTransactionsWithFailureInNestedTransactionNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + createCase("transaction_test", "onButtonNested") + throw new RuntimeException("error") + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testNestedDifferentTransactionsWithFailureInParentTransaction</id> + <title/> + <event type="set"> + <id>testNestedDifferentTransactionsWithFailureInParentTransaction</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testNestedDifferentTransactionsWithFailureInParentTransactionNested: f.testNestedDifferentTransactionsWithFailureInParentTransactionNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testNestedDifferentTransactionsWithFailureInParentTransactionNested value { "some text value" } + createCase("transaction_test", "onButton") + throw new RuntimeException("error") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testNestedDifferentTransactionsWithFailureInParentTransactionNested</id> + <title/> + <event type="set"> + <id>testNestedDifferentTransactionsWithFailureInParentTransactionNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + forceCreation: true, + event: { + createCase("transaction_test", "onButtonNested") + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testNestedDifferentTransactionsWithFailureInNestedTransaction</id> + <title/> + <event type="set"> + <id>testNestedDifferentTransactionsWithFailureInNestedTransaction</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + testNestedDifferentTransactionsWithFailureInNestedTransactionNested: f.testNestedDifferentTransactionsWithFailureInNestedTransactionNested, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + change testNestedDifferentTransactionsWithFailureInNestedTransactionNested value { "some text value" } + createCase("transaction_test", "onButton") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { createCase("transaction_test", "onRollBack") } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + <data type="text"> + <id>testNestedDifferentTransactionsWithFailureInNestedTransactionNested</id> + <title/> + <event type="set"> + <id>testNestedDifferentTransactionsWithFailureInNestedTransactionNested</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + forceCreation: true, + event: { + createCase("transaction_test", "onButtonNested") + throw new RuntimeException("error") + }, + onCommit: { createCase("transaction_test", "onCommitNested") }, + onRollBack: { createCase("transaction_test", "onRollBackNested") } + ) + createCase("transaction_test", "onAlwaysNested") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testRollBackErrorCurrying</id> + <title/> + <event type="set"> + <id>testRollBackErrorCurrying</id> + <actions phase="post"> + <action> + was_transaction_rolled_back: f.was_transaction_rolled_back, + text_without_action: f.text_without_action; + + def myTransaction = transaction( + event: { + createCase("transaction_test", "onButton") + throw new IllegalArgumentException("argument is initialized") + }, + onCommit: { createCase("transaction_test", "onCommit") }, + onRollBack: { e -> + if (e != null && e instanceof IllegalArgumentException) { + createCase("transaction_test", e.getMessage()) + } + } + ) + createCase("transaction_test", "onAlways") + + change was_transaction_rolled_back value { myTransaction.wasRolledBack } + </action> + </actions> + </event> + </data> + + <data type="button"> + <id>testCreateCaseInTransactionPerformance</id> + <title/> + <event type="set"> + <id>testCreateCaseInTransactionPerformance</id> + <actions phase="post"> + <action> + transaction { + createCase("transaction_test", "transactional create case") + } + </action> + </actions> + </event> + </data> + <data type="button"> + <id>testCreateCasePerformance</id> + <title/> + <event type="set"> + <id>testCreateCasePerformance</id> + <actions phase="post"> + <action> + createCase("transaction_test", "non transactional create case") + </action> + </actions> + </event> + </data> + <data type="number"> + <id>iterations</id> + <title/> + </data> + + <transition> + <id>t1</id> + <x>496</x> + <y>144</y> + <label>t1</label> + </transition> +</document> \ No newline at end of file diff --git a/src/test/resources/petriNets/transaction/transaction_test_secondary.xml b/src/test/resources/petriNets/transaction/transaction_test_secondary.xml new file mode 100644 index 00000000000..690dbad2591 --- /dev/null +++ b/src/test/resources/petriNets/transaction/transaction_test_secondary.xml @@ -0,0 +1,34 @@ +<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd"> + <id>transaction_test_secondary</id> + <version>1.0.0</version> + <initials>TRS</initials> + <title>transaction_test_secondary + device_hub + true + true + false + + + text_without_action + + </data> + <data type="text"> + <id>text_2</id> + <title/> + </data> + + <transition> + <id>t1</id> + <x>496</x> + <y>144</y> + <label>t1</label> + <event type="assign"> + <id>1</id> + <actions phase="post"> + <action> + createCase("transaction_test", "toBeRemovedNestedOnFailure") + </action> + </actions> + </event> + </transition> +</document> \ No newline at end of file diff --git a/src/test/resources/test_setData.xml b/src/test/resources/test_setData.xml index 86fde7e4000..50962c23298 100644 --- a/src/test/resources/test_setData.xml +++ b/src/test/resources/test_setData.xml @@ -28,6 +28,16 @@ <data type="button"> <id>button_1</id> <title/> + <event type="set"> + <id>0</id> + <actions phase="pre"> + <action> + button_0: f.button_0; + + change button_0 value { 1337 } + </action> + </actions> + </event> </data> <transition> <id>t1</id> diff --git a/src/test/resources/transactional_task_event_test.xml b/src/test/resources/transactional_task_event_test.xml new file mode 100644 index 00000000000..726fb0bd33c --- /dev/null +++ b/src/test/resources/transactional_task_event_test.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd"> + <id>transactional_task_event_test</id> + <initials>TST</initials> + <title>Test + true + + assignTest + 0 + 0 + + + 1 + + + createCase("transactional_task_event_test", "CasePre") + + + + + createCase("transactional_task_event_test", "CasePost") + throw new RuntimeException("error on purpose") + + + + + + cancelTest + 0 + 0 + + + 2 + + + createCase("transactional_task_event_test", "CasePre") + + + + + createCase("transactional_task_event_test", "CasePost") + throw new RuntimeException("error on purpose") + + + + + + finishTest + 0 + 0 + + + 3 + + + createCase("transactional_task_event_test", "CasePre") + + + + + createCase("transactional_task_event_test", "CasePost") + throw new RuntimeException("error on purpose") + + + + + \ No newline at end of file diff --git a/src/test/resources/userrefs_test.xml b/src/test/resources/userrefs_test.xml index e2b0c67e704..1971de0e989 100644 --- a/src/test/resources/userrefs_test.xml +++ b/src/test/resources/userrefs_test.xml @@ -89,7 +89,7 @@ userList: f.user_list_1, email: f.email; - change userList value { [userService.findByEmail(email.value, true).id] } + change userList value { [userService.findByEmail(email.value).id] }