diff --git a/core/src/main/java/lucee/runtime/config/ConfigAdmin.java b/core/src/main/java/lucee/runtime/config/ConfigAdmin.java index b5b308e5fc..22427b7d7b 100755 --- a/core/src/main/java/lucee/runtime/config/ConfigAdmin.java +++ b/core/src/main/java/lucee/runtime/config/ConfigAdmin.java @@ -1624,6 +1624,24 @@ private void _removeStartupHook(ClassDefinition cd) throws PageException { } } + private void _removeStartupHook(String component) { + + Array children = ConfigWebUtil.getAsArray("startupHooks", root); + Key[] keys = children.keys(); + // Remove + for (int i = keys.length - 1; i >= 0; i--) { + Key key = keys[i]; + Struct tmp = Caster.toStruct(children.get(key, null), null); + if (tmp == null) continue; + + String n = Caster.toString(tmp.get(KeyConstants._component, null), null); + if (n != null && n.equalsIgnoreCase(component)) { + children.removeEL(key); + break; + } + } + } + private void unloadStartupIfNecessary(ConfigPro config, ClassDefinition cd, boolean force) { ConfigBase.Startup startup = config.getStartups().get(cd.getClassName()); if (startup == null) return; @@ -1736,6 +1754,34 @@ private void _updateStartupHook(ClassDefinition cd) throws PageException { } } + private void _updateStartupHook(String component) { + // unloadStartupIfNecessary(config, cd, false); + + Array children = ConfigWebUtil.getAsArray("startupHooks", root); + + // Update + Struct child = null; + for (int i = 1; i <= children.size(); i++) { + Struct tmp = Caster.toStruct(children.get(i, null), null); + if (tmp == null) continue; + + String n = ConfigWebUtil.getAsString("component", tmp, null); + if (n.equalsIgnoreCase(component)) { + child = tmp; + break; + } + } + + // Insert + if (child == null) { + child = new StructImpl(Struct.TYPE_LINKED); + children.appendEL(child); + } + + // make sure the class exists + child.setEL(KeyConstants._component, component); + } + public void updateGatewayEntry(String id, ClassDefinition cd, String componentPath, String listenerCfcPath, int startupMode, Struct custom, boolean readOnly) throws PageException { checkWriteAccess(); @@ -4915,11 +4961,20 @@ public void updateRHExtension(Config config, RHExtension rhext, boolean reload, while (itl.hasNext()) { map = itl.next(); ClassDefinition cd = RHExtension.toClassDefinition(config, map, null); + String cfc = map.get("component"); + + // class if (cd != null && cd.isBundle()) { _updateStartupHook(cd); reloadNecessary = true; + logger.info("extension", "Update Startup Hook [" + cd + "] from extension [" + rhext.getName() + ":" + rhext.getVersion() + "]"); + } + // component + else if (!StringUtil.isEmpty(cfc, true)) { + _updateStartupHook(cfc); + reloadNecessary = true; + logger.info("extension", "Update Startup Hook [" + cfc + "] from extension [" + rhext.getName() + ":" + rhext.getVersion() + "]"); } - logger.info("extension", "Update Startup Hook [" + cd + "] from extension [" + rhext.getName() + ":" + rhext.getVersion() + "]"); } } @@ -5239,9 +5294,14 @@ private void removeRHExtension(Config config, RHExtension rhe, RHExtension repla while (itl.hasNext()) { map = itl.next(); ClassDefinition cd = RHExtension.toClassDefinition(config, map, null); + String cfc = map.get("component"); + if (cd != null && cd.isBundle()) { _removeStartupHook(cd); } + else if (!StringUtil.isEmpty(cfc, true)) { + _removeStartupHook(cfc); + } logger.info("extension", "Remove Startup Hook [" + cd + "] from extension [" + rhe.getName() + ":" + rhe.getVersion() + "]"); } } diff --git a/core/src/main/java/lucee/runtime/config/ConfigWebFactory.java b/core/src/main/java/lucee/runtime/config/ConfigWebFactory.java index 9c41e88269..3fc22f734b 100644 --- a/core/src/main/java/lucee/runtime/config/ConfigWebFactory.java +++ b/core/src/main/java/lucee/runtime/config/ConfigWebFactory.java @@ -4331,7 +4331,14 @@ private static void _loadStartupHook(ConfigServerImpl configServer, ConfigImpl c try { child = Caster.toStruct(it.next()); if (child == null) continue; + // component + String cfc = Caster.toString(child.get(KeyConstants._component), null); + if (!StringUtil.isEmpty(cfc, true)) { + // TODO start hook + continue; + } + // class ClassDefinition cd = getClassDefinition(child, "", config.getIdentification()); ConfigBase.Startup existing = config.getStartups().get(cd.getClassName()); diff --git a/loader/build.xml b/loader/build.xml index 234a8936f2..8d02317cde 100644 --- a/loader/build.xml +++ b/loader/build.xml @@ -2,7 +2,7 @@ - + diff --git a/loader/pom.xml b/loader/pom.xml index dfbc6b9200..d0a449013d 100644 --- a/loader/pom.xml +++ b/loader/pom.xml @@ -3,7 +3,7 @@ org.lucee lucee - 6.2.0.23-SNAPSHOT + 6.2.0.24-SNAPSHOT jar Lucee Loader Build