diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/AsyncRunnerWrapper.java b/application-engine/src/main/groovy/com/netgrif/application/engine/AsyncRunnerWrapper.java new file mode 100644 index 0000000000..20731407f2 --- /dev/null +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/AsyncRunnerWrapper.java @@ -0,0 +1,32 @@ +package com.netgrif.application.engine; + +import com.netgrif.application.engine.auth.config.WorkspaceContextHolder; +import com.netgrif.application.engine.auth.service.UserService; +import groovy.lang.Closure; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AsyncRunnerWrapper { + private final AsyncRunner async; + private final UserService userService; + + public void run(Closure closure) { + run(closure, userService.getLoggedOrSystem().getWorkspaceId()); + } + + public void run(Closure closure, String workspaceId) { + WorkspaceContextHolder.setWorkspaceId(workspaceId, true); + async.run(closure); + } + + public void execute(final Runnable runnable) { + execute(runnable, userService.getLoggedOrSystem().getWorkspaceId()); + } + + public void execute(final Runnable runnable, String workspaceId) { + WorkspaceContextHolder.setWorkspaceId(workspaceId, true); + async.execute(runnable); + } +} diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/DevConsole.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/DevConsole.groovy index 81fc5f265c..93f98a4bc3 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/DevConsole.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/DevConsole.groovy @@ -1,5 +1,6 @@ package com.netgrif.application.engine +import com.netgrif.application.engine.objects.auth.domain.LoggedUser import com.netgrif.application.engine.objects.importer.model.Document import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.workflow.domain.repositories.CaseRepository @@ -7,6 +8,7 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Profile +import org.springframework.security.core.Authentication import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RequestMapping @@ -33,15 +35,17 @@ class DevConsole { private PetriNetRepository netRepository @GetMapping(value = "/dataset/{title}", produces = APPLICATION_JSON_VALUE) - String dataset(@PathVariable String title) { - def useCase = caseRepository.findAll().find { it.title == title } + String dataset(@PathVariable String title, Authentication auth) { + LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); + def useCase = caseRepository.findAllByWorkspaceId(loggedUser.getWorkspaceId()).find { it.title == title } return "{ ${useCase?.dataSet?.collect { "\"${useCase?.petriNet?.dataSet?.get(it?.key)?.importId}:${useCase?.petriNet?.dataSet?.get(it?.key)?.name?.toString()?.replaceAll("\n[ ]{2}", "")}\":\"${it?.value?.value as String}\"" }?.join(", ")} }" } @GetMapping(value = "/net/{title}", produces = APPLICATION_XML_VALUE) - String netSnapshot(@PathVariable String title) { + String netSnapshot(@PathVariable String title, Authentication auth) { try { - def useCase = caseRepository.findAll().find { it.title == title } + LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); + def useCase = caseRepository.findAllByWorkspaceId(loggedUser.getWorkspaceId()).find { it.title == title } def net = useCase.petriNet def xml = new File(net.importXmlPath) diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy index 926624c09b..eda15072ae 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/migration/ActionMigration.groovy @@ -24,7 +24,7 @@ class ActionMigration { void migrateActions(String petriNetPath) { InputStream netStream = new ClassPathResource(petriNetPath).inputStream - ImportPetriNetEventOutcome newPetriNet = petriNetService.importPetriNet(netStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())) + ImportPetriNetEventOutcome newPetriNet = petriNetService.importPetriNet(netStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()) List oldPetriNets if(newPetriNet.getNet() != null) { diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy index d90dc30fed..2d7fc2aa8d 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy @@ -2,6 +2,7 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action import com.netgrif.application.engine.AsyncRunner +import com.netgrif.application.engine.AsyncRunnerWrapper import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService import com.netgrif.application.engine.adapter.spring.workflow.domain.QCase import com.netgrif.application.engine.adapter.spring.workflow.domain.QTask @@ -61,6 +62,7 @@ import com.netgrif.application.engine.workflow.service.TaskService import com.netgrif.application.engine.workflow.service.interfaces.* import com.netgrif.application.engine.workflow.web.responsebodies.MessageResource import com.netgrif.application.engine.workflow.web.responsebodies.TaskReference +import com.querydsl.core.BooleanBuilder import com.querydsl.core.types.Predicate import groovy.transform.NamedVariant import org.bson.types.ObjectId @@ -120,7 +122,7 @@ class ActionDelegate { IPetriNetService petriNetService @Autowired - AsyncRunner async + AsyncRunnerWrapper async @Autowired IPdfGenerator pdfGenerator @@ -1983,9 +1985,9 @@ class ActionDelegate { * @return */ def deleteMenuItem(Case item) { - async.run { + async.run({ workflowService.deleteCase(item.stringId) - } + }, item.getWorkspaceId()); } /** diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FieldActionsRunner.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FieldActionsRunner.groovy index b4b1c6ba7a..05f0dfa061 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FieldActionsRunner.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/FieldActionsRunner.groovy @@ -1,5 +1,6 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action +import com.netgrif.application.engine.auth.config.WorkspaceContextHolder import com.netgrif.application.engine.business.IPostalCodeService import com.netgrif.application.engine.business.orsr.IOrsrService import com.netgrif.application.engine.importer.service.FieldFactory @@ -43,11 +44,11 @@ abstract class FieldActionsRunner { private Map actionsCache = new HashMap<>() - List run(com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.action.Action action, Case useCase, Map params, List functions = []) { - return run(action, useCase, Optional.empty(), params, functions) + List run(com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.action.Action action, Case useCase, Map params, String workspaceId, List functions = []) { + return run(action, useCase, Optional.empty(), params, workspaceId, functions) } - List run(com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.action.Action action, Case useCase, Optional task, Map params, List functions = []) { + List run(com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.action.Action action, Case useCase, Optional task, Map params, String workspaceId, List functions = []) { if (!actionsCache) actionsCache = new HashMap<>() @@ -56,6 +57,7 @@ abstract class FieldActionsRunner { final ActionStartEvent actionStart = new ActionStartEvent(action) try { publisher.publishEvent(actionStart) + WorkspaceContextHolder.setWorkspaceId(useCase != null ? useCase.getWorkspaceId() : workspaceId, true); code.init(action, useCase, task, this, params) code() publisher.publishEvent(new ActionStopEvent(action, actionStart, true)) diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/CaseFieldsExpressionRunner.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/CaseFieldsExpressionRunner.groovy index 95ab7bce86..1bce816941 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/CaseFieldsExpressionRunner.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/CaseFieldsExpressionRunner.groovy @@ -1,5 +1,6 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action.runner +import com.netgrif.application.engine.auth.config.WorkspaceContextHolder import com.netgrif.application.engine.event.IGroovyShellFactory import com.netgrif.application.engine.elastic.service.executors.MaxSizeHashMap import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.ActionDelegate @@ -42,6 +43,7 @@ abstract class CaseFieldsExpressionRunner { logger().debug("Expression: $expression") def code = getExpressionCode(expression) try { + WorkspaceContextHolder.setWorkspaceId(useCase.getWorkspaceId(), true); initCode(code.delegate, useCase, fields, params) code() } catch (Exception e) { diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/RoleActionsRunner.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/RoleActionsRunner.groovy index 52b8577053..7b1d23c1e0 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/RoleActionsRunner.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/runner/RoleActionsRunner.groovy @@ -1,11 +1,10 @@ package com.netgrif.application.engine.petrinet.domain.dataset.logic.action.runner - +import com.netgrif.application.engine.auth.config.WorkspaceContextHolder import com.netgrif.application.engine.event.IGroovyShellFactory import com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.action.Action import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.context.RoleContext import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.delegate.RoleActionDelegate -import org.codehaus.groovy.control.CompilerConfiguration import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired @@ -34,6 +33,7 @@ abstract class RoleActionsRunner { log.debug("Action: $action") def code = getActionCode(action) try { + WorkspaceContextHolder.setWorkspaceId(roleContext.petriNet.getWorkspaceId(), true); code.init(action, roleContext, params) code() } catch (Exception e) { diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy index e059f5b5bb..4c7e6fd460 100644 --- a/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy +++ b/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy @@ -7,7 +7,6 @@ import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepos import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.petrinet.service.interfaces.IUriService import com.netgrif.application.engine.startup.runner.SuperCreatorRunner -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 import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService @@ -52,15 +51,9 @@ class ImportHelper { private static final Logger log = LoggerFactory.getLogger(ImportHelper.class.name) - @Autowired - private PetriNetRepository petriNetRepository - @Autowired private UserService userService - @Autowired - private CaseRepository caseRepository - @Autowired private AuthorityService authorityService @@ -119,7 +112,11 @@ class ImportHelper { Optional createNet(String fileName, VersionType release = VersionType.MAJOR, LoggedUser author = userService.transformToLoggedUser(userService.getSystem()), String uriNodeId = uriService.getDefault().stringId) { InputStream netStream = new ClassPathResource("petriNets/$fileName" as String).inputStream - PetriNet petriNet = petriNetService.importPetriNet(netStream, release, author, uriNodeId).getNet() + return createNet(netStream, release, author, uriNodeId) + } + + Optional createNet(InputStream netStream, VersionType release = VersionType.MAJOR, LoggedUser author = userService.transformToLoggedUser(userService.getSystem()), String uriNodeId = uriService.getDefault().stringId) { + PetriNet petriNet = petriNetService.importPetriNet(netStream, release, author, uriNodeId, author.getWorkspaceId()).getNet() log.info("Imported '${petriNet?.title?.defaultValue}' ['${petriNet?.identifier}', ${petriNet?.stringId}]") return Optional.of(petriNet) } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/RegistrationService.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/RegistrationService.java index 9d56ca0ce0..789d3bc33b 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/RegistrationService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/RegistrationService.java @@ -11,6 +11,8 @@ import com.netgrif.application.engine.configuration.properties.ServerAuthProperties; import com.netgrif.application.engine.auth.service.GroupService; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; +import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -45,6 +47,8 @@ public class RegistrationService implements IRegistrationService { private ServerAuthProperties serverAuthProperties; @Autowired private ProcessRoleService processRoleService; + @Autowired + private DefaultWorkspaceService defaultWorkspaceService; @Override @Transactional @@ -132,7 +136,12 @@ public User createNewUser(NewUserRequest newUser) { if (newUser.processRoles != null && !newUser.processRoles.isEmpty()) { user.setProcessRoles(new HashSet<>(processRole.findByIds(newUser.processRoles))); } - userService.addRole(user, processRoleService.getDefaultRole().getStringId()); + Set roles = user.getProcessRoles(); + defaultWorkspaceService.getAllWorkspaces().forEach(workspace -> + roles.add(processRoleService.defaultRole(workspace.getId())) + ); + user.setProcessRoles(roles); + user = (User) userService.saveUser(user, null); if (newUser.groups != null && !newUser.groups.isEmpty()) { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java index ba3c287634..589327a454 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/service/UserResourceHelperService.java @@ -31,6 +31,7 @@ public UserResource getResource(LoggedUser loggedUser, Locale locale, boolean sm User result = loggedUser.isImpersonating() ? getLocalisedUser(user, getImpersonated(loggedUser, small), locale) : getLocalisedUser(user, locale); + result.setWorkspaceId(loggedUser.getWorkspaceId()); return new UserResource(result, "profile"); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java index d5dda0d26b..72b70515b1 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/UserController.java @@ -4,7 +4,15 @@ import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; import com.netgrif.application.engine.auth.service.*; import com.netgrif.application.engine.auth.web.requestbodies.PreferencesRequest; +import com.netgrif.application.engine.auth.web.requestbodies.UpdateUserRequest; import com.netgrif.application.engine.auth.web.requestbodies.UserCreateRequest; +import com.netgrif.application.engine.auth.web.responsebodies.*; +import com.netgrif.application.engine.configuration.properties.ServerAuthProperties; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.Workspace; +import com.netgrif.application.engine.security.service.ISecurityContextService; +import com.netgrif.application.engine.workflow.web.responsebodies.MessageResource; +import com.netgrif.application.engine.workflow.web.responsebodies.ResourceLinkAssembler; import com.netgrif.application.engine.auth.web.requestbodies.UserSearchRequestBody; import com.netgrif.application.engine.auth.web.responsebodies.PreferencesResource; import com.netgrif.application.engine.auth.web.responsebodies.User; @@ -25,6 +33,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.springframework.hateoas.MediaTypes; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -53,6 +62,9 @@ public class UserController { private final PreferencesService preferencesService; private final AuthorityService authorityService; private final RealmService realmService; + private final DefaultWorkspaceService workspaceService; + private final ServerAuthProperties serverAuthProperties; + private final ISecurityContextService securityContextService; private final UserFactory userFactory; @Operation(summary = "Create a new user", description = "Creates a new user in the realm specified by id.") @@ -167,37 +179,17 @@ public ResponseEntity getUser(@PathVariable("realmId") String realmId, @Pa } catch (IllegalArgumentException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } + user.setWorkspaceId(actualUser.getWorkspaceId()); return ResponseEntity.ok(userFactory.getUser(user, locale)); } -// todo step 2, only used in test on frontend -// @Operation(summary = "Update user", security = {@SecurityRequirement(name = "X-Auth-Token")}) -// @PostMapping(value = "/update", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) -// public ResponseEntity updateUser(@RequestBody UpdateUserRequest updates, Authentication auth, Locale locale) { + @Operation(summary = "Get all workspaces", security = {@SecurityRequirement(name = "BasicAuth")}) + @GetMapping(value = "/workspaces", produces = MediaTypes.HAL_JSON_VALUE) + public List getAllWorkspaces() { + List workspaces = workspaceService.getAllWorkspaces(); - /// / todo should this be kept? not relevant anymore? -// if (!serverAuthProperties.isEnableProfileEdit()) { -// return null; -// } -// LoggedUser loggedUser = (LoggedUser) auth.getPrincipal(); -// String userId = updates.getStringId(); -// IUser user; -// try { -// user = userService.findById(userId, updatedUser.getRealmId()); -// } catch (IllegalArgumentException e) { -// log.error("Could not find user with id [{}]", userId, e); -// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); -// } -// user = userService.update(user, updates.getUpdatedUser()); -// securityContextService.saveToken(userId); -// if (Objects.equals(loggedUser.getId(), userId)) { -// loggedUser.setFirstName(user.getFirstName()); -// loggedUser.setLastName(user.getLastName()); -// securityContextService.reloadSecurityContext(loggedUser); -// } -// log.info("Updating user " + user.getEmail() + " with data " + updatedUser); -// return ResponseEntity.ok(User.createUser(user)); -// } + return workspaces.stream().map(w -> new WorkspaceResponse(w.getId(), w.isDefaultWorkspace())).collect(Collectors.toList()); + } // todo not used on front, is it needed? // @Operation(summary = "Get all users with specified roles", security = {@SecurityRequirement(name = "X-Auth-Token")}) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UpdateUserRequest.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UpdateUserRequest.java index e2f12db51a..c40b0fbe59 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UpdateUserRequest.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/requestbodies/UpdateUserRequest.java @@ -27,6 +27,8 @@ public class UpdateUserRequest implements IUser, Serializable { public String surname; + public String workspaceId; + public UpdateUserRequest() { } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/AuthoritiesResources.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/AuthoritiesResources.java deleted file mode 100644 index 3762f54057..0000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/AuthoritiesResources.java +++ /dev/null @@ -1,17 +0,0 @@ -//package com.netgrif.application.engine.auth.web.responsebodies; -// -// -//import com.netgrif.application.engine.objects.auth.domain.Authority; -//import com.netgrif.application.engine.auth.web.UserController; -//import org.springframework.hateoas.CollectionModel; -//import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; -// -//public class AuthoritiesResources extends CollectionModel { -// public AuthoritiesResources(Iterable content) { -// super(content); -// } -// -// public AuthoritiesResources() { -// } -// -//} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/IProcessRoleFactory.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/IProcessRoleFactory.java deleted file mode 100644 index 3302cc2b4f..0000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/IProcessRoleFactory.java +++ /dev/null @@ -1,7 +0,0 @@ -//package com.netgrif.application.engine.auth.web.responsebodies; -// -//import java.util.Locale; -// -//public interface IProcessRoleFactory { -// ProcessRole getProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale); -//} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/IUserFactory.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/IUserFactory.java deleted file mode 100644 index a6514d7dc2..0000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/IUserFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -//package com.netgrif.application.engine.auth.web.responsebodies; -// -//import com.netgrif.application.engine.objects.auth.domain.IUser; -// -//import java.util.Locale; -// -//public interface UserFactory { -// /** -// * @param user the domain User object we want to send to frontend -// * @param locale the locale for translations -// * @return a full version of the user response object, that has all of its attributes set -// */ -// User getUser(IUser user, Locale locale); -// -// /** -// * @param user the domain User object we want to send to frontend -// * @return a small version of the user response object, that has its large attributes (roles, groups, authorities...) cleared -// */ -// User getSmallUser(IUser user); -//} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRole.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRole.java deleted file mode 100644 index 46cf106169..0000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/ProcessRole.java +++ /dev/null @@ -1,36 +0,0 @@ -//package com.netgrif.application.engine.auth.web.responsebodies; -// -//import lombok.Data; -// -//import java.util.Locale; -// -//@Data -//public class ProcessRole { -// -// private String stringId; -// -// private String name; -// -// private String description; -// -// private String importId; -// -// // net attributes are set in the Factory service -// private String netImportId; -// -// private String netVersion; -// -// private String netStringId; -// -// /** -// * The constructor doesn't set attributes regarding the Petri net. -// * -// * Use the ProcessRoleFactory to create instances that have these attributes set. -// */ -// public ProcessRole(com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole role, Locale locale) { -// stringId = role.getStringId(); -// name = role.getLocalisedName(locale); -// description = role.getDescription(); -// importId = role.getImportId(); -// } -//} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java deleted file mode 100644 index 9cdbbc913c..0000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java +++ /dev/null @@ -1,67 +0,0 @@ -//package com.netgrif.application.engine.auth.web.responsebodies; -// -//import com.netgrif.application.engine.objects.auth.domain.Authority; -//import com.netgrif.application.engine.objects.auth.domain.Group; -//import com.netgrif.application.engine.objects.auth.domain.IUser; -//import lombok.Data; -// -//import java.util.Set; -//import java.util.stream.Collectors; -// -//@Data -//public class User { -// -// private String id; -// -// private String email; -// -// private String telNumber; -// -// private String avatar; -// -// private String name; -// -// private String surname; -// -// private String fullName; -// -// private Set authorities; -// -// // process roles are set with the factory -// private Set processRoles; -// -// private Set nextGroups; -// -// private User impersonated; -// -// protected User(IUser user) { -// id = user.getStringId(); -// email = user.getEmail(); -// avatar = user.getAvatar(); -// name = user.getFirstName(); -// surname = user.getLastName(); -// fullName = user.getFullName(); -// } -// -// /** -// * This static method doesn't set attributes regarding the ProcessRoles -// * -// * Use the UserFactory service to create instances that have these attributes set. -// */ -// public static User createSmallUser(IUser user) { -// return new User(user); -// } -// -// /** -// * This static method doesn't set attributes regarding the ProcessRoles -// * -// * Use the UserFactory service to create instances that have these attributes set. -// */ -// public static User createUser(IUser user) { -// User result = new User(user); -// result.setTelNumber(user.getTelNumber()); -// result.setAuthorities(user.getAuthorities()); -// result.setNextGroups(user.getGroups().stream().map(Group::getStringId).collect(Collectors.toSet())); -// return result; -// } -//} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserFactory.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserFactory.java deleted file mode 100644 index 2bb66eaf76..0000000000 --- a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/UserFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -//package com.netgrif.application.engine.auth.web.responsebodies; -// -//import com.netgrif.application.engine.objects.auth.domain.IUser; -//import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; -//import org.springframework.beans.factory.annotation.Autowired; -// -//import java.util.Locale; -//import java.util.stream.Collectors; -// -//public class UserFactory implements UserFactory { -// -// @Autowired -// private ProcessRoleService processRoleService; -// -// @Autowired -// private IProcessRoleFactory processRoleFactory; -// -// @Override -// public User getUser(IUser user, Locale locale) { -// User result = getUser(user); -// -// String defaultRoleId = processRoleService.defaultRole().getStringId(); -// String anonymousRoleId = processRoleService.anonymousRole().getStringId(); -// result.setProcessRoles(user.getProcessRoles().stream().map(processRole -> { -// if (processRole.getStringId().equals(defaultRoleId)) { -// return new ProcessRole(processRole, locale); -// } -// if (processRole.getStringId().equals(anonymousRoleId)) { -// return new ProcessRole(processRole, locale); -// } -// return processRoleFactory.getProcessRole(processRole, locale); -// }).collect(Collectors.toSet())); -// -// return result; -// } -// -// @Override -// public User getSmallUser(IUser user) { -// return User.createSmallUser(user); -// } -// -// protected User getUser(IUser user) { -// return User.createUser(user); -// } -//} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/WorkspaceResponse.java b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/WorkspaceResponse.java new file mode 100644 index 0000000000..f755b00d85 --- /dev/null +++ b/application-engine/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/WorkspaceResponse.java @@ -0,0 +1,16 @@ +package com.netgrif.application.engine.auth.web.responsebodies; + +import lombok.Data; + +@Data +public class WorkspaceResponse { + + private String id; + + private boolean defaultWorkspace; + + public WorkspaceResponse(String id, boolean defaultWorkspace) { + this.id = id; + this.defaultWorkspace = defaultWorkspace; + } +} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/basic/NetgrifBasicAuthenticationProvider.java b/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/basic/NetgrifBasicAuthenticationProvider.java index bebe22693f..b81432880c 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/basic/NetgrifBasicAuthenticationProvider.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/basic/NetgrifBasicAuthenticationProvider.java @@ -1,10 +1,12 @@ package com.netgrif.application.engine.configuration.authentication.providers.basic; +import com.netgrif.application.engine.adapter.spring.auth.domain.LoggedUserImpl; import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.objects.auth.domain.IUser; import com.netgrif.application.engine.objects.auth.domain.User; import com.netgrif.application.engine.configuration.authentication.providers.NetgrifAuthenticationProvider; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.MessageSourceAccessor; @@ -28,6 +30,9 @@ public class NetgrifBasicAuthenticationProvider extends NetgrifAuthenticationPro @Autowired protected UserService userService; + @Autowired + protected DefaultWorkspaceService defaultWorkspaceService; + protected MessageSourceAccessor messages = SpringSecurityMessageSource.getAccessor(); protected PasswordEncoder passwordEncoder; @@ -61,8 +66,8 @@ public Authentication authenticate(Authentication authentication) throws Authent .getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); } - UserDetails userDetails = userService.transformToLoggedUser(user); - + LoggedUserImpl userDetails = userService.transformToLoggedUser(user); + userDetails.setWorkspaceId(defaultWorkspaceService.getDefaultWorkspace().getId()); UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(userDetails, presentedPassword, userDetails.getAuthorities()); result.setDetails(authentication.getDetails()); loginAttemptService.loginSucceeded(user.getStringId()); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/ldap/NetgrifLdapAuthenticationProvider.java b/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/ldap/NetgrifLdapAuthenticationProvider.java index 6ddec08254..7d1d377ece 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/ldap/NetgrifLdapAuthenticationProvider.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/configuration/authentication/providers/ldap/NetgrifLdapAuthenticationProvider.java @@ -1,9 +1,12 @@ package com.netgrif.application.engine.configuration.authentication.providers.ldap; +import com.netgrif.application.engine.adapter.spring.auth.domain.LoggedUserImpl; import com.netgrif.application.engine.configuration.authentication.providers.NetgrifAuthenticationProvider; import com.netgrif.application.engine.configuration.properties.NaeLdapProperties; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.ldap.NamingException; import org.springframework.ldap.core.DirContextOperations; @@ -38,6 +41,9 @@ @ConditionalOnExpression("${nae.ldap.enabled:false}") public class NetgrifLdapAuthenticationProvider extends NetgrifAuthenticationProvider { + @Autowired + protected DefaultWorkspaceService defaultWorkspaceService; + protected NaeLdapProperties ldapProperties; protected PasswordEncoder passwordEncoder; @@ -160,8 +166,9 @@ public Authentication authenticate(Authentication authentication) throws Authent Collection extraAuthorities = loadUserAuthorities(userData, username, password); - UserDetails user = userDetailsContextMapper.mapUserFromContext(userData, username, extraAuthorities); + LoggedUserImpl user = (LoggedUserImpl) userDetailsContextMapper.mapUserFromContext(userData, username, extraAuthorities); loginAttemptService.loginSucceeded(key); + user.setWorkspaceId(defaultWorkspaceService.getDefaultWorkspace().getId()); return createSuccessfulAuthentication(userToken, user); } catch (PasswordPolicyException ppe) { log.error(ppe.getStatus().getErrorCode() + ": " + ppe.getStatus().getDefaultMessage()); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/configuration/security/jwt/JwtService.java b/application-engine/src/main/java/com/netgrif/application/engine/configuration/security/jwt/JwtService.java index c808c707fb..9a7cc07996 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/configuration/security/jwt/JwtService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/configuration/security/jwt/JwtService.java @@ -5,6 +5,7 @@ import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.AuthorityService; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; @@ -33,6 +34,7 @@ public class JwtService implements IJwtService { private final JwtProperties properties; private final ProcessRoleService roleService; private final AuthorityService authorityService; + private final DefaultWorkspaceService defaultWorkspaceService; @PostConstruct private void resolveSecret() { @@ -81,6 +83,7 @@ public LoggedUser getLoggedUser(String token, String authority) { user.setFirstName(userMap.get("firstName").toString()); user.getAttributes().put("anonymous", new Attribute<>(true, false)); user.setProcessRoles(Collections.singleton(roleService.anonymousRole())); + user.setWorkspaceId(defaultWorkspaceService.getDefaultWorkspace().getId()); return user; } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java index 9a5da428d8..a42912573e 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/domain/ElasticPetriNetRepository.java @@ -11,7 +11,7 @@ public interface ElasticPetriNetRepository extends ElasticsearchRepository findAllByUriNodeId(String uriNodeId); + List findAllByUriNodeIdAndWorkspaceId(String uriNodeId, String workspaceId); void deleteAllByStringId(String id); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java index 3fd66f168c..38b40648fb 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticCaseService.java @@ -215,6 +215,7 @@ protected BoolQuery.Builder buildSingleQuery(CaseSearchRequest request, LoggedUs buildCaseIdQuery(request, query); buildUriNodeIdQuery(request, query); buildTagsQuery(request, query); + buildWorkspaceQuery(query, user); boolean resultAlwaysEmpty = buildGroupQuery(request, user, locale, query); // TODO: filtered query https://stackoverflow.com/questions/28116404/filtered-query-using-nativesearchquerybuilder-in-spring-data-elasticsearch diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java index d9fc4b0c08..da20d90cbc 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java @@ -1,5 +1,6 @@ package com.netgrif.application.engine.elastic.service; +import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.objects.elastic.domain.ElasticPetriNet; import com.netgrif.application.engine.elastic.domain.ElasticPetriNetRepository; import com.netgrif.application.engine.elastic.service.executors.Executor; @@ -21,12 +22,15 @@ public class ElasticPetriNetService implements IElasticPetriNetService { private final ElasticPetriNetRepository repository; + private final UserService userService; + private final Executor executors; private IPetriNetService petriNetService; - public ElasticPetriNetService(ElasticPetriNetRepository repository, Executor executors) { + public ElasticPetriNetService(ElasticPetriNetRepository repository, UserService userService, Executor executors) { this.repository = repository; + this.userService = userService; this.executors = executors; } @@ -86,7 +90,7 @@ public String findUriNodeId(PetriNet net) { @Override public List findAllByUriNodeId(String uriNodeId) { - List elasticPetriNets = repository.findAllByUriNodeId(uriNodeId); + List elasticPetriNets = repository.findAllByUriNodeIdAndWorkspaceId(uriNodeId, userService.getLoggedOrSystem().getWorkspaceId()); return petriNetService.findAllById(elasticPetriNets.stream().map(ElasticPetriNet::getStringId).collect(Collectors.toList())); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java index a23c427c76..f36fc0068f 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticTaskService.java @@ -204,6 +204,7 @@ protected BoolQuery.Builder buildSingleQuery(ElasticTaskSearchRequest request, L buildTransitionQuery(request, query); buildTagsQuery(request, query); buildStringQuery(request, query, user); + buildWorkspaceQuery(query, user); boolean resultAlwaysEmpty = buildGroupQuery(request, user, locale, query); if (resultAlwaysEmpty) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticViewPermissionService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticViewPermissionService.java index 0d355d014d..7a28a06e18 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticViewPermissionService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticViewPermissionService.java @@ -92,4 +92,10 @@ private BoolQuery union(BoolQuery setA, BoolQuery setB) { unionSet.should(setB._toQuery()); return unionSet.build(); } + + protected void buildWorkspaceQuery(BoolQuery.Builder query, LoggedUser user) { + BoolQuery.Builder workspaceQuery = new BoolQuery.Builder(); + workspaceQuery.must(termQuery("workspaceId", user.getWorkspaceId())._toQuery()); + query.filter(workspaceQuery.build()._toQuery()); + } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/export/service/ExportService.java b/application-engine/src/main/java/com/netgrif/application/engine/export/service/ExportService.java index 2c6ecb895d..eaf4e60fc9 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/export/service/ExportService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/export/service/ExportService.java @@ -12,11 +12,14 @@ import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.dataset.*; import com.netgrif.application.engine.objects.workflow.domain.Case; +import com.netgrif.application.engine.objects.workflow.domain.QCase; +import com.netgrif.application.engine.objects.workflow.domain.QTask; import com.netgrif.application.engine.objects.workflow.domain.Task; 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; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; +import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringEscapeUtils; @@ -91,10 +94,11 @@ public OutputStream fillCsvCaseData(Predicate predicate, File outFile, ExportDat @Override public OutputStream fillCsvCaseData(Predicate predicate, File outFile, ExportDataConfig config, int pageSize) throws FileNotFoundException { - int numOfPages = (int) (((caseRepository.count(predicate)) / pageSize) + 1); + Predicate newPredicate = new BooleanBuilder(predicate).and(QCase.case$.workspaceId.eq(userService.getLoggedOrSystem().getWorkspaceId())); + int numOfPages = (int) (((caseRepository.count(newPredicate)) / pageSize) + 1); List exportCases = new ArrayList<>(); for (int i = 0; i < numOfPages; i++) { - exportCases.addAll(workflowService.search(predicate, PageRequest.of(i, pageSize)).getContent()); + exportCases.addAll(workflowService.search(newPredicate, PageRequest.of(i, pageSize)).getContent()); } return buildCaseCsv(exportCases, config, outFile); } @@ -208,10 +212,11 @@ public OutputStream fillCsvTaskData(Predicate predicate, File outFile, ExportDat @Override public OutputStream fillCsvTaskData(Predicate predicate, File outFile, ExportDataConfig config, int pageSize) throws FileNotFoundException { - int numberOfTasks = (int) taskRepository.count(predicate); + Predicate newPredicate = new BooleanBuilder(predicate).and(QTask.task.workspaceId.eq(userService.getLoggedOrSystem().getWorkspaceId())); + int numberOfTasks = (int) taskRepository.count(newPredicate); List exportTasks = new ArrayList<>(); for (int i = 0; i < numberOfTasks; i++) { - exportTasks.addAll(taskService.search(predicate, PageRequest.of(i, pageSize)).getContent()); + exportTasks.addAll(taskService.search(newPredicate, PageRequest.of(i, pageSize)).getContent()); } return buildTaskCsv(exportTasks, config, outFile); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java b/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java index 344897081a..dbff49b14b 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/impersonation/service/ImpersonationAuthorizationService.java @@ -12,6 +12,7 @@ import com.netgrif.application.engine.objects.petrinet.domain.dataset.UserFieldValue; import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import com.netgrif.application.engine.utils.DateUtils; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.objects.workflow.domain.DataField; @@ -51,6 +52,9 @@ public class ImpersonationAuthorizationService implements IImpersonationAuthoriz @Autowired protected ProcessRoleService processRoleService; + @Autowired + private DefaultWorkspaceService defaultWorkspaceService; + @Override public Page getConfiguredImpersonationUsers(String query, LoggedUser impersonator, Pageable pageable) { if (impersonator.isAdmin()) { @@ -104,7 +108,9 @@ public List getAuthorities(List configs, IUser impersonated) { @Override public List getRoles(List configs, IUser impersonated) { List impersonatedRoles = new ArrayList<>(); - impersonatedRoles.add(processRoleService.defaultRole()); + defaultWorkspaceService.getAllWorkspaces().forEach(workspace -> + impersonatedRoles.add(processRoleService.defaultRole(workspace.getId())) + ); if (configs.isEmpty()) { return impersonatedRoles; } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/importer/service/Importer.java b/application-engine/src/main/java/com/netgrif/application/engine/importer/service/Importer.java index e6cb08bb2d..b62c701668 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/importer/service/Importer.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/importer/service/Importer.java @@ -127,9 +127,9 @@ public class Importer { private ILogicValidator logicValidator; @Transactional - public Optional importPetriNet(InputStream xml) throws MissingPetriNetMetaDataException, MissingIconKeyException { + public Optional importPetriNet(InputStream xml, String workspaceId) throws MissingPetriNetMetaDataException, MissingIconKeyException { try { - initialize(); + initialize(workspaceId); unmarshallXml(xml); return createPetriNet(); } catch (JAXBException e) { @@ -139,23 +139,23 @@ public Optional importPetriNet(InputStream xml) throws MissingPetriNet } @Transactional - public Optional importPetriNet(File xml) throws MissingPetriNetMetaDataException, MissingIconKeyException { + public Optional importPetriNet(File xml, String workspaceId) throws MissingPetriNetMetaDataException, MissingIconKeyException { try { - return importPetriNet(new FileInputStream(xml)); + return importPetriNet(new FileInputStream(xml), workspaceId); } catch (FileNotFoundException e) { log.error("Importing Petri net failed: ", e); } return Optional.empty(); } - protected void initialize() { + protected void initialize(String workspaceId) { this.roles = new HashMap<>(); this.transitions = new HashMap<>(); this.places = new HashMap<>(); this.fields = new HashMap<>(); this.transactions = new HashMap<>(); - this.defaultRole = processRoleService.defaultRole(); - this.anonymousRole = processRoleService.anonymousRole(); + this.defaultRole = processRoleService.defaultRole(workspaceId); + this.anonymousRole = processRoleService.anonymousRole(workspaceId); this.i18n = new HashMap<>(); this.actions = new HashMap<>(); this.actionRefs = new HashMap<>(); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/config/DefaultProcessResource.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/config/DefaultProcessResource.java new file mode 100644 index 0000000000..b458cb73b2 --- /dev/null +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/config/DefaultProcessResource.java @@ -0,0 +1,20 @@ +package com.netgrif.application.engine.petrinet.config; + +import lombok.Data; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.Scope; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +@Component +@PropertySource("classpath:application.properties") +@ConfigurationProperties(prefix = "nae.petrinet.resources") +@Data +@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class DefaultProcessResource { + + private Resource[] defaultProcesses; + +} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/repositories/PetriNetRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/repositories/PetriNetRepository.java index 3a133ee4bc..a0e45e8ce2 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/repositories/PetriNetRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/repositories/PetriNetRepository.java @@ -16,17 +16,19 @@ public interface PetriNetRepository extends MongoRepository, Q PetriNet findByImportId(String id); - List findAllByIdentifier(String identifier); + List findAllByIdentifierAndWorkspaceId(String identifier, String workspaceId); - PetriNet findByIdentifierAndVersion(String identifier, Version version); + PetriNet findByIdentifierAndVersionAndWorkspaceId(String identifier, Version version, String workspaceId); - Page findByIdentifier(String identifier, Pageable pageable); + Page findByIdentifierAndWorkspaceId(String identifier, String workspaceId, Pageable pageable); - Page findByIdentifierIn(List identifier, Pageable pageable); + Page findByIdentifierInAndWorkspaceId(List identifier, String workspaceId, Pageable pageable); - List findAllByVersion(Version version); + List findAllByVersionAndWorkspaceId(Version version, String workspaceId); - List findAllByUriNodeId(String uri); + List findAllByUriNodeIdAndWorkspaceId(String uri, String workspaceId); + + List findAllByWorkspaceId(String workspaceId); void deleteBy_id(ObjectId id); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleRepository.java index 0ba7793e71..b1988d7722 100755 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleRepository.java @@ -16,22 +16,24 @@ public interface ProcessRoleRepository extends MongoRepository findAllByWorkspaceId(String workspaceId); + Set findAllByProcessId(String netId); Set findAllByImportIdIn(Set importIds); - Set findAllByName_DefaultValue(String name); + Set findAllByName_DefaultValueAndWorkspaceId(String name, String workspaceId); - Set findAllByImportId(String importId); + Set findAllByImportIdAndWorkspaceId(String importId, String workspaceId); - Set findAllByGlobalIsTrue(); + Set findAllByGlobalIsTrueAndWorkspaceId(String workspaceId); @Query("{ '_id.objectId': ?0 }") - Optional findByIdObjectId(ObjectId objectId); - void deleteAllBy_idIn(Collection ids); + Optional findByIdObjectId(ObjectId objectId); + void deleteAllBy_idIn(Collection ids); //TODO: It goes one at a time... make bulk default Set findAllById(Set ids) { return ids.stream() diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java index e6f3702ce5..f3e7d7e3b8 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/PetriNetService.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.type.TypeFactory; +import com.netgrif.application.engine.AsyncRunnerWrapper; +import com.netgrif.application.engine.petrinet.config.DefaultProcessResource; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; import com.netgrif.application.engine.petrinet.web.responsebodies.ArcImportReference; import com.netgrif.application.engine.objects.auth.domain.Group; @@ -131,6 +133,12 @@ public class PetriNetService implements IPetriNetService { @Autowired protected IUriService uriService; + @Autowired + protected DefaultProcessResource defaultProcessResource; + + @Autowired + protected AsyncRunnerWrapper asyncRunner; + protected ApplicationEventPublisher publisher; protected IElasticPetriNetService elasticPetriNetService; @@ -187,48 +195,55 @@ public List get(List petriNetIds) { @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.getDefault().getStringId()); + public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser author, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + return importPetriNet(xmlFile, VersionType.valueOf(releaseType.trim().toUpperCase()), author, uriService.getDefault().getStringId(), workspaceId); } @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); + public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser author, String uriNodeId, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + return importPetriNet(xmlFile, VersionType.valueOf(releaseType.trim().toUpperCase()), author, uriNodeId, workspaceId); } @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, releaseType, author, uriService.getDefault().getStringId()); + public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + return importPetriNet(xmlFile, releaseType, author, uriService.getDefault().getStringId(), workspaceId); } @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { - return importPetriNet(xmlFile, releaseType, author, uriService.getDefault().getStringId(), params); + public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String workspaceId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + return importPetriNet(xmlFile, releaseType, author, uriService.getDefault().getStringId(), workspaceId, 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<>()); + public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String uriNodeId, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + return importPetriNet(xmlFile, releaseType, author, uriNodeId, workspaceId, new HashMap<>()); } @Override - public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String uriNodeId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { + public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser author, String uriNodeId, String workspaceId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException { ImportPetriNetEventOutcome outcome = new ImportPetriNetEventOutcome(); ByteArrayOutputStream xmlCopy = new ByteArrayOutputStream(); IOUtils.copy(xmlFile, xmlCopy); - Optional imported = getImporter().importPetriNet(new ByteArrayInputStream(xmlCopy.toByteArray())); + Optional imported = getImporter().importPetriNet(new ByteArrayInputStream(xmlCopy.toByteArray()), workspaceId); if (imported.isEmpty()) { return outcome; } PetriNet net = imported.get(); net.setUriNodeId(uriNodeId); + if (workspaceId == null || workspaceId.isEmpty()) { + throw new MissingPetriNetMetaDataException(Arrays.asList("WorkspaceId")); + } + net.setWorkspaceId(workspaceId); + net.setUri("/" + workspaceId + uriNodeId); - PetriNet existingNet = getNewestVersionByIdentifier(net.getIdentifier()); + PetriNet existingNet = getNewestVersionByIdentifier(net.getIdentifier(), workspaceId); if (existingNet != null) { net.setVersion(existingNet.getVersion()); net.incrementVersion(releaseType); } + net.getRoles().values().forEach(role -> role.setWorkspaceId(net.getWorkspaceId())); + net.getTransitions().values().forEach(transition -> transition.setWorkspaceId(net.getWorkspaceId())); processRoleService.saveAll(net.getRoles().values()); net.setAuthor(author.transformToAuthor()); functionCacheService.cachePetriNetFunctions(net); @@ -236,15 +251,49 @@ public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionTyp xmlCopy.close(); log.info("Petri net " + net.getTitle() + " (" + net.getInitials() + " v" + net.getVersion() + ") imported successfully and saved in a folder: " + savedPath.toString()); - outcome.setOutcomes(eventService.runActions(net.getPreUploadActions(), null, Optional.empty(), params)); + outcome.setOutcomes(eventService.runActions(net.getPreUploadActions(), null, Optional.empty(), params, net.getWorkspaceId())); publisher.publishEvent(new ProcessDeployEvent(outcome, EventPhase.PRE)); save(net); - outcome.setOutcomes(eventService.runActions(net.getPostUploadActions(), null, Optional.empty(), params)); + outcome.setOutcomes(eventService.runActions(net.getPostUploadActions(), null, Optional.empty(), params, net.getWorkspaceId())); publisher.publishEvent(new ProcessDeployEvent(outcome, EventPhase.POST)); outcome.setNet(imported.get()); return outcome; } + @Override + public List importDefaultProcesses(String workspaceId) { + List nets = new ArrayList<>(); + for (org.springframework.core.io.Resource resource : defaultProcessResource.getDefaultProcesses()) { + try { + InputStream netStream = resource.getInputStream(); + String identifier = resource.getFilename().split("\\.")[0]; + List existingNets = repository.findByIdentifierAndWorkspaceId(identifier, workspaceId, PageRequest.of(0, 1, Sort.Direction.DESC, "version.major", "version.minor", "version.patch")).getContent(); + if (!existingNets.isEmpty()) { + log.info("{} has already been imported.", identifier); + nets.add(existingNets.getFirst()); + } else { + VersionType release = VersionType.MAJOR; + LoggedUser author = userService.getLoggedOrSystem().transformToLoggedUser(); + String uriNodeId = uriService.getDefault().getStringId(); + nets.add(importPetriNet(netStream, release, author, uriNodeId, workspaceId).getNet()); + } + } catch (IOException e) { + log.info("Default Petri net import failed, file {} doesn't exists", resource.getFilename()); + } catch (MissingPetriNetMetaDataException e) { + throw new RuntimeException(e); + } + } + return nets; + } + + @Override + public void deleteWorkspaceProcesses(String workspaceId) { + List nets = repository.findAllByWorkspaceId(workspaceId); + for (PetriNet net : nets) { + asyncRunner.execute(() -> deletePetriNet(net.getStringId(), userService.getLoggedOrSystem().transformToLoggedUser()), workspaceId); + } + } + private ImportPetriNetEventOutcome addMessageToOutcome(PetriNet net, ProcessEventType type, ImportPetriNetEventOutcome outcome) { if (net.getProcessEvents().containsKey(type)) { outcome.setMessage(net.getProcessEvents().get(type).getMessage()); @@ -286,7 +335,7 @@ public PetriNet getPetriNet(String id) { @Override @Cacheable(value = "petriNetByIdentifier", key = "#identifier+#version.toString()", unless = "#result == null") public PetriNet getPetriNet(String identifier, Version version) { - PetriNet net = repository.findByIdentifierAndVersion(identifier, version); + PetriNet net = repository.findByIdentifierAndVersionAndWorkspaceId(identifier, version, userService.getLoggedOrSystem().getWorkspaceId()); if (net == null) { return null; } @@ -296,7 +345,7 @@ public PetriNet getPetriNet(String identifier, Version version) { @Override public List getByIdentifier(String identifier) { - List nets = repository.findAllByIdentifier(identifier); + List nets = repository.findAllByIdentifierAndWorkspaceId(identifier, userService.getLoggedOrSystem().getWorkspaceId()); nets.forEach(PetriNet::initializeArcs); return nets; } @@ -314,9 +363,14 @@ public List findAllById(List ids) { } @Override - @Cacheable(value = "petriNetNewest", unless = "#result == null") public PetriNet getNewestVersionByIdentifier(String identifier) { - List nets = repository.findByIdentifier(identifier, PageRequest.of(0, 1, Sort.Direction.DESC, "version.major", "version.minor", "version.patch")).getContent(); + return getNewestVersionByIdentifier(identifier, userService.getLoggedOrSystem().getWorkspaceId()); + } + + @Override + @Cacheable(value = "petriNetNewest", unless = "#result == null") + public PetriNet getNewestVersionByIdentifier(String identifier, String workspaceId) { + List nets = repository.findByIdentifierAndWorkspaceId(identifier, workspaceId, PageRequest.of(0, 1, Sort.Direction.DESC, "version.major", "version.minor", "version.patch")).getContent(); if (nets.isEmpty()) { return null; } @@ -332,7 +386,7 @@ public PetriNet getNewestVersionByIdentifier(String identifier) { @Override public List getExistingPetriNetIdentifiersFromIdentifiersList(List identifiers) { Aggregation agg = Aggregation.newAggregation( - Aggregation.match(Criteria.where("identifier").in(identifiers)), + Aggregation.match(Criteria.where("identifier").in(identifiers).andOperator(Criteria.where("workspaceId").is(userService.getLoggedOrSystem().getWorkspaceId()))), Aggregation.group("identifier"), Aggregation.project("identifier").and("identifier").previousOperation() ); @@ -361,7 +415,7 @@ public PetriNetImportReference getNetFromCase(String caseId) { @Override public List getAll() { - List nets = repository.findAll(); + List nets = repository.findAllByWorkspaceId(userService.getLoggedOrSystem().getWorkspaceId()); nets.forEach(PetriNet::initializeArcs); return nets; } @@ -395,7 +449,10 @@ public List getReferencesByVersion(Version version, LoggedUse if (version == null) { GroupOperation groupByIdentifier = Aggregation.group("identifier").max("version").as("version"); - Aggregation aggregation = Aggregation.newAggregation(groupByIdentifier); + Aggregation aggregation = Aggregation.newAggregation( + Aggregation.match(Criteria.where("workspaceId").is(userService.getLoggedOrSystem().getWorkspaceId())), + groupByIdentifier + ); AggregationResults results = mongoTemplate.aggregate(aggregation, "petriNet", Document.class); references = results.getMappedResults().stream() .map(doc -> { @@ -405,7 +462,7 @@ public List getReferencesByVersion(Version version, LoggedUse }) .collect(Collectors.toList()); } else { - references = repository.findAllByVersion(version).stream() + references = repository.findAllByVersionAndWorkspaceId(version, userService.getLoggedOrSystem().getWorkspaceId()).stream() .map(net -> transformToReference(net, locale)).collect(Collectors.toList()); } @@ -414,7 +471,7 @@ public List getReferencesByVersion(Version version, LoggedUse @Override public List getReferencesByUsersProcessRoles(LoggedUser user, Locale locale) { - Query query = Query.query(getProcessRolesCriteria(user)); + Query query = Query.query(getProcessRolesCriteria(user)).addCriteria(Criteria.where("workspaceId").is(userService.getLoggedOrSystem().getWorkspaceId())); return mongoTemplate.find(query, com.netgrif.application.engine.adapter.spring.petrinet.domain.PetriNet.class).stream().map(net -> transformToReference(net, locale)).collect(Collectors.toList()); } @@ -465,6 +522,7 @@ public Page search(PetriNetSearch criteriaClass, LoggedUser u Query query = new Query(); Query queryTotal = new Query(); + this.addValueCriteria(query, queryTotal, Criteria.where("workspaceId").is(user.getWorkspaceId())); if (!user.getSelfOrImpersonated().isAdmin()) query.addCriteria(getProcessRolesCriteria(user.getSelfOrImpersonated())); @@ -550,7 +608,7 @@ 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()); + actionsRunner.run(action, null, new HashMap<>(), petriNet.getWorkspaceId(), petriNet.getFunctions()); }); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java index 77b7a583ef..2d299f10bf 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/ProcessRoleService.java @@ -7,8 +7,11 @@ import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.objects.event.events.user.UserRoleChangeEvent; import com.netgrif.application.engine.objects.importer.model.EventPhaseType; +import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.action.Action; +import com.netgrif.application.engine.objects.petrinet.domain.roles.PredefinedProcessRole; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.context.RoleContext; import com.netgrif.application.engine.petrinet.domain.dataset.logic.action.runner.RoleActionsRunner; import com.netgrif.application.engine.objects.petrinet.domain.events.Event; @@ -65,11 +68,6 @@ public ProcessRole save(ProcessRole processRole) { return processRoleRepository.save(processRole); } - @Override - public List getAll() { - return processRoleRepository.findAll(); - } - @Override public List findAllByNetId(String s) { return new ArrayList<>(processRoleRepository.findAllByProcessId(s)); @@ -202,16 +200,6 @@ protected String getProcessIdFromFirstRole(Set newRoles) { return newRoles.iterator().next().getProcessId(); } - @Override - public ProcessRole getDefaultRole() { - return processRoleRepository.findByImportId(ProcessRole.DEFAULT_ROLE); - } - - @Override - public ProcessRole getAnonymousRole() { - return processRoleRepository.findByImportId(ProcessRole.ANONYMOUS_ROLE); - } - @Override public Collection findAllByIds(Collection collection) { return processRoleRepository.findAllByCompositeId(collection.stream().map(ProcessResourceId::getStringId).collect(Collectors.toList())); @@ -225,7 +213,7 @@ public ProcessRole findById(ProcessResourceId processResourceId) { @Override public List saveAll(Iterable entities) { return StreamSupport.stream(entities.spliterator(), false).map(processRole -> { - if (!processRole.isGlobal() || processRoleRepository.findAllByImportId(processRole.getImportId()).isEmpty()) { + if (!processRole.isGlobal() || processRoleRepository.findAllByImportIdAndWorkspaceId(processRole.getImportId(), userService.getLoggedOrSystem().getWorkspaceId()).isEmpty()) { return processRoleRepository.save(processRole); } return null; @@ -350,12 +338,17 @@ private void removeOldAndAssignNewRolesToUser(IUser user, Set reque @Override public List findAll() { - return processRoleRepository.findAll(); + return findAllByWorkspaceId(userService.getLoggedOrSystem().getWorkspaceId()); + } + + @Override + public List findAllByWorkspaceId(String workspaceId) { + return processRoleRepository.findAllByWorkspaceId(workspaceId); } @Override public Set findAllGlobalRoles() { - return processRoleRepository.findAllByGlobalIsTrue(); + return processRoleRepository.findAllByGlobalIsTrueAndWorkspaceId(userService.getLoggedOrSystem().getWorkspaceId()); } @Override @@ -372,8 +365,18 @@ private List findAll(PetriNet net) { @Override public ProcessRole defaultRole() { + return defaultRole(userService.getLoggedOrSystem().getWorkspaceId()); + } + + @Override + public ProcessRole anonymousRole() { + return anonymousRole(userService.getLoggedOrSystem().getWorkspaceId()); + } + + @Override + public ProcessRole defaultRole(String workspaceId) { if (defaultRole == null) { - Set roles = processRoleRepository.findAllByName_DefaultValue(ProcessRole.DEFAULT_ROLE); + Set roles = processRoleRepository.findAllByImportIdAndWorkspaceId(ProcessRole.DEFAULT_ROLE, workspaceId); if (roles.isEmpty()) throw new IllegalStateException("No default process role has been found!"); if (roles.size() > 1) @@ -384,9 +387,9 @@ public ProcessRole defaultRole() { } @Override - public ProcessRole anonymousRole() { + public ProcessRole anonymousRole(String workspaceId) { if (anonymousRole == null) { - Set roles = processRoleRepository.findAllByImportId(ProcessRole.ANONYMOUS_ROLE); + Set roles = processRoleRepository.findAllByImportIdAndWorkspaceId(ProcessRole.ANONYMOUS_ROLE, workspaceId); if (roles.isEmpty()) throw new IllegalStateException("No anonymous process role has been found!"); if (roles.size() > 1) @@ -396,25 +399,55 @@ public ProcessRole anonymousRole() { return anonymousRole; } - /** - * @param importId id from a process of a role - * @return a process role object - * @deprecated use {@link ProcessRoleService#findAllByImportId(String)} instead - */ - @Deprecated(forRemoval = true, since = "6.2.0") - @Override - public ProcessRole findByImportId(String importId) { - return processRoleRepository.findAllByImportId(importId).stream().findFirst().orElse(null); + public ProcessRole createDefaultOrAnonymousRole(PredefinedProcessRole predefinedRole, String workspaceId) { + log.info("Creating " + predefinedRole.getName() + " process role in workspace " + workspaceId); + + Set role = processRoleRepository.findAllByImportIdAndWorkspaceId(predefinedRole.getName(), workspaceId); + if (role != null && !role.isEmpty()) { + log.info("Role already exists"); + return role.stream().findFirst().orElse(null); + } + + ProcessRole newRole = new com.netgrif.application.engine.adapter.spring.petrinet.domain.roles.ProcessRole(); + newRole.setImportId(predefinedRole.getName()); + newRole.setName(new I18nString(predefinedRole.getName())); + newRole.setDescription(predefinedRole.getDescription()); + newRole.setEvents(new LinkedHashMap()); + newRole.setWorkspaceId(workspaceId); + newRole = processRoleRepository.save(newRole); + + return newRole; + } + + public void deleteDefaultOrAnonymousRole(PredefinedProcessRole predefinedRole, String workspaceId) { + log.info("Deleting " + predefinedRole.getName() + " process role in workspace " + workspaceId); + + Set roleToDelete = processRoleRepository.findAllByImportIdAndWorkspaceId(predefinedRole.getName(), workspaceId).stream().map(ProcessRole::get_id).collect(Collectors.toSet()); + Set deletedRoleStringId = roleToDelete.stream().map(ProcessResourceId::toString).collect(Collectors.toSet()); + + List usersWithRemovedRoles = this.userService.findAllByProcessRoles(new HashSet<>(roleToDelete), null); + for (IUser user : usersWithRemovedRoles) { + if (user.getProcessRoles().isEmpty()) + continue; + + Set newRoles = user.getProcessRoles().stream() + .filter(role -> !deletedRoleStringId.contains(role.getStringId())) + .map(ProcessRole::get_id) + .collect(Collectors.toSet()); + this.assignRolesToUser(user, newRoles, userService.getLoggedOrSystem().transformToLoggedUser()); + } + + this.processRoleRepository.deleteAllBy_idIn(roleToDelete); } @Override public Set findAllByImportId(String importId) { - return processRoleRepository.findAllByImportId(importId); + return processRoleRepository.findAllByImportIdAndWorkspaceId(importId, userService.getLoggedOrSystem().getWorkspaceId()); } @Override public Set findAllByDefaultName(String name) { - return processRoleRepository.findAllByName_DefaultValue(name); + return processRoleRepository.findAllByName_DefaultValueAndWorkspaceId(name, userService.getLoggedOrSystem().getWorkspaceId()); } @Override diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java index c11ff71c84..347189ebca 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/interfaces/IPetriNetService.java @@ -42,18 +42,22 @@ static DataFieldReference transformToReference(PetriNet net, Transition transiti } @Deprecated - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser user) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; + ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser user, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; @Deprecated - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser user, String uriNodeId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; + ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, String releaseType, LoggedUser user, String uriNodeId, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; + ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user, String workspaceId) 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 workspaceId, 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, String workspaceId) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; - ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user, String uriNodeId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; + ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionType releaseType, LoggedUser user, String uriNodeId, String workspaceId, Map params) throws IOException, MissingPetriNetMetaDataException, MissingIconKeyException; + + List importDefaultProcesses(String workspaceId); + + void deleteWorkspaceProcesses(String workspaceId); Optional save(PetriNet petriNet); @@ -69,6 +73,8 @@ static DataFieldReference transformToReference(PetriNet net, Transition transiti PetriNet getNewestVersionByIdentifier(String identifier); + PetriNet getNewestVersionByIdentifier(String identifier, String workspaceId); + List getAll(); FileSystemResource getFile(String netId, String title); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/workspace/DefaultWorkspaceConfiguration.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/workspace/DefaultWorkspaceConfiguration.java new file mode 100644 index 0000000000..2d3beafa20 --- /dev/null +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/workspace/DefaultWorkspaceConfiguration.java @@ -0,0 +1,16 @@ +package com.netgrif.application.engine.petrinet.service.workspace; + +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DefaultWorkspaceConfiguration { + + @Bean + @ConditionalOnMissingBean + public DefaultWorkspaceService defaultWorkspaceService() { + return new DefaultWorkspaceServiceImpl(); + } +} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/workspace/DefaultWorkspaceServiceImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/workspace/DefaultWorkspaceServiceImpl.java new file mode 100644 index 0000000000..a6e3f41f21 --- /dev/null +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/service/workspace/DefaultWorkspaceServiceImpl.java @@ -0,0 +1,29 @@ +package com.netgrif.application.engine.petrinet.service.workspace; + +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.Workspace; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +@Slf4j +public class DefaultWorkspaceServiceImpl implements DefaultWorkspaceService { + + private final Workspace defaultWorkspace; + + public DefaultWorkspaceServiceImpl() { + this.defaultWorkspace = new Workspace(); + this.defaultWorkspace.setId(DefaultWorkspaceService.DEFAULT_WORKSPACE_ID); + this.defaultWorkspace.setDefaultWorkspace(true); + } + + @Override + public Workspace getDefaultWorkspace() { + return defaultWorkspace; + } + + @Override + public List getAllWorkspaces() { + return List.of(defaultWorkspace); + } +} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java index 46e23c8a33..839d245bbf 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java @@ -1,23 +1,20 @@ package com.netgrif.application.engine.petrinet.web; -import com.netgrif.application.engine.AsyncRunner; -import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetImportReference; -import com.netgrif.application.engine.petrinet.web.responsebodies.ProcessRolesResource; -import com.netgrif.application.engine.petrinet.web.responsebodies.TransitionReferencesResource; -import com.netgrif.application.engine.objects.auth.domain.LoggedUser; +import com.netgrif.application.engine.AsyncRunnerWrapper; +import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; import com.netgrif.application.engine.eventoutcomes.LocalisedEventOutcomeFactory; import com.netgrif.application.engine.importer.service.Importer; import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException; +import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch; import com.netgrif.application.engine.objects.petrinet.domain.VersionType; import com.netgrif.application.engine.objects.petrinet.domain.throwable.MissingPetriNetMetaDataException; +import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; import com.netgrif.application.engine.petrinet.domain.version.StringToVersionConverter; import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; -import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; -import com.netgrif.application.engine.workflow.domain.FileStorageConfiguration; import com.netgrif.application.engine.petrinet.web.responsebodies.*; -import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome; +import com.netgrif.application.engine.workflow.domain.FileStorageConfiguration; 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.web.responsebodies.MessageResource; @@ -26,6 +23,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +43,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -80,7 +77,7 @@ public class PetriNetController { private StringToVersionConverter converter; @Autowired - private AsyncRunner asyncRunner; + private AsyncRunnerWrapper asyncRunner; public static String decodeUrl(String s1) { try { @@ -106,12 +103,13 @@ public static String decodeUrl(String s1) { public EntityModel importPetriNet( @RequestParam(value = "file", required = true) MultipartFile multipartFile, @RequestParam(value = "uriNodeId", required = true) String uriNodeId, + @RequestParam(value = "workspaceId", required = true) String workspaceId, @RequestParam(value = "meta", required = false) String releaseType, Authentication auth, Locale locale) throws MissingPetriNetMetaDataException, MissingIconKeyException { try { String decodedUriNodeId = new String(Base64.decodeBase64(uriNodeId)); VersionType release = releaseType == null ? VersionType.MAJOR : VersionType.valueOf(releaseType.trim().toUpperCase()); - ImportPetriNetEventOutcome importPetriNetOutcome = service.importPetriNet(multipartFile.getInputStream(), release, (LoggedUser) auth.getPrincipal(), decodedUriNodeId); + ImportPetriNetEventOutcome importPetriNetOutcome = service.importPetriNet(multipartFile.getInputStream(), release, (LoggedUser) auth.getPrincipal(), decodedUriNodeId, workspaceId == null ? ((LoggedUser) auth.getPrincipal()).getWorkspaceId() : workspaceId); return EventOutcomeWithMessageResource.successMessage("Petri net " + multipartFile.getOriginalFilename() + " imported successfully", LocalisedEventOutcomeFactory.from(importPetriNetOutcome, locale)); } catch (IOException e) { @@ -214,7 +212,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(decodedProcessId, user), user.getWorkspaceId()); return MessageResource.successMessage("Petri net " + decodedProcessId + " is being deleted"); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/security/service/SecurityContextService.java b/application-engine/src/main/java/com/netgrif/application/engine/security/service/SecurityContextService.java index b74b4b272b..fe41a48273 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/security/service/SecurityContextService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/security/service/SecurityContextService.java @@ -3,15 +3,24 @@ import com.netgrif.application.engine.adapter.spring.auth.domain.LoggedUserImpl; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.auth.service.UserService; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.context.SecurityContextHolderStrategy; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.security.web.context.SecurityContextRepository; import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; -import java.util.Collection; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -29,8 +38,13 @@ public class SecurityContextService implements ISecurityContextService { protected UserService userService; + protected DefaultWorkspaceService defaultWorkspaceService; + + private final SecurityContextRepository securityContextRepository; + protected SecurityContextService() { this.cachedTokens = ConcurrentHashMap.newKeySet(); + this.securityContextRepository = new HttpSessionSecurityContextRepository(); } /** @@ -65,15 +79,38 @@ public void forceReloadSecurityContext(LoggedUser loggedUser) { private void reloadSecurityContext(LoggedUser loggedUser, boolean forceRefresh) { if (isUserLogged(loggedUser) && cachedTokens.contains(loggedUser.getId())) { + if (loggedUser.getWorkspaceId() == null) { + loggedUser.setWorkspaceId(defaultWorkspaceService.getDefaultWorkspace().getId()); + } if (forceRefresh) { - loggedUser = (LoggedUser) userService.transformToLoggedUser(userService.findById(loggedUser.getId(), null)); + String workspaceId = loggedUser.getWorkspaceId(); + loggedUser = userService.transformToLoggedUser(userService.findById(loggedUser.getId(), null)); + loggedUser.setWorkspaceId(workspaceId); } - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(loggedUser, SecurityContextHolder.getContext().getAuthentication().getCredentials(), ((LoggedUserImpl) loggedUser).getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(token); + SecurityContext context = getSecurityContext(loggedUser); + securityContextRepository.saveContext(context, getServletRequest(), getServletResponse()); clearToken(loggedUser.getId()); } } + @NotNull + private SecurityContext getSecurityContext(LoggedUser loggedUser) { + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(loggedUser, SecurityContextHolder.getContext().getAuthentication().getCredentials(), ((LoggedUserImpl) loggedUser).getAuthorities()); + SecurityContextHolderStrategy securityContextHolderStrategy = SecurityContextHolder.getContextHolderStrategy(); + SecurityContext context = securityContextHolderStrategy.createEmptyContext(); + context.setAuthentication(authentication); + securityContextHolderStrategy.setContext(context); + return context; + } + + private HttpServletRequest getServletRequest() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + } + + private HttpServletResponse getServletResponse() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse(); + } + /** * Checks type of SecurityContext * @@ -112,4 +149,9 @@ private boolean isUserLogged(LoggedUser loggedUser) { public void setUserService(UserService userService) { this.userService = userService; } + + @Autowired + public void setDefaultWorkspaceService(DefaultWorkspaceService defaultWorkspaceService) { + this.defaultWorkspaceService = defaultWorkspaceService; + } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/AnonymousRoleRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/AnonymousRoleRunner.java index c6be15a8dc..8421244412 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/AnonymousRoleRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/AnonymousRoleRunner.java @@ -4,7 +4,9 @@ import com.netgrif.application.engine.objects.petrinet.domain.I18nString; import com.netgrif.application.engine.objects.petrinet.domain.events.Event; import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; +import com.netgrif.application.engine.objects.petrinet.domain.roles.PredefinedProcessRole; import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository; import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner; import com.netgrif.application.engine.startup.annotation.RunnerOrder; @@ -23,22 +25,12 @@ public class AnonymousRoleRunner implements ApplicationEngineStartupRunner { private final ProcessRoleService processRoleService; + private final DefaultWorkspaceService defaultWorkspaceService; @Override public void run(ApplicationArguments args) throws Exception { log.info("Creating anonymous process role"); - Set role = processRoleService.findAllByImportId(ProcessRole.ANONYMOUS_ROLE); - if (role != null && !role.isEmpty()) { - log.info("Anonymous role already exists"); - return; - } - - ProcessRole anonymousRole = new com.netgrif.application.engine.adapter.spring.petrinet.domain.roles.ProcessRole(); - anonymousRole.setImportId(ProcessRole.ANONYMOUS_ROLE); - anonymousRole.setName(new I18nString(ProcessRole.ANONYMOUS_ROLE)); - anonymousRole.setDescription("Anonymous system process role"); - anonymousRole.setEvents(new LinkedHashMap()); - processRoleService.save(anonymousRole); + processRoleService.createDefaultOrAnonymousRole(PredefinedProcessRole.ANONYMOUS_ROLE, defaultWorkspaceService.getDefaultWorkspace().getId()); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java index 2174c28290..3e91c097ea 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java @@ -32,8 +32,8 @@ public class DashboardRunner implements ApplicationEngineStartupRunner { @Override public void run(ApplicationArguments args) throws Exception { - createDashboardNet(); - createDashboardTileNet(); +// createDashboardNet(); +// createDashboardTileNet(); } public Optional createDashboardNet() { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultNetImportRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultNetImportRunner.java new file mode 100644 index 0000000000..60b5a4f889 --- /dev/null +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultNetImportRunner.java @@ -0,0 +1,25 @@ +package com.netgrif.application.engine.startup.runner; + +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; +import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService; +import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner; +import com.netgrif.application.engine.startup.annotation.RunnerOrder; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RunnerOrder(100) +@RequiredArgsConstructor +public class DefaultNetImportRunner implements ApplicationEngineStartupRunner { + + private final IPetriNetService petriNetService; + private final DefaultWorkspaceService defaultWorkspaceService; + + @Override + public void run(ApplicationArguments args) throws Exception { + petriNetService.importDefaultProcesses(defaultWorkspaceService.getDefaultWorkspace().getId()); + } +} diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultRoleRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultRoleRunner.java index b9e1cd5add..3d14b2b1c2 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultRoleRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultRoleRunner.java @@ -6,6 +6,8 @@ import com.netgrif.application.engine.objects.petrinet.domain.events.EventType; import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; import com.netgrif.application.engine.petrinet.domain.roles.ProcessRoleRepository; +import com.netgrif.application.engine.objects.petrinet.domain.roles.PredefinedProcessRole; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner; import com.netgrif.application.engine.startup.annotation.RunnerOrder; import lombok.RequiredArgsConstructor; @@ -14,9 +16,6 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; -import java.util.LinkedHashMap; -import java.util.Set; - @Slf4j @Component @Profile("!update") @@ -25,26 +24,11 @@ public class DefaultRoleRunner implements ApplicationEngineStartupRunner { private final ProcessRoleService processRoleService; + private final DefaultWorkspaceService defaultWorkspaceService; @Override public void run(ApplicationArguments args) throws Exception { - log.info("Creating default process role"); - Set role = (Set) processRoleService.findAllByDefaultName(ProcessRole.DEFAULT_ROLE); - if (role != null && !role.isEmpty()) { - log.info("Default role already exists"); - return; - } - - ProcessRole defaultRole = new com.netgrif.application.engine.adapter.spring.petrinet.domain.roles.ProcessRole(); - defaultRole.setImportId(ProcessRole.DEFAULT_ROLE); - defaultRole.setName(new I18nString(ProcessRole.DEFAULT_ROLE)); - defaultRole.setDescription("Default system process role"); - defaultRole.setEvents(new LinkedHashMap()); - defaultRole = processRoleService.save(defaultRole); - - if (defaultRole == null) { - log.error("Error saving default process role"); - } + processRoleService.createDefaultOrAnonymousRole(PredefinedProcessRole.DEFAULT_ROLE, defaultWorkspaceService.getDefaultWorkspace().getId()); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java index f001c86b02..4caa08789a 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java @@ -35,10 +35,10 @@ public class FilterRunner implements ApplicationEngineStartupRunner { @Override public void run(ApplicationArguments args) throws Exception { - createFilterNet(); - createPreferenceItemNet(); - createImportFiltersNet(); - createExportFiltersNet(); +// createFilterNet(); +// createPreferenceItemNet(); +// createImportFiltersNet(); +// createExportFiltersNet(); } public Optional createFilterNet() { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/ImpersonationRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/ImpersonationRunner.java index 44522a2556..cf9659d8f4 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/ImpersonationRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/ImpersonationRunner.java @@ -30,7 +30,7 @@ public class ImpersonationRunner implements ApplicationEngineStartupRunner { @Override public void run(ApplicationArguments args) throws Exception { - createConfigNets(); +// createConfigNets(); } public void createConfigNets() { diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/SuperCreatorRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/SuperCreatorRunner.java index 3aaa7a03b5..59b31e069b 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/SuperCreatorRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/SuperCreatorRunner.java @@ -5,6 +5,7 @@ import com.netgrif.application.engine.auth.service.UserService; import com.netgrif.application.engine.auth.service.GroupService; import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner; import com.netgrif.application.engine.startup.annotation.RunnerOrder; import com.netgrif.application.engine.objects.auth.domain.enums.UserState; @@ -38,6 +39,7 @@ public class SuperCreatorRunner implements ApplicationEngineStartupRunner { private final UserService userService; private final GroupService groupService; private final ProcessRoleService processRoleService; + private final DefaultWorkspaceService defaultWorkspaceService; @Getter private IUser superUser; @@ -73,6 +75,7 @@ private IUser createSuperUser() { this.superUser = superUser.get(); } + this.superUser.setWorkspaceId(defaultWorkspaceService.getDefaultWorkspace().getId()); return this.superUser; } @@ -98,6 +101,7 @@ public void setAllAuthorities() { } public LoggedUser getLoggedSuper() { + this.superUser.setWorkspaceId(defaultWorkspaceService.getDefaultWorkspace().getId()); return userService.transformToLoggedUser(superUser); } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepository.java index 875ba17451..b9875a6fa3 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/CaseRepository.java @@ -19,14 +19,18 @@ @Repository public interface CaseRepository extends MongoRepository, QuerydslPredicateExecutor, QuerydslBinderCustomizer { - List findAllByProcessIdentifier(String identifier); + List findAllByProcessIdentifierAndWorkspaceId(String identifier, String workspaceId); List findAllBy_idIn(Iterable id); + List findAllByWorkspaceId(String workspaceId); + + Page findAllByWorkspaceId(String workspaceId, Pageable pageable); + @Query("{ '_id.objectId': { $in: ?0 } }") List findAllByObjectIdsIn(List objectIds); - Page findAllByUriNodeId(String uri, Pageable pageable); + Page findAllByUriNodeIdAndWorkspaceId(String uri, String workspaceId, Pageable pageable); List findAllByPetriNetObjectId(ObjectId petriNetObjectId); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java index 5338d1d4ab..44d1378eca 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/domain/repositories/TaskRepository.java @@ -3,6 +3,7 @@ import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import com.netgrif.application.engine.adapter.spring.workflow.domain.QTask; import com.netgrif.application.engine.objects.workflow.domain.Task; +import com.querydsl.core.types.Predicate; import org.bson.types.ObjectId; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -22,13 +23,13 @@ public interface TaskRepository extends MongoRepository, QuerydslP Page findByCaseIdIn(Pageable pageable, Collection ids); - Page findByTransitionIdIn(Pageable pageable, Collection ids); + Page findByTransitionIdInAndWorkspaceId(Pageable pageable, Collection ids, String workspaceId); - List findAllByTransitionIdIn(Collection ids); + List findAllByTransitionIdInAndWorkspaceId(Collection ids, String workspaceId); Page findByUserId(Pageable pageable, String userId); - List findByUserIdAndFinishDateNotNull(Long userId); + List findByUserIdAndWorkspaceIdAndFinishDateNotNull(Long userId, String workspaceId); Task findByTransitionIdAndCaseId(String transitionId, String caseId); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java index d9d4abfe4a..962223f5cd 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/CaseSearchService.java @@ -94,6 +94,7 @@ public Predicate buildQuery(Map requestQuery, LoggedUser user, L permissionConstraints.or(buildViewUserQueryConstraint(loggedOrImpersonated)); permissionConstraints.andNot(buildNegativeViewUsersQueryConstraint(loggedOrImpersonated)); builder.and(permissionConstraints); + builder.and(QCase.case$.workspaceId.eq(loggedOrImpersonated.getWorkspaceId())); return builder; } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java index 26fc962f97..71d7386558 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/DataService.java @@ -520,8 +520,8 @@ public FileFieldInputStream getFile(Case useCase, Task task, FileField field, bo private void runGetActionsFromFileField(Map events, Case useCase, Map params) { if (events != null && !events.isEmpty() && events.containsKey(DataEventType.GET)) { DataEvent event = events.get(DataEventType.GET); - event.getPreActions().forEach(action -> actionsRunner.run(action, useCase, params)); - event.getPostActions().forEach(action -> actionsRunner.run(action, useCase, params)); + event.getPreActions().forEach(action -> actionsRunner.run(action, useCase, params, useCase.getWorkspaceId())); + event.getPostActions().forEach(action -> actionsRunner.run(action, useCase, params, useCase.getWorkspaceId())); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java index ae3644df19..cfc482d146 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java @@ -37,22 +37,22 @@ public EventService(FieldActionsRunner actionsRunner, IWorkflowService workflowS @Override public List runActions(List actions, Case useCase, Task task, Transition transition, Map params) { log.info("[" + useCase.getStringId() + "]: Running actions of transition " + transition.getStringId()); - return runActions(actions, useCase, Optional.of(task), params); + return runActions(actions, useCase, Optional.of(task), params, useCase.getWorkspaceId()); } @Override - public List runActions(List actions, Map params) { - return runActions(actions, null, Optional.empty(), params); + public List runActions(List actions, Map params, String workspaceId) { + return runActions(actions, null, Optional.empty(), params, workspaceId); } @Override - public List runActions(List actions, Case useCase, Optional task, Map params) { + public List runActions(List actions, Case useCase, Optional task, Map params, String workspaceId) { List allOutcomes = new ArrayList<>(); if (actions.isEmpty()) { return allOutcomes; } actions.forEach(action -> { - List outcomes = actionsRunner.run(action, useCase, task, params, useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions()); + List outcomes = actionsRunner.run(action, useCase, task, params, useCase == null ? workspaceId : useCase.getWorkspaceId(), useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions()); outcomes.stream().filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().isEmpty()) return; @@ -67,13 +67,13 @@ public List runActions(List actions, Case useCase, Optiona } @Override - public List runEventActions(Case useCase, Task task, List actions, DataEventType trigger, Map params) { + public List runEventActions(Case useCase, Task task, List actions, DataEventType trigger, Map params, String workspaceId) { List allOutcomes = new ArrayList<>(); if (actions.isEmpty()) { return allOutcomes; } actions.forEach(action -> { - List outcomes = actionsRunner.run(action, useCase, task == null ? Optional.empty() : Optional.of(task), params, useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions()); + List outcomes = actionsRunner.run(action, useCase, task == null ? Optional.empty() : Optional.of(task), params, useCase == null ? workspaceId : useCase.getWorkspaceId(), useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions()); outcomes.stream().filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().isEmpty()) return; @@ -101,7 +101,7 @@ public List processDataEvents(Field field, DataEventType actionTri return Collections.emptyList(); } - return runEventActions(useCase, task, fieldActions, actionTrigger, params); + return runEventActions(useCase, task, fieldActions, actionTrigger, params, useCase.getWorkspaceId()); } @Override diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java index 7d9d6c4dff..93ccf8424d 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskSearchService.java @@ -113,6 +113,7 @@ private Predicate buildSingleQuery(TaskSearchRequest request, LoggedUser user, L buildFullTextQuery(request, builder); buildTransitionQuery(request, builder); buildTagsQuery(request, builder); + builder.and(QTask.task.workspaceId.eq(user.getWorkspaceId())); boolean resultAlwaysEmpty = buildGroupQuery(request, user, locale, builder); if (resultAlwaysEmpty) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java index db2113701c..e670abfbc5 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/TaskService.java @@ -37,6 +37,7 @@ 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 com.querydsl.core.BooleanBuilder; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; @@ -726,24 +727,27 @@ public Page findByUser(Pageable pageable, IUser user) { @Override public Page findByTransitions(Pageable pageable, List transitions) { - return loadUsers(taskRepository.findByTransitionIdIn(pageable, transitions)); + return loadUsers(taskRepository.findByTransitionIdInAndWorkspaceId(pageable, transitions, userService.getLoggedOrSystem().getWorkspaceId())); } @Override public Page searchAll(com.querydsl.core.types.Predicate predicate) { - Page tasks = taskRepository.findAll(predicate, new FullPageRequest()); + com.querydsl.core.types.Predicate expression = new BooleanBuilder(predicate).and(QTask.task.workspaceId.eq(userService.getLoggedOrSystem().getWorkspaceId())); + Page tasks = taskRepository.findAll(expression, new FullPageRequest()); return loadUsers(tasks); } @Override public Page search(com.querydsl.core.types.Predicate predicate, Pageable pageable) { - Page tasks = taskRepository.findAll(predicate, pageable); + com.querydsl.core.types.Predicate expression = new BooleanBuilder(predicate).and(QTask.task.workspaceId.eq(userService.getLoggedOrSystem().getWorkspaceId())); + Page tasks = taskRepository.findAll(expression, pageable); return loadUsers(tasks); } @Override public Task searchOne(com.querydsl.core.types.Predicate predicate) { - Page tasks = taskRepository.findAll(predicate, PageRequest.of(0, 1)); + com.querydsl.core.types.Predicate expression = new BooleanBuilder(predicate).and(QTask.task.workspaceId.eq(userService.getLoggedOrSystem().getWorkspaceId())); + Page tasks = taskRepository.findAll(expression, PageRequest.of(0, 1)); if (tasks.getTotalElements() > 0) return tasks.getContent().get(0); return null; @@ -814,6 +818,7 @@ private Task createFromTransition(Transition transition, Case useCase) { .processId(useCase.getPetriNetId()) .caseId(useCase.get_id().toString()) .transitionId(transition.getImportId()) + .workspaceId(transition.getWorkspaceId()) .layout(transition.getLayout()) .tags(transition.getTags()) .caseColor(useCase.getColor()) @@ -845,8 +850,8 @@ private Task createFromTransition(Transition transition, Case useCase) { scheduleTaskExecution(task, timeTrigger.getStartDate(), useCase); } } - ProcessRole defaultRole = processRoleService.defaultRole(); - ProcessRole anonymousRole = processRoleService.anonymousRole(); + ProcessRole defaultRole = processRoleService.defaultRole(transition.getWorkspaceId()); + ProcessRole anonymousRole = processRoleService.anonymousRole(transition.getWorkspaceId()); for (Map.Entry> entry : transition.getRoles().entrySet()) { if (useCase.getEnabledRoles().contains(entry.getKey()) || defaultRole.getStringId().equals(entry.getKey()) diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index 9e533aac5a..a1e952635a 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -34,6 +34,7 @@ import com.netgrif.application.engine.objects.workflow.service.InitValueExpressionEvaluator; import com.netgrif.application.engine.workflow.service.interfaces.ITaskService; import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService; +import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Predicate; import org.bson.types.ObjectId; import org.slf4j.Logger; @@ -188,7 +189,7 @@ public List findAllById(List ids) { @Override public Page getAll(Pageable pageable) { - Page page = repository.findAll(pageable); + Page page = repository.findAllByWorkspaceId(userService.getLoggedOrSystem().getWorkspaceId(), pageable); page.getContent().forEach(this::setPetriNet); decryptDataSets(page.getContent()); return setImmediateDataFields(page); @@ -196,7 +197,7 @@ public Page getAll(Pageable pageable) { @Override public Page findAllByUri(String uri, Pageable pageable) { - Page page = repository.findAllByUriNodeId(uri, pageable); + Page page = repository.findAllByUriNodeIdAndWorkspaceId(uri, userService.getLoggedOrSystem().getWorkspaceId(), pageable); page.getContent().forEach(this::setPetriNet); decryptDataSets(page.getContent()); return setImmediateDataFields(page); @@ -204,7 +205,8 @@ public Page findAllByUri(String uri, Pageable pageable) { @Override public Page search(Predicate predicate, Pageable pageable) { - Page page = repository.findAll(predicate, pageable); + Predicate expression = new BooleanBuilder(predicate).and(QCase.case$.workspaceId.eq(userService.getLoggedOrSystem().getWorkspaceId())); + Page page = repository.findAll(expression, pageable); page.getContent().forEach(this::setPetriNet); return setImmediateDataFields(page); } @@ -339,7 +341,7 @@ public CreateCaseEventOutcome createCase(String netId, Function ma useCase.setUriNodeId(petriNet.getUriNodeId()); CreateCaseEventOutcome outcome = new CreateCaseEventOutcome(); - outcome.addOutcomes(eventService.runActions(petriNet.getPreCreateActions(), null, Optional.empty(), params)); + outcome.addOutcomes(eventService.runActions(petriNet.getPreCreateActions(), null, Optional.empty(), params, petriNet.getWorkspaceId())); //evaluateRules(new CreateCaseEvent(new CreateCaseEventOutcome(null, outcome.getOutcomes()), EventPhase.PRE)); publisher.publishEvent(new CreateCaseEvent(outcome, EventPhase.PRE)); @@ -351,7 +353,7 @@ public CreateCaseEventOutcome createCase(String netId, Function ma resolveTaskRefs(useCase); useCase = findOne(useCase.getStringId()); - outcome.addOutcomes(eventService.runActions(petriNet.getPostCreateActions(), useCase, Optional.empty(), params)); + outcome.addOutcomes(eventService.runActions(petriNet.getPostCreateActions(), useCase, Optional.empty(), params, useCase.getWorkspaceId())); useCase = findOne(useCase.getStringId()); useCase = evaluateRules(new CreateCaseEvent(new CreateCaseEventOutcome(useCase, outcome.getOutcomes()), EventPhase.POST)); // rulesExecuted = ruleEngine.evaluateRules(useCase, new CaseCreatedFact(useCase.getStringId(), EventPhase.POST)); @@ -400,7 +402,7 @@ public DeleteCaseEventOutcome deleteCase(String caseId) { @Override public DeleteCaseEventOutcome deleteCase(Case useCase, Map params) { - DeleteCaseEventOutcome outcome = new DeleteCaseEventOutcome(useCase, eventService.runActions(useCase.getPetriNet().getPreDeleteActions(), useCase, Optional.empty(), params)); + DeleteCaseEventOutcome outcome = new DeleteCaseEventOutcome(useCase, eventService.runActions(useCase.getPetriNet().getPreDeleteActions(), useCase, Optional.empty(), params, useCase.getPetriNet().getWorkspaceId())); publisher.publishEvent(new DeleteCaseEvent(outcome, EventPhase.PRE)); useCase = ((Evaluator) evaluationService.getEvaluator("default")).apply(new DeleteCaseEvent(outcome, EventPhase.PRE));; log.info("[" + useCase.getStringId() + "]: User [" + userService.getLoggedOrSystem().getStringId() + "] is deleting case " + useCase.getTitle()); @@ -408,7 +410,7 @@ public DeleteCaseEventOutcome deleteCase(Case useCase, Map param taskService.deleteTasksByCase(useCase.getStringId()); repository.delete(useCase); - outcome.addOutcomes(eventService.runActions(useCase.getPetriNet().getPostDeleteActions(), null, Optional.empty(), params)); + outcome.addOutcomes(eventService.runActions(useCase.getPetriNet().getPostDeleteActions(), null, Optional.empty(), params, useCase.getPetriNet().getWorkspaceId())); addMessageToOutcome(useCase.getPetriNet(), CaseEventType.DELETE, outcome); ((Evaluator) evaluationService.getEvaluator("noContext")).apply(new DeleteCaseEvent(outcome, EventPhase.POST)); publisher.publishEvent(new DeleteCaseEvent(outcome, EventPhase.POST)); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java index 04cb693e86..954bef4dc7 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IEventService.java @@ -18,13 +18,13 @@ public interface IEventService { List runActions(List actions, Case useCase, Task task, Transition transition, Map params); - List runActions(List actions, Case useCase, Optional task, Map params); + List runActions(List actions, Case useCase, Optional task, Map params, String workspaceId); - List runActions(List actions, Map params); + List runActions(List actions, Map params, String workspaceId); List processDataEvents(Field field, DataEventType actionTrigger, EventPhase phase, Case useCase, Task task, Map params); - List runEventActions(Case useCase, Task task, List actions, DataEventType trigger, Map params); + List runEventActions(Case useCase, Task task, List actions, DataEventType trigger, Map params, String workspaceId); void runEventActionsOnChanged(Task task, SetDataEventOutcome outcome, DataEventType trigger); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java index 0731ed7923..00b015cf80 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/responsebodies/Task.java @@ -76,6 +76,8 @@ public class Task { private Map tags; + private String workspaceId; + public Task(com.netgrif.application.engine.objects.workflow.domain.Task task, Locale locale) { this._id = task.getObjectId(); this.caseId = task.getCaseId(); @@ -105,6 +107,7 @@ public Task(com.netgrif.application.engine.objects.workflow.domain.Task task, Lo this.delegateTitle = task.getTranslatedEventTitle(EventType.DELEGATE, locale); this.assignedUserPolicy = task.getAssignedUserPolicy(); this.tags = task.getTags(); + this.workspaceId = task.getWorkspaceId(); } public Task(ElasticTask entity) { @@ -114,6 +117,7 @@ public Task(ElasticTask entity) { title = entity.getTitle().getDefaultValue(); caseTitle = entity.getCaseTitle(); priority = entity.getPriority(); + workspaceId = entity.getWorkspaceId(); } public String getStringId() { diff --git a/application-engine/src/main/resources/application.properties b/application-engine/src/main/resources/application.properties index 1d56c2d135..2501ad17ed 100644 --- a/application-engine/src/main/resources/application.properties +++ b/application-engine/src/main/resources/application.properties @@ -199,3 +199,6 @@ management.endpoint.health.probes.enabled=true logging.file.path=log management.info.build.enabled=false management.info.env.enabled=true + +# Default petrinets import +nae.petrinet.resources.default-processes=file:src/main/resources/petriNets/engine-processes/filter.xml,file:src/main/resources/petriNets/engine-processes/preference_item.xml,file:src/main/resources/petriNets/engine-processes/import_filters.xml,file:src/main/resources/petriNets/engine-processes/export_filters.xml,file:src/main/resources/petriNets/engine-processes/impersonation_config.xml,file:src/main/resources/petriNets/engine-processes/impersonation_users_select.xml,file:src/main/resources/petriNets/engine-processes/dashboard.xml,file:src/main/resources/petriNets/engine-processes/dashboard_tile.xml \ No newline at end of file diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy index c8138c3274..0efe7ed845 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignActionTest.groovy @@ -107,10 +107,10 @@ 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 FileInputStream("src/test/resources/assignRoleMainNet_test_.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) 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 FileInputStream("src/test/resources/assignRoleSecondaryNet_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert secondaryNet.getNet() != null this.mainNet = mainNet.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy index 554b7d3640..b3567a4c2c 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/action/AssignRemoveTest.groovy @@ -65,7 +65,7 @@ class AssignRemoveTest { @Test @Disabled("Create functions or update test") public 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 FileInputStream("src/test/resources/petriNets/role_assign_remove_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); assert netOptional.getNet() != null; def net = netOptional.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy index 276d5501e0..aed89392e4 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/action/RemoveActionTest.groovy @@ -93,7 +93,7 @@ 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 FileInputStream("src/test/resources/removeRole_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert net.getNet() != null this.petriNet = net.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy index cc437f9fda..790f4db863 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/AuthenticationControllerTest.groovy @@ -84,7 +84,7 @@ class AuthenticationControllerTest { smtpServer = new GreenMail(new ServerSetup(2525, null, "smtp")).withConfiguration(GreenMailConfiguration.aConfig().withDisabledAuthentication()) 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 FileInputStream("src/test/resources/insurance_portal_demo_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert net.getNet() != null if (authorityService.findAll().size() == 0) importHelper.createAuthority(Authority.user) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy index 9e82ef43b6..07e0d6d401 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/SecurityContextTest.groovy @@ -71,7 +71,7 @@ class SecurityContextTest { user = userService.saveUser(user, null) assert user != null - net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net != null } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy index 35ee7ea506..78a236660e 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/TaskAuthorizationServiceTest.groovy @@ -157,11 +157,11 @@ 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 FileInputStream("src/test/resources/task_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) 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 FileInputStream("src/test/resources/task_authorization_service_test_with_userRefs.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netWithUserRefs.getNet() != null this.netWithUserRefs = netWithUserRefs.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy index d8d66f5802..d770b42291 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/auth/WorkflowAuthorizationServiceTest.groovy @@ -118,11 +118,11 @@ class WorkflowAuthorizationServiceTest { @BeforeEach void init() { testHelper.truncateDbs() - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/workflow_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/workflow_authorization_service_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) 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 FileInputStream("src/test/resources/workflow_authorization_service_test_with_userRefs.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netWithUserRefs.getNet() != null this.netWithUserRefs = netWithUserRefs.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy index fcf3f010a9..708851e3b6 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/DataSearchRequestTest.groovy @@ -96,7 +96,7 @@ class DataSearchRequestTest { void before() { testHelper.truncateDbs() - def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert net.getNet() != null def users = userService.findAllUsers(null, Pageable.ofSize(100)) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy index 296082f3f0..f0a19464a4 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticSearchTest.groovy @@ -100,8 +100,8 @@ class ElasticSearchTest { auth = new UsernamePasswordAuthenticationToken(USER_EMAIL, USER_PASSW) testHelper.truncateDbs() - 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() + def net2 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net assert net2 diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy index 71695bf6e2..9445671015 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ElasticTaskTest.groovy @@ -79,7 +79,7 @@ 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert optional.getNet() != null def net = optional.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy index cf9cd55db8..8b199784d9 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/elastic/ReindexTest.groovy @@ -50,7 +50,7 @@ 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert net.getNet() != null int countTread = Thread.activeCount() List threads = [] diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy index 4419accb4a..1fba787800 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/importer/PredefinedRolesPermissionsTest.groovy @@ -445,7 +445,7 @@ class PredefinedRolesPermissionsTest { } private NetCaseTask importAndCreate(Resource model) { - ImportPetriNetEventOutcome importOutcome = petriNetService.importPetriNet(model.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + ImportPetriNetEventOutcome importOutcome = petriNetService.importPetriNet(model.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert importOutcome.getNet() != null diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy index c9c4fe1e3b..40540c05ed 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/importer/UserListTest.groovy @@ -54,7 +54,7 @@ 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 FileInputStream("src/test/resources/user_list.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); assert net.getNet() != null; Optional caseOpt = caseRepository.findOne(QCase.case$.title.eq("User List")); diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy index 15538dc2f1..5d1426eb63 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/AssignCancelFinishWithCaseTest.groovy @@ -57,7 +57,7 @@ class AssignCancelFinishWithCaseTest { @Test void testAssignCancelFinish() { - def testNet = petriNetService.importPetriNet(stream(ASSIGN_CANCEL_FINISH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(stream(ASSIGN_CANCEL_FINISH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert testNet.getNet() != null diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy index 9970a02249..eb13d1e02a 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/CaseApiTest.groovy @@ -55,7 +55,7 @@ class CaseApiTest { @Test void testCreate() { - testNet = petriNetService.importPetriNet(stream(CREATE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + testNet = petriNetService.importPetriNet(stream(CREATE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert testNet.getNet() != null @@ -72,7 +72,7 @@ class CaseApiTest { void testSearch() { testHelper.truncateDbs() - testNet = petriNetService.importPetriNet(stream(SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + testNet = petriNetService.importPetriNet(stream(SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert testNet.getNet() != null diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy index 89ea77e4dc..5f7634d32c 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/ipc/TaskApiTest.groovy @@ -68,7 +68,7 @@ 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(stream(TASK_SEARCH_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null @@ -99,7 +99,7 @@ class TaskApiTest { @Test @Disabled() void testTaskEventActions() { - def netOptional = petriNetService.importPetriNet(stream(TASK_EVENTS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(stream(TASK_EVENTS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null @@ -121,8 +121,8 @@ 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(stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) + def leasingNetOptional = petriNetService.importPetriNet(stream(LEASING_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert limitsNetOptional.getNet() != null assert leasingNetOptional.getNet() != null @@ -196,7 +196,7 @@ class TaskApiTest { @Test void testTaskBulkActions() { - def netOptional = petriNetService.importPetriNet(stream(TASK_BULK_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(stream(TASK_BULK_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null PetriNet net = netOptional.getNet() @@ -221,7 +221,7 @@ class TaskApiTest { @Test void testGetData() { - def netOptional = petriNetService.importPetriNet(stream(TASK_GETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(stream(TASK_GETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null PetriNet net = netOptional.getNet() @@ -256,7 +256,7 @@ class TaskApiTest { @Test void testSetData() { - def netOptional = petriNetService.importPetriNet(stream(TASK_SETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(stream(TASK_SETTER_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null PetriNet net = netOptional.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/pdf/service/PdfGeneratorTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/pdf/service/PdfGeneratorTest.groovy index c98381c755..2a96eaf4b9 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/pdf/service/PdfGeneratorTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/pdf/service/PdfGeneratorTest.groovy @@ -89,7 +89,7 @@ class PdfGeneratorTest { @Test void testActionDelegateFunction() { - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[3]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[3]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) String taskId = testCase.getTasks().find(taskPair -> taskPair.transition.equals("1")).task @@ -101,7 +101,7 @@ class PdfGeneratorTest { @Test void testAllData() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[3]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[3]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[3] + "_.pdf")) @@ -115,7 +115,7 @@ class PdfGeneratorTest { @Test void testingNormal() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[0]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[0]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[0] + "_.pdf")) @@ -129,7 +129,7 @@ class PdfGeneratorTest { @Test void testingWithTemplate() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[1]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[1]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[1] + "_.pdf")) @@ -148,7 +148,7 @@ class PdfGeneratorTest { @Test void testingCustomFunction() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[1]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[1]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) String filename = pdfResource.getOutputDefaultName() @@ -168,7 +168,7 @@ class PdfGeneratorTest { @Test void testingLongDocument() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[2]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[2]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[2] + "_.pdf")) @@ -182,7 +182,7 @@ class PdfGeneratorTest { @Test void testingPageNumber() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[2]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[2]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setNumberFormat(Locale.US) @@ -209,7 +209,7 @@ class PdfGeneratorTest { pdfResource.getLineHeight(), pdfResource) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[2]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[2]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_custom_field.pdf")) @@ -224,7 +224,7 @@ class PdfGeneratorTest { @Test void testFlowLayout() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[4]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[4]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() testCase.getPetriNet().getTransition("t1").setDataGroups(getDataGroupMap(dataService.getDataGroups(testCase.getTasks()[0].getTask(), Locale.ENGLISH).getData())) pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[4] + "_.pdf")) @@ -238,7 +238,7 @@ class PdfGeneratorTest { @Test void testDataGroup() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[5]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[5]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[5] + "_.pdf")) pdfGenerator.setupPdfGenerator(pdfResource) @@ -251,7 +251,7 @@ class PdfGeneratorTest { @Test void testTaskRef() { PdfResource pdfResource = applicationContext.getBean(PdfResource.class) - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[6]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[6]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() pdfResource.setOutputResource(new ClassPathResource(pdfOutputFolder + "/out_" + TESTING_DATA[6] + "_.pdf")) pdfGenerator.setupPdfGenerator(pdfResource) @@ -263,7 +263,7 @@ class PdfGeneratorTest { @Test void testRunGenerateAction() { - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[7]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[7]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) assertNotNull(net.getNet()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() assertNotNull(testCase) @@ -282,7 +282,7 @@ class PdfGeneratorTest { @Test void testRunGenerateActionToAnotherCase() { - ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[7]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem())) + ImportPetriNetEventOutcome net = petriNetService.importPetriNet(stream(TESTING_DATA[7]), VersionType.MAJOR, userService.transformToLoggedUser(userService.getSystem()), userService.getLoggedOrSystem().getWorkspaceId()) assertNotNull(net.getNet()) Case testCase = workflowService.createCase(net.getNet().getStringId(), "Test PDF", "", userService.transformToLoggedUser(userService.getSystem())).getCase() assertNotNull(testCase) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy index 4ed910ccc9..7abdeefbac 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ActionRefTest.groovy @@ -1,6 +1,7 @@ package com.netgrif.application.engine.petrinet.domain import com.netgrif.application.engine.auth.service.UserService +import com.netgrif.application.engine.petrinet.service.PetriNetService import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService @@ -59,7 +60,7 @@ 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 FileInputStream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).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/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy index 99cf689295..de1c757554 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcOrderTest.groovy @@ -51,7 +51,7 @@ class ArcOrderTest { @Test void testOrder() { - def net = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + def net = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() def arcs = net.getArcsOfTransition(NET_TASK) def sorted = arcs.sort { a1, a2 -> ArcOrderComparator.getInstance().compare(a1, a2) } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy index 1cffed6317..42f1714ac1 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ArcReferenceTest.groovy @@ -2,6 +2,7 @@ package com.netgrif.application.engine.petrinet.domain import com.netgrif.application.engine.auth.service.UserService import com.netgrif.application.engine.importer.service.Importer +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService import com.netgrif.application.engine.startup.ImportHelper import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -40,7 +41,7 @@ class ArcReferenceTest { @Test void testReference() { - def net = importer.importPetriNet(stream(NET_FILE)).get() + def net = importer.importPetriNet(stream(NET_FILE), DefaultWorkspaceService.DEFAULT_WORKSPACE_ID).get() assert net } @@ -48,7 +49,7 @@ class ArcReferenceTest { @Test void testInvalidReference() { assertThrows(IllegalArgumentException.class, () -> { - importer.importPetriNet(stream(NET_INVALID_FILE)).get() + importer.importPetriNet(stream(NET_INVALID_FILE), DefaultWorkspaceService.DEFAULT_WORKSPACE_ID).get() }); } } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy index 8d129ebca8..637c13ed95 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/EventTest.groovy @@ -87,7 +87,7 @@ class EventTest { void testEventImport() { testHelper.truncateDbs() - PetriNet net = petriNetService.importPetriNet(stream(EVENT_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()).getNet() + PetriNet net = petriNetService.importPetriNet(stream(EVENT_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() instance = helper.createCase(EVENT_NET_CASE, net) outcome = helper.assignTaskToSuper(EVENT_NET_TASK, instance.stringId) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy index 6a33aa08bb..9887a65db0 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/FunctionsTest.groovy @@ -87,8 +87,8 @@ class FunctionsTest { void testNamespaceFunction() { assert userService.findUserByUsername("test@test.com", null) == null - def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() + def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionResNet assert functionTestNet @@ -106,7 +106,7 @@ class FunctionsTest { @Test void testProcessFunctions() { - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionTestNet Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.transformToLoggedUser(userService.getLoggedOrSystem())).getCase() @@ -130,7 +130,7 @@ class FunctionsTest { } } - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionTestNet Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.transformToLoggedUser(userService.getLoggedOrSystem())).getCase() @@ -148,13 +148,13 @@ class FunctionsTest { } } - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionTestNet Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.transformToLoggedUser(userService.getLoggedOrSystem())).getCase() dataService.setData(aCase.tasks.first().task, ImportHelper.populateDataset(["text": ["value": "20", "type": "text"]])) - functionTestNet = petriNetService.importPetriNet(functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + functionTestNet = petriNetService.importPetriNet(functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionTestNet dataService.setData(aCase.tasks.first().task, ImportHelper.populateDataset(["text": ["value": "20", "type": "text"]])) @@ -164,7 +164,7 @@ class FunctionsTest { @Test void testProcessFunctionException() { assertThrows(MissingMethodException.class, () -> { - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionTestNet Case aCase = workflowService.createCase(functionTestNet.stringId, "Test", "", userService.transformToLoggedUser(userService.getLoggedOrSystem())).getCase() @@ -174,8 +174,8 @@ class FunctionsTest { @Test void testNewVersionOfNamespaceFunction() { - def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() - def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionResNet = petriNetService.importPetriNet(functionResNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() + def functionTestNet = petriNetService.importPetriNet(functionTestNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionResNet assert functionTestNet @@ -186,7 +186,7 @@ class FunctionsTest { assert aCase.getFieldValue("number2") == 20 + 20 - functionResNet = petriNetService.importPetriNet(functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + functionResNet = petriNetService.importPetriNet(functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert functionResNet dataService.setData(aCase.tasks.first().task, ImportHelper.populateDataset(["number": ["value": "20", "type": "number"]])) @@ -198,14 +198,14 @@ class FunctionsTest { @Test void testNamespaceMethodOverloadingFail() { assertThrows(IllegalArgumentException.class, () -> { - petriNetService.importPetriNet(functionOverloadingFailNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())) + petriNetService.importPetriNet(functionOverloadingFailNetResource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()) }) } @Test void testNamespaceUseCaseUpdate() { - def functionResV2Net = petriNetService.importPetriNet(functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() - def functionTestV2Net = petriNetService.importPetriNet(functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def functionResV2Net = petriNetService.importPetriNet(functionResNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() + def functionTestV2Net = petriNetService.importPetriNet(functionTestNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() Case aCase = workflowService.createCase(functionTestV2Net.stringId, "Test", "", userService.transformToLoggedUser(userService.getLoggedOrSystem())).getCase() dataService.setData(aCase.tasks.first().task, ImportHelper.populateDataset(["updateOtherField": ["value": "true", "type": "boolean"]])) @@ -223,7 +223,7 @@ class FunctionsTest { @Test void testProcessMethodOverloadingFail() { assertThrows(IllegalArgumentException.class, () -> { - petriNetService.importPetriNet(functionOverloadingFailNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())) + petriNetService.importPetriNet(functionOverloadingFailNetResourceV2.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()) }) } @@ -233,7 +233,7 @@ class FunctionsTest { } private void testMethodOverloading(Resource resource) { - def petriNet = petriNetService.importPetriNet(resource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + def petriNet = petriNetService.importPetriNet(resource.inputStream, VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert petriNet diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy index 15e6138b78..58c7a661b2 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/ImporterTest.groovy @@ -85,7 +85,8 @@ class ImporterTest { def netOptional = petriNetService.importPetriNet( firstVersionResource.inputStream, VersionType.MAJOR, - superCreator.loggedSuper + superCreator.loggedSuper, + userService.getLoggedOrSystem().getWorkspaceId() ) assert netOptional.getNet() != null assert processRoleRepository.count() == beforeImportNet + 2 @@ -171,7 +172,8 @@ class ImporterTest { def netOptional2 = petriNetService.importPetriNet( secondVersionResource.inputStream, VersionType.MAJOR, - superCreator.loggedSuper + superCreator.loggedSuper, + userService.getLoggedOrSystem().getWorkspaceId() ) assert processRoleRepository.count() == statusImportRole + 1 @@ -284,7 +286,7 @@ 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 ClassPathResource("/this_kw_test.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net != null Case testCase = workflowService.createCase(net.stringId, "Test case", "", superCreator.loggedSuper).getCase() @@ -295,7 +297,7 @@ 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 ClassPathResource("/initial_behavior.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net Case testCase = workflowService.createCase(net.stringId, "Test case", "", superCreator.loggedSuper).getCase() @@ -318,7 +320,7 @@ 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 ClassPathResource("/enumeration_multichoice_options.xml").getInputStream(), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net != null @@ -343,7 +345,8 @@ class ImporterTest { def netOutcome = petriNetService.importPetriNet( new FileInputStream("src/test/resources/datagroup_no_id_test.xml"), VersionType.MAJOR, - superCreator.loggedSuper) + superCreator.loggedSuper, + userService.getLoggedOrSystem().getWorkspaceId()) assert netOutcome.getNet() != null @@ -355,7 +358,7 @@ 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 FileInputStream("src/test/resources/importTest/NoLabel.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net PetriNet importNet = petriNetService.findByImportId(net.getImportId()).get() assert importNet diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy index 72b43e2d37..76ab0ec1c7 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/PetriNetTest.groovy @@ -58,7 +58,7 @@ class PetriNetTest { void testClone() { int beforeImportNet = processRoleRepository.count() - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null @@ -79,13 +79,13 @@ class PetriNetTest { @Test void testVersioning() { - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null - def netOptional2 = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional2 = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional2.getNet() != null - def netOptional3 = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional3 = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional3.getNet() != null def nets = petriNetService.getReferencesByVersion(null, superCreator.loggedSuper, Locale.UK) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy index 21eaf0bf50..122c688761 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/CaseFieldTest.groovy @@ -114,7 +114,7 @@ class CaseFieldTest { @Test void testImmediateAllowedNets() { - def testNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert testNet.getNet() != null Case aCase = importHelper.createCase("Case 1", testNet.getNet()) @@ -168,10 +168,10 @@ class CaseFieldTest { @Test @Disabled("Please fix this test") void testChangeValueAction() { - def notAllowedNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def notAllowedNet = petriNetService.importPetriNet(stream(ALLOWED_NETS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert notAllowedNet.getNet() != null - def testNet = petriNetService.importPetriNet(stream(CHANGE_VALUE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def testNet = petriNetService.importPetriNet(stream(CHANGE_VALUE_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert testNet.getNet() != null Case aCase = importHelper.createCase("Case 1", testNet.getNet()) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy index d706df19b4..476c54e629 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeCasePropertyTest.groovy @@ -56,7 +56,7 @@ class ChangeCasePropertyTest { @BeforeEach void initNet() { testHelper.truncateDbs() - net = petriNetService.importPetriNet(new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem())).getNet() + net = petriNetService.importPetriNet(new FileInputStream(RESOURCE_PATH), VersionType.MAJOR, userService.transformToLoggedUser(userService.getLoggedOrSystem()), userService.getLoggedOrSystem().getWorkspaceId()).getNet() assert net != null } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy index a7bdcb92fb..33a858e5c7 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChangeFieldValueInitTest.groovy @@ -49,7 +49,7 @@ 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 FileInputStream("src/test/resources/petriNets/change_field_value_init.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); Case useCase = importHelper.createCase("test", optNet.getNet()) assert useCase.dataSet["text_static"].value == "TEST VALUE" diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy index 066271a6f0..66e55e5276 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/ChoiceFieldTest.groovy @@ -56,7 +56,7 @@ class ChoiceFieldTest { @Test void testChoices() { - def netOptional = petriNetService.importPetriNet(stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(stream(LIMITS_NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null def net = netOptional.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy index f48a81f611..da82eaf96d 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicCaseNameTest.groovy @@ -39,7 +39,7 @@ class DynamicCaseNameTest { @Test void testInitValues() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_case_name_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_case_name_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) Case useCase = workflowService.createCase(optNet.getNet().stringId, null, "", superCreator.loggedSuper, Locale.forLanguageTag("sk-SK")).getCase() assert useCase.title == "SK text value 6" diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy index a28c85311e..9f08c49447 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicChoicesTest.groovy @@ -50,7 +50,7 @@ class DynamicChoicesTest { @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 FileInputStream("src/test/resources/petriNets/dynamic_choices.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); assert optNet.getNet() != null; def net = optNet.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy index dbb1e362ad..b0bc415dff 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicDefaultValueTest.groovy @@ -40,7 +40,7 @@ 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 FileInputStream("src/test/resources/petriNets/dynamic_init.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); Case useCase = importHelper.createCase("test", optNet.getNet()) assert useCase.dataSet["text"].value == superCreator.superUser.name diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy index 8eccd3493c..0c363b2183 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicEnumerationTest.groovy @@ -54,7 +54,7 @@ class DynamicEnumerationTest { @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 FileInputStream("src/test/resources/test_autocomplete_dynamic.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); assert optNet.getNet() != null; def net = optNet.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy index 9b72a7663a..1fcf30b2c2 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationPerformanceTest.groovy @@ -61,8 +61,8 @@ class DynamicValidationPerformanceTest { @Test void testValidations() { - 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 FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) + ImportPetriNetEventOutcome optNet2 = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations_performance_test_comparison.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) def aCase1 = importHelper.createCase("Case 1", optNet1.getNet()) def aCase2 = importHelper.createCase("Case 2", optNet2.getNet()) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy index 16b0b50dc9..9aa2120dba 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/DynamicValidationTest.groovy @@ -57,7 +57,7 @@ class DynamicValidationTest { @Test @Disabled void testValidations() { - ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome optNet = petriNetService.importPetriNet(new FileInputStream("src/test/resources/petriNets/dynamic_validations.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) Case useCase = importHelper.createCase("test", optNet.getNet()) Map data = getData(useCase) assert (data["number"]).validations[0] instanceof DynamicValidation diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy index 280b33c817..09350fac4f 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FieldTest.groovy @@ -5,6 +5,7 @@ import com.netgrif.application.engine.TestHelper import com.netgrif.application.engine.importer.service.Importer import com.netgrif.application.engine.ipc.TaskApiTest import com.netgrif.application.engine.objects.petrinet.domain.PetriNet +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService import com.netgrif.application.engine.startup.runner.GroupRunner import com.netgrif.application.engine.startup.runner.SuperCreatorRunner import com.netgrif.application.engine.startup.runner.SystemUserRunner @@ -75,7 +76,7 @@ class FieldTest { @Test void testImport() { - limitsNetOptional = importer.importPetriNet(stream(LIMITS_NET_FILE)) + limitsNetOptional = importer.importPetriNet(stream(LIMITS_NET_FILE), DefaultWorkspaceService.DEFAULT_WORKSPACE_ID) assertNet() assertNumberField() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy index b348b789f7..2bf8a77be2 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileFieldTest.groovy @@ -99,7 +99,7 @@ class FileFieldTest { } PetriNet getNet() { - def netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/remoteFileField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/remoteFileField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null return netOptional.getNet() } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy index 1d9e66d46c..b9ff5ca2c5 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/FileListFieldTest.groovy @@ -163,7 +163,7 @@ class FileListFieldTest { } PetriNet getNet() { - def netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/remoteFileListField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()) + def netOptional = petriNetService.importPetriNet(new FileInputStream("src/test/resources/remoteFileListField.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null return netOptional.getNet() } diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy index b9c0d6af68..0b1f2e1505 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/dataset/MapFieldTest.groovy @@ -46,7 +46,7 @@ class MapFieldTest { @Test void testImport() { - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null def net = netOptional.getNet() @@ -70,7 +70,7 @@ class MapFieldTest { @Test void testValue() { - def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null Case aCase = importHelper.createCase("Case", netOptional.getNet()) @@ -107,7 +107,7 @@ class MapFieldTest { @Test void testImportMultichoice() { - def netOptional = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + def netOptional = petriNetService.importPetriNet(netResource2.inputStream, VersionType.MAJOR, superCreator.loggedSuper, userService.getLoggedOrSystem().getWorkspaceId()) assert netOptional.getNet() != null def net = netOptional.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy index ea69024248..0b84072c55 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/domain/roles/ProcessRoleTest.groovy @@ -86,7 +86,7 @@ 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 FileInputStream("src/test/resources/rolref_view.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert net.getNet() != null String netId = net.getNet().getStringId() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy index d05881f3f2..0ff9f79e9f 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/service/PetriNetServiceTest.groovy @@ -108,7 +108,7 @@ class PetriNetServiceTest { long taskCount = taskRepository.count() - ImportPetriNetEventOutcome testNetOptional = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + ImportPetriNetEventOutcome testNetOptional = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert testNetOptional.getNet() != null assert petriNetRepository.count() == processCount + 1 PetriNet testNet = testNetOptional.getNet() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy index 342e9ae9dc..ff46a9cb52 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/petrinet/web/PetriNetControllerTest.groovy @@ -81,7 +81,7 @@ class PetriNetControllerTest { void before() { testHelper.truncateDbs() - def net = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper()) + def net = petriNetService.importPetriNet(stream(NET_FILE), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()) assert net.getNet() != null this.net = net.getNet() diff --git a/application-engine/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java b/application-engine/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java index 839a8a11ac..bfeaab381c 100644 --- a/application-engine/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java +++ b/application-engine/src/test/java/com/netgrif/application/engine/importer/ConstructorAndDestructorTest.java @@ -46,7 +46,7 @@ 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 FileInputStream("src/test/resources/constructor_destructor.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); assert outcome.getNet() != null; Optional caseOpt = caseRepository.findOne(QCase.case$.title.eq("Construct")); diff --git a/application-engine/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java b/application-engine/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java index aedbe6e565..720e0be55d 100644 --- a/application-engine/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java +++ b/application-engine/src/test/java/com/netgrif/application/engine/importer/ImporterTest.java @@ -62,13 +62,13 @@ 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 FileInputStream("src/test/resources/prikladFM_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); 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 FileInputStream("src/test/resources/priority_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); assert outcome.getNet() != null; CreateCaseEventOutcome caseOutcome = workflowService.createCase(outcome.getNet().getStringId(), outcome.getNet().getTitle().getDefaultValue(), "color", superCreator.getLoggedSuper()); @@ -78,19 +78,19 @@ public void priorityTest() throws MissingPetriNetMetaDataException, IOException, @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 FileInputStream("src/test/resources/datagroup_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); 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 FileInputStream("src/test/resources/read_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); } @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 FileInputStream("src/test/resources/mapping_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); assertExternalMappingImport(outcome.getNet()); } @@ -102,7 +102,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(fileInputStream, VersionType.MAJOR, loggedUser, superCreator.getLoggedSuper().getWorkspaceId())) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("doesn't have a layout"); @@ -133,7 +133,7 @@ private void assertExternalMappingImport(PetriNet imported) { private void assertNetProperlyImported() { assert repository.count() > 0; - Page nets = repository.findByIdentifier(NET_ID, new FullPageRequest()); + Page nets = repository.findByIdentifierAndWorkspaceId(NET_ID, superCreator.getLoggedSuper().getWorkspaceId(), new FullPageRequest()); PetriNet net = nets.getContent().get(0); assert net.getTitle().getDefaultValue().equals(NET_TITLE); assert net.getInitials().equals(NET_INITIALS); diff --git a/application-engine/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java b/application-engine/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java index 6ed4609530..feb6b537ed 100644 --- a/application-engine/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java +++ b/application-engine/src/test/java/com/netgrif/application/engine/petrinet/service/ProcessRoleServiceTest.java @@ -55,8 +55,8 @@ 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); + petriNetService.importPetriNet(new FileInputStream("src/test/resources/role_all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); roles = processRoleService.findAll(); assertNotNull(roles); assertFalse(roles.isEmpty()); @@ -65,7 +65,7 @@ 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); List roles = processRoleService.findAll(eventOutcome.getNet().getStringId()); assertNotNull(roles); assertFalse(roles.isEmpty()); @@ -92,7 +92,7 @@ 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); Set roles = processRoleService.findAllByImportId(ROLE_IMPORT_ID); assertNotNull(roles); assertFalse(roles.isEmpty()); @@ -102,7 +102,7 @@ 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 FileInputStream("src/test/resources/all_data.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), superCreator.getLoggedSuper().getWorkspaceId()); Collection roles = processRoleService.findAllByDefaultName("Process role"); assertNotNull(roles); assertFalse(roles.isEmpty()); diff --git a/application-engine/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java b/application-engine/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java index eaa7e5ba9e..e3513668e0 100644 --- a/application-engine/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java +++ b/application-engine/src/test/java/com/netgrif/application/engine/workflow/service/TaskServiceTest.java @@ -91,14 +91,14 @@ public void setUp() throws Exception { userRunner.run(null); uriRunner.run(null); - petriNetService.importPetriNet(new FileInputStream("src/test/resources/prikladFM.xml"), VersionType.MAJOR, superCreator.getLoggedSuper()); + petriNetService.importPetriNet(new FileInputStream("src/test/resources/prikladFM.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); PetriNet net = petriNetRepository.findAll().get(0); workflowService.createCase(net.getStringId(), "Storage Unit", "color", mockLoggedUser()); } @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 FileInputStream("src/test/resources/reset_inhibitor_test.xml"), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()).getNet(); LoggedUser loggedUser = mockLoggedUser(); CreateCaseEventOutcome outcome = workflowService.createCase(net.getStringId(), "Reset test", "color", loggedUser); User user = new com.netgrif.application.engine.adapter.spring.auth.domain.User(); diff --git a/application-engine/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java b/application-engine/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java index 37fd23b699..a6c9d062aa 100644 --- a/application-engine/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java +++ b/application-engine/src/test/java/com/netgrif/application/engine/workflow/web/VariableArcsTest.java @@ -108,7 +108,7 @@ 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 FileInputStream(NET_PATH), VersionType.MAJOR, superCreator.getLoggedSuper(), userService.getLoggedOrSystem().getWorkspaceId()); assert outcome.getNet() != null; PetriNet net = outcome.getNet(); diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/IUser.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/IUser.java index 99943cab71..4307bf2266 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/IUser.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/IUser.java @@ -17,6 +17,10 @@ public interface IUser extends Actor { void setRealmId(String realmId); + String getWorkspaceId(); + + void setWorkspaceId(String workspaceId); + String getUsername(); void setUsername(String username); diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/LoggedUser.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/LoggedUser.java index 0554db1c22..d04c5a6240 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/LoggedUser.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/auth/domain/LoggedUser.java @@ -23,6 +23,8 @@ public abstract class LoggedUser implements Serializable { private String realmId; + private String workspaceId; + private String createMethod; private String username; diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java index f5c0d3246c..9bd3042747 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticCase.java @@ -33,6 +33,8 @@ public abstract class ElasticCase implements Serializable { private String uriNodeId; + private String workspaceId; + private Long version; private Long lastModified; @@ -93,6 +95,7 @@ public abstract class ElasticCase implements Serializable { public ElasticCase(Case useCase) { stringId = useCase.getStringId(); uriNodeId = useCase.getUriNodeId(); + workspaceId = useCase.getWorkspaceId(); mongoId = useCase.getStringId(); //TODO: Duplication lastModified = Timestamp.valueOf(useCase.getLastModified()).getTime(); processIdentifier = useCase.getProcessIdentifier(); @@ -124,6 +127,7 @@ public void update(ElasticCase useCase) { if (useCase.getUriNodeId() != null) { uriNodeId = useCase.getUriNodeId(); } + workspaceId = useCase.getWorkspaceId(); title = useCase.getTitle(); taskIds = useCase.getTaskIds(); taskMongoIds = useCase.getTaskMongoIds(); diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java index 064e8ca610..8bdfca9425 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java @@ -26,6 +26,8 @@ public abstract class ElasticPetriNet { private String uriNodeId; + private String workspaceId; + private String stringId; private I18nString title; @@ -40,6 +42,7 @@ public ElasticPetriNet(PetriNet net) { this.identifier = net.getIdentifier(); this.version = net.getVersion(); this.uriNodeId = net.getUriNodeId(); + this.workspaceId = net.getWorkspaceId(); this.stringId = net.getStringId(); this.title = net.getTitle(); this.initials = net.getInitials(); @@ -51,6 +54,7 @@ public void update(ElasticPetriNet net) { if (net.getUriNodeId() != null) { this.uriNodeId = net.getUriNodeId(); } + this.workspaceId = net.getWorkspaceId(); this.title = net.getTitle(); this.initials = net.getInitials(); } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java index e0bd698820..a4cb57b341 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticTask.java @@ -32,6 +32,8 @@ public abstract class ElasticTask { private String transitionId; + private String workspaceId; + private I18nString title; private String titleSortable; @@ -86,6 +88,7 @@ public ElasticTask(Task task) { this.taskId = task.getStringId(); this.caseId = task.getCaseId(); this.transitionId = task.getTransitionId(); + this.workspaceId = task.getWorkspaceId(); this.title = task.getTitle(); this.titleSortable = title.getDefaultValue(); this.caseTitle = task.getCaseTitle(); @@ -112,6 +115,7 @@ public ElasticTask(Task task) { public void update(ElasticTask task) { this.title = task.getTitle(); this.titleSortable = title.getDefaultValue(); + this.workspaceId = task.getWorkspaceId(); this.caseTitle = task.getCaseTitle(); this.caseTitleSortable = this.caseTitle; this.priority = task.getPriority(); diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/PetriNet.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/PetriNet.java index 04b1db7de6..c08e2842f4 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/PetriNet.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/PetriNet.java @@ -36,6 +36,14 @@ public abstract class PetriNet extends PetriNetObject { @Setter private String uriNodeId; + @Getter + @Setter + private String uri; + + @Getter + @Setter + private String workspaceId; + @Getter private I18nString title; @@ -192,6 +200,8 @@ public PetriNet(PetriNet petriNet) { this.defaultRoleEnabled = petriNet.isDefaultRoleEnabled(); this.anonymousRoleEnabled = petriNet.isAnonymousRoleEnabled(); this.author = petriNet.getAuthor(); + this.workspaceId = petriNet.getWorkspaceId(); + this.uri = petriNet.getUri(); initializeArcs(); } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/Transition.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/Transition.java index 5522ed5053..0cc3ee249e 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/Transition.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/Transition.java @@ -22,6 +22,10 @@ public class Transition extends Node { + @Getter + @Setter + private String workspaceId; + @Getter @Setter private Map dataGroups; @@ -270,5 +274,6 @@ public Transition(Transition transition) { this.setAssignedUserPolicy(new HashMap<>(transition.assignedUserPolicy)); this.setTags(new HashMap<>(transition.tags)); this.setDefaultRoleId(transition.defaultRoleId); + this.setWorkspaceId(transition.workspaceId); } } diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/PredefinedProcessRole.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/PredefinedProcessRole.java new file mode 100644 index 0000000000..131b975fab --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/PredefinedProcessRole.java @@ -0,0 +1,18 @@ +package com.netgrif.application.engine.objects.petrinet.domain.roles; + +import lombok.Getter; + +@Getter +public enum PredefinedProcessRole { + + DEFAULT_ROLE("default", "Default system process role"), + ANONYMOUS_ROLE("anonymous", "Anonymous system process role"); + + private final String name; + private final String description; + + PredefinedProcessRole(String s, String d) { + name = s; + description = d; + } +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/ProcessRole.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/ProcessRole.java index c31ca2c6fc..17d0f5aaba 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/ProcessRole.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/roles/ProcessRole.java @@ -35,6 +35,9 @@ public abstract class ProcessRole extends Imported { @Getter private ProcessResourceId _id; + @Setter + private String workspaceId; + @Getter private I18nString name; @@ -62,6 +65,7 @@ public ProcessRole(ProcessRole processRole) { this.processId = processRole.processId; this.description = processRole.description; this.events = processRole.events; + this.workspaceId = processRole.workspaceId; } public ProcessRole(String id) { diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/DefaultWorkspaceService.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/DefaultWorkspaceService.java new file mode 100644 index 0000000000..5e1010875c --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/DefaultWorkspaceService.java @@ -0,0 +1,12 @@ +package com.netgrif.application.engine.objects.petrinet.domain.workspace; + +import java.util.List; + +public interface DefaultWorkspaceService { + + public static final String DEFAULT_WORKSPACE_ID = "default"; + + Workspace getDefaultWorkspace(); + + List getAllWorkspaces(); +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/Workspace.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/Workspace.java new file mode 100644 index 0000000000..3b063e6da3 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/Workspace.java @@ -0,0 +1,25 @@ +package com.netgrif.application.engine.objects.petrinet.domain.workspace; + +import com.netgrif.application.engine.objects.auth.domain.Author; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class Workspace implements Serializable { + + @Serial + private static final long serialVersionUID = 2708949961379974800L; + + private String id; + + private String name; + + private String description; + + private Author owner; + + private boolean defaultWorkspace; + +} \ No newline at end of file diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/WorkspaceRequest.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/WorkspaceRequest.java new file mode 100644 index 0000000000..123ff11031 --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/WorkspaceRequest.java @@ -0,0 +1,9 @@ +package com.netgrif.application.engine.objects.petrinet.domain.workspace; + +public record WorkspaceRequest( + String workspaceId, + String name, + String description, + boolean defaultWorkspace) { +} + diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/WorkspaceService.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/WorkspaceService.java new file mode 100644 index 0000000000..14c08da7ee --- /dev/null +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/workspace/WorkspaceService.java @@ -0,0 +1,25 @@ +package com.netgrif.application.engine.objects.petrinet.domain.workspace; + +import com.netgrif.application.engine.objects.auth.domain.LoggedUser; + +import java.util.List; +import java.util.Optional; + +public interface WorkspaceService { + + Workspace save(Workspace workspace); + + Optional get(String id); + + List getAll(); + + Workspace createWorkspace(WorkspaceRequest createRequest, LoggedUser loggedUser); + + Workspace setDefaultWorkspace(String workspaceId); + + Workspace setDefaultWorkspace(Workspace workspace); + + Workspace getDefaultWorkspace(); + + void delete(String identifier); +} diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java index 51d11b5846..44624f8ed4 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Case.java @@ -33,6 +33,9 @@ public abstract class Case implements Serializable { @Setter private String uriNodeId; + @Setter + private String workspaceId; + @Setter private LocalDateTime lastModified; @@ -153,6 +156,7 @@ public Case(PetriNet petriNet) { icon = petriNet.getIcon(); userRefs = petriNet.getUserRefs(); tags = new HashMap<>(petriNet.getTags()); + workspaceId = petriNet.getWorkspaceId(); permissions = petriNet.getPermissions().entrySet().stream() .filter(role -> role.getValue().containsKey("delete") || role.getValue().containsKey("view")) diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java index 5809106d99..4fc0c712bd 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/Task.java @@ -42,6 +42,10 @@ public abstract class Task implements Serializable { @Setter private String transitionId; + @Getter + @Setter + private String workspaceId; + @Getter @Setter private TaskLayout layout; diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/AnonymousUser.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/AnonymousUser.java index 55ea7b0218..bc5526bf4e 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/AnonymousUser.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/AnonymousUser.java @@ -20,6 +20,7 @@ public class AnonymousUser extends AbstractUser implements IUser { private String email; private String firstName; private String lastName; + private String workspaceId; private transient Duration sessionTimeout = Duration.ofHours(2); diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/LoggedUserImpl.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/LoggedUserImpl.java index 4b8545c9d7..53ac179ac2 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/LoggedUserImpl.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/LoggedUserImpl.java @@ -22,8 +22,8 @@ public LoggedUserImpl(String id, String username, String password, Set authoritySet, Set groups, boolean enabled, boolean emailVerified, boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, LoggedUser impersonated, Set processRoles, Set MFAMethod, Duration sessionTimeout, Map> attributes, Set negativeProcessRoles) { - super(id, realmId, createMethod, username, email, password, firstName, lastName, authoritySet, groups, enabled, emailVerified, accountNonExpired, accountNonLocked, credentialsNonExpired, impersonated, processRoles, negativeProcessRoles, MFAMethod, sessionTimeout, attributes); + public LoggedUserImpl(String id, String realmId, String workspaceId, String createMethod, String username, String email, String password, String firstName, String lastName, Set authoritySet, Set groups, boolean enabled, boolean emailVerified, boolean accountNonExpired, boolean accountNonLocked, boolean credentialsNonExpired, LoggedUser impersonated, Set processRoles, Set MFAMethod, Duration sessionTimeout, Map> attributes, Set negativeProcessRoles) { + super(id, realmId, workspaceId, createMethod, username, email, password, firstName, lastName, authoritySet, groups, enabled, emailVerified, accountNonExpired, accountNonLocked, credentialsNonExpired, impersonated, processRoles, negativeProcessRoles, MFAMethod, sessionTimeout, attributes); } @Override diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/User.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/User.java index a5a8bad6e3..6e4fae471b 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/User.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/User.java @@ -7,6 +7,8 @@ import com.netgrif.application.engine.objects.auth.domain.Group; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.querydsl.core.annotations.QueryEntity; +import lombok.Getter; +import lombok.Setter; import org.bson.types.ObjectId; import org.springframework.data.annotation.Transient; @@ -23,6 +25,11 @@ public User(ObjectId id) { super(id); } + @Getter + @Setter + @Transient + private String workspaceId; + @Override public LoggedUser transformToLoggedUser() { return LoggedUserMapper.toLoggedUser(this); diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/mapper/LoggedUserMapper.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/mapper/LoggedUserMapper.java index d248d22ad0..b6a91f2638 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/mapper/LoggedUserMapper.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/auth/domain/mapper/LoggedUserMapper.java @@ -31,7 +31,7 @@ public static IUser toUser(LoggedUser loggedUser) { user.setProcessRoles(loggedUser.getProcessRoles()); user.setAttributes(loggedUser.getAttributes()); user.setAuthMethods(loggedUser.getMfaMethod()); - + user.setWorkspaceId(loggedUser.getWorkspaceId()); return user; } @@ -58,6 +58,7 @@ public static LoggedUser toLoggedUser(IUser user) { if (user.getImpersonated() != null) { loggedUser.setImpersonated(toLoggedUser(user.getImpersonated())); } + loggedUser.setWorkspaceId(user.getWorkspaceId()); return loggedUser; } diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java index b67c046177..a7c2affd9f 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticCase.java @@ -38,6 +38,11 @@ public String getUriNodeId() { return super.getUriNodeId(); } + @Field(type = Keyword) + public String getWorkspaceId() { + return super.getWorkspaceId(); + } + @Version public Long getVersion() { return super.getVersion(); diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java index ae33ae757c..78812cbb1e 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java @@ -42,6 +42,12 @@ public String getUriNodeId() { return super.getUriNodeId(); } + @Field(type = Keyword) + @Override + public String getWorkspaceId() { + return super.getWorkspaceId(); + } + @Field(type = Keyword) @Override public String getStringId() { diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java index ca1a5c7dbd..e22a162af1 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticTask.java @@ -64,6 +64,12 @@ public String getTransitionId() { return super.getTransitionId(); } + @Field(type = Keyword) + @Override + public String getWorkspaceId() { + return super.getWorkspaceId(); + } + @Field(type = Keyword) @Override public String getTitleSortable() { diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/service/ProcessRoleService.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/service/ProcessRoleService.java index 5c6a448428..2cc0e06fe6 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/service/ProcessRoleService.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/petrinet/service/ProcessRoleService.java @@ -2,6 +2,7 @@ import com.netgrif.application.engine.objects.auth.domain.Group; import com.netgrif.application.engine.objects.auth.domain.IUser; +import com.netgrif.application.engine.objects.petrinet.domain.roles.PredefinedProcessRole; import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; import com.netgrif.application.engine.objects.auth.domain.LoggedUser; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; @@ -12,7 +13,6 @@ public interface ProcessRoleService { ProcessRole save(ProcessRole processRole); List saveAll(Iterable processRoles); - List getAll(); List findAllByNetId(String netId); Optional get(ProcessResourceId id); void delete(String id); @@ -24,20 +24,22 @@ public interface ProcessRoleService { void assignNegativeRolesToUser(IUser user, Set roleIds, LoggedUser loggedUser); void assignNegativeRolesToUser(IUser user, Set roleIds, LoggedUser loggedUser, Map params); void assignNegativeRolesToGroup(Group group, Set requestedRolesIds); - ProcessRole getDefaultRole(); - ProcessRole getAnonymousRole(); Collection findAllByIds(Collection roleIds); ProcessRole findById(ProcessResourceId id); Collection findAllByDefaultName(String name); Set findAllByImportId(String importId); ProcessRole findById(String id); Set findByIds(Set ids); - ProcessRole findByImportId(String importId); List findAll(); + List findAllByWorkspaceId(String workspaceId); Set findAllGlobalRoles(); List findAll(String netId); ProcessRole defaultRole(); ProcessRole anonymousRole(); + ProcessRole defaultRole(String workspaceId); + ProcessRole anonymousRole(String workspaceId); + ProcessRole createDefaultOrAnonymousRole(PredefinedProcessRole role, String workspaceId); + void deleteDefaultOrAnonymousRole(PredefinedProcessRole role, String workspaceId); void deleteRolesOfNet(PetriNet net, LoggedUser loggedUser); void clearCache(); } diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java index 690bb5a3b4..7740d0d261 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/workflow/domain/Task.java @@ -28,8 +28,8 @@ public Task() { } @Builder(builderMethodName = "with") - public Task(ProcessResourceId _id, String processId, String caseId, String transitionId, TaskLayout layout, I18nString title, String caseColor, String caseTitle, Integer priority, String userId, String userRealmId, IUser user, List triggers, Map> roles, Map> userRefs, Map> users, List viewRoles, List viewUserRefs, List viewUsers, List negativeViewRoles, List negativeViewUsers, LocalDateTime startDate, LocalDateTime finishDate, String finishedBy, String transactionId, Boolean requiredFilled, LinkedHashSet immediateDataFields, List> immediateData, String icon, AssignPolicy assignPolicy, DataFocusPolicy dataFocusPolicy, FinishPolicy finishPolicy, Map eventTitles, Map assignedUserPolicy, Map consumedTokens, Map tags) { - super(_id, processId, caseId, transitionId, layout, title, caseColor, caseTitle, priority, userId, userRealmId, user, triggers, roles, userRefs, users, viewRoles, viewUserRefs, viewUsers, negativeViewRoles, negativeViewUsers, startDate, finishDate, finishedBy, transactionId, requiredFilled, immediateDataFields, immediateData, icon, assignPolicy, dataFocusPolicy, finishPolicy, eventTitles, assignedUserPolicy, consumedTokens, tags); + public Task(ProcessResourceId _id, String processId, String caseId, String transitionId, String workspaceId, TaskLayout layout, I18nString title, String caseColor, String caseTitle, Integer priority, String userId, String userRealmId, IUser user, List triggers, Map> roles, Map> userRefs, Map> users, List viewRoles, List viewUserRefs, List viewUsers, List negativeViewRoles, List negativeViewUsers, LocalDateTime startDate, LocalDateTime finishDate, String finishedBy, String transactionId, Boolean requiredFilled, LinkedHashSet immediateDataFields, List> immediateData, String icon, AssignPolicy assignPolicy, DataFocusPolicy dataFocusPolicy, FinishPolicy finishPolicy, Map eventTitles, Map assignedUserPolicy, Map consumedTokens, Map tags) { + super(_id, processId, caseId, transitionId, workspaceId, layout, title, caseColor, caseTitle, priority, userId, userRealmId, user, triggers, roles, userRefs, users, viewRoles, viewUserRefs, viewUsers, negativeViewRoles, negativeViewUsers, startDate, finishDate, finishedBy, transactionId, requiredFilled, immediateDataFields, immediateData, icon, assignPolicy, dataFocusPolicy, finishPolicy, eventTitles, assignedUserPolicy, consumedTokens, tags); } @Id diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/config/WorkspaceContextHolder.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/config/WorkspaceContextHolder.java new file mode 100644 index 0000000000..46fcb78b03 --- /dev/null +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/config/WorkspaceContextHolder.java @@ -0,0 +1,67 @@ +package com.netgrif.application.engine.auth.config; + +import org.springframework.core.NamedInheritableThreadLocal; +import org.springframework.core.NamedThreadLocal; + +public class WorkspaceContextHolder { + + private static final ThreadLocal workspaceHolder = + new NamedThreadLocal("WorkspaceId Context"); + + private static final ThreadLocal inheritableWorkspaceHolder = + new NamedInheritableThreadLocal("WorkspaceId Context"); + + /** + * Reset the workspaceId for the current thread. + */ + public static void resetWorkspaceId() { + workspaceHolder.remove(); + } + + /** + * Bind the given workspaceId to the current thread, + * not exposing it as inheritable for child threads. + * @param workspaceId the workspaceId to expose + * @see #setWorkspaceId(String, boolean) + */ + public static void setWorkspaceId(String workspaceId) { + setWorkspaceId(workspaceId, false); + } + + /** + * Bind the given workspaceId to the current thread. + * @param workspaceId the workspaceId to expose, + * or {@code null} to reset the thread-bound context + * @param inheritable whether to expose the workspaceId as inheritable + * for child threads (using an {@link InheritableThreadLocal}) + */ + public static void setWorkspaceId(String workspaceId, boolean inheritable) { + if (workspaceId == null) { + resetWorkspaceId(); + } + else { + if (inheritable) { + inheritableWorkspaceHolder.set(workspaceId); + workspaceHolder.remove(); + } + else { + workspaceHolder.set(workspaceId); + inheritableWorkspaceHolder.remove(); + } + } + } + + /** + * Return the workspaceId currently bound to the thread. + * @return the workspaceId currently bound to the thread, + * or {@code null} if none bound + */ + public static String getWorkspaceId() { + String workspaceId = workspaceHolder.get(); + if (workspaceId == null) { + workspaceId = inheritableWorkspaceHolder.get(); + } + return workspaceId; + } + +} diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java index 4ef71c4873..da0adf421c 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserFactoryImpl.java @@ -4,8 +4,11 @@ import com.netgrif.application.engine.adapter.spring.petrinet.web.responsebodies.ProcessRole; import com.netgrif.application.engine.auth.web.responsebodies.User; import com.netgrif.application.engine.objects.auth.domain.IUser; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import org.springframework.beans.factory.annotation.Autowired; +import java.util.ArrayList; +import java.util.List; import java.util.Locale; import java.util.stream.Collectors; @@ -17,17 +20,22 @@ public class UserFactoryImpl implements UserFactory { @Autowired private ProcessRoleFactory processRoleFactory; + @Autowired + private DefaultWorkspaceService defaultWorkspaceService; + @Override public User getUser(IUser user, Locale locale) { User result = getUser(user); - String defaultRoleId = processRoleService.defaultRole().getStringId(); - String anonymousRoleId = processRoleService.anonymousRole().getStringId(); + List defaultRolesId = new ArrayList<>(); + List anonymousRolesId = new ArrayList<>(); + defaultWorkspaceService.getAllWorkspaces().forEach(workspace -> { + defaultRolesId.add(processRoleService.defaultRole(workspace.getId()).getStringId()); + anonymousRolesId.add(processRoleService.anonymousRole(workspace.getId()).getStringId()); + }); + result.setProcessRoles(user.getProcessRoles().stream().map(processRole -> { - if (processRole.getStringId().equals(defaultRoleId)) { - return new ProcessRole(processRole, locale); - } - if (processRole.getStringId().equals(anonymousRoleId)) { + if (defaultRolesId.contains(processRole.getStringId()) || anonymousRolesId.contains(processRole.getStringId())) { return new ProcessRole(processRole, locale); } return processRoleFactory.getProcessRole(processRole, locale); diff --git a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java index 21e1334c01..541667dfc2 100644 --- a/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java +++ b/nae-user-ce/src/main/java/com/netgrif/application/engine/auth/service/UserServiceImpl.java @@ -4,6 +4,7 @@ import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService; import com.netgrif.application.engine.adapter.spring.workflow.service.FilterImportExportService; import com.netgrif.application.engine.auth.config.GroupConfigurationProperties; +import com.netgrif.application.engine.auth.config.WorkspaceContextHolder; import com.netgrif.application.engine.auth.provider.CollectionNameProvider; import com.netgrif.application.engine.auth.repository.UserRepository; import com.netgrif.application.engine.objects.auth.constants.UserConstants; @@ -11,6 +12,7 @@ import com.netgrif.application.engine.objects.auth.domain.enums.UserState; import com.netgrif.application.engine.objects.petrinet.domain.PetriNet; import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole; +import com.netgrif.application.engine.objects.petrinet.domain.workspace.DefaultWorkspaceService; import com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId; import com.querydsl.core.types.dsl.BooleanExpression; import lombok.Getter; @@ -56,6 +58,8 @@ public class UserServiceImpl implements UserService { private IUser systemUser; + private DefaultWorkspaceService defaultWorkspaceService; + @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; @@ -103,6 +107,11 @@ public void setGroupService(GroupService groupService) { this.groupService = groupService; } + @Autowired + public void setDefaultWorkspaceService(DefaultWorkspaceService defaultWorkspaceService) { + this.defaultWorkspaceService = defaultWorkspaceService; + } + @Override public IUser saveUser(IUser user, String realmId) { user.setRealmId(realmId); @@ -112,6 +121,7 @@ public IUser saveUser(IUser user, String realmId) { @Override public IUser saveUser(IUser user) { log.debug("Saving user [{}] in DEFAULT realm", user.getUsername()); + user.setWorkspaceId(null); String collectionName = collectionNameProvider.getCollectionNameForRealm(user.getRealmId()); user = userRepository.saveUser((User) user, mongoTemplate, collectionName); log.trace("User [{}] saved in collection [{}]", user.getUsername(), collectionName); @@ -159,7 +169,7 @@ public IUser createUser(String username, String email, String firstName, String public IUser createUser(IUser user, String realmId) { log.info("Creating user [{}] in realm [{}]", user.getUsername(), realmId); addDefaultAuthorities(user); - addDefaultRole(user); + addDefaultRoles(user); ((User) user).addAuthMethod("basic"); setPassword(((User) user), ((User) user).getPassword()); @@ -185,7 +195,7 @@ public User createUserFromThirdParty(String username, String email, String first log.info("Creating user [{}] from third-party auth [{}] in realm [{}] without password", username, authMethod, realmId); User user = initializeNewUser(username, email, firstName, lastName, realmId); addDefaultAuthorities(user); - addDefaultRole(user); + addDefaultRoles(user); setDisablePassword(user); user.addAuthMethod(authMethod); String collectionName = collectionNameProvider.getCollectionNameForRealm(realmId); @@ -220,11 +230,17 @@ public void addDefaultAuthorities(IUser user) { } @Override - public void addDefaultRole(IUser user) { - log.trace("Assigning default role to user [{}]", user.getUsername()); - user.addProcessRole(processRoleService.defaultRole()); + public void addDefaultRoles(IUser user) { + log.trace("Assigning default roles to user [{}]", user.getUsername()); + Set roles = user.getProcessRoles(); + defaultWorkspaceService.getAllWorkspaces().forEach(workspace -> + roles.add(processRoleService.defaultRole(workspace.getId())) + ); + user.setProcessRoles(roles); } + + @Override public void addAnonymousAuthorities(IUser user) { log.trace("Assigning anonymous authorities to user [{}]", user.getUsername()); @@ -251,9 +267,13 @@ public void addAllRolesToAdminByUsername(String username) { } @Override - public void addAnonymousRole(IUser user) { - log.trace("Assigning anonymous role to user [{}]", user.getUsername()); - user.addProcessRole(processRoleService.anonymousRole()); + public void addAnonymousRoles(IUser user) { + log.trace("Assigning anonymous roles to user [{}]", user.getUsername()); + Set roles = user.getProcessRoles(); + defaultWorkspaceService.getAllWorkspaces().forEach(workspace -> + roles.add(processRoleService.anonymousRole(workspace.getId())) + ); + user.setProcessRoles(roles); } @Override @@ -418,6 +438,7 @@ public IUser getLoggedUser() { impersonated.setProcessRoles(new HashSet<>(processRoleService.findAllByIds(resourceIds))); user.setImpersonated(impersonated); } + user.setWorkspaceId(loggedUser.getWorkspaceId()); return user; } @@ -426,7 +447,9 @@ public IUser getSystem() { if (systemUser == null) { systemUser = createSystemUser(); } - systemUser.setProcessRoles(new HashSet<>(processRoleService.getAll())); + String workspaceId = WorkspaceContextHolder.getWorkspaceId() != null ? WorkspaceContextHolder.getWorkspaceId() : defaultWorkspaceService.getDefaultWorkspace().getId(); + systemUser.setWorkspaceId(workspaceId); + systemUser.setProcessRoles(new HashSet<>(processRoleService.findAllByWorkspaceId(workspaceId))); return systemUser; } @@ -531,6 +554,7 @@ public IUser transformToUser(LoggedUserImpl loggedUser) { user.setGroups(loggedUser.getGroups()); user.setAuthorities(loggedUser.getAuthoritySet()); user.setAttributes(loggedUser.getAttributes()); + user.setWorkspaceId(loggedUser.getWorkspaceId()); if (loggedUser.getImpersonated() != null) { user.setImpersonated(transformToUser((LoggedUserImpl) loggedUser.getImpersonated())); } @@ -563,7 +587,7 @@ public LoggedUserImpl transformToLoggedUser(IUser user) { loggedUser.setRealmId(user.getRealmId()); loggedUser.setGroups(user.getGroups()); loggedUser.setMfaMethod(mfaMethods); - + loggedUser.setWorkspaceId(user.getWorkspaceId()); if (user.getImpersonated() != null) { loggedUser.setImpersonated(transformToLoggedUser(user.getImpersonated())); } diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java index 5a8509f4d0..77c12ab21b 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/service/UserService.java @@ -38,13 +38,13 @@ public interface UserService { IUser createUserFromThirdParty(String username, String email, String firstName, String lastName, String realmId, String authMethod); - void addDefaultRole(IUser user); + void addDefaultRoles(IUser user); void addAnonymousAuthorities(IUser user); void addAllRolesToAdminByUsername(String username); - void addAnonymousRole(IUser user); + void addAnonymousRoles(IUser user); IUser findById(String id, String realmId); diff --git a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java index df9449b74b..d571eb6adc 100644 --- a/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java +++ b/nae-user-common/src/main/java/com/netgrif/application/engine/auth/web/responsebodies/User.java @@ -35,6 +35,7 @@ public class User { private boolean enabled; private boolean emailVerified; protected UserState state; + private String workspaceId; public User(IUser user) { id = user.getStringId(); @@ -45,6 +46,7 @@ public User(IUser user) { firstName = user.getFirstName(); lastName = user.getLastName(); fullName = user.getFullName(); + workspaceId = user.getWorkspaceId(); createdAt = user.getCreatedAt(); attributes = user.getAttributes(); enabled = user.isEnabled();