Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -32,9 +35,15 @@
@Slf4j
public class RequestContext extends FeatureContainer implements AutoCloseable {

private ConcurrentMap<String, Object> variables = new ConcurrentHashMap<>();

public RequestContext () {
}


public Map<String, Object> getVariables () {
return variables;
}

@Override
public void close() throws Exception {
super.close();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public String replace (final String content, Map<String, Object> contextModel) {
}

public String replace (final String content, Map<String, Object> contextModel, RequestContext requestContext) {
return parser.parse(content, tagMap, contextModel);
return parser.parse(content, tagMap, contextModel, requestContext);
}

public String execute (String name, Map<String, Object> parameters, RequestContext requestContext) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -90,12 +91,12 @@ public List<TagInfo> 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<String, Object> contextModel) {
public String parse(String text, TagMap tagHandlers, Map<String, Object> contextModel, RequestContext requestContext) {
// Erster Schritt: Finde alle Tags
List<TagInfo> tags = findTags(text, tagHandlers);

Expand All @@ -107,11 +108,11 @@ public String parse(String text, TagMap tagHandlers, Map<String, Object> context
Function<Parameter, String> 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);
}

Expand Down Expand Up @@ -172,8 +173,8 @@ private Parameter parseRawAttributes(String attributesString) {
}

// Zweiter Schritt: Attribute auswerten
private Parameter evaluateAttributes(Parameter rawAttributes, Map<String, Object> contextModel) {
Parameter evaluatedAttributes = new Parameter();
private Parameter evaluateAttributes(Parameter rawAttributes, Map<String, Object> contextModel, RequestContext requestContext) {
Parameter evaluatedAttributes = new Parameter(requestContext);
for (Map.Entry<String, Object> entry : rawAttributes.entrySet()) {
String key = entry.getKey();
String rawValue = (String) entry.getValue(); // Rohwert als String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -65,6 +66,20 @@ public void init () {
params -> "<span>%s</span>".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());
}

Expand Down Expand Up @@ -202,4 +217,16 @@ void test_expression() {

Assertions.assertThat(result).isEqualTo("<span>CondationCMS</span>");
}

@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!");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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");
}

Expand All @@ -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!");
}
Expand All @@ -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("<div class='parent'>nested</div>");
}
}