From b98530cb2053ed2589692bfb407e5407a3ce4fdf Mon Sep 17 00:00:00 2001 From: Adam Heath Date: Mon, 8 May 2023 14:09:02 -0500 Subject: [PATCH] Add check-empty-type support to explicit load calls. If "load" is requested from the moqui cli, then all given data load types are *always* run. However, if moqui is started normally, it has special support to load certain data items only the *first* time, when the database is empty(checked via looking for Enumeration records). This feature lets one specify check-empty-types, and load types. Then, always call "load" in the deployment process, and the first time through(empty database) it'll load seed,seed-initial, etc, and subsequent calls will just load seed. --- framework/src/main/java/org/moqui/Moqui.java | 23 +++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/moqui/Moqui.java b/framework/src/main/java/org/moqui/Moqui.java index 4fa100038..5dfc054d7 100644 --- a/framework/src/main/java/org/moqui/Moqui.java +++ b/framework/src/main/java/org/moqui/Moqui.java @@ -132,10 +132,31 @@ public static void loadData(Map argMap) { // set the data load parameters EntityDataLoader edl = ec.getEntity().makeDataLoader(); + Set loadTypes = new HashSet<>(); if (argMap.containsKey("types")) { String types = argMap.get("types"); - if (!"all".equals(types)) edl.dataTypes(new HashSet<>(Arrays.asList(types.split(",")))); + if (!"all".equals(types)) loadTypes.addAll(Arrays.asList(types.split(","))); } + if (argMap.containsKey("check-empty-types")) { + String checkEmptyTypesStr = (String) argMap.get("check-empty-types"); + List checkEmptyTypes = new ArrayList(Arrays.asList(checkEmptyTypesStr.split(","))); + // Remove always-load types from the checkEmpty list + if (!loadTypes.isEmpty()) checkEmptyTypes.removeAll(loadTypes); + if ("all".equals(checkEmptyTypesStr)) { + logger.info("Check empty types set to \"all\", skipping empty database check"); + } else if (checkEmptyTypes.isEmpty()) { + logger.info("Check empty types (" + checkEmptyTypesStr + ") in the always-load list, not checking for empty database"); + } else { + long enumCount = ec.getEntity().find("moqui.basic.Enumeration").disableAuthz().count(); + if (enumCount == 0) { + logger.info("Found " + enumCount + " Enumeration records, loading data types (" + String.join(",", checkEmptyTypes) + ")"); + loadTypes.addAll(checkEmptyTypes); + } else { + logger.info("Found " + enumCount + " Enumeration records, NOT loading data types (" + String.join(",", checkEmptyTypes) + ")"); + } + } + } + if (!loadTypes.isEmpty()) edl.dataTypes(loadTypes); if (argMap.containsKey("components")) edl.componentNameList(Arrays.asList(argMap.get("components").split(","))); if (argMap.containsKey("location")) edl.location(argMap.get("location")); if (argMap.containsKey("timeout")) edl.transactionTimeout(Integer.valueOf(argMap.get("timeout")));