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" )