diff --git a/build.gradle.kts b/build.gradle.kts
index 36844c2..263abaa 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -5,17 +5,6 @@
* https://www.elex-project.com/
*/
-buildscript {
- repositories {
- maven {
- setUrl("https://repository.elex-project.com/repository/maven")
- }
- }
-
- dependencies {
- classpath ("com.jaredsburrows:gradle-license-plugin:0.8.90")
- }
-}
plugins {
id("com.github.ben-manes.versions") version "0.39.0"
}
diff --git a/buildSrc/src/main/kotlin/elex-application.gradle.kts b/buildSrc/src/main/kotlin/elex-application.gradle.kts
index 0b6844d..3cf04fb 100644
--- a/buildSrc/src/main/kotlin/elex-application.gradle.kts
+++ b/buildSrc/src/main/kotlin/elex-application.gradle.kts
@@ -7,7 +7,7 @@
plugins {
- id("elex-base")
+ id("elex-java")
application
}
diff --git a/buildSrc/src/main/kotlin/elex-base.gradle.kts b/buildSrc/src/main/kotlin/elex-base.gradle.kts
index 60f0401..720919c 100644
--- a/buildSrc/src/main/kotlin/elex-base.gradle.kts
+++ b/buildSrc/src/main/kotlin/elex-base.gradle.kts
@@ -69,9 +69,9 @@ tasks.javadoc {
dependencies {
//implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation("org.slf4j:slf4j-api:1.7.32")
- implementation("org.jetbrains:annotations:21.0.1")
+ implementation("org.jetbrains:annotations:22.0.0")
- implementation("com.elex-project:abraxas:4.5.3")
+ implementation("com.elex-project:abraxas:4.6.0")
compileOnly("org.projectlombok:lombok:1.18.20")
annotationProcessor("org.projectlombok:lombok:1.18.20")
diff --git a/buildSrc/src/main/kotlin/elex-library.gradle.kts b/buildSrc/src/main/kotlin/elex-library.gradle.kts
index 5caf4d1..0b3fc9f 100644
--- a/buildSrc/src/main/kotlin/elex-library.gradle.kts
+++ b/buildSrc/src/main/kotlin/elex-library.gradle.kts
@@ -6,7 +6,7 @@
*/
plugins {
- id ("elex-base")
+ id ("elex-java")
`java-library`
`maven-publish`
}
diff --git a/buildSrc/src/main/kotlin/elex-war.gradle.kts b/buildSrc/src/main/kotlin/elex-war.gradle.kts
index e35c938..e979055 100644
--- a/buildSrc/src/main/kotlin/elex-war.gradle.kts
+++ b/buildSrc/src/main/kotlin/elex-war.gradle.kts
@@ -6,7 +6,7 @@
*/
plugins {
- id ("elex-base")
+ id ("elex-java")
war
}
diff --git a/properties/README.md b/properties/README.md
new file mode 100644
index 0000000..7790977
--- /dev/null
+++ b/properties/README.md
@@ -0,0 +1,6 @@
+
+## 자바 Resource Bundle 로캐일 선택 순서
+1. 사용자 로캐일과 일치하는 로캐일
+2. 사용자 로캐일 언어와 일치하는 로캐일
+3. 시스템 기본 로캐일
+4. 루트 로캐일
diff --git a/properties/build.gradle.kts b/properties/build.gradle.kts
new file mode 100644
index 0000000..d2aab59
--- /dev/null
+++ b/properties/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/properties/logback.xml b/properties/logback.xml
new file mode 100644
index 0000000..74ff8a3
--- /dev/null
+++ b/properties/logback.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
diff --git a/properties/src/main/java/kr/pe/elex/examples/MyResourceBundleControl.java b/properties/src/main/java/kr/pe/elex/examples/MyResourceBundleControl.java
new file mode 100644
index 0000000..4b21ffb
--- /dev/null
+++ b/properties/src/main/java/kr/pe/elex/examples/MyResourceBundleControl.java
@@ -0,0 +1,136 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+@Slf4j
+public class MyResourceBundleControl extends ResourceBundle.Control {
+ @Override
+ public List getFormats(String baseName) {
+ if (baseName == null) {
+ throw new NullPointerException();
+ }
+ return Collections.unmodifiableList(
+ Arrays.asList("xml", "properties"));
+ }
+
+ @Override
+ public ResourceBundle newBundle(String baseName, Locale locale,
+ String format,
+ ClassLoader loader,
+ boolean reload)
+ throws IllegalAccessException,
+ InstantiationException, IOException {
+ if (baseName == null || locale == null
+ || format == null || loader == null) {
+ throw new NullPointerException();
+ }
+ ResourceBundle bundle = null;
+ if (format.equals("xml")) {
+ String bundleName = toBundleName(baseName, locale);
+ String resourceName = toResourceName(bundleName, format);
+
+
+ URL url = loader.getResource(resourceName);
+ if (url != null) {
+ URLConnection connection = url.openConnection();
+ if (connection != null) {
+ if (reload) {
+ // disable caches if reloading
+ connection.setUseCaches(false);
+ }
+ log.info("Bundle Name: {}", bundleName);
+ log.info("Res Name: {}", resourceName);
+ try (InputStream stream = connection.getInputStream()) {
+ if (stream != null) {
+ BufferedInputStream bis =
+ new BufferedInputStream(stream);
+ bundle = new XMLResourceBundle(bis);
+ }
+ }
+ }
+ }
+ } else if (format.equals("properties")) {
+ String bundleName = toBundleName(baseName, locale);
+ String resourceName = toResourceName(bundleName, format);
+
+
+ URL url = loader.getResource(resourceName);
+ if (url != null) {
+ URLConnection connection = url.openConnection();
+ if (connection != null) {
+ if (reload) {
+ // disable caches if reloading
+ connection.setUseCaches(false);
+ }
+ log.info("Bundle Name: {}", bundleName);
+ log.info("Res Name: {}", resourceName);
+ //System.out.println("Res Name: " + resourceName);
+ try (InputStream stream = connection.getInputStream()) {
+ if (stream != null) {
+ InputStreamReader reader =
+ new InputStreamReader(new BufferedInputStream(stream), StandardCharsets.UTF_8);
+ bundle = new PropertyResourceBundle(reader);
+ }
+ }
+ }
+ }
+ }
+ return bundle;
+ }
+
+ @Override
+ public List getCandidateLocales(String baseName, Locale locale) {
+
+ List locales = Arrays.asList(
+ locale,
+ new Locale(locale.getLanguage()),
+ Locale.ROOT);
+ log.info("locales: {} -> {}", locale, locales);
+ return locales;
+ }
+
+ private static class XMLResourceBundle extends ResourceBundle {
+ private final Properties props;
+
+ XMLResourceBundle(InputStream stream) throws IOException {
+ props = new Properties();
+ props.loadFromXML(stream);
+ }
+
+ protected Object handleGetObject(String key) {
+ if (key == null) {
+ throw new NullPointerException();
+ }
+ return props.getProperty(key);
+ }
+
+ public Enumeration getKeys() {
+ Set handleKeys = props.stringPropertyNames();
+
+ return Collections.enumeration(handleKeys);
+ }
+
+ @NotNull
+ @Override
+ protected Set handleKeySet() {
+ return props.stringPropertyNames();
+ }
+ }
+}
diff --git a/properties/src/main/java/kr/pe/elex/examples/MyResourceBundleControlProvider.java b/properties/src/main/java/kr/pe/elex/examples/MyResourceBundleControlProvider.java
new file mode 100644
index 0000000..7362b76
--- /dev/null
+++ b/properties/src/main/java/kr/pe/elex/examples/MyResourceBundleControlProvider.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 java.util.ResourceBundle;
+import java.util.spi.ResourceBundleControlProvider;
+
+public class MyResourceBundleControlProvider
+ implements ResourceBundleControlProvider {
+ static final ResourceBundle.Control XMLCONTROL =
+ new MyResourceBundleControl();
+
+ public ResourceBundle.Control getControl(String baseName) {
+ System.out.println("Class: " + getClass().getName()+".getControl");
+ System.out.println(" called for " + baseName);
+
+ // Throws a NPE if baseName is null.
+ if (baseName.startsWith("resources.Xml")) {
+ System.out.println(" returns " + XMLCONTROL);
+ return XMLCONTROL;
+ }
+ System.out.println(" returns null");
+ System.out.println();
+ return null;
+ }
+}
diff --git a/properties/src/main/resources/lang.properties b/properties/src/main/resources/lang.properties
new file mode 100644
index 0000000..3d311fb
--- /dev/null
+++ b/properties/src/main/resources/lang.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/properties/src/main/resources/lang_ja.properties b/properties/src/main/resources/lang_ja.properties
new file mode 100644
index 0000000..67c2a2b
--- /dev/null
+++ b/properties/src/main/resources/lang_ja.properties
@@ -0,0 +1,8 @@
+#
+# Examples for Java
+#
+# Copyright (c) 2021. Elex. All Rights Reserved.
+# https://www.elex-project.com/
+#
+
+hello = 오하이오!
diff --git a/properties/src/main/resources/lang_ko.properties b/properties/src/main/resources/lang_ko.properties
new file mode 100644
index 0000000..6d8c27d
--- /dev/null
+++ b/properties/src/main/resources/lang_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/properties/src/main/resources/language.xml b/properties/src/main/resources/language.xml
new file mode 100644
index 0000000..2dc092f
--- /dev/null
+++ b/properties/src/main/resources/language.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Hello
+ Only in Root
+
diff --git a/properties/src/main/resources/language_ko.xml b/properties/src/main/resources/language_ko.xml
new file mode 100644
index 0000000..ab7ec23
--- /dev/null
+++ b/properties/src/main/resources/language_ko.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ 안녕
+
diff --git a/properties/src/main/resources/sample.properties b/properties/src/main/resources/sample.properties
new file mode 100644
index 0000000..1a69254
--- /dev/null
+++ b/properties/src/main/resources/sample.properties
@@ -0,0 +1,9 @@
+#
+# Examples for Java
+#
+# Copyright (c) 2021. Elex. All Rights Reserved.
+# https://www.elex-project.com/
+#
+
+key1 = value1
+key2 = value2
diff --git a/properties/src/main/resources/sample.xml b/properties/src/main/resources/sample.xml
new file mode 100644
index 0000000..f6060b2
--- /dev/null
+++ b/properties/src/main/resources/sample.xml
@@ -0,0 +1,7 @@
+
+
+
+ Sample properties file in XML format.
+ Value 1
+ Value 2
+
diff --git a/properties/src/test/java/kr/pe/elex/examples/PropertiesTest.java b/properties/src/test/java/kr/pe/elex/examples/PropertiesTest.java
new file mode 100644
index 0000000..7db47be
--- /dev/null
+++ b/properties/src/test/java/kr/pe/elex/examples/PropertiesTest.java
@@ -0,0 +1,44 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.Properties;
+
+public class PropertiesTest {
+ @Test
+ void properties() throws IOException {
+ Properties properties = new Properties();
+ // 인풋스트림만 사용하면 인코딩이 꺠질 수 있으므로 리더를 사용해서 인코딩을 지정해서 불러 온다.
+ properties.load(new InputStreamReader(getClass()
+ .getResourceAsStream("/sample.properties"), StandardCharsets.UTF_8));
+
+ String value1 = properties.getProperty("key1");
+ System.out.println(value1);
+
+ // setProperty(key, value);
+ // properties.store(writer, comment);
+ }
+
+ @Test
+ void xml_properties() throws IOException {
+ Properties properties = new Properties();
+ properties.loadFromXML(getClass()
+ .getResourceAsStream("/sample.xml"));
+
+ String value1 = properties.getProperty("key1");
+ System.out.println(value1);
+
+ // setProperty(key, value);
+ //properties.storeToXML(os, comment);
+ }
+}
diff --git a/properties/src/test/java/kr/pe/elex/examples/ResourceBundleTest.java b/properties/src/test/java/kr/pe/elex/examples/ResourceBundleTest.java
new file mode 100644
index 0000000..d1f6be2
--- /dev/null
+++ b/properties/src/test/java/kr/pe/elex/examples/ResourceBundleTest.java
@@ -0,0 +1,64 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+
+import java.util.*;
+@Slf4j
+public class ResourceBundleTest {
+ @Test
+ void resource_bundle_xml() {
+ ResourceBundle bundle = ResourceBundle
+ .getBundle("language", new MyResourceBundleControl());
+
+ System.out.println(bundle.getString("hello"));
+ System.out.println(bundle.getString("only"));
+
+ }
+
+ @Test
+ void resource_bundle_xml_jp() {
+ ResourceBundle bundle = ResourceBundle
+ .getBundle("language", Locale.JAPANESE, new MyResourceBundleControl());
+ System.out.println(bundle.getLocale());
+ System.out.println(bundle.getString("hello"));
+ System.out.println(bundle.getString("only"));
+
+
+ }
+
+ @Test
+ void resource_bundle() {
+ ResourceBundle bundle = ResourceBundle
+ .getBundle("lang");
+
+ System.out.println(bundle.getString("hello"));
+ System.out.println(bundle.getString("only"));
+ }
+
+ @Test
+ void resource_bundle_jp() {
+ ResourceBundle bundle = ResourceBundle
+ .getBundle("lang", Locale.JAPAN, new MyResourceBundleControl());
+ log.info("Bundle locale: {}", bundle.getLocale());
+ System.out.println(bundle.getString("hello"));
+ System.out.println(bundle.getString("only"));
+ }
+
+ @Test
+ void resource_bundle_fr() {
+ Locale.setDefault(Locale.FRANCE);
+ ResourceBundle bundle = ResourceBundle
+ .getBundle("lang", Locale.FRENCH, new MyResourceBundleControl());
+ log.info("Bundle locale: {}", bundle.getLocale());
+ System.out.println(bundle.getString("hello"));
+ System.out.println(bundle.getString("only"));
+ }
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 6673134..14d63ce 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -13,5 +13,5 @@ include(
"web-socket-servlet", "web-socket-client",
"thread", "hibernate", "jdbc-sqlite",
"xml", "jackson", "jsoup", "markdown", "network", "httpd",
- "swing", "java-fx"
+ "swing", "java-fx", "properties"
)