diff --git a/app/aem/api/src/main/java/com/cognifide/apm/api/services/ScriptManager.java b/app/aem/api/src/main/java/com/cognifide/apm/api/services/ScriptManager.java index dc6886de..d2c2b4b0 100644 --- a/app/aem/api/src/main/java/com/cognifide/apm/api/services/ScriptManager.java +++ b/app/aem/api/src/main/java/com/cognifide/apm/api/services/ScriptManager.java @@ -20,8 +20,6 @@ package com.cognifide.apm.api.services; import com.cognifide.apm.api.scripts.Script; -import java.util.Collections; -import java.util.Map; import javax.jcr.RepositoryException; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.ResourceResolver; @@ -39,27 +37,6 @@ default ExecutionResult process(Script script, ExecutionMode mode, ResourceResol /** * Fail-safe execution of script in concrete mode (dry run, automatic execution, validation) */ - default ExecutionResult process(Script script, ExecutionMode mode, Map customDefinitions, ResourceResolver resolver) - throws RepositoryException, PersistenceException { - return process(script, mode, customDefinitions, resolver, resolver.getUserID()); - } - - /** - * Fail-safe execution of script in concrete mode (dry run, automatic execution, validation) - */ - default ExecutionResult process(Script script, ExecutionMode mode, ResourceResolver resolver, String executor) - throws RepositoryException, PersistenceException { - return process(script, mode, Collections.emptyMap(), resolver, executor); - } - - /** - * Fail-safe execution of script in concrete mode (dry run, automatic execution, validation) - */ - ExecutionResult process(Script script, ExecutionMode mode, Map customDefinitions, ResourceResolver resolver, String executor) + ExecutionResult process(Script script, ExecutionMode mode, ResourceResolver resolver, String executor) throws RepositoryException, PersistenceException; - - /** - * Get predefined variables accessible in script via syntax: ${definitionName} - */ - Map getPredefinedDefinitions(); } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/DefinitionsServlet.java b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/DefinitionsServlet.java index f7f9b3dd..7de4780a 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/DefinitionsServlet.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/DefinitionsServlet.java @@ -19,7 +19,7 @@ */ package com.cognifide.apm.core.endpoints; -import com.cognifide.apm.api.services.ScriptManager; +import com.cognifide.apm.api.services.DefinitionsProvider; import com.cognifide.apm.core.Property; import com.cognifide.apm.core.utils.ServletUtils; import java.io.IOException; @@ -42,10 +42,10 @@ public class DefinitionsServlet extends SlingAllMethodsServlet { @Reference - private ScriptManager scriptManager; + private DefinitionsProvider definitionsProvider; @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { - ServletUtils.writeJson(response, scriptManager.getPredefinedDefinitions()); + ServletUtils.writeJson(response, definitionsProvider.getPredefinedDefinitions()); } } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionForm.java b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionForm.java index ca873f71..b974544c 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionForm.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionForm.java @@ -22,7 +22,6 @@ import com.cognifide.apm.api.services.ExecutionMode; import com.cognifide.apm.core.endpoints.params.RequestParameter; -import java.util.Map; import javax.inject.Inject; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.models.annotations.Model; @@ -42,10 +41,6 @@ public class ScriptExecutionForm { @RequestParameter("async") private boolean async; - @Inject - @RequestParameter("define") - private Map customDefinitions; - public String getScript() { return script; } @@ -57,8 +52,4 @@ public ExecutionMode getExecutionMode() { public boolean isAsync() { return async; } - - public Map getCustomDefinitions() { - return customDefinitions; - } } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java index 95606657..20b30c98 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/ScriptExecutionServlet.java @@ -123,13 +123,13 @@ private ResponseEntity executeScript(ScriptExecutionForm form, ResourceResolver } private ResponseEntity asyncExecute(Script script, ScriptExecutionForm form, String executor) { - String id = asyncScriptExecutor.process(script, form.getExecutionMode(), form.getCustomDefinitions(), executor); + String id = asyncScriptExecutor.process(script, form.getExecutionMode(), executor); return ResponseEntity.ok("Script successfully queued for async execution") .addEntry("id", id); } private ResponseEntity syncExecute(Script script, ScriptExecutionForm form, ResourceResolver resourceResolver, String executor) throws PersistenceException, RepositoryException { - ExecutionResult result = scriptManager.process(script, form.getExecutionMode(), form.getCustomDefinitions(), resourceResolver, executor); + ExecutionResult result = scriptManager.process(script, form.getExecutionMode(), resourceResolver, executor); if (result.isSuccess()) { return ResponseEntity.ok("Script successfully executed") .addEntry("output", result.getEntries()); diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/params/RequestParameterInjector.java b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/params/RequestParameterInjector.java index 3282fdc0..081427db 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/params/RequestParameterInjector.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/endpoints/params/RequestParameterInjector.java @@ -24,14 +24,12 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; -import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.sling.api.SlingHttpServletRequest; @@ -60,13 +58,9 @@ public String getName() { public Object getValue(Object adaptable, String fieldName, Type type, AnnotatedElement annotatedElement, DisposalCallbackRegistry disposalCallbackRegistry) { if (adaptable instanceof SlingHttpServletRequest) { RequestParameter annotation = annotatedElement.getAnnotation(RequestParameter.class); - if (annotation != null) { + if (annotation != null && type instanceof Class) { String parameterName = annotation.value(); - if (type instanceof ParameterizedType && ((ParameterizedType) type).getRawType() instanceof Class && Map.class.isAssignableFrom((Class) ((ParameterizedType) type).getRawType())) { - return extractParams((SlingHttpServletRequest) adaptable, parameterName); - } else if (type instanceof Class) { - return getValue((SlingHttpServletRequest) adaptable, (Class) type, parameterName, annotatedElement); - } + return getValue((SlingHttpServletRequest) adaptable, (Class) type, parameterName, annotatedElement); } } return null; @@ -92,7 +86,9 @@ private Object getValue(SlingHttpServletRequest request, Class type, String p if (parameterValue.getString().contains(",")) { return parameterValue.getString().split(","); } else { - return Arrays.stream(request.getRequestParameters(parameterName)) + return Optional.ofNullable(request.getRequestParameters(parameterName)) + .map(Arrays::stream) + .orElse(Stream.empty()) .map(org.apache.sling.api.request.RequestParameter::getString) .toArray(String[]::new); } @@ -115,17 +111,6 @@ private Object toEnum(Class type, org.apache.sling.api.request.RequestParamet .orElse(null); } - private Map extractParams(SlingHttpServletRequest request, String prefix) { - return request.getParameterMap() - .entrySet() - .stream() - .filter(entry -> StringUtils.startsWith(entry.getKey(), prefix)) - .collect(Collectors.toMap( - entry -> StringUtils.uncapitalize(StringUtils.removeStart(entry.getKey(), prefix)), - entry -> entry.getValue()[0] - )); - } - private OffsetDateTime toOffsetDateTime(org.apache.sling.api.request.RequestParameter parameterValue) { return OffsetDateTime.parse(parameterValue.getString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME); } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/jobs/ScriptRunnerJobConsumer.java b/app/aem/core/src/main/java/com/cognifide/apm/core/jobs/ScriptRunnerJobConsumer.java index 45631526..3e819947 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/jobs/ScriptRunnerJobConsumer.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/jobs/ScriptRunnerJobConsumer.java @@ -29,7 +29,6 @@ import com.cognifide.apm.core.services.ResourceResolverProvider; import com.cognifide.apm.core.services.async.AsyncScriptExecutorImpl; import com.cognifide.apm.core.utils.sling.SlingHelper; -import java.util.Collections; import java.util.Map; import javax.jcr.RepositoryException; import org.apache.commons.lang3.StringUtils; @@ -71,7 +70,7 @@ public void process(Map properties) { Script script = getScript(properties, resolver); if (script != null && mode != null) { try { - ExecutionResult executionResult = scriptManager.process(script, mode, getDefinitions(properties), resolver, userId); + ExecutionResult executionResult = scriptManager.process(script, mode, resolver, userId); String summaryPath = getSummaryPath(resolver, script, mode); jobResultsCache.put(id, ExecutionSummary.finished(executionResult, summaryPath)); } catch (RepositoryException | PersistenceException e) { @@ -101,14 +100,6 @@ private ExecutionMode getMode(Map properties) { return result; } - private Map getDefinitions(Map properties) { - Map definitions = (Map) properties.get(AsyncScriptExecutorImpl.DEFINITIONS); - if (definitions == null) { - definitions = Collections.emptyMap(); - } - return definitions; - } - private Script getScript(Map properties, ResourceResolver resolver) { String scriptSearchPath = (String) properties.get(AsyncScriptExecutorImpl.SCRIPT_PATH); if (StringUtils.isNotBlank(scriptSearchPath)) { diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/DefaultDefinitionsProvider.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/DefaultDefinitionsProvider.java index 8356c841..cb6a9074 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/DefaultDefinitionsProvider.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/DefaultDefinitionsProvider.java @@ -24,12 +24,12 @@ import java.util.Map; import org.osgi.service.component.annotations.Component; -@Component +@Component(service = DefinitionsProvider.class) public class DefaultDefinitionsProvider implements DefinitionsProvider { @Override public Map getPredefinedDefinitions() { - final Map definitions = new HashMap<>(); + Map definitions = new HashMap<>(); // Modules definitions.put("Websites", "/libs/wcm/core/content/siteadmin"); diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptManagerImpl.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptManagerImpl.java index 82cb4ca6..5493df9f 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptManagerImpl.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptManagerImpl.java @@ -48,10 +48,7 @@ import com.cognifide.apm.core.services.version.VersionService; import com.cognifide.apm.core.utils.RuntimeUtils; import java.util.Arrays; -import java.util.HashMap; import java.util.Map; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.apache.jackrabbit.api.JackrabbitSession; @@ -59,8 +56,6 @@ import org.apache.sling.api.resource.ResourceResolver; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; -import org.osgi.service.component.annotations.ReferenceCardinality; -import org.osgi.service.component.annotations.ReferencePolicy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,17 +85,13 @@ public class ScriptManagerImpl implements ScriptManager { private History history; @Reference - private DataSourceInvoker dataSourceInvoker; + private DefinitionsProvider definitionsProvider; - @Reference( - cardinality = ReferenceCardinality.MULTIPLE, - policy = ReferencePolicy.DYNAMIC, - service = DefinitionsProvider.class - ) - private final Set definitionsProviders = new CopyOnWriteArraySet<>(); + @Reference + private DataSourceInvoker dataSourceInvoker; - private Progress execute(Script script, ExecutionMode mode, Map customDefinitions, - ResourceResolver resolver, String executor) throws ExecutionException, RepositoryException { + private Progress execute(Script script, ExecutionMode mode, ResourceResolver resolver, String executor) + throws ExecutionException, RepositoryException { if (script == null) { throw new ExecutionException("Script is not specified"); } @@ -139,9 +130,7 @@ private Progress execute(Script script, ExecutionMode mode, Map }, dataSourceInvoker); try { - Map definitions = new HashMap<>(); - definitions.putAll(getPredefinedDefinitions()); - definitions.putAll(customDefinitions); + Map definitions = definitionsProvider.getPredefinedDefinitions(); scriptRunner.execute(script, progress, definitions); } catch (RuntimeException e) { progress.addEntry(Status.ERROR, e.getMessage()); @@ -153,11 +142,11 @@ private Progress execute(Script script, ExecutionMode mode, Map } @Override - public Progress process(Script script, ExecutionMode mode, Map customDefinitions, - ResourceResolver resolver, String executor) throws RepositoryException, PersistenceException { + public Progress process(Script script, ExecutionMode mode, ResourceResolver resolver, String executor) + throws RepositoryException, PersistenceException { Progress progress; try { - progress = execute(script, mode, customDefinitions, resolver, executor); + progress = execute(script, mode, resolver, executor); } catch (ExecutionException e) { progress = new ProgressImpl(executor); progress.addEntry(Status.ERROR, e.getMessage()); @@ -191,13 +180,6 @@ private void updateScriptProperties(Script script, ExecutionMode mode, boolean s } } - @Override - public Map getPredefinedDefinitions() { - Map predefinedDefinitions = new HashMap<>(); - definitionsProviders.forEach(provider -> predefinedDefinitions.putAll(provider.getPredefinedDefinitions())); - return predefinedDefinitions; - } - private ActionExecutor createExecutor(ExecutionMode mode, ResourceResolver resolver) throws RepositoryException { boolean compositeNodeStore = RuntimeUtils.determineCompositeNodeStore(resolver); Context context = new ContextImpl((JackrabbitSession) resolver.adaptTo(Session.class), compositeNodeStore); diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutor.java b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutor.java index 2c15006c..4f6a3b9c 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutor.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutor.java @@ -21,11 +21,10 @@ import com.cognifide.apm.api.scripts.Script; import com.cognifide.apm.api.services.ExecutionMode; -import java.util.Map; public interface AsyncScriptExecutor { - String process(Script script, ExecutionMode executionMode, Map customDefinitions, String executor); + String process(Script script, ExecutionMode executionMode, String executor); ExecutionStatus checkStatus(String id); } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java index 4f099538..688a3a90 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/services/async/AsyncScriptExecutorImpl.java @@ -47,8 +47,6 @@ public class AsyncScriptExecutorImpl implements AsyncScriptExecutor { public static final String USER_ID = "userName"; - public static final String DEFINITIONS = "definitions"; - public static final String ID = "id"; @Reference @@ -58,14 +56,13 @@ public class AsyncScriptExecutorImpl implements AsyncScriptExecutor { private JobResultsCache jobResultsCache; @Override - public String process(Script script, ExecutionMode executionMode, Map customDefinitions, String executor) { + public String process(Script script, ExecutionMode executionMode, String executor) { String id = UUID.randomUUID().toString(); Map properties = ImmutableMap.of( ID, id, SCRIPT_PATH, script.getPath(), EXECUTION_MODE, executionMode.toString(), - USER_ID, executor, - DEFINITIONS, customDefinitions + USER_ID, executor ); jobResultsCache.put(id, ExecutionSummary.running()); new Thread(() -> scriptRunnerJobConsumer.process(properties)).start(); diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/ui/models/ReferencesModel.java b/app/aem/core/src/main/java/com/cognifide/apm/core/ui/models/ReferencesModel.java index 8940763e..3859b58d 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/ui/models/ReferencesModel.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/ui/models/ReferencesModel.java @@ -20,7 +20,7 @@ package com.cognifide.apm.core.ui.models; -import com.cognifide.apm.api.services.ScriptManager; +import com.cognifide.apm.api.services.DefinitionsProvider; import com.cognifide.apm.core.actions.ActionFactory; import com.cognifide.apm.core.actions.CommandDescription; import java.util.List; @@ -38,9 +38,9 @@ public class ReferencesModel { private final Map definitions; @Inject - public ReferencesModel(@OSGiService ActionFactory actionFactory, @OSGiService ScriptManager scriptManager) { + public ReferencesModel(@OSGiService ActionFactory actionFactory, @OSGiService DefinitionsProvider definitionsProvider) { this.references = actionFactory.getCommandDescriptions(); - this.definitions = scriptManager.getPredefinedDefinitions(); + this.definitions = definitionsProvider.getPredefinedDefinitions(); } public List getReferences() {