From 6af7e4fd827b9f42895192e4bc0bbb8fadca3c45 Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Sat, 4 May 2024 18:06:14 +0200 Subject: [PATCH] Echo working. --- .../StandardGStringTemplateViewMetaClass.java | 24 ++++++----- .../groovy/groowt/view/web/lib/Echo.groovy | 42 +++++++++---------- .../groowt/view/web/lib/EchoTemplate.gst | 2 +- .../groowt/view/web/lib/EchoTests.groovy | 16 +++++++ .../groowt/view/web/lib/FragmentTests.groovy | 2 +- ...ava => AbstractWebViewComponentTests.java} | 4 +- 6 files changed, 54 insertions(+), 36 deletions(-) create mode 100644 web-views/src/test/groovy/groowt/view/web/lib/EchoTests.groovy rename web-views/src/testFixtures/java/groowt/view/web/lib/{AbstractComponentTests.java => AbstractWebViewComponentTests.java} (93%) diff --git a/views/src/main/groovy/groowt/view/StandardGStringTemplateViewMetaClass.java b/views/src/main/groovy/groowt/view/StandardGStringTemplateViewMetaClass.java index fedf35e..ea38a5d 100644 --- a/views/src/main/groovy/groowt/view/StandardGStringTemplateViewMetaClass.java +++ b/views/src/main/groovy/groowt/view/StandardGStringTemplateViewMetaClass.java @@ -14,12 +14,15 @@ public class StandardGStringTemplateViewMetaClass extends ExpandoMetaClass { private static final Logger logger = LoggerFactory.getLogger(StandardGStringTemplateViewMetaClass.class); - private static StandardGStringTemplateView asView(Object object) { + private static StandardGStringTemplateView asStandardGStringTemplateView(Object object) { return object instanceof StandardGStringTemplateView view ? view : null; } private static Object[] asArgsArray(Object object) { - return object instanceof Object[] objects ? objects : new Object[] { object }; + return object instanceof Object[] objects + ? objects + : new Object[] { object } + ; } private static MetaMethod findMetaMethod(MetaClass metaClass, String methodName, Object[] argsArray) { @@ -57,9 +60,9 @@ public class StandardGStringTemplateViewMetaClass extends ExpandoMetaClass { @Override public Object invokeMethod(Object object, String methodName, Object arguments) { - final StandardGStringTemplateView view = asView(object); + final StandardGStringTemplateView view = asStandardGStringTemplateView(object); if (view == null) { - logger.warn("StandardGStringTemplateViewMetaClass should only be used as a MetaClass of StandardGStringTemplateViewMetaClass."); + warnWrongType(object); return super.invokeMethod(object, methodName, arguments); } @@ -76,7 +79,7 @@ public class StandardGStringTemplateViewMetaClass extends ExpandoMetaClass { final Object[] argsArray = asArgsArray(arguments); // self - final MetaMethod selfMethod = findMetaMethod(this, methodName, argsArray); + final MetaMethod selfMethod = this.getMetaMethod(methodName, argsArray); if (selfMethod != null) { return selfMethod.invoke(view, argsArray); } @@ -84,11 +87,12 @@ public class StandardGStringTemplateViewMetaClass extends ExpandoMetaClass { // parent hierarchy View parent = view.getParent(); while (parent != null) { - final var parentMetaMethod = findMetaMethod(findMetaClass(parent), methodName, argsArray); + final var parentMetaClass = findMetaClass(parent); + final var parentMetaMethod = parentMetaClass.getMetaMethod(methodName, argsArray); if (parentMetaMethod != null) { return parentMetaMethod.invoke(parent, argsArray); - } else if (parent instanceof StandardGStringTemplateView) { - parent = ((StandardGStringTemplateView) parent).getParent(); + } else if (parent instanceof StandardGStringTemplateView standardGStringTemplateView) { + parent = standardGStringTemplateView.getParent(); } else { parent = null; } @@ -99,7 +103,7 @@ public class StandardGStringTemplateViewMetaClass extends ExpandoMetaClass { @Override public Object getProperty(Object object, String name) { - final StandardGStringTemplateView view = asView(object); + final StandardGStringTemplateView view = asStandardGStringTemplateView(object); if (view == null) { warnWrongType(object); return super.getProperty(object, name); @@ -136,7 +140,7 @@ public class StandardGStringTemplateViewMetaClass extends ExpandoMetaClass { @Override public void setProperty(Object object, String name, Object value) { - final StandardGStringTemplateView view = asView(object); + final StandardGStringTemplateView view = asStandardGStringTemplateView(object); if (view == null) { warnWrongType(object); super.setProperty(object, name, value); diff --git a/web-views/src/main/groovy/groowt/view/web/lib/Echo.groovy b/web-views/src/main/groovy/groowt/view/web/lib/Echo.groovy index 9f015c2..12713cb 100644 --- a/web-views/src/main/groovy/groowt/view/web/lib/Echo.groovy +++ b/web-views/src/main/groovy/groowt/view/web/lib/Echo.groovy @@ -10,37 +10,32 @@ class Echo extends DelegatingWebViewComponent { static final class EchoFactory implements ComponentFactory { - Echo doCreate(String typeName, ComponentContext context, Map attr) { - doCreate(typeName, context, attr, true) + Echo doCreate(String typeName, boolean selfClose) { + doCreate(typeName, [:], selfClose) } - Echo doCreate(String typeName, ComponentContext context, Map attr, boolean selfClose) { + Echo doCreate(String typeName, Map attr) { + doCreate(typeName, attr, true) + } + + Echo doCreate(String typeName, Map attr, boolean selfClose) { def echo = new Echo(attr, typeName, selfClose) - echo.context = context echo } Echo doCreate( String typeName, - ComponentContext context, Map attr, List children ) { def echo = new Echo(attr, typeName, false) - echo.context = context echo.childRenderers = children echo } @Override Echo create(String type, ComponentContext componentContext, Object... args) { - if (args == null || args.length < 1) { - throw new IllegalArgumentException( - ' must have at least one attribute. ' + - 'If you are just echoing children, use a fragment (<>...) instead. ' - ) - } - this.invokeMethod('doCreate', type as String, componentContext, *args) as Echo + this.doCreate(type, *args) as Echo } @Override @@ -50,12 +45,13 @@ class Echo extends DelegatingWebViewComponent { } - String typeName + String name boolean selfClose - Echo(Map attr, String typeName, boolean selfClose) { + Echo(Map attr, String name, boolean selfClose) { super(attr) - this.typeName = typeName + this.name = name + this.selfClose = selfClose } @Override @@ -66,18 +62,20 @@ class Echo extends DelegatingWebViewComponent { ) } - void renderAttr(Writer out) { + String formatAttr() { + def sb = new StringBuilder() def iter = this.attr.iterator() while (iter.hasNext()) { def entry = iter.next() - out << entry.key - out << '="' - out << entry.value - out << '"' + sb << entry.key + sb << '="' + sb << entry.value + sb << '"' if (iter.hasNext()) { - out << ' ' + sb << ' ' } } + sb.toString() } } diff --git a/web-views/src/main/resources/groowt/view/web/lib/EchoTemplate.gst b/web-views/src/main/resources/groowt/view/web/lib/EchoTemplate.gst index c028d2c..66d5500 100644 --- a/web-views/src/main/resources/groowt/view/web/lib/EchoTemplate.gst +++ b/web-views/src/main/resources/groowt/view/web/lib/EchoTemplate.gst @@ -1 +1 @@ -<$typeName ${renderAttr()}${selfClose ? ' /' : ''}>${renderChildren()}${!selfClose ? "" : ''} +<$name ${formatAttr()}${selfClose ? '/' : ''}>${hasChildren() ? renderChildren() : ''}${hasChildren() || !selfClose ? "" : ''} diff --git a/web-views/src/test/groovy/groowt/view/web/lib/EchoTests.groovy b/web-views/src/test/groovy/groowt/view/web/lib/EchoTests.groovy new file mode 100644 index 0000000..d59fea1 --- /dev/null +++ b/web-views/src/test/groovy/groowt/view/web/lib/EchoTests.groovy @@ -0,0 +1,16 @@ +package groowt.view.web.lib + +import groowt.view.web.DefaultWebViewComponentContext +import org.junit.jupiter.api.Test + +class EchoTests extends AbstractWebViewComponentTests { + + @Test + void typeOnlySelfClose() { + def context = new DefaultWebViewComponentContext() + context.pushDefaultScope() + context.currentScope.add('Echo', new Echo.EchoFactory()) + this.doTest('', '', context) + } + +} diff --git a/web-views/src/test/groovy/groowt/view/web/lib/FragmentTests.groovy b/web-views/src/test/groovy/groowt/view/web/lib/FragmentTests.groovy index e84db8d..c7d65d6 100644 --- a/web-views/src/test/groovy/groowt/view/web/lib/FragmentTests.groovy +++ b/web-views/src/test/groovy/groowt/view/web/lib/FragmentTests.groovy @@ -7,7 +7,7 @@ import groowt.view.web.DefaultWebViewComponentContext import groowt.view.web.WebViewTemplateComponentSource import org.junit.jupiter.api.Test -class FragmentTests extends AbstractComponentTests { +class FragmentTests extends AbstractWebViewComponentTests { static class Greeter extends DefaultWebViewComponent { diff --git a/web-views/src/testFixtures/java/groowt/view/web/lib/AbstractComponentTests.java b/web-views/src/testFixtures/java/groowt/view/web/lib/AbstractWebViewComponentTests.java similarity index 93% rename from web-views/src/testFixtures/java/groowt/view/web/lib/AbstractComponentTests.java rename to web-views/src/testFixtures/java/groowt/view/web/lib/AbstractWebViewComponentTests.java index 7c2b304..f614231 100644 --- a/web-views/src/testFixtures/java/groowt/view/web/lib/AbstractComponentTests.java +++ b/web-views/src/testFixtures/java/groowt/view/web/lib/AbstractWebViewComponentTests.java @@ -14,7 +14,7 @@ import java.io.StringWriter; import static org.junit.jupiter.api.Assertions.*; -public abstract class AbstractComponentTests { +public abstract class AbstractWebViewComponentTests { protected void doTest(Reader source, String expected, ComponentContext context) { final var compiler = new DefaultWebComponentTemplateCompiler( @@ -25,7 +25,7 @@ public abstract class AbstractComponentTests { final StringWriter sw = new StringWriter(); final WebViewComponentWriter out = new WebViewComponentWriter(sw); renderer.call(context, out); - assertEquals(expected, sw.toString()); + assertEquals(expected, sw.toString().trim()); } protected void doTest(String source, String expected, ComponentContext context) {