diff --git a/cms-api/src/main/java/com/condation/cms/api/hooks/HookSystem.java b/cms-api/src/main/java/com/condation/cms/api/hooks/HookSystem.java index 896486ab..e9c65dc7 100644 --- a/cms-api/src/main/java/com/condation/cms/api/hooks/HookSystem.java +++ b/cms-api/src/main/java/com/condation/cms/api/hooks/HookSystem.java @@ -20,17 +20,7 @@ * along with this program. If not, see . * #L% */ -import com.condation.cms.api.annotations.Filter; -import com.condation.cms.api.annotations.Action; -import com.condation.cms.api.utils.AnnotationsUtil; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; /** @@ -39,78 +29,21 @@ * * @author t.marx */ -@Slf4j -public class HookSystem { +public interface HookSystem { - Multimap actions = ArrayListMultimap.create(); + void register(Object sourceObject); - Multimap filters = ArrayListMultimap.create(); + public void registerAction(final String name, final ActionFunction hookFunction); - public HookSystem () { - - } - public HookSystem(HookSystem source) { - this.actions.putAll(source.actions); - this.filters.putAll(source.filters); - } + public void registerAction(final String name, final ActionFunction hookFunction, int priority); - public void register(Object sourceObject) { - // Action-Methoden registrieren - List> actionMethods - = AnnotationsUtil.process(sourceObject, Action.class, List.of(ActionContext.class), Void.class); + public void registerFilter(final String name, final FilterFunction hookFunction); - for (AnnotationsUtil.CMSAnnotation ann : actionMethods) { - Action annotation = ann.annotation(); - registerAction(annotation.value(), context -> ann.invoke(context), annotation.priority()); - } + public void registerFilter(final String name, final FilterFunction hookFunction, int priority); - // Filter-Methoden registrieren - List> filterMethods - = AnnotationsUtil.process(sourceObject, Filter.class, List.of(FilterContext.class), Object.class); + public ActionContext doAction(final String name); - for (AnnotationsUtil.CMSAnnotation ann : filterMethods) { - Filter annotation = ann.annotation(); - registerFilter(annotation.value(), context -> ann.invoke(context), annotation.priority()); - } - } - - public void registerAction(final String name, final ActionFunction hookFunction) { - registerAction(name, hookFunction, 10); - } - - public void registerAction(final String name, final ActionFunction hookFunction, int priority) { - actions.put(name, new ActionHook<>(name, priority, hookFunction)); - } - - public void registerFilter(final String name, final FilterFunction hookFunction) { - registerFilter(name, hookFunction, 10); - } - - public void registerFilter(final String name, final FilterFunction hookFunction, int priority) { - filters.put(name, new FilterHook<>(name, priority, hookFunction)); - } - - public ActionContext execute(final String name) { - return execute(name, Map.of()); - } - - public ActionContext execute(final String name, final Map arguments) { - var context = new ActionContext(new HashMap<>(arguments), new ArrayList<>()); - actions.get(name).stream() - .sorted((h1, h2) -> Integer.compare(h1.priority(), h2.priority())) - .map((action) -> { - try { - return action.function().apply(context); - } catch (Exception e) { - log.error("error executing action", e); - } - return null; - }) - .filter(value -> value != null) - .forEach(context.results()::add); - - return context; - } + public ActionContext doAction(final String name, final Map arguments); /** * calls all filters with the given parameters, if no filter is executed, @@ -121,22 +54,5 @@ public ActionContext execute(final String name, final Map FilterContext filter(final String name, final T parameters) { - final FilterContext returnContext = new FilterContext( - parameters - ); - filters.get(name).stream() - .sorted((h1, h2) -> Integer.compare(h1.priority(), h2.priority())) - .forEach((var action) -> { - try { - var context = new FilterContext(returnContext.value()); - var result = action.function().apply(context); - returnContext.value((T) result); - } catch (Exception e) { - log.error("error on filter", e); - } - }); - - return returnContext; - } + public FilterContext doFilter(final String name, final T parameters); } diff --git a/cms-api/src/main/java/com/condation/cms/api/hooks/Hooks.java b/cms-api/src/main/java/com/condation/cms/api/hooks/Hooks.java index cffc774e..a1018578 100644 --- a/cms-api/src/main/java/com/condation/cms/api/hooks/Hooks.java +++ b/cms-api/src/main/java/com/condation/cms/api/hooks/Hooks.java @@ -34,6 +34,8 @@ public enum Hooks { /* content */ CONTENT_TAGS("system/content/tags"), CONTENT_FILTER("system/content/filter"), + CONTENT_SLOT_HEADER("system/content/slot/header"), + CONTENT_SLOT_FOOTER("system/content/slot/footer"), /*query*/ DB_QUERY_OPERATIONS("system/db/query/operations"), /* scheduler */ diff --git a/cms-content/pom.xml b/cms-content/pom.xml index 774d2d16..787d2031 100644 --- a/cms-content/pom.xml +++ b/cms-content/pom.xml @@ -44,7 +44,7 @@ com.condation.cms - cms-core + cms-hooksystem org.projectlombok diff --git a/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java b/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java index 0583ee5e..c5644941 100644 --- a/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java +++ b/cms-content/src/main/java/com/condation/cms/content/DefaultContentRenderer.java @@ -49,8 +49,9 @@ import com.condation.cms.content.pipeline.ContentPipelineFactory; import com.condation.cms.content.views.model.View; import com.condation.cms.api.content.MapAccess; -import com.condation.cms.extensions.hooks.DBHooks; -import com.condation.cms.extensions.hooks.TemplateHooks; +import com.condation.cms.content.pipeline.HTMLPipeline; +import com.condation.cms.hooksystem.extensions.DBHooks; +import com.condation.cms.hooksystem.extensions.TemplateHooks; import com.condation.cms.content.template.functions.LinkFunction; import com.condation.cms.content.template.functions.MarkdownFunction; import com.condation.cms.content.template.functions.list.NodeListFunctionBuilder; @@ -218,7 +219,10 @@ public String render(final ReadOnlyFile contentFile, final RequestContext contex model.values.putAll(namespace.getNamespaces()); - return templates.get().render((String) meta.get("template"), model); + var htmlContent = templates.get().render((String) meta.get("template"), model); + + HTMLPipeline htmlPipeline = new HTMLPipeline(context.get(HookSystemFeature.class).hookSystem()); + return htmlPipeline.process(htmlContent); } protected MarkdownFunction createMarkdownFunction(final RequestContext context) { diff --git a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java index bf542bb1..a0bb9212 100644 --- a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java +++ b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipeline.java @@ -63,9 +63,9 @@ protected void init() { }); } - + public String process(String rawContent) { - return hookSystem.filter(Hooks.CONTENT_FILTER.hook(), rawContent).value(); + return hookSystem.doFilter(Hooks.CONTENT_FILTER.hook(), rawContent).value(); } private String processMarkdown(FilterContext context) { diff --git a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java index 79cc5286..0357a07d 100644 --- a/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java +++ b/cms-content/src/main/java/com/condation/cms/content/pipeline/ContentPipelineFactory.java @@ -25,6 +25,7 @@ import com.condation.cms.api.hooks.HookSystem; import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.template.TemplateEngine; +import com.condation.cms.hooksystem.CMSHookSystem; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -37,8 +38,8 @@ public final class ContentPipelineFactory { public static ContentPipeline create (final RequestContext requestContext, final TemplateEngine.Model model) { - var hookSystem = requestContext.get(HookSystemFeature.class).hookSystem(); - var pipeline = new ContentPipeline(new HookSystem(hookSystem), requestContext, model); + var hookSystem = (CMSHookSystem)requestContext.get(HookSystemFeature.class).hookSystem(); + var pipeline = new ContentPipeline(new CMSHookSystem(hookSystem), requestContext, model); pipeline.init(); return pipeline; diff --git a/cms-content/src/main/java/com/condation/cms/content/pipeline/HTMLPipeline.java b/cms-content/src/main/java/com/condation/cms/content/pipeline/HTMLPipeline.java new file mode 100644 index 00000000..0d81892e --- /dev/null +++ b/cms-content/src/main/java/com/condation/cms/content/pipeline/HTMLPipeline.java @@ -0,0 +1,68 @@ +package com.condation.cms.content.pipeline; + +/*- + * #%L + * CMS Content + * %% + * Copyright (C) 2023 - 2026 CondationCMS + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * #L% + */ +import com.condation.cms.api.hooks.HookSystem; +import com.condation.cms.api.hooks.Hooks; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * + * @author thmar + */ +@Slf4j +@RequiredArgsConstructor +public class HTMLPipeline { + + private final HookSystem hookSystem; + + public String process(String rawContent) { + rawContent = updateSlot(Hooks.CONTENT_SLOT_HEADER, "", rawContent); + return updateSlot(Hooks.CONTENT_SLOT_FOOTER, "", rawContent); + } + + public String updateSlot (Hooks hook, String elementName, String rawContent) { + + if (!rawContent.contains(elementName)) { + log.warn("No {} found, skipping header slot injection", elementName); + return rawContent; + } + + var result = hookSystem.doAction(hook.hook()); + + var hookValues = result.results().stream() + .filter(Objects::nonNull) + .filter(String.class::isInstance) + .map(String.class::cast) + .toList(); + if (hookValues.isEmpty()) { + return rawContent; + } + + + var mergedValue = String.join("\n\n", hookValues); + + return rawContent.replace(elementName, mergedValue + "\n" + elementName); + } + +} diff --git a/cms-content/src/main/java/com/condation/cms/content/template/functions/hooks/HooksTemlateFunction.java b/cms-content/src/main/java/com/condation/cms/content/template/functions/hooks/HooksTemlateFunction.java index 6bcead54..fd25f0b0 100644 --- a/cms-content/src/main/java/com/condation/cms/content/template/functions/hooks/HooksTemlateFunction.java +++ b/cms-content/src/main/java/com/condation/cms/content/template/functions/hooks/HooksTemlateFunction.java @@ -42,13 +42,13 @@ public ActionContext execute (String name) { return execute(name, Map.of()); } public ActionContext execute (String name, Map arguments) { - return hookSystem.execute(name, arguments); + return hookSystem.doAction(name, arguments); } public FilterContext filter (String name) { return filter(name, List.of()); } public FilterContext filter (String name, List arguments) { - return hookSystem.filter(name, arguments); + return hookSystem.doFilter(name, arguments); } } diff --git a/cms-content/src/main/java/com/condation/cms/content/template/functions/navigation/NavigationFunction.java b/cms-content/src/main/java/com/condation/cms/content/template/functions/navigation/NavigationFunction.java index 611572d8..cc33fa3f 100644 --- a/cms-content/src/main/java/com/condation/cms/content/template/functions/navigation/NavigationFunction.java +++ b/cms-content/src/main/java/com/condation/cms/content/template/functions/navigation/NavigationFunction.java @@ -104,7 +104,7 @@ public List path() { navNodes = navNodes.reversed(); if (name != null) { - var hookContext = hookSystem.filter(Hooks.NAVIGATION_PATH.hook(name), navNodes); + var hookContext = hookSystem.doFilter(Hooks.NAVIGATION_PATH.hook(name), navNodes); navNodes = hookContext.value(); } @@ -153,7 +153,7 @@ private List getNodes(final String start, final int depth) { } if (name != null) { - var hookContext = hookSystem.filter(Hooks.NAVIGATION_LIST.hook(name), navNodes); + var hookContext = hookSystem.doFilter(Hooks.NAVIGATION_LIST.hook(name), navNodes); navNodes = hookContext.value(); } return navNodes; diff --git a/cms-content/src/test/java/com/condation/cms/content/pipeline/HTMLPipelineTest.java b/cms-content/src/test/java/com/condation/cms/content/pipeline/HTMLPipelineTest.java new file mode 100644 index 00000000..d831c188 --- /dev/null +++ b/cms-content/src/test/java/com/condation/cms/content/pipeline/HTMLPipelineTest.java @@ -0,0 +1,160 @@ +package com.condation.cms.content.pipeline; + +/*- + * #%L + * CMS Content + * %% + * Copyright (C) 2023 - 2026 CondationCMS + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * #L% + */ +import com.condation.cms.api.hooks.HookSystem; +import com.condation.cms.api.hooks.Hooks; +import com.condation.cms.hooksystem.CMSHookSystem; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class HTMLPipelineTest { + + private HookSystem hookSystem; + private HTMLPipeline pipeline; + + @BeforeEach + void setUp() { + hookSystem = new CMSHookSystem(); + pipeline = new HTMLPipeline(hookSystem); + } + + @Test + void shouldInjectHeaderSlot() { + // given + String html = """ + + + + + content + + + """; + + hookSystem.registerAction(Hooks.CONTENT_SLOT_HEADER.hook(), + (context) -> ""); + // when + String result = pipeline.process(html); + + // then + assertThat(result) + .contains("") + .contains(""); + } + + @Test + void shouldInjectFooterSlot() { + // given + String html = """ + + + + + content + + + """; + + hookSystem.registerAction(Hooks.CONTENT_SLOT_FOOTER.hook(), + (context) -> ""); + + // when + String result = pipeline.process(html); + + // then + assertThat(result) + .contains("") + .contains(""); + } + + @Test + void shouldInjectBothSlots() { + // given + String html = """ + + + + + content + + + """; + + hookSystem.registerAction(Hooks.CONTENT_SLOT_HEADER.hook(), + (context) -> ""); + hookSystem.registerAction(Hooks.CONTENT_SLOT_FOOTER.hook(), + (context) -> ""); + + // when + String result = pipeline.process(html); + + // then + assertThat(result) + .contains("") + .contains("") + .contains("") + .contains(""); + } + + @Test + void shouldIgnoreEmptyHooks() { + // given + String html = """ + + + + + content + + + """; + + // when + String result = pipeline.process(html); + + // then + assertThat(result) + .doesNotContain("") + .contains(""); + } + + @Test + void shouldNotFailIfNoHeadOrBodyExists() { + // given + String html = "
no layout tags
"; + + hookSystem.registerAction(Hooks.CONTENT_SLOT_HEADER.hook(), + (context) -> ""); + hookSystem.registerAction(Hooks.CONTENT_SLOT_FOOTER.hook(), + (context) -> ""); + + // when + String result = pipeline.process(html); + + // then + assertThat(result) + .isEqualTo(html); + } +} diff --git a/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionITest.java b/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionITest.java index d3817c0e..9d20f325 100644 --- a/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionITest.java +++ b/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionITest.java @@ -42,6 +42,7 @@ import com.condation.cms.content.template.functions.navigation.NavigationFunction; import com.condation.cms.core.eventbus.DefaultEventBus; import com.condation.cms.filesystem.FileDB; +import com.condation.cms.hooksystem.CMSHookSystem; import com.google.inject.Injector; import java.nio.file.Path; import org.assertj.core.api.Assertions; @@ -110,7 +111,7 @@ public void setupRequestContext() { requestContext.add(ContentParserFeature.class, new ContentParserFeature(contentParser)); requestContext.add(ContentNodeMapperFeature.class, new ContentNodeMapperFeature(new ContentNodeMapper(db, contentParser))); requestContext.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(new CMSMarkdownRenderer())); - requestContext.add(HookSystemFeature.class, new HookSystemFeature(new HookSystem())); + requestContext.add(HookSystemFeature.class, new HookSystemFeature(new CMSHookSystem())); Mockito.lenient().when(request.getAttribute("_requestContext")).thenReturn(requestContext); } diff --git a/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionTest.java b/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionTest.java index 4ad7edff..85a8740f 100644 --- a/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/template/navigation/NavigationFunctionTest.java @@ -39,6 +39,7 @@ import com.condation.cms.api.markdown.MarkdownRenderer; import com.condation.cms.api.model.NavNode; import com.condation.cms.api.request.RequestContext; +import com.condation.cms.hooksystem.CMSHookSystem; import java.nio.file.Path; import java.util.List; import java.util.Optional; @@ -92,7 +93,7 @@ public void setup () { Mockito.lenient().when(content.byUri("current")).thenReturn(Optional.empty()); - hookSystem = new HookSystem(); + hookSystem = new CMSHookSystem(); requestContext = new RequestContext(); requestContext.add(HookSystemFeature.class, new HookSystemFeature(hookSystem)); requestContext.add(ContentParserFeature.class, new ContentParserFeature(contentParser)); diff --git a/cms-extensions/pom.xml b/cms-extensions/pom.xml index 8d289695..2ce7b7d3 100644 --- a/cms-extensions/pom.xml +++ b/cms-extensions/pom.xml @@ -24,7 +24,6 @@ com.condation.cms cms-filesystem - org.projectlombok lombok diff --git a/cms-hooksystem/pom.xml b/cms-hooksystem/pom.xml new file mode 100644 index 00000000..a41d646d --- /dev/null +++ b/cms-hooksystem/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + com.condation.cms + cms-parent + 8.1.0 + + cms-hooksystem + jar + CMS HookSystem + + + + com.condation.cms + cms-api + + + com.condation.cms + cms-extensions + + + + org.projectlombok + lombok + provided + + + \ No newline at end of file diff --git a/cms-api/src/main/java/com/condation/cms/api/hooks/ActionHook.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/ActionHook.java similarity index 90% rename from cms-api/src/main/java/com/condation/cms/api/hooks/ActionHook.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/ActionHook.java index 3d02dac9..9c41cc31 100644 --- a/cms-api/src/main/java/com/condation/cms/api/hooks/ActionHook.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/ActionHook.java @@ -1,4 +1,6 @@ -package com.condation.cms.api.hooks; +package com.condation.cms.hooksystem; + +import com.condation.cms.api.hooks.ActionFunction; /*- * #%L diff --git a/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/CMSHookSystem.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/CMSHookSystem.java new file mode 100644 index 00000000..9ca00428 --- /dev/null +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/CMSHookSystem.java @@ -0,0 +1,145 @@ +package com.condation.cms.hooksystem; + +/*- + * #%L + * CMS Api + * %% + * Copyright (C) 2023 - 2026 CondationCMS + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * #L% + */ +import com.condation.cms.api.annotations.Filter; +import com.condation.cms.api.annotations.Action; +import com.condation.cms.api.hooks.ActionContext; +import com.condation.cms.api.hooks.ActionFunction; +import com.condation.cms.api.hooks.FilterContext; +import com.condation.cms.api.hooks.FilterFunction; +import com.condation.cms.api.hooks.HookSystem; +import com.condation.cms.api.utils.AnnotationsUtil; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +/** + * + * Request based hook system. + * + * @author t.marx + */ +@Slf4j +public class CMSHookSystem implements HookSystem { + + Multimap actions = ArrayListMultimap.create(); + + Multimap filters = ArrayListMultimap.create(); + + public CMSHookSystem () { + + } + public CMSHookSystem(CMSHookSystem source) { + this.actions.putAll(source.actions); + this.filters.putAll(source.filters); + } + + public void register(Object sourceObject) { + // Action-Methoden registrieren + List> actionMethods + = AnnotationsUtil.process(sourceObject, Action.class, List.of(ActionContext.class), Void.class); + + for (AnnotationsUtil.CMSAnnotation ann : actionMethods) { + Action annotation = ann.annotation(); + registerAction(annotation.value(), context -> ann.invoke(context), annotation.priority()); + } + + // Filter-Methoden registrieren + List> filterMethods + = AnnotationsUtil.process(sourceObject, Filter.class, List.of(FilterContext.class), Object.class); + + for (AnnotationsUtil.CMSAnnotation ann : filterMethods) { + Filter annotation = ann.annotation(); + registerFilter(annotation.value(), context -> ann.invoke(context), annotation.priority()); + } + } + + public void registerAction(final String name, final ActionFunction hookFunction) { + registerAction(name, hookFunction, 10); + } + + public void registerAction(final String name, final ActionFunction hookFunction, int priority) { + actions.put(name, new ActionHook<>(name, priority, hookFunction)); + } + + public void registerFilter(final String name, final FilterFunction hookFunction) { + registerFilter(name, hookFunction, 10); + } + + public void registerFilter(final String name, final FilterFunction hookFunction, int priority) { + filters.put(name, new FilterHook<>(name, priority, hookFunction)); + } + + public ActionContext doAction(final String name) { + return doAction(name, Map.of()); + } + + public ActionContext doAction(final String name, final Map arguments) { + var context = new ActionContext(new HashMap<>(arguments), new ArrayList<>()); + actions.get(name).stream() + .sorted((h1, h2) -> Integer.compare(h1.priority(), h2.priority())) + .map((action) -> { + try { + return action.function().apply(context); + } catch (Exception e) { + log.error("error executing action", e); + } + return null; + }) + .filter(value -> value != null) + .forEach(context.results()::add); + + return context; + } + + /** + * calls all filters with the given parameters, if no filter is executed, + * the original parameters are returned + * + * @param + * @param name + * @param parameters + * @return + */ + public FilterContext doFilter(final String name, final T parameters) { + final FilterContext returnContext = new FilterContext( + parameters + ); + filters.get(name).stream() + .sorted((h1, h2) -> Integer.compare(h1.priority(), h2.priority())) + .forEach((var action) -> { + try { + var context = new FilterContext(returnContext.value()); + var result = action.function().apply(context); + returnContext.value((T) result); + } catch (Exception e) { + log.error("error on filter", e); + } + }); + + return returnContext; + } +} diff --git a/cms-api/src/main/java/com/condation/cms/api/hooks/FilterHook.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/FilterHook.java similarity index 90% rename from cms-api/src/main/java/com/condation/cms/api/hooks/FilterHook.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/FilterHook.java index 1efd7714..32a4d503 100644 --- a/cms-api/src/main/java/com/condation/cms/api/hooks/FilterHook.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/FilterHook.java @@ -1,4 +1,6 @@ -package com.condation.cms.api.hooks; +package com.condation.cms.hooksystem; + +import com.condation.cms.api.hooks.FilterFunction; /*- * #%L diff --git a/cms-api/src/main/java/com/condation/cms/api/hooks/Hook.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/Hook.java similarity index 95% rename from cms-api/src/main/java/com/condation/cms/api/hooks/Hook.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/Hook.java index 79a6c826..185b8106 100644 --- a/cms-api/src/main/java/com/condation/cms/api/hooks/Hook.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/Hook.java @@ -1,4 +1,4 @@ -package com.condation.cms.api.hooks; +package com.condation.cms.hooksystem; /*- * #%L diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/ContentHooks.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/ContentHooks.java similarity index 93% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/ContentHooks.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/ContentHooks.java index b5d1d99c..94fe9b80 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/ContentHooks.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/ContentHooks.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -47,7 +47,7 @@ public class ContentHooks implements Feature { public TagsWrapper getTags (Map> codes) { var codeWrapper = new TagsWrapper(codes); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.CONTENT_TAGS.hook(), Map.of("tags", codeWrapper)); + .doAction(Hooks.CONTENT_TAGS.hook(), Map.of("tags", codeWrapper)); return codeWrapper; } } diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/DBHooks.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/DBHooks.java similarity index 92% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/DBHooks.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/DBHooks.java index b66d003e..f00e34d4 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/DBHooks.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/DBHooks.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -46,7 +46,7 @@ public class DBHooks implements Feature { public QueryOperationsWrapper getQueryOperations () { var wrapper = new QueryOperationsWrapper(); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.DB_QUERY_OPERATIONS.hook(), Map.of("operations", wrapper)); + .doAction(Hooks.DB_QUERY_OPERATIONS.hook(), Map.of("operations", wrapper)); return wrapper; } diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/GlobalHooks.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/GlobalHooks.java similarity index 83% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/GlobalHooks.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/GlobalHooks.java index d8c203a5..fca4af0b 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/GlobalHooks.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/GlobalHooks.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -39,9 +39,9 @@ public class GlobalHooks { private final CronJobScheduler scheduler; public void registerCronJob () { - globalHookSystem.execute(Hooks.SCHEDULER_REGISTER.hook(), Map.of("scheduler", scheduler)); + globalHookSystem.doAction(Hooks.SCHEDULER_REGISTER.hook(), Map.of("scheduler", scheduler)); } public void removeCronJob () { - globalHookSystem.execute(Hooks.SCHEDULER_REMOVE.hook(), Map.of("scheduler", scheduler)); + globalHookSystem.doAction(Hooks.SCHEDULER_REMOVE.hook(), Map.of("scheduler", scheduler)); } } diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/HttpHandlerWrapper.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/HttpHandlerWrapper.java similarity index 96% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/HttpHandlerWrapper.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/HttpHandlerWrapper.java index ea7a0541..3978f74a 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/HttpHandlerWrapper.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/HttpHandlerWrapper.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/QueryOperationsWrapper.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/QueryOperationsWrapper.java similarity index 95% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/QueryOperationsWrapper.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/QueryOperationsWrapper.java index 20822e5c..b9012c8e 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/QueryOperationsWrapper.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/QueryOperationsWrapper.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/ServerHooks.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/ServerHooks.java similarity index 86% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/ServerHooks.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/ServerHooks.java index a2341b98..408248d0 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/ServerHooks.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/ServerHooks.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -46,7 +46,7 @@ public class ServerHooks implements Feature { public HttpHandlerWrapper getHttpExtensions () { var httpExtensions = new HttpHandlerWrapper(); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.HTTP_EXTENSION.hook(), Map.of("httpExtensions", httpExtensions)); + .doAction(Hooks.HTTP_EXTENSION.hook(), Map.of("httpExtensions", httpExtensions)); return httpExtensions; } @@ -54,7 +54,7 @@ public HttpHandlerWrapper getHttpExtensions () { public HttpHandlerWrapper getHttpRoutes () { var httpExtensions = new HttpHandlerWrapper(); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.HTTP_ROUTE.hook(), Map.of("httpRoutes", httpExtensions)); + .doAction(Hooks.HTTP_ROUTE.hook(), Map.of("httpRoutes", httpExtensions)); return httpExtensions; } @@ -62,7 +62,7 @@ public HttpHandlerWrapper getHttpRoutes () { public HttpHandlerWrapper getAPIRoutes () { var httpExtensions = new HttpHandlerWrapper(); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.API_ROUTE.hook(), Map.of("apiRoutes", httpExtensions)); + .doAction(Hooks.API_ROUTE.hook(), Map.of("apiRoutes", httpExtensions)); return httpExtensions; } diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TagsWrapper.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TagsWrapper.java similarity index 97% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TagsWrapper.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TagsWrapper.java index 31b9d11c..9b96dd70 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TagsWrapper.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TagsWrapper.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateComponentsWrapper.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateComponentsWrapper.java similarity index 97% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateComponentsWrapper.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateComponentsWrapper.java index 3a8a1014..439a3678 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateComponentsWrapper.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateComponentsWrapper.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateFunctionWrapper.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateFunctionWrapper.java similarity index 97% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateFunctionWrapper.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateFunctionWrapper.java index 9bd10fa6..c5b3c447 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateFunctionWrapper.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateFunctionWrapper.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateHooks.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateHooks.java similarity index 87% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateHooks.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateHooks.java index 93c096c6..fdd461aa 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateHooks.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateHooks.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -48,7 +48,7 @@ public class TemplateHooks implements Feature { public TemplateSupplierWrapper getTemplateSupplier () { var templateSupplier = new TemplateSupplierWrapper(); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.TEMPLATE_SUPPLIER.hook(), Map.of("suppliers", templateSupplier)); + .doAction(Hooks.TEMPLATE_SUPPLIER.hook(), Map.of("suppliers", templateSupplier)); return templateSupplier; } @@ -56,7 +56,7 @@ public TemplateSupplierWrapper getTemplateSupplier () { public TemplateFunctionWrapper getTemplateFunctions () { var templateFunctions = new TemplateFunctionWrapper(); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.TEMPLATE_FUNCTION.hook(), Map.of("functions", templateFunctions)); + .doAction(Hooks.TEMPLATE_FUNCTION.hook(), Map.of("functions", templateFunctions)); return templateFunctions; } @@ -64,7 +64,7 @@ public TemplateFunctionWrapper getTemplateFunctions () { public TemplateComponentsWrapper getComponents (Map> components) { var componentsWrapper = new TemplateComponentsWrapper(components); requestContext.get(HookSystemFeature.class).hookSystem() - .execute(Hooks.TEMPLATE_COMPONENT.hook(), Map.of("components", componentsWrapper)); + .doAction(Hooks.TEMPLATE_COMPONENT.hook(), Map.of("components", componentsWrapper)); return componentsWrapper; } diff --git a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateSupplierWrapper.java b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateSupplierWrapper.java similarity index 96% rename from cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateSupplierWrapper.java rename to cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateSupplierWrapper.java index 007566de..004e92c1 100644 --- a/cms-extensions/src/main/java/com/condation/cms/extensions/hooks/TemplateSupplierWrapper.java +++ b/cms-hooksystem/src/main/java/com/condation/cms/hooksystem/extensions/TemplateSupplierWrapper.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions.hooks; +package com.condation.cms.hooksystem.extensions; /*- * #%L diff --git a/cms-api/src/test/java/com/condation/cms/api/hooks/HookSystemTest.java b/cms-hooksystem/src/test/java/com/condation/cms/hooksystem/CMSHookSystemTest.java similarity index 83% rename from cms-api/src/test/java/com/condation/cms/api/hooks/HookSystemTest.java rename to cms-hooksystem/src/test/java/com/condation/cms/hooksystem/CMSHookSystemTest.java index cfb3cbf3..a6b608d7 100644 --- a/cms-api/src/test/java/com/condation/cms/api/hooks/HookSystemTest.java +++ b/cms-hooksystem/src/test/java/com/condation/cms/hooksystem/CMSHookSystemTest.java @@ -1,4 +1,4 @@ -package com.condation.cms.api.hooks; +package com.condation.cms.hooksystem; /*- * #%L @@ -24,6 +24,8 @@ import com.condation.cms.api.annotations.Filter; import com.condation.cms.api.annotations.Action; +import com.condation.cms.api.hooks.ActionContext; +import com.condation.cms.api.hooks.FilterContext; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -35,13 +37,13 @@ * * @author t.marx */ -public class HookSystemTest { +public class CMSHookSystemTest { - private HookSystem hookSystem; + private CMSHookSystem hookSystem; @BeforeEach public void setup() { - hookSystem = new HookSystem(); + hookSystem = new CMSHookSystem(); } @Test @@ -49,7 +51,7 @@ public void test_single_result() { hookSystem.registerAction("test/test1", (context) -> { return true; }); - var context = hookSystem.execute("test/test1"); + var context = hookSystem.doAction("test/test1"); Assertions.assertThat(context.results()).hasSize(1).contains(true); } @@ -61,7 +63,7 @@ public void test_multiple_result() { hookSystem.registerAction("test/test1", (context) -> { return "test2"; }); - var context = hookSystem.execute("test/test1"); + var context = hookSystem.doAction("test/test1"); Assertions.assertThat(context.results()).hasSize(2).contains("test1", "test2"); } @@ -76,7 +78,7 @@ public void test_multiple_result_with_priority() { hookSystem.registerAction("test/test1", (context) -> { return "test2"; }, 200); - var context = hookSystem.execute("test/test1"); + var context = hookSystem.doAction("test/test1"); Assertions.assertThat(context.results()).hasSize(3).containsExactly("test1", "test2", "test3"); } @@ -91,14 +93,14 @@ public void test_multiple_result_with_priority_reversed() { hookSystem.registerAction("test/test1", (context) -> { return "test2"; }, 200); - var context = hookSystem.execute("test/test1"); + var context = hookSystem.doAction("test/test1"); Assertions.assertThat(context.results()).hasSize(3).containsExactly("test3", "test2", "test1"); } @Test public void test_filter_reversed () { hookSystem.registerFilter("test/list", (context) -> ((List)context.value()).reversed()); - var context = hookSystem.filter("test/list", List.of("1", "2", "3")); + var context = hookSystem.doFilter("test/list", List.of("1", "2", "3")); Assertions.assertThat(context.value()).containsExactly("3", "2", "1"); } @@ -108,7 +110,7 @@ public void test_filter_remove () { context.value().remove("2"); return context.value(); }); - var context = hookSystem.filter("test/list", new ArrayList<>(List.of("1", "2", "3"))); + var context = hookSystem.doFilter("test/list", new ArrayList<>(List.of("1", "2", "3"))); Assertions.assertThat(context.value()).containsExactly("1", "3"); } @@ -118,7 +120,7 @@ void test_action_annotation () { hookSystem.register(actionObject); - hookSystem.execute("test/annotation/action1"); + hookSystem.doAction("test/annotation/action1"); Assertions.assertThat(actionObject.counter).hasValue(2); } @@ -129,7 +131,7 @@ void test_filter_annotations () { hookSystem.register(myFilters); - var context = hookSystem.filter("test/annotation/filter1", new ArrayList<>(List.of("1", "2", "3"))); + var context = hookSystem.doFilter("test/annotation/filter1", new ArrayList<>(List.of("1", "2", "3"))); Assertions.assertThat(context.value()).containsExactly("1", "3"); } diff --git a/cms-extensions/src/test/java/com/condation/cms/extensions/ExtensionManagerTest.java b/cms-hooksystem/src/test/java/com/condation/cms/hooksystem/extensions/ExtensionManagerTest.java similarity index 89% rename from cms-extensions/src/test/java/com/condation/cms/extensions/ExtensionManagerTest.java rename to cms-hooksystem/src/test/java/com/condation/cms/hooksystem/extensions/ExtensionManagerTest.java index 9845c4a8..f512d8af 100644 --- a/cms-extensions/src/test/java/com/condation/cms/extensions/ExtensionManagerTest.java +++ b/cms-hooksystem/src/test/java/com/condation/cms/hooksystem/extensions/ExtensionManagerTest.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -28,7 +28,9 @@ import com.condation.cms.api.hooks.HookSystem; import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.theme.Theme; +import com.condation.cms.extensions.ExtensionManager; import com.condation.cms.filesystem.FileSystem; +import com.condation.cms.hooksystem.CMSHookSystem; import java.io.IOException; import java.nio.file.Path; import org.assertj.core.api.Assertions; @@ -91,12 +93,12 @@ public void setup() throws Exception { public void test_with_auth() throws IOException { var requestContext = new RequestContext(); - final HookSystem hookSystem = new HookSystem(); + final HookSystem hookSystem = new CMSHookSystem(); requestContext.add(HookSystemFeature.class, new HookSystemFeature(hookSystem)); requestContext.add(AuthFeature.class, new AuthFeature("thorsten")); extensionManager.newContext(theme, requestContext); - Assertions.assertThat(hookSystem.execute("test").results()) + Assertions.assertThat(hookSystem.doAction("test").results()) .hasSize(1) .containsExactly("Hallo thorsten"); } @@ -105,11 +107,11 @@ public void test_with_auth() throws IOException { public void test_without_auth() throws IOException { var requestContext = new RequestContext(); - final HookSystem hookSystem = new HookSystem(); + final HookSystem hookSystem = new CMSHookSystem(); requestContext.add(HookSystemFeature.class, new HookSystemFeature(hookSystem)); extensionManager.newContext(theme, requestContext); - Assertions.assertThat(hookSystem.execute("test").results()) + Assertions.assertThat(hookSystem.doAction("test").results()) .hasSize(1) .containsExactly("Guten Tag"); } diff --git a/cms-extensions/src/test/java/com/condation/cms/extensions/GlobalExtensionsTest.java b/cms-hooksystem/src/test/java/com/condation/cms/hooksystem/extensions/GlobalExtensionsTest.java similarity index 91% rename from cms-extensions/src/test/java/com/condation/cms/extensions/GlobalExtensionsTest.java rename to cms-hooksystem/src/test/java/com/condation/cms/hooksystem/extensions/GlobalExtensionsTest.java index d690be3d..e1137881 100644 --- a/cms-extensions/src/test/java/com/condation/cms/extensions/GlobalExtensionsTest.java +++ b/cms-hooksystem/src/test/java/com/condation/cms/hooksystem/extensions/GlobalExtensionsTest.java @@ -1,4 +1,4 @@ -package com.condation.cms.extensions; +package com.condation.cms.hooksystem.extensions; /*- * #%L @@ -22,8 +22,9 @@ */ -import com.condation.cms.extensions.GlobalExtensions; import com.condation.cms.api.hooks.HookSystem; +import com.condation.cms.extensions.GlobalExtensions; +import com.condation.cms.hooksystem.CMSHookSystem; import java.io.IOException; import org.assertj.core.api.Assertions; import org.graalvm.polyglot.Context; @@ -51,7 +52,7 @@ public static void initEngine() throws IOException { .allowValueSharing(true) .build(); - hookSystem = new HookSystem(); + hookSystem = new CMSHookSystem(); globalExtensions = new GlobalExtensions(hookSystem, context); globalExtensions.init(); @@ -70,7 +71,7 @@ public void test_init() { public void test_hook () { globalExtensions.evaluate("$hooks.registerAction('test/hook1', (context) => {return 'Hello';})"); - var context = hookSystem.execute("test/hook1"); + var context = hookSystem.doAction("test/hook1"); Assertions.assertThat(context.results()) .hasSize(1) diff --git a/cms-extensions/src/test/resources/site/extensions/hook-test.js b/cms-hooksystem/src/test/resources/site/extensions/hook-test.js similarity index 100% rename from cms-extensions/src/test/resources/site/extensions/hook-test.js rename to cms-hooksystem/src/test/resources/site/extensions/hook-test.js diff --git a/cms-server/pom.xml b/cms-server/pom.xml index e7251733..83f12a01 100644 --- a/cms-server/pom.xml +++ b/cms-server/pom.xml @@ -44,6 +44,10 @@ com.condation.cms + cms-hooksystem + + + com.condation.cms cms-auth diff --git a/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java b/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java index 2700159e..f2959f54 100644 --- a/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java +++ b/cms-server/src/main/java/com/condation/cms/request/RequestContextFactory.java @@ -35,7 +35,6 @@ import com.condation.cms.api.feature.features.InjectorFeature; import com.condation.cms.api.feature.features.IsDevModeFeature; import com.condation.cms.api.feature.features.MarkdownRendererFeature; -import com.condation.cms.api.feature.features.ModuleManagerFeature; import com.condation.cms.api.feature.features.RequestFeature; import com.condation.cms.api.feature.features.ServerPropertiesFeature; import com.condation.cms.api.feature.features.SiteMediaServiceFeature; @@ -56,11 +55,11 @@ import com.condation.cms.content.tags.Tags; import com.condation.cms.content.tags.TagParser; import com.condation.cms.extensions.ExtensionManager; -import com.condation.cms.extensions.hooks.ContentHooks; -import com.condation.cms.extensions.hooks.DBHooks; -import com.condation.cms.extensions.hooks.ServerHooks; -import com.condation.cms.extensions.hooks.TemplateHooks; import com.condation.cms.extensions.request.RequestExtensions; +import com.condation.cms.hooksystem.extensions.ContentHooks; +import com.condation.cms.hooksystem.extensions.DBHooks; +import com.condation.cms.hooksystem.extensions.ServerHooks; +import com.condation.cms.hooksystem.extensions.TemplateHooks; import com.condation.modules.api.ModuleManager; import com.google.inject.Injector; import java.io.IOException; diff --git a/cms-server/src/main/java/com/condation/cms/server/configs/ServerGlobalModule.java b/cms-server/src/main/java/com/condation/cms/server/configs/ServerGlobalModule.java index aaaa2051..aacd4c81 100644 --- a/cms-server/src/main/java/com/condation/cms/server/configs/ServerGlobalModule.java +++ b/cms-server/src/main/java/com/condation/cms/server/configs/ServerGlobalModule.java @@ -38,6 +38,7 @@ import com.condation.cms.core.messaging.DefaultMessaging; import com.condation.cms.core.scheduler.ServerCronJobScheduler; import com.condation.cms.core.site.DefaultSiteService; +import com.condation.cms.hooksystem.CMSHookSystem; import com.condation.modules.api.ModuleManager; import com.condation.modules.manager.ModuleAPIClassLoader; import com.condation.modules.manager.ModuleManagerImpl; @@ -165,7 +166,7 @@ public SiteService siteService() { @Singleton @Named("server") public HookSystem hookSystem() { - return new HookSystem(); + return new CMSHookSystem(); } @Provides diff --git a/cms-server/src/main/java/com/condation/cms/server/configs/SiteGlobalModule.java b/cms-server/src/main/java/com/condation/cms/server/configs/SiteGlobalModule.java index 53a543ee..402b6699 100644 --- a/cms-server/src/main/java/com/condation/cms/server/configs/SiteGlobalModule.java +++ b/cms-server/src/main/java/com/condation/cms/server/configs/SiteGlobalModule.java @@ -33,7 +33,8 @@ import com.condation.cms.core.scheduler.SingleCronJobScheduler; import com.condation.cms.core.scheduler.SiteCronJobScheduler; import com.condation.cms.extensions.GlobalExtensions; -import com.condation.cms.extensions.hooks.GlobalHooks; +import com.condation.cms.hooksystem.CMSHookSystem; +import com.condation.cms.hooksystem.extensions.GlobalHooks; import com.condation.modules.api.ModuleManager; import com.google.inject.Binder; import com.google.inject.Injector; @@ -75,7 +76,7 @@ public Context context(Engine engine) throws IOException { @Singleton @Named("global") public HookSystem hookSystem () { - return new HookSystem(); + return new CMSHookSystem(); } @Provides diff --git a/cms-server/src/main/java/com/condation/cms/server/configs/SiteModulesModule.java b/cms-server/src/main/java/com/condation/cms/server/configs/SiteModulesModule.java index 758923ad..5094d5f2 100644 --- a/cms-server/src/main/java/com/condation/cms/server/configs/SiteModulesModule.java +++ b/cms-server/src/main/java/com/condation/cms/server/configs/SiteModulesModule.java @@ -30,6 +30,7 @@ import com.condation.cms.api.template.TemplateEngine; import com.condation.cms.api.theme.Theme; import com.condation.cms.filesystem.FileDB; +import com.condation.cms.hooksystem.CMSHookSystem; import com.condation.modules.api.ModuleManager; import com.condation.modules.manager.ModuleAPIClassLoader; import com.condation.modules.manager.ModuleManagerImpl; @@ -156,7 +157,7 @@ public TemplateEngine resolveTemplateEngine(SiteProperties siteProperties, Theme */ @Provides public HookSystem hookSystem(final ModuleManager moduleManager) { - var hookSystem = new HookSystem(); + var hookSystem = new CMSHookSystem(); /* moduleManager.extensions(HookSystemRegisterExtensionPoint.class).forEach(extensionPoint -> { diff --git a/cms-server/src/main/java/com/condation/cms/server/handler/extensions/JettyHttpHandlerExtensionHandler.java b/cms-server/src/main/java/com/condation/cms/server/handler/extensions/JettyHttpHandlerExtensionHandler.java index f933a914..655ffd7c 100644 --- a/cms-server/src/main/java/com/condation/cms/server/handler/extensions/JettyHttpHandlerExtensionHandler.java +++ b/cms-server/src/main/java/com/condation/cms/server/handler/extensions/JettyHttpHandlerExtensionHandler.java @@ -26,9 +26,8 @@ import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.utils.RequestUtil; import com.condation.cms.extensions.HttpHandlerExtension; -import com.condation.cms.extensions.hooks.ServerHooks; import com.condation.cms.extensions.http.JettyHttpHandlerWrapper; -import com.condation.cms.server.filter.CreateRequestContextFilter; +import com.condation.cms.hooksystem.extensions.ServerHooks; import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/cms-server/src/main/java/com/condation/cms/server/handler/http/APIHandler.java b/cms-server/src/main/java/com/condation/cms/server/handler/http/APIHandler.java index ff45555d..0007b46b 100644 --- a/cms-server/src/main/java/com/condation/cms/server/handler/http/APIHandler.java +++ b/cms-server/src/main/java/com/condation/cms/server/handler/http/APIHandler.java @@ -30,9 +30,8 @@ import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.utils.RequestUtil; import com.condation.cms.extensions.HttpHandlerExtension; -import com.condation.cms.extensions.hooks.ServerHooks; import com.condation.cms.extensions.http.JettyHttpHandlerWrapper; -import com.condation.cms.server.filter.CreateRequestContextFilter; +import com.condation.cms.hooksystem.extensions.ServerHooks; import com.condation.cms.server.handler.AbstractHandler; import com.condation.modules.api.ModuleManager; import com.google.inject.Inject; @@ -40,7 +39,6 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; import org.eclipse.jetty.util.Callback; diff --git a/cms-server/src/main/java/com/condation/cms/server/handler/http/RoutesHandler.java b/cms-server/src/main/java/com/condation/cms/server/handler/http/RoutesHandler.java index ab3b390c..706f77b4 100644 --- a/cms-server/src/main/java/com/condation/cms/server/handler/http/RoutesHandler.java +++ b/cms-server/src/main/java/com/condation/cms/server/handler/http/RoutesHandler.java @@ -29,12 +29,10 @@ import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.utils.RequestUtil; import com.condation.cms.extensions.HttpHandlerExtension; -import com.condation.cms.extensions.hooks.ServerHooks; import com.condation.cms.extensions.http.JettyHttpHandlerWrapper; -import com.condation.cms.server.filter.CreateRequestContextFilter; +import com.condation.cms.hooksystem.extensions.ServerHooks; import com.condation.modules.api.ModuleManager; import com.google.inject.Inject; -import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/cms-server/src/main/java/com/condation/cms/server/host/VHost.java b/cms-server/src/main/java/com/condation/cms/server/host/VHost.java index 0229c5d4..aaa53d32 100644 --- a/cms-server/src/main/java/com/condation/cms/server/host/VHost.java +++ b/cms-server/src/main/java/com/condation/cms/server/host/VHost.java @@ -53,8 +53,8 @@ import com.condation.cms.core.utils.SiteUtil; import com.condation.cms.core.configuration.ConfigManagement; import com.condation.cms.extensions.GlobalExtensions; -import com.condation.cms.extensions.hooks.GlobalHooks; import com.condation.cms.filesystem.FileDB; +import com.condation.cms.hooksystem.extensions.GlobalHooks; import com.condation.cms.media.MediaManager; import com.condation.cms.media.SiteMediaManager; import com.condation.cms.media.ThemeMediaManager; diff --git a/cms-templates/pom.xml b/cms-templates/pom.xml index 11e7809e..a676e34b 100644 --- a/cms-templates/pom.xml +++ b/cms-templates/pom.xml @@ -35,6 +35,11 @@ cms-core + + com.condation.cms + cms-hooksystem + + org.apache.commons commons-jexl3 diff --git a/cms-templates/src/main/java/com/condation/cms/templates/DynamicConfiguration.java b/cms-templates/src/main/java/com/condation/cms/templates/DynamicConfiguration.java index 5d51aaa6..0fa6af6e 100644 --- a/cms-templates/src/main/java/com/condation/cms/templates/DynamicConfiguration.java +++ b/cms-templates/src/main/java/com/condation/cms/templates/DynamicConfiguration.java @@ -24,7 +24,7 @@ import com.condation.cms.api.feature.features.InjectorFeature; import com.condation.cms.api.model.Parameter; import com.condation.cms.api.request.RequestContext; -import com.condation.cms.extensions.hooks.TemplateHooks; +import com.condation.cms.hooksystem.extensions.TemplateHooks; import com.condation.cms.templates.components.TemplateComponents; import com.condation.cms.templates.components.TemplateFunctions; import com.condation.cms.templates.functions.TemplateFunction; diff --git a/cms-templates/src/main/java/com/condation/cms/templates/module/CMSModuleTemplateEngine.java b/cms-templates/src/main/java/com/condation/cms/templates/module/CMSModuleTemplateEngine.java index c07d8899..47c8e497 100644 --- a/cms-templates/src/main/java/com/condation/cms/templates/module/CMSModuleTemplateEngine.java +++ b/cms-templates/src/main/java/com/condation/cms/templates/module/CMSModuleTemplateEngine.java @@ -30,7 +30,7 @@ import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.template.TemplateEngine; import com.condation.cms.api.theme.Theme; -import com.condation.cms.extensions.hooks.TemplateHooks; +import com.condation.cms.hooksystem.extensions.TemplateHooks; import com.condation.cms.templates.CMSTemplateEngine; import com.condation.cms.templates.DynamicConfiguration; import com.condation.cms.templates.TemplateEngineFactory; diff --git a/cms-templates/src/test/java/com/condation/cms/templates/TemplateEngineFunctionsTest.java b/cms-templates/src/test/java/com/condation/cms/templates/TemplateEngineFunctionsTest.java index 99220ccd..3a429563 100644 --- a/cms-templates/src/test/java/com/condation/cms/templates/TemplateEngineFunctionsTest.java +++ b/cms-templates/src/test/java/com/condation/cms/templates/TemplateEngineFunctionsTest.java @@ -29,7 +29,8 @@ import com.condation.cms.api.hooks.HookSystem; import com.condation.cms.api.model.Parameter; import com.condation.cms.api.request.RequestContext; -import com.condation.cms.extensions.hooks.TemplateHooks; +import com.condation.cms.hooksystem.CMSHookSystem; +import com.condation.cms.hooksystem.extensions.TemplateHooks; import com.condation.cms.templates.components.TemplateComponents; import com.condation.cms.templates.loaders.StringTemplateLoader; import com.condation.modules.api.ModuleManager; @@ -71,7 +72,7 @@ public void test_date() throws IOException { @Test void getFunctionsFromDynamicConig () { var requestContext = new RequestContext(); - requestContext.add(HookSystemFeature.class, new HookSystemFeature(new HookSystem())); + requestContext.add(HookSystemFeature.class, new HookSystemFeature(new CMSHookSystem())); requestContext.add(TemplateHooks.class, new TemplateHooks(requestContext)); var injectorMock = Mockito.mock(Injector.class); diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 05be68ee..7b63d240 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -45,6 +45,10 @@ com.condation.cms cms-content + + com.condation.cms + cms-hooksystem + com.condation.cms cms-media diff --git a/integration-tests/src/test/java/com/condation/cms/TestHelper.java b/integration-tests/src/test/java/com/condation/cms/TestHelper.java index 8d18e143..8637763d 100644 --- a/integration-tests/src/test/java/com/condation/cms/TestHelper.java +++ b/integration-tests/src/test/java/com/condation/cms/TestHelper.java @@ -45,11 +45,12 @@ import com.condation.cms.content.tags.TagParser; import com.condation.cms.core.configuration.ConfigurationFactory; import com.condation.cms.core.configuration.properties.ExtendedServerProperties; -import com.condation.cms.extensions.hooks.DBHooks; -import com.condation.cms.extensions.hooks.TemplateHooks; import com.condation.cms.extensions.request.RequestExtensions; import com.condation.cms.media.FileMediaService; import com.condation.cms.core.theme.DefaultTheme; +import com.condation.cms.hooksystem.CMSHookSystem; +import com.condation.cms.hooksystem.extensions.DBHooks; +import com.condation.cms.hooksystem.extensions.TemplateHooks; import com.condation.cms.test.TestSiteProperties; import com.google.inject.Injector; import java.io.IOException; @@ -83,7 +84,7 @@ public static RequestContext requestContext(String uri) throws IOException { context.add(SiteMediaServiceFeature.class, new SiteMediaServiceFeature(new FileMediaService(null))); context.add(InjectorFeature.class, new InjectorFeature(Mockito.mock(Injector.class))); - context.add(HookSystemFeature.class, new HookSystemFeature(new HookSystem())); + context.add(HookSystemFeature.class, new HookSystemFeature(new CMSHookSystem())); context.add(ContentNodeMapperFeature.class, new ContentNodeMapperFeature(null)); context.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(null)); @@ -117,7 +118,7 @@ public static RequestContext requestContext(String uri, ContentParser contentPar context.add(ContentParserFeature.class, new ContentParserFeature(contentParser)); context.add(MarkdownRendererFeature.class, new MarkdownRendererFeature(markdownRenderer)); context.add(ContentNodeMapperFeature.class, new ContentNodeMapperFeature(contentMapper)); - context.add(HookSystemFeature.class, new HookSystemFeature(new HookSystem())); + context.add(HookSystemFeature.class, new HookSystemFeature(new CMSHookSystem())); context.add(SitePropertiesFeature.class, new SitePropertiesFeature(new TestSiteProperties(Map.of( "context_path", "/" )))); diff --git a/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleJettyHttpHandlerExtension.java b/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleJettyHttpHandlerExtension.java index cddd2d2a..8d8b35d9 100644 --- a/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleJettyHttpHandlerExtension.java +++ b/modules/example-module/src/main/java/com/condation/cms/modules/example/ExampleJettyHttpHandlerExtension.java @@ -50,7 +50,7 @@ public Mapping getMapping() { mapping.add(PathSpec.from("/people"), new ExampleHandler("Hello people!")); mapping.add(PathSpec.from("/hook"), (request, response, callback) -> { - ActionContext hookContext = getRequestContext().get(HookSystemFeature.class).hookSystem().execute("example/test"); + ActionContext hookContext = getRequestContext().get(HookSystemFeature.class).hookSystem().doAction("example/test"); var content = (String)hookContext.results().get(0); diff --git a/modules/system-modules/src/main/java/com/condation/cms/modules/system/templates/HooksTemplateFunctionExtensions.java b/modules/system-modules/src/main/java/com/condation/cms/modules/system/templates/HooksTemplateFunctionExtensions.java index 6186b265..01cd8850 100644 --- a/modules/system-modules/src/main/java/com/condation/cms/modules/system/templates/HooksTemplateFunctionExtensions.java +++ b/modules/system-modules/src/main/java/com/condation/cms/modules/system/templates/HooksTemplateFunctionExtensions.java @@ -49,7 +49,7 @@ public Object hook(Parameter params){ return ""; } - List results = getRequestContext().get(HookSystemFeature.class).hookSystem().execute(hook).results().stream() + List results = getRequestContext().get(HookSystemFeature.class).hookSystem().doAction(hook).results().stream() .map(Object::toString) // oder o -> o.getName() .toList(); diff --git a/modules/ui-module/pom.xml b/modules/ui-module/pom.xml index 5a900dcb..263ff2bf 100644 --- a/modules/ui-module/pom.xml +++ b/modules/ui-module/pom.xml @@ -23,6 +23,10 @@ com.condation.cms cms-auth + + com.condation.cms + cms-hooksystem + io.jsonwebtoken jjwt-api diff --git a/modules/ui-module/src/main/java/com/condation/cms/modules/ui/http/HookHandler.java b/modules/ui-module/src/main/java/com/condation/cms/modules/ui/http/HookHandler.java index 8357c083..4e467cba 100644 --- a/modules/ui-module/src/main/java/com/condation/cms/modules/ui/http/HookHandler.java +++ b/modules/ui-module/src/main/java/com/condation/cms/modules/ui/http/HookHandler.java @@ -55,7 +55,7 @@ public boolean handle(Request request, Response response, Callback callback) thr String body = getBody(request); var command = UIGsonProvider.INSTANCE.fromJson(body, HookCall.class); - ActionContext actionContext = hookSystem.execute(command.hook(), command.parameters()); + ActionContext actionContext = hookSystem.doAction(command.hook(), command.parameters()); Map commandResponse = new HashMap<>(); commandResponse.put("hook", command.hook()); diff --git a/modules/ui-module/src/main/java/com/condation/cms/modules/ui/utils/UIHooks.java b/modules/ui-module/src/main/java/com/condation/cms/modules/ui/utils/UIHooks.java index c0d9bf1b..3f873243 100644 --- a/modules/ui-module/src/main/java/com/condation/cms/modules/ui/utils/UIHooks.java +++ b/modules/ui-module/src/main/java/com/condation/cms/modules/ui/utils/UIHooks.java @@ -47,19 +47,19 @@ public UIHooks (final HookSystem hookSystem) { public ContentTypes contentTypes () { var contentTypes = new ContentTypes(); - return hookSystem.filter(HOOK_REGISTER_CONTENT_TYPES, contentTypes).value(); + return hookSystem.doFilter(HOOK_REGISTER_CONTENT_TYPES, contentTypes).value(); } public MediaForms mediaForms () { var mediaForms = new MediaForms(); - return hookSystem.filter(HOOK_REGISTER_MEDIA_FORMS, mediaForms).value(); + return hookSystem.doFilter(HOOK_REGISTER_MEDIA_FORMS, mediaForms).value(); } public Menu menu() { var menu = new Menu(); - menu = hookSystem.filter(HOOK_MENU, menu).value(); + menu = hookSystem.doFilter(HOOK_MENU, menu).value(); return menu; } @@ -69,6 +69,6 @@ public Map> translations () { "de", new HashMap<>(), "en", new HashMap<>() )); - return hookSystem.filter(HOOK_TRANSLATIONS, translations).value(); + return hookSystem.doFilter(HOOK_TRANSLATIONS, translations).value(); } } diff --git a/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/TemplateEngineTest.java b/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/TemplateEngineTest.java index 1966f179..b9290b7f 100644 --- a/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/TemplateEngineTest.java +++ b/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/TemplateEngineTest.java @@ -31,6 +31,7 @@ import com.condation.cms.api.ui.elements.MenuEntry; import com.condation.cms.auth.services.User; import com.condation.cms.core.cache.LocalCacheProvider; +import com.condation.cms.hooksystem.CMSHookSystem; import com.condation.modules.api.ModuleManager; import java.util.ArrayList; import java.util.List; @@ -61,7 +62,7 @@ public void testSomeMethod() { TemplateEngine templateEngine = new TemplateEngine(cacheManager); - var hookSystem = new HookSystem(); + var hookSystem = new CMSHookSystem(); hookSystem.registerFilter("module/ui/menu", (FilterContext context) -> { var menu = context.value(); diff --git a/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/UIHooksTest.java b/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/UIHooksTest.java index 2771a844..b7121b8f 100644 --- a/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/UIHooksTest.java +++ b/modules/ui-module/src/test/java/com/condation/cms/modules/ui/utils/UIHooksTest.java @@ -24,6 +24,7 @@ import com.condation.cms.api.hooks.HookSystem; import com.condation.cms.api.ui.elements.Menu; import com.condation.cms.api.ui.elements.MenuEntry; +import com.condation.cms.hooksystem.CMSHookSystem; import java.util.ArrayList; import java.util.List; import org.assertj.core.api.Assertions; @@ -38,7 +39,7 @@ public class UIHooksTest { @Test public void registerMenuEntry() { - HookSystem hookSystem = new HookSystem(); + HookSystem hookSystem = new CMSHookSystem(); hookSystem.registerFilter(UIHooks.HOOK_MENU, (FilterContext context) -> { var menu = context.value(); @@ -62,7 +63,7 @@ public void registerMenuEntry() { @Test public void registerMenuEntryAreSorted() { - HookSystem hookSystem = new HookSystem(); + HookSystem hookSystem = new CMSHookSystem(); hookSystem.registerFilter(UIHooks.HOOK_MENU, (FilterContext context) -> { var menu = context.value(); diff --git a/pom.xml b/pom.xml index 06516aa0..9c7985f2 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,7 @@ integration-tests cms-core cms-test + cms-hooksystem 2023 @@ -107,6 +108,11 @@ com.condation.cms cms-test ${project.version} + + + com.condation.cms + cms-hooksystem + ${project.version} com.condation.modules.framework diff --git a/test-server/modules/example-module/libs/example-module-8.0.0.jar b/test-server/modules/example-module/libs/example-module-8.0.0.jar deleted file mode 100644 index 3ab59264..00000000 Binary files a/test-server/modules/example-module/libs/example-module-8.0.0.jar and /dev/null differ diff --git a/test-server/modules/example-module/libs/example-module-8.1.0.jar b/test-server/modules/example-module/libs/example-module-8.1.0.jar new file mode 100644 index 00000000..5fa5687f Binary files /dev/null and b/test-server/modules/example-module/libs/example-module-8.1.0.jar differ diff --git a/test-server/modules/example-module/module.properties b/test-server/modules/example-module/module.properties index 93dd4e37..32924449 100644 --- a/test-server/modules/example-module/module.properties +++ b/test-server/modules/example-module/module.properties @@ -1,4 +1,4 @@ id=example-module name=example module -version=8.0.0 +version=8.1.0 priority=HIGH \ No newline at end of file diff --git a/test-server/themes/demo/extensions/theme.extension.js b/test-server/themes/demo/extensions/theme.extension.js index 6b5a4947..f095295b 100644 --- a/test-server/themes/demo/extensions/theme.extension.js +++ b/test-server/themes/demo/extensions/theme.extension.js @@ -51,4 +51,11 @@ $hooks.registerFilter("module/ui/translations", (context) => { translations.de["field.description"] = "Beschreibung"; return translations; +}) + +$hooks.registerAction("system/content/slot/header", (context) => { + return ""; +}) +$hooks.registerAction("system/content/slot/footer", (context) => { + return ""; }) \ No newline at end of file