Organized view-components into subpackages.

This commit is contained in:
JesseBrault0709 2024-05-05 20:23:30 +02:00
parent 6788b10068
commit 3926be1443
40 changed files with 172 additions and 132 deletions

View File

@ -1,6 +1,9 @@
package groowt.view.component;
import groovy.lang.Closure;
import groowt.view.component.compiler.ComponentTemplateCompiler;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.factory.ComponentTemplateSource;
import java.io.IOException;
import java.io.Writer;
@ -26,12 +29,12 @@ public abstract class AbstractViewComponent implements ViewComponent {
}
}
protected AbstractViewComponent(TemplateSource source, Function<String, ComponentTemplateCompiler> getCompiler) {
protected AbstractViewComponent(ComponentTemplateSource source, Function<String, ComponentTemplateCompiler> getCompiler) {
final Class<? extends AbstractViewComponent> selfClass = this.getSelfClass();
this.template = getCompiler.apply(selfClass.getPackageName()).compile(selfClass, source);
}
protected AbstractViewComponent(TemplateSource source, ComponentTemplateCompiler compiler) {
protected AbstractViewComponent(ComponentTemplateSource source, ComponentTemplateCompiler compiler) {
this.template = compiler.compile(this.getSelfClass(), source);
}

View File

@ -1,5 +0,0 @@
package groowt.view.component;
public interface ComponentTemplateCompiler {
ComponentTemplate compile(Class<? extends ViewComponent> forClass, TemplateSource source);
}

View File

@ -1,55 +0,0 @@
package groowt.view.component;
import java.io.File;
import java.io.InputStream;
import java.io.Reader;
import java.net.URI;
import java.net.URL;
public sealed interface TemplateSource {
static TemplateSource of(String template) {
return new StringSource(template);
}
static TemplateSource of(File templateFile) {
return new FileSource(templateFile);
}
static TemplateSource of(URI templateURI) {
return new URISource(templateURI);
}
static TemplateSource of(URL url) {
return new URLSource(url);
}
static TemplateSource of(InputStream templateInputStream) {
return new InputStreamSource(templateInputStream);
}
static TemplateSource of(Reader templateReader) {
return new ReaderSource(templateReader);
}
/**
* @param resourceName An <strong>absolute</strong> path resource name.
* @return A template source
*/
static TemplateSource fromResource(String resourceName) {
return of(TemplateSource.class.getClassLoader().getResource(resourceName));
}
record StringSource(String template) implements TemplateSource {}
record FileSource(File templateFile) implements TemplateSource {}
record URISource(URI templateURI) implements TemplateSource {}
record URLSource(URL templateURL) implements TemplateSource {}
record InputStreamSource(InputStream templateInputStream) implements TemplateSource {}
record ReaderSource(Reader templateReader) implements TemplateSource {}
}

View File

@ -1,7 +1,7 @@
package groowt.view.component;
import groowt.view.View;
import org.jetbrains.annotations.ApiStatus;
import groowt.view.component.context.ComponentContext;
public interface ViewComponent extends View {

View File

@ -1,6 +1,9 @@
package groowt.view.component;
package groowt.view.component.compiler;
import groowt.view.component.TemplateSource.*;
import groowt.view.component.ComponentTemplate;
import groowt.view.component.ViewComponent;
import groowt.view.component.factory.ComponentTemplateSource;
import groowt.view.component.factory.ComponentTemplateSource.*;
import java.io.*;
import java.net.URI;
@ -9,13 +12,13 @@ import java.net.URL;
public abstract class AbstractComponentTemplateCompiler implements ComponentTemplateCompiler {
protected abstract ComponentTemplate compile(
TemplateSource templateSource,
ComponentTemplateSource componentTemplateSource,
Class<? extends ViewComponent> forClass,
Reader actualSource
);
@Override
public ComponentTemplate compile(Class<? extends ViewComponent> forClass, TemplateSource source) {
public ComponentTemplate compile(Class<? extends ViewComponent> forClass, ComponentTemplateSource source) {
return switch (source) {
case FileSource(File file) -> {
try {

View File

@ -1,4 +1,8 @@
package groowt.view.component;
package groowt.view.component.compiler;
import groowt.view.component.ComponentTemplate;
import groowt.view.component.ViewComponent;
import groowt.view.component.factory.ComponentTemplateSource;
import java.io.Reader;
import java.util.HashMap;
@ -10,7 +14,7 @@ public abstract class CachingComponentTemplateCompiler extends AbstractComponent
@Override
protected final ComponentTemplate compile(
TemplateSource source,
ComponentTemplateSource source,
Class<? extends ViewComponent> forClass,
Reader sourceReader
) {
@ -18,7 +22,7 @@ public abstract class CachingComponentTemplateCompiler extends AbstractComponent
}
protected abstract ComponentTemplate doCompile(
TemplateSource source,
ComponentTemplateSource source,
Class<? extends ViewComponent> forClass,
Reader sourceReader
);

View File

@ -1,16 +1,16 @@
package groowt.view.component;
package groowt.view.component.compiler;
import java.io.Reader;
import groowt.view.component.ViewComponent;
/**
* Represents an exception thrown while attempting to instantiate a ComponentTemplate during compilation.
*/
public class ComponentTemplateCreateException extends RuntimeException {
public class ComponentTemplateCompileException extends RuntimeException {
private final Class<? extends ViewComponent> forClass;
private final Object templateSource;
public ComponentTemplateCreateException(
public ComponentTemplateCompileException(
String message,
Class<? extends ViewComponent> forClass,
Object templateSource
@ -20,7 +20,7 @@ public class ComponentTemplateCreateException extends RuntimeException {
this.templateSource = templateSource;
}
public ComponentTemplateCreateException(
public ComponentTemplateCompileException(
String message,
Throwable cause,
Class<? extends ViewComponent> forClass,
@ -31,7 +31,7 @@ public class ComponentTemplateCreateException extends RuntimeException {
this.templateSource = templateSource;
}
public ComponentTemplateCreateException(
public ComponentTemplateCompileException(
Throwable cause,
Class<? extends ViewComponent> forClass,
Object templateSource

View File

@ -0,0 +1,9 @@
package groowt.view.component.compiler;
import groowt.view.component.ComponentTemplate;
import groowt.view.component.ViewComponent;
import groowt.view.component.factory.ComponentTemplateSource;
public interface ComponentTemplateCompiler {
ComponentTemplate compile(Class<? extends ViewComponent> forClass, ComponentTemplateSource source);
}

View File

@ -1,5 +1,7 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ViewComponent;
import groowt.view.component.factory.ComponentFactory;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

View File

@ -1,4 +1,6 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ComponentTemplate;
/**
* An exception which signals that a component of the given type

View File

@ -1,6 +1,8 @@
package groowt.view.component;
package groowt.view.component.context;
import groovy.lang.Closure;
import groowt.view.component.ViewComponent;
import groowt.view.component.factory.ComponentFactory;
public interface ComponentScope {

View File

@ -1,5 +1,7 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ViewComponent;
import groowt.view.component.factory.ComponentFactory;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;

View File

@ -1,4 +1,6 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.factory.ComponentFactory;
import java.util.HashMap;
import java.util.Map;

View File

@ -1,4 +1,6 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ComponentTemplate;
public class MissingClassTypeException extends MissingComponentException {

View File

@ -1,4 +1,7 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ComponentTemplate;
import groowt.view.component.context.ComponentContext;
/**
* An exception which represents that a component type could not be
@ -21,7 +24,8 @@ public abstract class MissingComponentException extends RuntimeException {
@Override
public String getMessage() {
return "Missing " + this.getMissingKeyName() + " on line " + this.line + ", column " + this.col + ".";
return "In " + this.template + " missing " + this.getMissingKeyName()
+ " on line " + this.line + ", column " + this.col + ".";
}
}

View File

@ -1,4 +1,6 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ComponentTemplate;
public class MissingFragmentTypeException extends MissingComponentException {

View File

@ -1,4 +1,6 @@
package groowt.view.component;
package groowt.view.component.context;
import groowt.view.component.ComponentTemplate;
public abstract class MissingStringTypeException extends MissingComponentException {

View File

@ -1,4 +1,4 @@
package groowt.view.component;
package groowt.view.component.context;
public class NoFactoryMissingException extends UnsupportedOperationException {

View File

@ -1,8 +1,10 @@
package groowt.view.component;
package groowt.view.component.factory;
import groovy.lang.Closure;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.ViewComponent;
import static groowt.view.component.ComponentFactoryUtil.flatten;
import static groowt.view.component.factory.ComponentFactoryUtil.flatten;
final class ClosureComponentFactory<T extends ViewComponent> implements ComponentFactory<T> {

View File

@ -1,6 +1,8 @@
package groowt.view.component;
package groowt.view.component.factory;
import groovy.lang.Closure;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.ViewComponent;
import java.util.function.Supplier;

View File

@ -1,9 +1,11 @@
package groowt.view.component;
package groowt.view.component.factory;
import groovy.lang.GroovyObjectSupport;
import groovy.lang.MetaClass;
import groovy.lang.MetaMethod;
import groovy.lang.MissingMethodException;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.ViewComponent;
import java.util.HashMap;
import java.util.Map;

View File

@ -1,9 +1,4 @@
package groowt.view.component;
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import groovy.lang.MetaMethod;
import org.jetbrains.annotations.Nullable;
package groowt.view.component.factory;
import java.util.ArrayList;
import java.util.Arrays;

View File

@ -0,0 +1,55 @@
package groowt.view.component.factory;
import java.io.File;
import java.io.InputStream;
import java.io.Reader;
import java.net.URI;
import java.net.URL;
public sealed interface ComponentTemplateSource {
static ComponentTemplateSource of(String template) {
return new StringSource(template);
}
static ComponentTemplateSource of(File templateFile) {
return new FileSource(templateFile);
}
static ComponentTemplateSource of(URI templateURI) {
return new URISource(templateURI);
}
static ComponentTemplateSource of(URL url) {
return new URLSource(url);
}
static ComponentTemplateSource of(InputStream templateInputStream) {
return new InputStreamSource(templateInputStream);
}
static ComponentTemplateSource of(Reader templateReader) {
return new ReaderSource(templateReader);
}
/**
* @param resourceName An <strong>absolute</strong> path resource name.
* @return A template source
*/
static ComponentTemplateSource fromResource(String resourceName) {
return of(ComponentTemplateSource.class.getClassLoader().getResource(resourceName));
}
record StringSource(String template) implements ComponentTemplateSource {}
record FileSource(File templateFile) implements ComponentTemplateSource {}
record URISource(URI templateURI) implements ComponentTemplateSource {}
record URLSource(URL templateURL) implements ComponentTemplateSource {}
record InputStreamSource(InputStream templateInputStream) implements ComponentTemplateSource {}
record ReaderSource(Reader templateReader) implements ComponentTemplateSource {}
}

View File

@ -1,4 +1,7 @@
package groowt.view.component;
package groowt.view.component.factory;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.ViewComponent;
import java.util.function.Supplier;

View File

@ -2,7 +2,7 @@ package groowt.view.web
import groowt.view.component.AbstractViewComponent
import groowt.view.component.ComponentTemplate
import groowt.view.component.TemplateSource
import groowt.view.component.factory.ComponentTemplateSource
class DefaultWebViewComponent extends AbstractWebViewComponent {
@ -16,26 +16,26 @@ class DefaultWebViewComponent extends AbstractWebViewComponent {
super(templateType)
}
DefaultWebViewComponent(TemplateSource source) {
DefaultWebViewComponent(ComponentTemplateSource source) {
super(source)
}
DefaultWebViewComponent(TemplateSource source, WebViewComponentTemplateCompiler compiler) {
DefaultWebViewComponent(ComponentTemplateSource source, WebViewComponentTemplateCompiler compiler) {
super(source, compiler)
}
/**
* A convenience constructor which creates a {@link TemplateSource}
* A convenience constructor which creates a {@link ComponentTemplateSource}
* from the given {@code source} parameter and passes it to super. See
* {@link TemplateSource} for possible types.
* {@link ComponentTemplateSource} for possible types.
*
* @param source the object passed to {@link TemplateSource#of}
* @param source the object passed to {@link ComponentTemplateSource#of}
*
* @see TemplateSource
* @see ComponentTemplateSource
*/
@SuppressWarnings('GroovyAssignabilityCheck')
DefaultWebViewComponent(Object source) {
super(TemplateSource.of(source))
super(ComponentTemplateSource.of(source))
}
@Override

View File

@ -1,7 +1,7 @@
package groowt.view.web
import groowt.view.component.ComponentScope
import groowt.view.component.DefaultComponentContext
import groowt.view.component.context.ComponentScope
import groowt.view.component.context.DefaultComponentContext
import groowt.view.component.ViewComponent
import groowt.view.web.lib.Fragment
import groowt.view.web.runtime.DefaultWebViewComponentChildCollection

View File

@ -2,7 +2,7 @@ package groowt.view.web
import groovy.transform.stc.ClosureParams
import groovy.transform.stc.FromString
import groowt.view.component.ComponentFactory
import groowt.view.component.factory.ComponentFactory
import java.util.function.Function

View File

@ -1,9 +1,8 @@
package groowt.view.web
import groowt.view.component.ComponentFactory
import groowt.view.component.DefaultComponentScope
import groowt.view.component.factory.ComponentFactory
import groowt.view.component.context.DefaultComponentScope
import groowt.view.web.lib.Echo
import groowt.view.web.lib.Echo.EchoFactory
class WebViewScope extends DefaultComponentScope {

View File

@ -1,8 +1,8 @@
package groowt.view.web.lib
import groowt.view.View
import groowt.view.component.ComponentContext
import groowt.view.component.ComponentFactory
import groowt.view.component.context.ComponentContext
import groowt.view.component.factory.ComponentFactory
import groowt.view.component.ComponentRenderException
import groowt.view.web.WebViewChildComponentRenderer

View File

@ -3,7 +3,7 @@ package groowt.view.web;
import groovy.lang.Closure;
import groowt.view.component.AbstractViewComponent;
import groowt.view.component.ComponentTemplate;
import groowt.view.component.TemplateSource;
import groowt.view.component.factory.ComponentTemplateSource;
import groowt.view.web.runtime.DefaultWebViewComponentWriter;
import groowt.view.web.runtime.WebViewComponentWriter;
import org.codehaus.groovy.control.CompilerConfiguration;
@ -27,14 +27,14 @@ public abstract class AbstractWebViewComponent extends AbstractViewComponent imp
super(templateClass);
}
protected AbstractWebViewComponent(TemplateSource source) {
protected AbstractWebViewComponent(ComponentTemplateSource source) {
super(source, packageName -> new DefaultWebViewComponentTemplateCompiler(
CompilerConfiguration.DEFAULT,
packageName
));
}
protected AbstractWebViewComponent(TemplateSource source, WebViewComponentTemplateCompiler compiler) {
protected AbstractWebViewComponent(ComponentTemplateSource source, WebViewComponentTemplateCompiler compiler) {
super(source, compiler);
}

View File

@ -2,6 +2,9 @@ package groowt.view.web;
import groovy.lang.GroovyClassLoader;
import groowt.view.component.*;
import groowt.view.component.compiler.CachingComponentTemplateCompiler;
import groowt.view.component.compiler.ComponentTemplateCompileException;
import groowt.view.component.factory.ComponentTemplateSource;
import groowt.view.web.antlr.CompilationUnitParseResult;
import groowt.view.web.antlr.ParserUtil;
import groowt.view.web.antlr.TokenList;
@ -65,13 +68,13 @@ public class DefaultWebViewComponentTemplateCompiler extends CachingComponentTem
@Override
protected ComponentTemplate doCompile(
@Nullable TemplateSource source,
@Nullable ComponentTemplateSource source,
@Nullable Class<? extends ViewComponent> forClass,
Reader sourceReader
) {
if (source instanceof TemplateSource.URISource uriSource) {
if (source instanceof ComponentTemplateSource.URISource uriSource) {
return this.doCompile(forClass, sourceReader, uriSource.templateURI());
} else if (source instanceof TemplateSource.URLSource urlSource) {
} else if (source instanceof ComponentTemplateSource.URLSource urlSource) {
try {
return this.doCompile(forClass, sourceReader, urlSource.templateURL().toURI());
} catch (URISyntaxException e) {
@ -160,7 +163,7 @@ public class DefaultWebViewComponentTemplateCompiler extends CachingComponentTem
try {
return (ComponentTemplate) templateClass.getConstructor().newInstance();
} catch (Exception e) {
throw new ComponentTemplateCreateException(e, forClass, reader);
throw new ComponentTemplateCompileException(e, forClass, reader);
}
}

View File

@ -1,7 +1,7 @@
package groowt.view.web;
import groovy.lang.Closure;
import groowt.view.component.ComponentContext;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.ViewComponent;
import org.jetbrains.annotations.ApiStatus;

View File

@ -1,7 +1,7 @@
package groowt.view.web;
import groowt.view.component.ComponentTemplate;
import groowt.view.component.ComponentTemplateCompiler;
import groowt.view.component.compiler.ComponentTemplateCompiler;
import java.io.Reader;

View File

@ -2,6 +2,7 @@ package groowt.view.web.transpile;
import groovy.lang.Tuple2;
import groowt.view.component.*;
import groowt.view.component.context.*;
import groowt.view.web.ast.node.*;
import groowt.view.web.runtime.WebViewComponentChildCollection;
import groowt.view.web.transpile.util.GroovyUtil;

View File

@ -2,7 +2,7 @@ package groowt.view.web.transpile;
import groovy.lang.Tuple2;
import groovy.transform.Field;
import groowt.view.component.ComponentContext;
import groowt.view.component.context.ComponentContext;
import groowt.view.component.ComponentTemplate;
import groowt.view.web.runtime.WebViewComponentWriter;
import groowt.view.web.util.SourcePosition;

View File

@ -1,6 +1,6 @@
package groowt.view.web
import groowt.view.component.ComponentFactoryBase
import groowt.view.component.factory.ComponentFactoryBase
import groowt.view.web.lib.WithContext
import org.junit.jupiter.api.Test

View File

@ -1,10 +1,9 @@
package groowt.view.web.lib
import groowt.view.component.ComponentContext
import groowt.view.component.ComponentFactory
import groowt.view.component.context.ComponentContext
import groowt.view.web.DefaultWebViewComponent
import groowt.view.web.DefaultWebViewComponentContext
import groowt.view.component.TemplateSource
import groowt.view.component.factory.ComponentTemplateSource
import org.junit.jupiter.api.Test
import static groowt.view.web.WebViewComponentFactories.withAttr
@ -16,7 +15,7 @@ class FragmentTests extends AbstractWebViewComponentTests {
String greeting
Greeter(Map<String, Object> attr) {
super(TemplateSource.of('$greeting'))
super(ComponentTemplateSource.of('$greeting'))
greeting = attr.greeting
}

View File

@ -1,7 +1,7 @@
package groowt.view.web.lib
import groowt.view.component.ComponentContext
import groowt.view.component.context.ComponentContext
import groowt.view.web.DefaultWebViewComponentTemplateCompiler
import groowt.view.web.WebViewComponentTemplateCompiler
import groowt.view.web.runtime.DefaultWebViewComponentWriter

View File

@ -1,7 +1,7 @@
package groowt.view.web.transpiler;
import groovy.lang.Tuple2;
import groowt.view.component.ComponentContext;
import groowt.view.component.context.ComponentContext;
import groowt.view.web.antlr.ParserUtil;
import groowt.view.web.antlr.TokenList;
import groowt.view.web.ast.DefaultAstBuilder;

View File

@ -1,6 +1,6 @@
package groowt.view.web.tools
import groowt.view.component.DefaultComponentContext
import groowt.view.component.context.DefaultComponentContext
import groowt.view.web.DefaultWebViewComponent
import picocli.CommandLine
import picocli.CommandLine.Command