diff --git a/buildSrc/src/main/kotlin/elex-base.gradle.kts b/buildSrc/src/main/kotlin/elex-base.gradle.kts
index 720919c..4b2d22d 100644
--- a/buildSrc/src/main/kotlin/elex-base.gradle.kts
+++ b/buildSrc/src/main/kotlin/elex-base.gradle.kts
@@ -71,7 +71,7 @@ dependencies {
implementation("org.slf4j:slf4j-api:1.7.32")
implementation("org.jetbrains:annotations:22.0.0")
- implementation("com.elex-project:abraxas:4.6.0")
+ implementation("com.elex-project:abraxas:4.7.0")
compileOnly("org.projectlombok:lombok:1.18.20")
annotationProcessor("org.projectlombok:lombok:1.18.20")
diff --git a/locale/build.gradle.kts b/locale/build.gradle.kts
new file mode 100644
index 0000000..d2aab59
--- /dev/null
+++ b/locale/build.gradle.kts
@@ -0,0 +1,14 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+plugins {
+ id("elex-java")
+}
+
+dependencies {
+
+}
diff --git a/locale/logback.xml b/locale/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/locale/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/locale/src/main/java/kr/pe/elex/examples/LocaleSample.java b/locale/src/main/java/kr/pe/elex/examples/LocaleSample.java
new file mode 100644
index 0000000..9c7b327
--- /dev/null
+++ b/locale/src/main/java/kr/pe/elex/examples/LocaleSample.java
@@ -0,0 +1,27 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.time.LocalDateTime;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Slf4j
+public class LocaleSample {
+
+}
diff --git a/locale/src/test/java/kr/pe/elex/examples/LocaleSampleTest.java b/locale/src/test/java/kr/pe/elex/examples/LocaleSampleTest.java
new file mode 100644
index 0000000..c28455e
--- /dev/null
+++ b/locale/src/test/java/kr/pe/elex/examples/LocaleSampleTest.java
@@ -0,0 +1,41 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import com.elex_project.abraxas.Console;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+
+import java.util.Locale;
+
+import static org.junit.jupiter.api.Assertions.*;
+@Slf4j
+class LocaleSampleTest {
+
+ @Test
+ void test(){
+ Locale locale = Locale.KOREA;
+
+ Console.writeLine("> Language: {}", locale.getLanguage());
+ Console.writeLine("> Country: {}", locale.getCountry());
+
+ Console.writeLine("> Display Name: {}", locale.getDisplayName());
+ Console.writeLine("> Display Country: {}", locale.getDisplayCountry());
+ Console.writeLine("> Display Language: {}", locale.getDisplayLanguage());
+ Console.writeLine("> Display Script: {}", locale.getDisplayScript());
+ Console.writeLine("> Display Variant: {}", locale.getDisplayVariant());
+
+ Console.writeLine("> ISO3 Country: {}", locale.getISO3Country());
+ Console.writeLine("> ISO3 Language: {}", locale.getISO3Language());
+
+ Console.writeLine("> To Language Tag: {}", locale.toLanguageTag());
+ Console.writeLine("> To String: {}", locale.toString());
+
+
+ }
+}
diff --git a/mustache/build.gradle.kts b/mustache/build.gradle.kts
new file mode 100644
index 0000000..9bd25cd
--- /dev/null
+++ b/mustache/build.gradle.kts
@@ -0,0 +1,14 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+plugins {
+ id("elex-java")
+}
+
+dependencies {
+ implementation("com.github.spullara.mustache.java:compiler:0.9.7")
+}
diff --git a/mustache/logback.xml b/mustache/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/mustache/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/mustache/src/main/java/kr/pe/elex/examples/MustacheSample.java b/mustache/src/main/java/kr/pe/elex/examples/MustacheSample.java
new file mode 100644
index 0000000..04b610d
--- /dev/null
+++ b/mustache/src/main/java/kr/pe/elex/examples/MustacheSample.java
@@ -0,0 +1,11 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+public class MustacheSample {
+}
diff --git a/mustache/src/main/java/kr/pe/elex/examples/Person.java b/mustache/src/main/java/kr/pe/elex/examples/Person.java
new file mode 100644
index 0000000..3f41839
--- /dev/null
+++ b/mustache/src/main/java/kr/pe/elex/examples/Person.java
@@ -0,0 +1,18 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Person {
+ private String name;
+ private int age;
+}
diff --git a/mustache/src/main/resources/sample.mustache b/mustache/src/main/resources/sample.mustache
new file mode 100644
index 0000000..9680375
--- /dev/null
+++ b/mustache/src/main/resources/sample.mustache
@@ -0,0 +1,2 @@
+
Sample Mustache
+Hello, {{person.name}}
diff --git a/mustache/src/test/java/kr/pe/elex/examples/MustacheTest.java b/mustache/src/test/java/kr/pe/elex/examples/MustacheTest.java
new file mode 100644
index 0000000..ee7834a
--- /dev/null
+++ b/mustache/src/test/java/kr/pe/elex/examples/MustacheTest.java
@@ -0,0 +1,41 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import com.elex_project.abraxas.Console;
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.Mustache;
+import com.github.mustachejava.MustacheFactory;
+import org.junit.jupiter.api.Test;
+
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+class MustacheTest {
+
+ @Test
+ void test(){
+ MustacheFactory factory = new DefaultMustacheFactory();
+ Mustache mustache = factory
+ //.compile("/sample.mustache"); // 리소스로부터 템플릿을 불러온다.
+ .compile(new InputStreamReader(getClass().getResourceAsStream("/sample.mustache")),
+ "sample");
+
+ //Object context; // Object, List, Map 등 템플릿에 전달될 데이터
+ Map context = new HashMap<>();
+ context.put("person",new Person("Charlie", 14));
+
+ StringWriter writer = new StringWriter();
+ mustache.execute(writer, context);
+ String result = writer.toString();
+
+ Console.writeLine(result);
+ }
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 14d63ce..46fd87c 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -13,5 +13,6 @@ include(
"web-socket-servlet", "web-socket-client",
"thread", "hibernate", "jdbc-sqlite",
"xml", "jackson", "jsoup", "markdown", "network", "httpd",
- "swing", "java-fx", "properties"
+ "swing", "java-fx", "properties",
+ "mustache", "thymeleaf", "locale"
)
diff --git a/thymeleaf/build.gradle.kts b/thymeleaf/build.gradle.kts
new file mode 100644
index 0000000..954e503
--- /dev/null
+++ b/thymeleaf/build.gradle.kts
@@ -0,0 +1,15 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+plugins {
+ id("elex-java")
+}
+
+dependencies {
+ implementation("org.thymeleaf:thymeleaf:3.0.12.RELEASE")
+
+}
diff --git a/thymeleaf/logback.xml b/thymeleaf/logback.xml
new file mode 100644
index 0000000..207f78b
--- /dev/null
+++ b/thymeleaf/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/thymeleaf/src/main/java/kr/pe/elex/examples/Person.java b/thymeleaf/src/main/java/kr/pe/elex/examples/Person.java
new file mode 100644
index 0000000..3f41839
--- /dev/null
+++ b/thymeleaf/src/main/java/kr/pe/elex/examples/Person.java
@@ -0,0 +1,18 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class Person {
+ private String name;
+ private int age;
+}
diff --git a/thymeleaf/src/main/java/kr/pe/elex/examples/Thymeleaf.java b/thymeleaf/src/main/java/kr/pe/elex/examples/Thymeleaf.java
new file mode 100644
index 0000000..09d0135
--- /dev/null
+++ b/thymeleaf/src/main/java/kr/pe/elex/examples/Thymeleaf.java
@@ -0,0 +1,91 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.thymeleaf.TemplateEngine;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.messageresolver.StandardMessageResolver;
+import org.thymeleaf.templatemode.TemplateMode;
+import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
+import org.thymeleaf.templateresource.ITemplateResource;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+
+@Slf4j
+public class Thymeleaf {
+ private final TemplateEngine templateEngine;
+
+ @SneakyThrows
+ public Thymeleaf() {
+ templateEngine = new TemplateEngine();
+ templateEngine.setTemplateResolver(new MyTemplateResolver());
+ templateEngine.setMessageResolver(new MyMessageResolver());
+ }
+
+ public String process(String template, Context context) throws IOException {
+
+ StringWriter writer = new StringWriter();
+ templateEngine.process(template, context, writer);
+
+ String out = writer.toString();
+ writer.close();
+ return out;
+ }
+
+ private static class MyTemplateResolver extends ClassLoaderTemplateResolver {
+ MyTemplateResolver() {
+ super();
+ this.setTemplateMode(TemplateMode.HTML);
+ this.setSuffix(".html");
+ }
+ }
+
+ private static class MyMessageResolver extends StandardMessageResolver {
+ @SneakyThrows
+ MyMessageResolver() {
+ super();
+
+ this.setDefaultMessages(properties(getClass()
+ .getResourceAsStream("/messages.properties")));
+ }
+
+ @SneakyThrows
+ @Override
+ protected Map resolveMessagesForTemplate(String template, ITemplateResource templateResource, Locale locale) {
+
+ Map map = propertiesToMap(getClass()
+ .getResourceAsStream("/messages_" + locale.getLanguage() + ".properties"));
+ return map;
+ }
+ }
+
+ private static Map propertiesToMap(InputStream is) throws IOException {
+ Properties properties = properties(is);
+ Map map = new HashMap<>();
+ for (String key : properties.stringPropertyNames()) {
+ map.put(key, properties.getProperty(key));
+ }
+ return map;
+ }
+
+ private static Properties properties(InputStream is) throws IOException {
+ Properties properties = new Properties();
+ properties.load(new InputStreamReader(is, StandardCharsets.UTF_8));
+ return properties;
+ }
+}
diff --git a/thymeleaf/src/main/resources/messages.properties b/thymeleaf/src/main/resources/messages.properties
new file mode 100644
index 0000000..4f0855a
--- /dev/null
+++ b/thymeleaf/src/main/resources/messages.properties
@@ -0,0 +1,9 @@
+
+# Examples for Java
+#
+# Copyright (c) 2021. Elex. All Rights Reserved.
+# https://www.elex-project.com/
+#
+
+hello = Hello
+only = Only in ROOT!
diff --git a/thymeleaf/src/main/resources/messages_ko.properties b/thymeleaf/src/main/resources/messages_ko.properties
new file mode 100644
index 0000000..dd65d24
--- /dev/null
+++ b/thymeleaf/src/main/resources/messages_ko.properties
@@ -0,0 +1,8 @@
+#
+# Examples for Java
+#
+# Copyright (c) 2021. Elex. All Rights Reserved.
+# https://www.elex-project.com/
+#
+
+hello = 안녕
diff --git a/thymeleaf/src/main/resources/sample.html b/thymeleaf/src/main/resources/sample.html
new file mode 100644
index 0000000..c238f54
--- /dev/null
+++ b/thymeleaf/src/main/resources/sample.html
@@ -0,0 +1,12 @@
+
+
+
+ Thymeleaf Sample
+
+
+
+
+NAME
+
+
+
diff --git a/thymeleaf/src/test/java/kr/pe/elex/examples/ThymeleafTest.java b/thymeleaf/src/test/java/kr/pe/elex/examples/ThymeleafTest.java
new file mode 100644
index 0000000..35f6d31
--- /dev/null
+++ b/thymeleaf/src/test/java/kr/pe/elex/examples/ThymeleafTest.java
@@ -0,0 +1,31 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import com.elex_project.abraxas.Console;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.thymeleaf.context.Context;
+
+import java.io.IOException;
+
+@Slf4j
+class ThymeleafTest {
+
+ @Test
+ void test() throws IOException {
+ Context context = new Context();
+ ///context.setLocale(Locale.ENGLISH);
+ context.setVariable("person", new Person("Charlie", 14));
+
+ Thymeleaf thymeleaf = new Thymeleaf();
+ String out = thymeleaf.process("sample.html", context);
+
+ Console.writeLine(out);
+ }
+}