diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7356dc0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+SeverellJtePlugin.iml
+/target
+/.idea
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1e3f840
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+## JTE Plugin for Severell
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..fc1e18c
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+
+ com.serverell.plugins
+ jte
+ 1.0-SNAPSHOT
+
+
+ 11
+ 11
+ 5.6.2
+ UTF-8
+
+
+
+
+ com.severell
+ core
+ 0.0.1-SNAPSHOT
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ 3.4.6
+ test
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/severell/plugins/jte/JteProvider.java b/src/main/java/com/severell/plugins/jte/JteProvider.java
new file mode 100644
index 0000000..0533799
--- /dev/null
+++ b/src/main/java/com/severell/plugins/jte/JteProvider.java
@@ -0,0 +1,21 @@
+package com.severell.plugins.jte;
+
+import com.severell.core.container.Container;
+import com.severell.core.providers.ServiceProvider;
+
+public class JteProvider extends ServiceProvider {
+
+ public JteProvider(Container c) {
+ super(c);
+ }
+
+ @Override
+ public void register() {
+ this.c.bind("ViewJteDriver", (container) -> new ViewJteDriver());
+ }
+
+ @Override
+ public void boot() throws Exception {
+
+ }
+}
diff --git a/src/main/java/com/severell/plugins/jte/ViewJteDriver.java b/src/main/java/com/severell/plugins/jte/ViewJteDriver.java
new file mode 100644
index 0000000..db49973
--- /dev/null
+++ b/src/main/java/com/severell/plugins/jte/ViewJteDriver.java
@@ -0,0 +1,64 @@
+package com.severell.plugins.jte;
+
+import com.severell.core.config.Config;
+import com.severell.core.exceptions.ViewException;
+import com.severell.core.view.BaseView;
+import gg.jte.ContentType;
+import gg.jte.TemplateEngine;
+import gg.jte.TemplateOutput;
+import gg.jte.output.PrintWriterOutput;
+import gg.jte.output.StringOutput;
+import gg.jte.resolve.DirectoryCodeResolver;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.nio.file.Path;
+
+/**
+ * This class uses the JTE templating engine to render templates
+ */
+public class ViewJteDriver extends BaseView {
+
+ private TemplateEngine templateEngine;
+ private Path templatePath;
+
+ public ViewJteDriver(Path templatePath) {
+ this.templatePath = templatePath;
+ setupTemplateEngine();
+ }
+
+ public ViewJteDriver() {
+ templatePath = Path.of("src", "main", "resources", "templates");
+ setupTemplateEngine();
+ }
+
+ private void setupTemplateEngine() {
+ if (Config.isLocal()) {
+ DirectoryCodeResolver codeResolver = new DirectoryCodeResolver(templatePath);
+ templateEngine = TemplateEngine.create(codeResolver, ContentType.Html);
+ } else {
+ templateEngine = TemplateEngine.createPrecompiled(ContentType.Html);
+ }
+ }
+
+ @Override
+ public void render(String template, Object object, Writer writer) throws ViewException {
+ render(template, object, "templates/", writer);
+ }
+
+ @Override
+ public void render(String template, Object object, String baseDir, Writer writer) throws ViewException {
+ if(writer instanceof PrintWriter) {
+ TemplateOutput output = new PrintWriterOutput((PrintWriter) writer);
+ templateEngine.render(template, object, output);
+ } else if(writer instanceof StringWriter) {
+ StringOutput output = new StringOutput();
+ templateEngine.render(template, object, output);
+ ((StringWriter) writer).write(output.toString());
+ } else {
+ throw new ViewException("Invalid writer. Needs to be instance of PrintWriter");
+ }
+ }
+}
diff --git a/src/test/java/com/severell/plugins/jte/ViewJteDriverTest.java b/src/test/java/com/severell/plugins/jte/ViewJteDriverTest.java
new file mode 100644
index 0000000..a2de61c
--- /dev/null
+++ b/src/test/java/com/severell/plugins/jte/ViewJteDriverTest.java
@@ -0,0 +1,76 @@
+package com.severell.plugins.jte;
+
+import com.severell.core.config.Config;
+import com.severell.core.exceptions.ViewException;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.*;
+import java.nio.file.Path;
+import java.util.HashMap;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.mock;
+
+public class ViewJteDriverTest {
+
+ @BeforeAll
+ public static void setup() throws Exception {
+ Config.setDir("src/test/resources");
+ Config.loadConfig();
+ }
+
+ @AfterAll
+ public static void tearDown() {
+ Config.unload();
+ }
+
+ @Test
+ public void testJteDriver() throws ViewException {
+ ViewJteDriver driver = new ViewJteDriver(Path.of("src", "test", "resources", "templates"));
+ StringWriter writer = new StringWriter();
+ HashMap map = new HashMap<>();
+
+ driver.render("test.jte",map , writer);
+
+ assertEquals("Hello", writer.toString());
+ }
+
+ @Test
+ public void testJteDriverPrintWriter() throws ViewException {
+ ViewJteDriver driver = new ViewJteDriver(Path.of("src", "test", "resources", "templates"));
+ StringWriter st = new StringWriter();
+ PrintWriter writer = new PrintWriter(st);
+ HashMap map = new HashMap<>();
+
+ driver.render("test.jte",map , writer);
+ writer.flush();
+ assertEquals("Hello", st.toString());
+ }
+
+ @Test
+ public void testJteDriverBufferedWriter() throws ViewException {
+ ViewJteDriver driver = new ViewJteDriver(Path.of("src", "test", "resources", "templates"));
+ Writer writer = new BufferedWriter(new StringWriter());
+ HashMap map = new HashMap<>();
+
+ assertThrows(ViewException.class, () -> {
+ driver.render("test.jte",map , writer);
+ });
+ }
+
+ @Test
+ public void testJteDriverThrowsIOError() throws IOException {
+ ViewJteDriver driver = new ViewJteDriver();
+ StringWriter writer = mock(StringWriter.class);
+
+
+ HashMap map = new HashMap<>();
+
+ assertThrows(UncheckedIOException.class, () -> {
+ driver.render("test.jte",map , writer);
+ });
+ }
+}
diff --git a/src/test/resources/.env b/src/test/resources/.env
new file mode 100644
index 0000000..b726565
--- /dev/null
+++ b/src/test/resources/.env
@@ -0,0 +1,2 @@
+ENV=TEST
+TEST=hello
\ No newline at end of file
diff --git a/src/test/resources/templates/test.jte b/src/test/resources/templates/test.jte
new file mode 100644
index 0000000..f0ea4e2
--- /dev/null
+++ b/src/test/resources/templates/test.jte
@@ -0,0 +1 @@
+Hello
\ No newline at end of file