From ccb65b837f89c60496f6d3765107447e5ff8a15e Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Tue, 17 Oct 2023 13:13:54 +0200 Subject: [PATCH 1/8] added cron support --- .../cognifide/apm/api/scripts/LaunchMode.java | 5 + .../com/cognifide/apm/api/scripts/Script.java | 5 + .../apm/api/scripts/TransientScript.java | 5 + .../apm/core/launchers/ApmInstallService.java | 67 ++++++++++ .../apm/core/scripts/LaunchMetadata.java | 8 +- .../apm/core/scripts/ScriptFilters.java | 7 + .../apm/core/scripts/ScriptModel.java | 38 ++++++ .../apm/core/scripts/ScriptNode.java | 2 + .../apm/core/scripts/ScriptStorageImpl.java | 1 + .../ScriptsResourceChangeListener.java | 125 ++++++++++++++++++ .../apm/core/endpoints/ScriptUploadForm.kt | 5 +- .../apm/core/grammar/ReferenceFinder.kt | 2 + .../install/launchers/ApmInstallService.java | 6 +- .../clientlibs/views/editor/js/apm-editor.js | 1 + .../views/editorGrid/js/apm-editor-grid.js | 6 + .../apm/fragments/scriptLauncher/.content.xml | 5 + ...itoryInitializer~apm-script-mixin.cfg.json | 2 +- .../main/content/META-INF/vault/nodetypes.cnd | 1 + docs/launchers.md | 1 + 19 files changed, 286 insertions(+), 6 deletions(-) create mode 100644 app/aem/core/src/main/java/com/cognifide/apm/core/launchers/ApmInstallService.java create mode 100644 app/aem/core/src/main/java/com/cognifide/apm/core/services/ScriptsResourceChangeListener.java diff --git a/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/LaunchMode.java b/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/LaunchMode.java index 1a9f90b4a..88eafaf37 100644 --- a/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/LaunchMode.java +++ b/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/LaunchMode.java @@ -35,6 +35,11 @@ public enum LaunchMode { */ ON_SCHEDULE, + /** + * Executed on CRON expression + */ + ON_CRON_EXPRESSION, + /** * Executed always on bundle start */ diff --git a/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/Script.java b/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/Script.java index fac23ca13..68e0ecb84 100644 --- a/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/Script.java +++ b/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/Script.java @@ -50,6 +50,11 @@ public interface Script { */ Date getLaunchSchedule(); + /** + * Get CRON expression + */ + String getCronExpression(); + /** * Get last execution date */ diff --git a/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/TransientScript.java b/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/TransientScript.java index 9da0b72bf..cfd84bd77 100644 --- a/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/TransientScript.java +++ b/app/aem/api/src/main/java/com/cognifide/apm/api/scripts/TransientScript.java @@ -82,6 +82,11 @@ public Date getLaunchSchedule() { return null; } + @Override + public String getCronExpression() { + return null; + } + @Override public Date getLastExecuted() { return null; diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/launchers/ApmInstallService.java b/app/aem/core/src/main/java/com/cognifide/apm/core/launchers/ApmInstallService.java new file mode 100644 index 000000000..c04c90a2f --- /dev/null +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/launchers/ApmInstallService.java @@ -0,0 +1,67 @@ +/*- + * ========================LICENSE_START================================= + * AEM Permission Management + * %% + * Copyright (C) 2013 Wunderman Thompson Technology + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * =========================LICENSE_END================================== + */ +package com.cognifide.apm.core.launchers; + +import com.cognifide.apm.api.scripts.Script; +import com.cognifide.apm.api.services.ScriptFinder; +import com.cognifide.apm.api.services.ScriptManager; +import com.cognifide.apm.core.services.ResourceResolverProvider; +import com.cognifide.apm.core.utils.RuntimeUtils; +import com.cognifide.apm.core.utils.sling.SlingHelper; +import java.lang.management.ManagementFactory; +import java.util.Collections; +import org.apache.commons.lang3.StringUtils; + +public class ApmInstallService extends AbstractLauncher implements Runnable { + + private static final String AEM_MUTABLE_CONTENT_INSTANCE = "aem-install-mutable-content"; + + private final String scriptPath; + + private final ResourceResolverProvider resolverProvider; + + private final ScriptManager scriptManager; + + private final ScriptFinder scriptFinder; + + public ApmInstallService(String scriptPath, ResourceResolverProvider resolverProvider, ScriptManager scriptManager, ScriptFinder scriptFinder) { + this.scriptPath = scriptPath; + this.resolverProvider = resolverProvider; + this.scriptManager = scriptManager; + this.scriptFinder = scriptFinder; + } + + @Override + public void run() { + SlingHelper.operateTraced(resolverProvider, resolver -> { + boolean compositeNodeStore = RuntimeUtils.determineCompositeNodeStore(resolver); + String instanceName = ManagementFactory.getRuntimeMXBean().getName(); + if (!compositeNodeStore || StringUtils.contains(instanceName, AEM_MUTABLE_CONTENT_INSTANCE)) { + Script script = scriptFinder.find(scriptPath, resolver); + processScripts(Collections.singletonList(script), resolver); + } + }); + } + + @Override + protected ScriptManager getScriptManager() { + return scriptManager; + } +} diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/LaunchMetadata.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/LaunchMetadata.java index 7e6c7d892..d7afcd69e 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/LaunchMetadata.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/LaunchMetadata.java @@ -36,15 +36,17 @@ public class LaunchMetadata { private final String[] launchRunModes; private final String executionHook; private final LocalDateTime executionSchedule; + private final String cronExpression; public LaunchMetadata(boolean executionEnabled, LaunchMode launchMode, LaunchEnvironment launchEnvironment, - String[] launchRunModes, String executionHook, LocalDateTime executionSchedule) { + String[] launchRunModes, String executionHook, LocalDateTime executionSchedule, String cronExpression) { this.executionEnabled = executionEnabled; this.launchMode = launchMode; this.launchEnvironment = launchEnvironment; this.launchRunModes = launchRunModes; this.executionHook = executionHook; this.executionSchedule = executionSchedule; + this.cronExpression = cronExpression; } public boolean isExecutionEnabled() { @@ -75,4 +77,8 @@ public String getExecutionHook() { public LocalDateTime getExecutionSchedule() { return executionSchedule; } + + public String getCronExpression() { + return cronExpression; + } } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptFilters.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptFilters.java index 7334b3084..ebed1fca3 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptFilters.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptFilters.java @@ -58,6 +58,13 @@ public static Predicate