From fac6203ed8a47a17346861c218a07540de34e7a9 Mon Sep 17 00:00:00 2001 From: Thorsten Marx Date: Mon, 24 Feb 2025 14:56:37 +0100 Subject: [PATCH] add variables to request context to share data in request scope --- .../cms/api/request/RequestContext.java | 11 +++++- .../cms/content/shortcodes/ShortCodes.java | 2 +- .../cms/content/shortcodes/TagParser.java | 15 ++++---- .../content/shortcodes/ShortCodesTest.java | 27 ++++++++++++++ .../cms/content/shortcodes/TagParserTest.java | 37 +++++++++++-------- 5 files changed, 67 insertions(+), 25 deletions(-) diff --git a/cms-api/src/main/java/com/condation/cms/api/request/RequestContext.java b/cms-api/src/main/java/com/condation/cms/api/request/RequestContext.java index f9a25306d..976e26f24 100644 --- a/cms-api/src/main/java/com/condation/cms/api/request/RequestContext.java +++ b/cms-api/src/main/java/com/condation/cms/api/request/RequestContext.java @@ -23,6 +23,9 @@ */ import com.condation.cms.api.feature.FeatureContainer; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import lombok.extern.slf4j.Slf4j; /** @@ -32,9 +35,15 @@ @Slf4j public class RequestContext extends FeatureContainer implements AutoCloseable { + private ConcurrentMap variables = new ConcurrentHashMap<>(); + public RequestContext () { } - + + public Map getVariables () { + return variables; + } + @Override public void close() throws Exception { super.close(); diff --git a/cms-content/src/main/java/com/condation/cms/content/shortcodes/ShortCodes.java b/cms-content/src/main/java/com/condation/cms/content/shortcodes/ShortCodes.java index 03022dd95..047a5e36a 100644 --- a/cms-content/src/main/java/com/condation/cms/content/shortcodes/ShortCodes.java +++ b/cms-content/src/main/java/com/condation/cms/content/shortcodes/ShortCodes.java @@ -62,7 +62,7 @@ public String replace (final String content, Map contextModel) { } public String replace (final String content, Map contextModel, RequestContext requestContext) { - return parser.parse(content, tagMap, contextModel); + return parser.parse(content, tagMap, contextModel, requestContext); } public String execute (String name, Map parameters, RequestContext requestContext) { diff --git a/cms-content/src/main/java/com/condation/cms/content/shortcodes/TagParser.java b/cms-content/src/main/java/com/condation/cms/content/shortcodes/TagParser.java index 054e64f23..30d425873 100644 --- a/cms-content/src/main/java/com/condation/cms/content/shortcodes/TagParser.java +++ b/cms-content/src/main/java/com/condation/cms/content/shortcodes/TagParser.java @@ -22,6 +22,7 @@ * #L% */ import com.condation.cms.api.model.Parameter; +import com.condation.cms.api.request.RequestContext; import org.apache.commons.jexl3.JexlEngine; import org.apache.commons.jexl3.MapContext; @@ -90,12 +91,12 @@ public List findTags(String text, TagMap tagHandlers) { return tags; } - public String parse(String text, TagMap tagHandlers) { - return parse(text, tagHandlers, Collections.emptyMap()); + public String parse(String text, TagMap tagHandlers, RequestContext requestContext) { + return parse(text, tagHandlers, Collections.emptyMap(), requestContext); } // Zweiter Schritt: Tags basierend auf den gespeicherten Positionen ersetzen - public String parse(String text, TagMap tagHandlers, Map contextModel) { + public String parse(String text, TagMap tagHandlers, Map contextModel, RequestContext requestContext) { // Erster Schritt: Finde alle Tags List tags = findTags(text, tagHandlers); @@ -107,11 +108,11 @@ public String parse(String text, TagMap tagHandlers, Map context Function handler = tagHandlers.get(tag.name); // Im zweiten Schritt: Attribute auswerten - Parameter evaluatedAttributes = evaluateAttributes(tag.rawAttributes, contextModel); + Parameter evaluatedAttributes = evaluateAttributes(tag.rawAttributes, contextModel, requestContext); if (evaluatedAttributes.containsKey("_content")) { String rawContent = (String) evaluatedAttributes.get("_content"); - String parsedContent = parse(rawContent, tagHandlers, contextModel); // Rekursives Parsen + String parsedContent = parse(rawContent, tagHandlers, contextModel, requestContext); // Rekursives Parsen evaluatedAttributes.put("_content", parsedContent); } @@ -172,8 +173,8 @@ private Parameter parseRawAttributes(String attributesString) { } // Zweiter Schritt: Attribute auswerten - private Parameter evaluateAttributes(Parameter rawAttributes, Map contextModel) { - Parameter evaluatedAttributes = new Parameter(); + private Parameter evaluateAttributes(Parameter rawAttributes, Map contextModel, RequestContext requestContext) { + Parameter evaluatedAttributes = new Parameter(requestContext); for (Map.Entry entry : rawAttributes.entrySet()) { String key = entry.getKey(); String rawValue = (String) entry.getValue(); // Rohwert als String diff --git a/cms-content/src/test/java/com/condation/cms/content/shortcodes/ShortCodesTest.java b/cms-content/src/test/java/com/condation/cms/content/shortcodes/ShortCodesTest.java index 33de04a80..8c0924ba3 100644 --- a/cms-content/src/test/java/com/condation/cms/content/shortcodes/ShortCodesTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/shortcodes/ShortCodesTest.java @@ -24,6 +24,7 @@ import com.condation.cms.api.model.Parameter; +import com.condation.cms.api.request.RequestContext; import com.condation.cms.content.ContentBaseTest; import java.util.HashMap; import java.util.Map; @@ -65,6 +66,20 @@ public void init () { params -> "%s".formatted(params.get("expression")) ); + tags.put( + "set_var", + params -> { + params.getRequestContext().getVariables().put("myVar", "Hello world!"); + return ""; + } + ); + tags.put( + "get_var", + params -> { + return (String)params.getRequestContext().getVariables().getOrDefault("myVar", "DEFAULT"); + } + ); + shortCodes = new ShortCodes(tags, getTagParser()); } @@ -202,4 +217,16 @@ void test_expression() { Assertions.assertThat(result).isEqualTo("CondationCMS"); } + + @Test + void test_variables() { + + RequestContext requestContext = new RequestContext(); + + shortCodes.replace("[[set_var /]]", Map.of(), requestContext); + + var result = shortCodes.replace("[[get_var /]]", Map.of(), requestContext); + + Assertions.assertThat(result).isEqualTo("Hello world!"); + } } diff --git a/cms-content/src/test/java/com/condation/cms/content/shortcodes/TagParserTest.java b/cms-content/src/test/java/com/condation/cms/content/shortcodes/TagParserTest.java index eb0a985dd..642304e4a 100644 --- a/cms-content/src/test/java/com/condation/cms/content/shortcodes/TagParserTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/shortcodes/TagParserTest.java @@ -22,6 +22,7 @@ * #L% */ +import com.condation.cms.api.request.RequestContext; import org.apache.commons.jexl3.JexlBuilder; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -37,8 +38,12 @@ public class TagParserTest { TagMap tagMap; + RequestContext requestContext; + @BeforeEach void setup() { + requestContext = new RequestContext(); + tagMap = new TagMap(); tagMap.put("code", params -> { // Verarbeitung der Parameter hier @@ -72,82 +77,82 @@ void setup() { @Test public void no_shortcode() { - String result = tagParser.parse("Dein Shortcode-Text hier", tagMap); + String result = tagParser.parse("Dein Shortcode-Text hier", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("Dein Shortcode-Text hier"); } @Test public void self_closing_tag() { - String result = tagParser.parse("[[code/]]", tagMap); + String result = tagParser.parse("[[code/]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("Ausgabe des Shortcodes"); } @Test public void self_closing_tag_with_space() { - String result = tagParser.parse("[[code /]]", tagMap); + String result = tagParser.parse("[[code /]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("Ausgabe des Shortcodes"); } @Test public void end_closing_tag() { - String result = tagParser.parse("[[code]][[/code]]", tagMap); + String result = tagParser.parse("[[code]][[/code]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("Ausgabe des Shortcodes"); } @Test public void tag_with_content() { - String result = tagParser.parse("[[content]]Hello CondationCMS[[/content]]", tagMap); + String result = tagParser.parse("[[content]]Hello CondationCMS[[/content]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("Hello CondationCMS"); } @Test public void expressions() { - String result = tagParser.parse("[[exp value=\"${5+4}\"/]]", tagMap); + String result = tagParser.parse("[[exp value=\"${5+4}\"/]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("expression: 9"); } @Test public void parameters_string() { - String result = tagParser.parse("[[param param1=\"5\"/]]", tagMap); + String result = tagParser.parse("[[param param1=\"5\"/]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("param: 5"); } @Test public void parameters_number() { - String result = tagParser.parse("[[param param1=5 /]]", tagMap); + String result = tagParser.parse("[[param param1=5 /]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("param: 5"); } @Test public void parameters_boolean_true() { - String result = tagParser.parse("[[param param1=true /]]", tagMap); + String result = tagParser.parse("[[param param1=true /]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("param: true"); } @Test public void parameters_boolean_false() { - String result = tagParser.parse("[[param param1=false /]]", tagMap); + String result = tagParser.parse("[[param param1=false /]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("param: false"); } @Test public void parameters_with_content() { - String result = tagParser.parse("[[param param1=\"5\"]]Hello[[/param]]", tagMap); + String result = tagParser.parse("[[param param1=\"5\"]]Hello[[/param]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("param: 5"); } @Test public void shortCode_in_text() { - String result = tagParser.parse("Hello [[content]]CondationCMS[[/content]]!", tagMap); + String result = tagParser.parse("Hello [[content]]CondationCMS[[/content]]!", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("Hello CondationCMS!"); } @Test public void namespace() { - String result = tagParser.parse("[[ns1:print message='Hello CondationCMS']][[/ns1:print]]", tagMap); + String result = tagParser.parse("[[ns1:print message='Hello CondationCMS']][[/ns1:print]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("message: Hello CondationCMS"); - result = tagParser.parse("[[ns1:print message='Hello CondationCMS' /]]", tagMap); + result = tagParser.parse("[[ns1:print message='Hello CondationCMS' /]]", tagMap, requestContext); Assertions.assertThat(result).isEqualTo("message: Hello CondationCMS"); } @@ -159,7 +164,7 @@ public void multiline () { [[/content]] """; - String result = tagParser.parse(content, tagMap); + String result = tagParser.parse(content, tagMap, requestContext); Assertions.assertThat(result).isEqualToIgnoringWhitespace("This is a multiline shortcode!"); } @@ -174,7 +179,7 @@ public void nested () { var tags = tagParser.findTags(content, tagMap); Assertions.assertThat(tags.size()).isEqualTo(1); - String result = tagParser.parse(content, tagMap); + String result = tagParser.parse(content, tagMap, requestContext); Assertions.assertThat(result).isEqualToIgnoringWhitespace("
nested
"); } }