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 93aacd729f5..651bf31abba 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 @@ -248,7 +248,7 @@ class ImportHelper { superCreator.setAllToSuperUser() } - Optional importProcess(String message, String netIdentifier, String netFileName) { + Optional importProcessOnce(String message, String netIdentifier, String netFileName) { PetriNet filter = petriNetService.getNewestVersionByIdentifier(netIdentifier) if (filter != null) { log.info("${message} has already been imported.") 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 f1438327d82..8cac15aad9a 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 @@ -183,6 +183,7 @@ public Path saveNetFile(PetriNet net, InputStream xmlFile) throws IOException { @Transactional protected Optional createPetriNet() throws MissingPetriNetMetaDataException, MissingIconKeyException { net = new com.netgrif.application.engine.adapter.spring.petrinet.domain.PetriNet(); + net.setVersion(null); documentValidator.checkConflictingAttributes(document, document.getUsersRef(), document.getUserRef(), "usersRef", "userRef"); documentValidator.checkDeprecatedAttributes(document); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java index f957e82aa1d..95a426e88eb 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java @@ -56,9 +56,8 @@ public class DashboardManagementServiceImpl implements DashboardManagementServic @Override public Case createDashboardManagement(DashboardManagementBody body) throws TransitionNotExecutableException { Case managementCase; - MenuItemUtils.sanitize(body.getId()); - managementCase = findDashboardManagement(body.getId()); + managementCase = findDashboardManagement(MenuItemUtils.sanitize(body.getId())); if (managementCase != null) { log.info("Dashboard management with id:{} already exists", body.getId()); return managementCase; @@ -80,7 +79,6 @@ public Case createDashboardManagement(DashboardManagementBody body) throws Trans */ @Override public Case updateDashboardManagement(Case managementCase, DashboardManagementBody body) throws TransitionNotExecutableException { - MenuItemUtils.sanitize(body.getId()); addReferencedMenuItems(body); ToDataSetOutcome outcome = body.toDataSet(); managementCase = setDataWithExecute(managementCase, DashboardItemConstants.TASK_CONFIGURE, outcome.getDataSet()); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java index 2aae3741494..a0665430a41 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java @@ -15,7 +15,6 @@ import com.netgrif.application.engine.objects.utils.MenuItemUtils; import com.netgrif.application.engine.objects.workflow.domain.Case; import com.netgrif.application.engine.objects.workflow.domain.Task; -import com.netgrif.application.engine.objects.workflow.domain.TaskPair; import com.netgrif.application.engine.objects.workflow.domain.menu.FilterBody; import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody; import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemConstants; @@ -333,7 +332,6 @@ public Case duplicateItem(Case originItem, I18nString newTitle, String newIdenti duplicated.setTitle(newTitle.getDefaultValue()); duplicated = workflowService.save(duplicated); - parentPath(String.valueOf(originItem.getDataSet().get(MenuItemConstants.FIELD_NODE_PATH))); String newNodePath = createNodePath(parentPath(String.valueOf(originItem.getDataSet().get(MenuItemConstants.FIELD_NODE_PATH))), sanitizedIdentifier); Map> dataSet = new HashMap<>(); @@ -619,47 +617,6 @@ protected Case getOrCreateFolderRecursive(String path, MenuItemBody body, Case c return folderCase; } - protected Case getOrCreateFolderRecursive2(String path, MenuItemBody body, Case childFolderCase) throws TransitionNotExecutableException { - Case folderCase = findFolderCase(path); - if (folderCase != null) { - if (childFolderCase != null) { - folderCase = appendChildCaseIdAndSave(folderCase, childFolderCase.getStringId()); - initializeParentId(childFolderCase, folderCase.getStringId()); - } - return folderCase; - } - - folderCase = createCase(MenuProcessRunner.MENU_NET_IDENTIFIER, body.getMenuName().toString(), ActorTransformer.toLoggedUser(userService.getLoggedOrSystem())); - if (childFolderCase != null) { - folderCase = appendChildCaseIdAndSave(folderCase, childFolderCase.getStringId()); - initializeParentId(childFolderCase, folderCase.getStringId()); - } else { - folderCase = workflowService.save(folderCase); - } - - Optional newItemTask = folderCase.getTasks().stream().filter(taskPair -> taskPair.getTransition().equals(MenuItemConstants.TRANS_INIT_ID)).findFirst(); - - ToDataSetOutcome dataSetOutcome = body.toDataSet(null, path, null); - if (childFolderCase != null) { - appendChildCaseIdInDataSet(folderCase, childFolderCase.getStringId(), dataSetOutcome.getDataSet()); - } - - if (newItemTask.isPresent()) { - setDataWithExecute(folderCase, MenuItemConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet()); - } - - if (hasParent(path)) { - body = new com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody(new I18nString(nameFromPath(path)), "folder"); - String parentPath = parentPath(path); - getOrCreateFolderRecursive(parentPath, body, folderCase); - } - - folderCase = setDataWithExecute(folderCase, MenuItemConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet()); - - return folderCase; - } - - private Case initializeParentId(Case childFolderCase, String parentFolderCaseId) { childFolderCase.getDataField(MenuItemConstants.FIELD_PARENT_ID).setValue(Collections.singletonList(parentFolderCaseId)); return workflowService.save(childFolderCase); 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 62f3fb243ec..f9dad57a49a 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 @@ -200,10 +200,19 @@ public ImportPetriNetEventOutcome importPetriNet(InputStream xmlFile, VersionTyp PetriNet net = imported.get(); PetriNet existingNet = getNewestVersionByIdentifier(net.getIdentifier()); - if (existingNet != null && net.getVersion() == null) { - net.setVersion(existingNet.getVersion()); - net.incrementVersion(releaseType); + + if (existingNet != null) { + if (existingNet.getVersion().equals(net.getVersion())) { + throw new IllegalArgumentException("Provided Petri net version is already present in the system"); + } + if (net.getVersion() == null) { + net.setVersion(existingNet.getVersion()); + net.incrementVersion(releaseType); + } + } else if (net.getVersion() == null) { + net.setVersion(new Version()); } + processRoleService.saveAll(net.getRoles().values()); net.setAuthor(ActorTransformer.toActorRef(author)); functionCacheService.cachePetriNetFunctions(net); @@ -357,8 +366,8 @@ public Page getReferencesByVersion(Version version, LoggedUse GroupOperation groupByIdentifier = Aggregation.group("identifier").max("version").as("version"); Aggregation aggregation; if (pageable == null || pageable.isUnpaged()) { - aggregation = Aggregation.newAggregation( - groupByIdentifier + aggregation = Aggregation.newAggregation( + groupByIdentifier ); } else { aggregation = Aggregation.newAggregation( diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java index eeab8452199..048c36db671 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java @@ -26,7 +26,7 @@ public class DashboardManagementRunner implements ApplicationEngineStartupRunner @Override public void run(ApplicationArguments args) throws Exception { - helper.importProcess("Petri net for dashboard management", DASHBOARD_MANAGEMENT_NET_IDENTIFIER, DASHBOARD_MANAGEMENT_FILE_NAME); - helper.importProcess("Petri net for dashboard items", DASHBOARD_ITEM_NET_IDENTIFIER, DASHBOARD_ITEM_FILE_NAME); + helper.importProcessOnce("Petri net for dashboard management", DASHBOARD_MANAGEMENT_NET_IDENTIFIER, DASHBOARD_MANAGEMENT_FILE_NAME); + helper.importProcessOnce("Petri net for dashboard items", DASHBOARD_ITEM_NET_IDENTIFIER, DASHBOARD_ITEM_FILE_NAME); } } 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 ef803c4f3e4..45cc86f08e5 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 @@ -5,7 +5,6 @@ import com.netgrif.application.engine.startup.annotation.RunnerOrder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; @@ -28,7 +27,7 @@ public class DashboardRunner implements ApplicationEngineStartupRunner { @Override public void run(ApplicationArguments args) throws Exception { - helper.importProcess("Petri net for dashboard", DASHBOARD_NET_IDENTIFIER, DASHBOARD_FILE_NAME); - helper.importProcess("Petri net for dashboard tile", DASHBOARD_TILE_NET_IDENTIFIER, DASHBOARD_TILE_FILE_NAME); + helper.importProcessOnce("Petri net for dashboard", DASHBOARD_NET_IDENTIFIER, DASHBOARD_FILE_NAME); + helper.importProcessOnce("Petri net for dashboard tile", DASHBOARD_TILE_NET_IDENTIFIER, DASHBOARD_TILE_FILE_NAME); } } 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 4c4010ff3ab..2627335a904 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 @@ -20,17 +20,17 @@ public class FilterRunner implements ApplicationEngineStartupRunner { public static final String FILTER_PETRI_NET_IDENTIFIER = "filter"; private static final String EXPORT_FILTER_FILE_NAME = "engine-processes/export_filters.xml"; - private static final String EXPORT_NET_IDENTIFIER = "export_filters"; + public static final String EXPORT_NET_IDENTIFIER = "export_filters"; private static final String IMPORT_FILTER_FILE_NAME = "engine-processes/import_filters.xml"; - private static final String IMPORT_NET_IDENTIFIER = "import_filters"; + public static final String IMPORT_NET_IDENTIFIER = "import_filters"; @Override public void run(ApplicationArguments args) throws Exception { - helper.importProcess("Petri net for filters", FILTER_PETRI_NET_IDENTIFIER, FILTER_FILE_NAME); - helper.importProcess("Petri net for importing filters", IMPORT_NET_IDENTIFIER, IMPORT_FILTER_FILE_NAME); - helper.importProcess("Petri net for exporting filters", EXPORT_NET_IDENTIFIER, EXPORT_FILTER_FILE_NAME); + helper.importProcessOnce("Petri net for filters", FILTER_PETRI_NET_IDENTIFIER, FILTER_FILE_NAME); + helper.importProcessOnce("Petri net for importing filters", IMPORT_NET_IDENTIFIER, IMPORT_FILTER_FILE_NAME); + helper.importProcessOnce("Petri net for exporting filters", EXPORT_NET_IDENTIFIER, EXPORT_FILTER_FILE_NAME); } } diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java index 68a2281754f..2927e78adf4 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java @@ -28,7 +28,7 @@ public class MenuProcessRunner implements ApplicationEngineStartupRunner { @Override public void run(ApplicationArguments args) throws Exception { - helper.importProcess("Petri net for filter preferences", MENU_NET_IDENTIFIER, MENU_ITEM_FILE_NAME); + helper.importProcessOnce("Petri net for filter preferences", MENU_NET_IDENTIFIER, MENU_ITEM_FILE_NAME); createConfigurationNets(); } @@ -37,7 +37,7 @@ private List createConfigurationNets() { .map(view -> { String processIdentifier = view.getIdentifier() + "_configuration"; String filePath = String.format("engine-processes/menu/%s.xml", processIdentifier); - return helper.importProcess( + return helper.importProcessOnce( String.format("Petri net for %s", processIdentifier), processIdentifier, filePath diff --git a/application-engine/src/main/resources/application.yaml b/application-engine/src/main/resources/application.yaml index 8f91b19e1fd..4e2bb303c18 100644 --- a/application-engine/src/main/resources/application.yaml +++ b/application-engine/src/main/resources/application.yaml @@ -159,4 +159,4 @@ netgrif: RoleActionsRunner: debug CaseFieldsExpressionRunner: debug actions: - imports: com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody,com.netgrif.application.engine.objects.petrinet.domain.I18nString,com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody + imports: com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody,com.netgrif.application.engine.objects.petrinet.domain.I18nString,com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody,com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardItemBody diff --git a/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml b/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml index d3205bdfb27..3f4a0182800 100644 --- a/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml +++ b/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml @@ -120,7 +120,7 @@ change inherit_icon value { true } change inherit_name value { true } - if (menu_items_list.value != null && menu_items_list.value != null) { + if (menu_items_list.value != null && menu_items_list.value != "") { make [inherit_name, inherit_icon, icon_color, font_color, font_weight], editable on trans when { true } make [menu_item_taskRef, filter_divider], visible on trans when { true } def menuItemCase = workflowService.findOne(menu_items_list.value) @@ -309,7 +309,7 @@ change external_icon value { false } if (inherit_icon.value) { make [item_icon, item_icon_preview, external_icon], visible on trans when { true } - if (menu_items_list.value != null) { + if (menu_items_list.value != null && menu_items_list.value != "") { def menuItemCase = workflowService.findOne(menu_items_list.value) change item_icon value { menuItemCase.dataSet["menu_icon"].value } } else { @@ -338,7 +338,7 @@ menu_items_list: f.menu_items_list; if (inherit_name.value) { - if (menu_items_list.value != null) { + if (menu_items_list.value != null && menu_items_list.value != "") { def menuItemCase = workflowService.findOne(menu_items_list.value) change item_name value { menuItemCase.dataSet["menu_name"].value } } else { diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy index aade9cdcd3c..7c9c495ab7e 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/TestHelper.groovy @@ -68,6 +68,9 @@ class TestHelper { @Autowired private FinisherRunner finisherRunner + @Autowired + private MenuProcessRunner menuProcessRunner + @Autowired private ImpersonationRunner impersonationRunner @@ -100,6 +103,7 @@ class TestHelper { systemUserRunner.run() groupRunner.run() filterRunner.run() + menuProcessRunner.run() impersonationRunner.run() superCreator.run() finisherRunner.run() diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy index d9280989a29..7793895f45b 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy @@ -18,6 +18,7 @@ import com.netgrif.application.engine.startup.runner.FilterRunner import com.netgrif.application.engine.startup.ImportHelper import com.netgrif.application.engine.objects.workflow.domain.Case import com.netgrif.application.engine.adapter.spring.workflow.domain.QCase +import com.netgrif.application.engine.startup.runner.MenuProcessRunner 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 @@ -107,9 +108,9 @@ class MenuItemApiTest { assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_VIEW_FILTER_CASE].value == [] assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_DEFAULT_HEADERS].value == "meta-title,meta-title" - Case testFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/netgrif/test\"", PageRequest.of(0, 1))[0] - Case netgrifFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/netgrif\"", PageRequest.of(0, 1))[0] - Case rootFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/\"", PageRequest.of(0, 1))[0] + Case testFolder = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/netgrif/test\"", PageRequest.of(0, 1))[0] + Case netgrifFolder = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/netgrif\"", PageRequest.of(0, 1))[0] + Case rootFolder = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/\"", PageRequest.of(0, 1))[0] assert testFolder.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == [netgrifFolder.stringId] assert (testFolder.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList).contains(item.stringId) @@ -200,7 +201,7 @@ class MenuItemApiTest { Case viewCase = workflowService.findOne(viewId) Thread.sleep(2000) - Case folderCase = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif2\"", PageRequest.of(0, 1))[0] + Case folderCase = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif2\"", PageRequest.of(0, 1))[0] ArrayList childIds = folderCase.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList assert childIds.contains(viewId) && childIds.size() == 2 @@ -224,11 +225,11 @@ class MenuItemApiTest { ]) Thread.sleep(2000) - folderCase = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test3\"", PageRequest.of(0, 1))[0] - Case folderCase2 = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif\"", PageRequest.of(0, 1))[0] + folderCase = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test3\"", PageRequest.of(0, 1))[0] + Case folderCase2 = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif\"", PageRequest.of(0, 1))[0] assert folderCase != null && folderCase.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == [folderCase2.stringId] - folderCase = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test3/netgrif2\"", PageRequest.of(0, 1))[0] + folderCase = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test3/netgrif2\"", PageRequest.of(0, 1))[0] assert folderCase != null assert folderCase.dataSet[MenuItemConstants.FIELD_NODE_PATH].value == "/netgrif/test3/netgrif2" @@ -321,7 +322,7 @@ class MenuItemApiTest { Case leafItemCase = getMenuItem(apiCase) sleep(2000) - Case testFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test\"", PageRequest.of(0, 1))[0] + Case testFolder = findCasesElastic("processIdentifier:$MenuProcessRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test\"", PageRequest.of(0, 1))[0] String netgrifFolderId = (testFolder.dataSet[MenuItemConstants.FIELD_PARENT_ID].value as ArrayList)[0] Case netgrifFolder = workflowService.findOne(netgrifFolderId) diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy index f7064b1f981..48a77df7224 100644 --- a/application-engine/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy +++ b/application-engine/src/test/groovy/com/netgrif/application/engine/filters/FilterImportExportTest.groovy @@ -9,6 +9,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.dataset.FileFieldValue import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole +import com.netgrif.application.engine.petrinet.service.PetriNetService import com.netgrif.application.engine.startup.runner.DefaultFiltersRunner import com.netgrif.application.engine.startup.runner.FilterRunner import com.netgrif.application.engine.startup.ImportHelper @@ -47,9 +48,6 @@ class FilterImportExportTest { public static final String DUMMY_USER_MAIL = "dummy@netgrif.com" public static final String DUMMY_USER_PASSWORD = "password" - private static final String EXPORT_NET_IDENTIFIER = "export_filters" - private static final String IMPORT_NET_IDENTIFIER = "import_filters" - private static final int DEFAULT_FILTERS_SIZE = 5 private static final String[] FILTERS_TO_EXPORT = ["My cases", "My tasks", "Test filter"] private static final String[] FILTERS_TO_EXPORT_NEW = ["My cases new", "My tasks new", "Test filter new"] @@ -96,6 +94,9 @@ class FilterImportExportTest { @Autowired private IDataService dataService + @Autowired + private PetriNetService petriNetService + private Authentication userAuth private User dummyUser private Case importCase @@ -109,17 +110,16 @@ class FilterImportExportTest { dummyUser = createDummyUser() userAuth = new UsernamePasswordAuthenticationToken(ActorTransformer.toLoggedUser(dummyUser), DUMMY_USER_PASSWORD) SecurityContextHolder.getContext().setAuthentication(userAuth) - - Optional importNet = this.filterRunner.createImportFiltersNet() - Optional exportNet = this.filterRunner.createExportFiltersNet() + Optional importNet = petriNetService.findByImportId(this.filterRunner.IMPORT_NET_IDENTIFIER) + Optional exportNet = petriNetService.findByImportId(this.filterRunner.EXPORT_NET_IDENTIFIER) assert importNet.isPresent() assert exportNet.isPresent() importCase = this.workflowService.searchOne( - QCase.case$.processIdentifier.eq(IMPORT_NET_IDENTIFIER) & QCase.case$.author.identifier.eq(DUMMY_USER_MAIL) + QCase.case$.processIdentifier.eq(this.filterRunner.IMPORT_NET_IDENTIFIER) & QCase.case$.author.identifier.eq(DUMMY_USER_MAIL) ) exportCase = this.workflowService.searchOne( - QCase.case$.processIdentifier.eq(EXPORT_NET_IDENTIFIER) & QCase.case$.author.identifier.eq(DUMMY_USER_MAIL) + QCase.case$.processIdentifier.eq(this.filterRunner.EXPORT_NET_IDENTIFIER) & QCase.case$.author.identifier.eq(DUMMY_USER_MAIL) ) assert importCase != null assert exportCase != null 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 8d129ebca84..0114cf38742 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 @@ -4,6 +4,7 @@ import com.netgrif.application.engine.auth.service.UserService 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.VersionType import com.netgrif.application.engine.petrinet.domain.repositories.PetriNetRepository import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService import com.netgrif.application.engine.startup.runner.DefaultRoleRunner 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 24bc1fa01f2..19b9b76ec8b 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 @@ -52,6 +52,12 @@ class PetriNetTest { @Value("classpath:net_import_1.xml") private Resource netResource2 + @Value("classpath:net_clone2.xml") + private Resource netResource3 + + @Value("classpath:net_clone3.xml") + private Resource netResource4 + @BeforeEach void before() { testHelper.truncateDbs() @@ -96,4 +102,42 @@ class PetriNetTest { assert nets.find { it.identifier == "new_model" }.version == "1.0.0" assert nets.find { it.identifier == "test" }.version == "2.0.0" } + + @Test + void testVersion() { + def zeroImport = petriNetService.importPetriNet(netResource3.inputStream, VersionType.PATCH, superCreator.loggedSuper) + assert zeroImport.getNet() != null + assert zeroImport.getNet().version.toString() == "0.0.1" + + def firstImport = petriNetService.importPetriNet(netResource.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + assert firstImport.getNet() != null + assert firstImport.getNet().version.toString() == "1.0.0" + + def secondImport = petriNetService.importPetriNet(netResource.inputStream, VersionType.MINOR, superCreator.loggedSuper) + assert secondImport.getNet().version.toString() == "1.1.0" + + def thirdImport = petriNetService.importPetriNet(netResource.inputStream, VersionType.PATCH, superCreator.loggedSuper) + assert thirdImport.getNet().version.toString() == "1.1.1" + + def lastImport = petriNetService.importPetriNet(netResource4.inputStream, VersionType.PATCH, superCreator.loggedSuper) + assert lastImport.getNet().version.toString() == "3.1.1" + + Page nets = petriNetService.getByIdentifier(zeroImport.getNet().identifier, Pageable.unpaged()) + assert nets.getSize() == 5 + } + + + @Test + void testVersioningConflicts() { + def zeroImport = petriNetService.importPetriNet(netResource3.inputStream, VersionType.PATCH, superCreator.loggedSuper) + assert zeroImport.getNet() != null + assert zeroImport.getNet().version.toString() == "0.0.1" + + try { + petriNetService.importPetriNet(netResource3.inputStream, VersionType.MAJOR, superCreator.loggedSuper) + } catch (Exception e) { + assert e.getMessage() == "Provided Petri net version is already present in the system" + } + } + } diff --git a/application-engine/src/test/resources/net_clone2.xml b/application-engine/src/test/resources/net_clone2.xml new file mode 100644 index 00000000000..a533901e4d3 --- /dev/null +++ b/application-engine/src/test/resources/net_clone2.xml @@ -0,0 +1,77 @@ + + + test + 0.0.1 + TST + Test + + user + User + + + admin + Admin + + + + 2 + 620 + 260 + + + + + 1 + 380 + 260 + + 0 + false + + + + 3 + regular + 1 + 2 + 1 + + 500 + 220 + + + + 4 + reset + 1 + 2 + 1 + + 500 + 180 + + + + 5 + inhibitor + 1 + 2 + 1 + + 500 + 300 + + + + 6 + read + 1 + 2 + 1 + + 500 + 340 + + + \ No newline at end of file diff --git a/application-engine/src/test/resources/net_clone3.xml b/application-engine/src/test/resources/net_clone3.xml new file mode 100644 index 00000000000..8acd54254c9 --- /dev/null +++ b/application-engine/src/test/resources/net_clone3.xml @@ -0,0 +1,77 @@ + + + test + 3.1.1 + TST + Test + + user + User + + + admin + Admin + + + + 2 + 620 + 260 + + + + + 1 + 380 + 260 + + 0 + false + + + + 3 + regular + 1 + 2 + 1 + + 500 + 220 + + + + 4 + reset + 1 + 2 + 1 + + 500 + 180 + + + + 5 + inhibitor + 1 + 2 + 1 + + 500 + 300 + + + + 6 + read + 1 + 2 + 1 + + 500 + 340 + + + \ No newline at end of file diff --git a/application-engine/src/test/resources/net_import_2.xml b/application-engine/src/test/resources/net_import_2.xml index 520d3c44045..64ad36ee421 100644 --- a/application-engine/src/test/resources/net_import_2.xml +++ b/application-engine/src/test/resources/net_import_2.xml @@ -2,7 +2,7 @@ new_model - 1.0.0 + 2.0.0 NEW New Model2 home2 diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/version/Version.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/version/Version.java index db834e950cf..3c5c2d84be6 100644 --- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/version/Version.java +++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/petrinet/domain/version/Version.java @@ -11,7 +11,7 @@ @Data @AllArgsConstructor -public class Version implements Serializable { +public class Version implements Serializable, Comparable { /** * @deprecated since 6.0.3 - please use {@link #LATEST} instead @@ -52,6 +52,17 @@ public void increment(VersionType type) { } } + public int compareTo(Version other) { + if (this.major != other.major) { + return Long.compare(this.major, other.major); + } + if (this.minor != other.minor) { + return Long.compare(this.minor, other.minor); + } + return Long.compare(this.patch, other.patch); + } + + @Override public Version clone() { Version clone = new Version();