diff --git a/core-java-8-2/.gitignore b/core-java-8-2/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-8-2/.gitignore
@@ -0,0 +1,25 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-8-2/pom.xml b/core-java-8-2/pom.xml
index 7035f12fb7..4692a0fca6 100644
--- a/core-java-8-2/pom.xml
+++ b/core-java-8-2/pom.xml
@@ -21,9 +21,16 @@
UTF-8
1.8
1.8
+ 64.2
+
+ com.ibm.icu
+ icu4j
+ ${icu.version}
+
+
diff --git a/core-java-8-2/src/main/java/com/baeldung/jarArguments/JarExample.java b/core-java-8-2/src/main/java/com/baeldung/jarArguments/JarExample.java
new file mode 100644
index 0000000000..c2fb809790
--- /dev/null
+++ b/core-java-8-2/src/main/java/com/baeldung/jarArguments/JarExample.java
@@ -0,0 +1,18 @@
+package com.baeldung.jarArguments;
+
+public class JarExample {
+
+ public static void main(String[] args) {
+ System.out.println("Hello Baeldung Reader in JarExample!");
+
+ if(args == null) {
+ System.out.println("You have not provided any arguments!");
+ }else {
+ System.out.println("There are "+args.length+" argument(s)!");
+ for(int i=0; i locales = Arrays.asList(new Locale[] { Locale.UK, Locale.ITALY, Locale.FRANCE, Locale.forLanguageTag("pl-PL") });
+ Localization.run(locales);
+ JavaSEFormat.run(locales);
+ ICUFormat.run(locales);
+ }
+
+}
diff --git a/core-java-8-2/src/main/java/com/baeldung/localization/ICUFormat.java b/core-java-8-2/src/main/java/com/baeldung/localization/ICUFormat.java
new file mode 100644
index 0000000000..f7bc357933
--- /dev/null
+++ b/core-java-8-2/src/main/java/com/baeldung/localization/ICUFormat.java
@@ -0,0 +1,29 @@
+package com.baeldung.localization;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import com.ibm.icu.text.MessageFormat;
+
+public class ICUFormat {
+
+ public static String getLabel(Locale locale, Object[] data) {
+ ResourceBundle bundle = ResourceBundle.getBundle("formats", locale);
+ String format = bundle.getString("label-icu");
+ MessageFormat formatter = new MessageFormat(format, locale);
+ return formatter.format(data);
+ }
+
+ public static void run(List locales) {
+ System.out.println("ICU formatter");
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 0 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 1 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 2 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 3 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 0 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 1 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 2 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 3 })));
+ }
+}
diff --git a/core-java-8-2/src/main/java/com/baeldung/localization/JavaSEFormat.java b/core-java-8-2/src/main/java/com/baeldung/localization/JavaSEFormat.java
new file mode 100644
index 0000000000..c95dfffa13
--- /dev/null
+++ b/core-java-8-2/src/main/java/com/baeldung/localization/JavaSEFormat.java
@@ -0,0 +1,24 @@
+package com.baeldung.localization;
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class JavaSEFormat {
+
+ public static String getLabel(Locale locale, Object[] data) {
+ ResourceBundle bundle = ResourceBundle.getBundle("formats", locale);
+ final String pattern = bundle.getString("label");
+ final MessageFormat formatter = new MessageFormat(pattern, locale);
+ return formatter.format(data);
+ }
+
+ public static void run(List locales) {
+ System.out.println("Java formatter");
+ final Date date = new Date(System.currentTimeMillis());
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { date, "Alice", 0 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { date, "Alice", 2 })));
+ }
+}
diff --git a/core-java-8-2/src/main/java/com/baeldung/localization/Localization.java b/core-java-8-2/src/main/java/com/baeldung/localization/Localization.java
new file mode 100644
index 0000000000..17a6598ce0
--- /dev/null
+++ b/core-java-8-2/src/main/java/com/baeldung/localization/Localization.java
@@ -0,0 +1,18 @@
+package com.baeldung.localization;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class Localization {
+
+ public static String getLabel(Locale locale) {
+ final ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
+ return bundle.getString("label");
+ }
+
+ public static void run(List locales) {
+ locales.forEach(locale -> System.out.println(getLabel(locale)));
+ }
+
+}
diff --git a/core-java-8-2/src/main/resources/example_manifest.txt b/core-java-8-2/src/main/resources/example_manifest.txt
new file mode 100644
index 0000000000..71abcb05fb
--- /dev/null
+++ b/core-java-8-2/src/main/resources/example_manifest.txt
@@ -0,0 +1 @@
+Main-Class: com.baeldung.jarArguments.JarExample
diff --git a/core-java-8-2/src/main/resources/formats_en.properties b/core-java-8-2/src/main/resources/formats_en.properties
new file mode 100644
index 0000000000..41e0e00119
--- /dev/null
+++ b/core-java-8-2/src/main/resources/formats_en.properties
@@ -0,0 +1,2 @@
+label=On {0, date, short} {1} has sent you {2, choice, 0#no messages|1#a message|2#two messages|2<{2,number,integer} messages}.
+label-icu={0} has sent you {2, plural, =0 {no messages} =1 {a message} other {{2, number, integer} messages}}.
\ No newline at end of file
diff --git a/core-java-8-2/src/main/resources/formats_fr.properties b/core-java-8-2/src/main/resources/formats_fr.properties
new file mode 100644
index 0000000000..c2d5159b32
--- /dev/null
+++ b/core-java-8-2/src/main/resources/formats_fr.properties
@@ -0,0 +1,2 @@
+label={0, date, short}, {1}{2, choice, 0# ne|0<} vous a envoyé {2, choice, 0#aucun message|1#un message|2#deux messages|2<{2,number,integer} messages}.
+label-icu={0} {2, plural, =0 {ne } other {}}vous a envoyé {2, plural, =0 {aucun message} =1 {un message} other {{2, number, integer} messages}}.
\ No newline at end of file
diff --git a/core-java-8-2/src/main/resources/formats_it.properties b/core-java-8-2/src/main/resources/formats_it.properties
new file mode 100644
index 0000000000..43fd1eee1c
--- /dev/null
+++ b/core-java-8-2/src/main/resources/formats_it.properties
@@ -0,0 +1,2 @@
+label={0, date, short} {1} ti ha inviato {2, choice, 0#nessun messagio|1#un messaggio|2#due messaggi|2<{2, number, integer} messaggi}.
+label-icu={0} {2, plural, =0 {non } other {}}ti ha inviato {2, plural, =0 {nessun messaggio} =1 {un messaggio} other {{2, number, integer} messaggi}}.
\ No newline at end of file
diff --git a/core-java-8-2/src/main/resources/formats_pl.properties b/core-java-8-2/src/main/resources/formats_pl.properties
new file mode 100644
index 0000000000..9333ec3396
--- /dev/null
+++ b/core-java-8-2/src/main/resources/formats_pl.properties
@@ -0,0 +1,2 @@
+label=W {0, date, short} {1}{2, choice, 0# nie|0<} wys\u0142a\u0142a ci {2, choice, 0#\u017Cadnych wiadomo\u015Bci|1#wiadomo\u015B\u0107|2#dwie wiadomo\u015Bci|2<{2, number, integer} wiadomo\u015Bci}.
+label-icu={0} {2, plural, =0 {nie } other {}}{1, select, male {wys\u0142a\u0142} female {wys\u0142a\u0142a} other {wys\u0142a\u0142o}} ci {2, plural, =0 {\u017Cadnej wiadomo\u015Bci} =1 {wiadomo\u015B\u0107} other {{2, number, integer} wiadomo\u015Bci}}.
diff --git a/core-java-8-2/src/main/resources/messages_en.properties b/core-java-8-2/src/main/resources/messages_en.properties
new file mode 100644
index 0000000000..bcbca9483c
--- /dev/null
+++ b/core-java-8-2/src/main/resources/messages_en.properties
@@ -0,0 +1 @@
+label=Alice has sent you a message.
diff --git a/core-java-8-2/src/main/resources/messages_fr.properties b/core-java-8-2/src/main/resources/messages_fr.properties
new file mode 100644
index 0000000000..6716102568
--- /dev/null
+++ b/core-java-8-2/src/main/resources/messages_fr.properties
@@ -0,0 +1 @@
+label=Alice vous a envoyé un message.
\ No newline at end of file
diff --git a/core-java-8-2/src/main/resources/messages_it.properties b/core-java-8-2/src/main/resources/messages_it.properties
new file mode 100644
index 0000000000..6929a8c091
--- /dev/null
+++ b/core-java-8-2/src/main/resources/messages_it.properties
@@ -0,0 +1 @@
+label=Alice ti ha inviato un messaggio.
\ No newline at end of file
diff --git a/core-java-8-2/src/main/resources/messages_pl.properties b/core-java-8-2/src/main/resources/messages_pl.properties
new file mode 100644
index 0000000000..5515a9920e
--- /dev/null
+++ b/core-java-8-2/src/main/resources/messages_pl.properties
@@ -0,0 +1 @@
+label=Alice wys\u0142a\u0142a ci wiadomo\u015B\u0107.
\ No newline at end of file
diff --git a/core-java-8-2/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java b/core-java-8-2/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java
new file mode 100644
index 0000000000..2c8f9b47f3
--- /dev/null
+++ b/core-java-8-2/src/test/java/com/baeldung/localization/ICUFormatUnitTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.localization;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Locale;
+
+import org.junit.Test;
+
+import com.baeldung.localization.ICUFormat;
+
+public class ICUFormatUnitTest {
+
+ @Test
+ public void givenInUK_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice has sent you no messages.", ICUFormat.getLabel(Locale.UK, new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInUK_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice has sent you a message.", ICUFormat.getLabel(Locale.UK, new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInUK_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob has sent you 6 messages.", ICUFormat.getLabel(Locale.UK, new Object[] { "Bob", "male", 6 }));
+ }
+
+ @Test
+ public void givenInItaly_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice non ti ha inviato nessun messaggio.", ICUFormat.getLabel(Locale.ITALY, new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInItaly_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice ti ha inviato un messaggio.", ICUFormat.getLabel(Locale.ITALY, new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInItaly_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob ti ha inviato 6 messaggi.", ICUFormat.getLabel(Locale.ITALY, new Object[] { "Bob", "male", 6 }));
+ }
+
+ @Test
+ public void givenInFrance_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice ne vous a envoyé aucun message.", ICUFormat.getLabel(Locale.FRANCE, new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInFrance_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice vous a envoyé un message.", ICUFormat.getLabel(Locale.FRANCE, new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInFrance_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob vous a envoyé 6 messages.", ICUFormat.getLabel(Locale.FRANCE, new Object[] { "Bob", "male", 6 }));
+ }
+
+
+ @Test
+ public void givenInPoland_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice nie wysłała ci żadnej wiadomości.", ICUFormat.getLabel(Locale.forLanguageTag("pl-PL"), new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInPoland_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice wysłała ci wiadomość.", ICUFormat.getLabel(Locale.forLanguageTag("pl-PL"), new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInPoland_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob wysłał ci 6 wiadomości.", ICUFormat.getLabel(Locale.forLanguageTag("pl-PL"), new Object[] { "Bob", "male", 6 }));
+ }
+
+}
diff --git a/core-java-modules/multimodulemavenproject/daomodule/pom.xml b/core-java-modules/multimodulemavenproject/daomodule/pom.xml
new file mode 100644
index 0000000000..a260e15e6d
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/daomodule/pom.xml
@@ -0,0 +1,27 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodulemavenproject
+ multimodulemavenproject
+ 1.0
+
+ com.baeldung.daomodule
+ daomodule
+ 1.0
+ jar
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
+ 9
+ 9
+
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/daomodule/src/main/java/com/baeldung/daomodule/Dao.java b/core-java-modules/multimodulemavenproject/daomodule/src/main/java/com/baeldung/daomodule/Dao.java
new file mode 100644
index 0000000000..9568bae9d9
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/daomodule/src/main/java/com/baeldung/daomodule/Dao.java
@@ -0,0 +1,11 @@
+package com.baeldung.daomodule;
+import java.util.List;
+import java.util.Optional;
+
+public interface Dao {
+
+ Optional findById(int id);
+
+ List findAll();
+
+}
diff --git a/core-java-modules/multimodulemavenproject/daomodule/src/main/java/module-info.java b/core-java-modules/multimodulemavenproject/daomodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..20c51d316a
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/daomodule/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.daomodule {
+ exports com.baeldung.daomodule;
+}
diff --git a/core-java-modules/multimodulemavenproject/entitymodule/pom.xml b/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
new file mode 100644
index 0000000000..1fd672d03e
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/entitymodule/pom.xml
@@ -0,0 +1,28 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodulemavenproject
+ multimodulemavenproject
+ 1.0
+
+ com.baeldung.entitymodule
+ entitymodule
+ 1.0
+ jar
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
+ 9
+ 9
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/entitymodule/src/main/java/com/baeldung/entitymodule/User.java b/core-java-modules/multimodulemavenproject/entitymodule/src/main/java/com/baeldung/entitymodule/User.java
new file mode 100644
index 0000000000..c025bffd87
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/entitymodule/src/main/java/com/baeldung/entitymodule/User.java
@@ -0,0 +1,19 @@
+package com.baeldung.entitymodule;
+
+public class User {
+
+ private final String name;
+
+ public User(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + '}';
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/entitymodule/src/main/java/module-info.java b/core-java-modules/multimodulemavenproject/entitymodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..b2c4553357
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/entitymodule/src/main/java/module-info.java
@@ -0,0 +1,3 @@
+module com.baeldung.entitymodule {
+ exports com.baeldung.entitymodule;
+}
diff --git a/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml b/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
new file mode 100644
index 0000000000..26e6a15b1e
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/mainappmodule/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodulemavenproject
+ multimodulemavenproject
+ 1.0
+
+ com.baeldung.mainappmodule
+ mainappmodule
+ 1.0
+ jar
+
+
+
+ com.baeldung.entitymodule
+ entitymodule
+ 1.0
+
+
+ com.baeldung.daomodule
+ daomodule
+ 1.0
+
+
+ com.baeldung.userdaomodule
+ userdaomodule
+ 1.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
+ 9
+ 9
+
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java b/core-java-modules/multimodulemavenproject/mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java
new file mode 100644
index 0000000000..cf0ba1d9bc
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/mainappmodule/src/main/java/com/baeldung/mainappmodule/Application.java
@@ -0,0 +1,19 @@
+package com.baeldung.mainappmodule;
+
+import com.baeldung.daomodule.Dao;
+import com.baeldung.entitymodule.User;
+import com.baeldung.userdaomodule.UserDao;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Application {
+
+ public static void main(String args[]) {
+ Map users = new HashMap<>();
+ users.put(1, new User("Julie"));
+ users.put(2, new User("David"));
+ Dao userDao = new UserDao(users);
+ userDao.findAll().forEach(System.out::println);
+ }
+
+}
diff --git a/core-java-modules/multimodulemavenproject/mainappmodule/src/main/java/module-info.java b/core-java-modules/multimodulemavenproject/mainappmodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..dd7620c7bf
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/mainappmodule/src/main/java/module-info.java
@@ -0,0 +1,8 @@
+module com.baeldung.mainppmodule {
+
+ requires com.baeldung.entitymodule;
+ requires com.baeldung.daomodule;
+ requires com.baeldung.userdaomodule;
+ uses com.baeldung.userdaomodule.UserDao;
+
+}
diff --git a/core-java-modules/multimodulemavenproject/pom.xml b/core-java-modules/multimodulemavenproject/pom.xml
new file mode 100644
index 0000000000..3d56f1356b
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/pom.xml
@@ -0,0 +1,62 @@
+
+
+ 4.0.0
+ com.baeldung.multimodulemavenproject
+ multimodulemavenproject
+ 1.0
+ pom
+ multimodulemavenproject
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.assertj
+ assertj-core
+ 3.12.2
+ test
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 1.9
+ 1.9
+
+
+
+
+
+
+
+
+ entitymodule
+ daomodule
+ userdaomodule
+ mainappmodule
+
+
+
+ UTF-8
+
+
diff --git a/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml b/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
new file mode 100644
index 0000000000..63968452db
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/userdaomodule/pom.xml
@@ -0,0 +1,41 @@
+
+
+ 4.0.0
+
+ com.baeldung.multimodulemavenproject
+ multimodulemavenproject
+ 1.0
+
+ com.baeldung.userdaomodule
+ userdaomodule
+ 1.0
+ jar
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+
+
+
+ com.baeldung.entitymodule
+ entitymodule
+ 1.0
+
+
+ com.baeldung.daomodule
+ daomodule
+ 1.0
+
+
+
+
+ 9
+ 9
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java b/core-java-modules/multimodulemavenproject/userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java
new file mode 100644
index 0000000000..aba157b431
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/userdaomodule/src/main/java/com/baeldung/userdaomodule/UserDao.java
@@ -0,0 +1,32 @@
+package com.baeldung.userdaomodule;
+
+import com.baeldung.daomodule.Dao;
+import com.baeldung.entitymodule.User;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class UserDao implements Dao {
+
+ private final Map users;
+
+ public UserDao() {
+ users = new HashMap<>();
+ }
+
+ public UserDao(Map users) {
+ this.users = users;
+ }
+
+ @Override
+ public List findAll() {
+ return new ArrayList<>(users.values());
+ }
+
+ @Override
+ public Optional findById(int id) {
+ return Optional.ofNullable(users.get(id));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/multimodulemavenproject/userdaomodule/src/main/java/module-info.java b/core-java-modules/multimodulemavenproject/userdaomodule/src/main/java/module-info.java
new file mode 100644
index 0000000000..6dd81dabe5
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/userdaomodule/src/main/java/module-info.java
@@ -0,0 +1,6 @@
+module com.baeldung.userdaomodule {
+ requires com.baeldung.entitymodule;
+ requires com.baeldung.daomodule;
+ provides com.baeldung.daomodule.Dao with com.baeldung.userdaomodule.UserDao;
+ exports com.baeldung.userdaomodule;
+}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index ad49cceb9d..ed6a056448 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -2,6 +2,7 @@
4.0.0
+ com.baeldung.core-java-modules
core-java-modules
core-java-modules
pom
@@ -15,5 +16,5 @@
pre-jpms
-
-
\ No newline at end of file
+
+
diff --git a/core-java/src/main/java/com/baeldung/graph/Graph.java b/core-java/src/main/java/com/baeldung/graph/Graph.java
index 43b5c0aa08..3f2e17c43c 100644
--- a/core-java/src/main/java/com/baeldung/graph/Graph.java
+++ b/core-java/src/main/java/com/baeldung/graph/Graph.java
@@ -59,18 +59,43 @@ public class Graph {
Vertex(String label) {
this.label = label;
}
- @Override
- public boolean equals(Object obj) {
- Vertex vertex = (Vertex) obj;
- return vertex.label == label;
- }
+
@Override
public int hashCode() {
- return label.hashCode();
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + getOuterType().hashCode();
+ result = prime * result + ((label == null) ? 0 : label.hashCode());
+ return result;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Vertex other = (Vertex) obj;
+ if (!getOuterType().equals(other.getOuterType()))
+ return false;
+ if (label == null) {
+ if (other.label != null)
+ return false;
+ } else if (!label.equals(other.label))
+ return false;
+ return true;
+ }
+
@Override
public String toString() {
return label;
}
+
+
+ private Graph getOuterType() {
+ return Graph.this;
+ }
}
}
\ No newline at end of file
diff --git a/core-kotlin-io/README.md b/core-kotlin-io/README.md
index c085c0653f..cb4dac7e4d 100644
--- a/core-kotlin-io/README.md
+++ b/core-kotlin-io/README.md
@@ -1,3 +1,5 @@
## Relevant articles:
- [InputStream to String in Kotlin](https://www.baeldung.com/kotlin-inputstream-to-string)
+- [Console I/O in Kotlin](https://www.baeldung.com/kotlin-console-io)
+
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileReader.kt b/core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileReader.kt
index 8539378c91..886a3fc51e 100644
--- a/core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileReader.kt
+++ b/core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileReader.kt
@@ -17,4 +17,8 @@ class FileReader {
File(fileName).inputStream().readBytes().toString(Charsets.UTF_8)
fun readFileDirectlyAsText(fileName: String): String = File(fileName).readText(Charsets.UTF_8)
+
+ fun readFileUsingGetResource(fileName: String) = this::class.java.getResource(fileName).readText(Charsets.UTF_8)
+
+ fun readFileAsLinesUsingGetResourceAsStream(fileName: String) = this::class.java.getResourceAsStream(fileName).bufferedReader().readLines()
}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt
index 67795dda14..ad541c446e 100644
--- a/core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt
+++ b/core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt
@@ -48,4 +48,20 @@ internal class FileReaderTest {
assertTrue { text.contains("Hello to Kotlin") }
}
+
+ @Test
+ fun whenReadFileAsTextUsingGetResource_thenCorrect() {
+ val text = fileReader.readFileUsingGetResource("/Kotlin.in")
+
+ assertTrue { text.contains("1. Concise") }
+ }
+
+ @Test
+ fun whenReadFileUsingGetResourceAsStream_thenCorrect() {
+ val lines = fileReader.readFileAsLinesUsingGetResourceAsStream("/Kotlin.in")
+
+ assertTrue { lines.contains("3. Interoperable") }
+ }
+
+
}
\ No newline at end of file
diff --git a/java-dates-2/pom.xml b/java-dates-2/pom.xml
index c2464ed47f..9307a794b9 100644
--- a/java-dates-2/pom.xml
+++ b/java-dates-2/pom.xml
@@ -15,6 +15,12 @@
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
org.assertj
@@ -49,6 +55,7 @@
3.6.1
+ 2.10
1.9
1.9
diff --git a/java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java b/java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
new file mode 100644
index 0000000000..cd31ccc799
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.convert;
+
+import org.joda.time.Instant;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.Calendar;
+import java.util.Date;
+
+public class ConvertDateTimeUnitTest {
+
+ public final long millis = 1556175797428L;
+
+ @Test
+ public void givenLocalDateTime_WhenToEpochMillis_ThenMillis() {
+ ZoneId id = ZoneId.systemDefault();
+
+ LocalDateTime localDateTime =
+ LocalDateTime.ofInstant(java.time.Instant.ofEpochMilli(millis), id);
+
+ ZonedDateTime zdt = ZonedDateTime.of(localDateTime, id);
+
+ Assert.assertEquals(millis, zdt.toInstant().toEpochMilli());
+ }
+
+ @Test
+ public void givenJava8Instant_WhenGToEpochMillis_ThenMillis() {
+ java.time.Instant instant = java.time.Instant.ofEpochMilli(millis);
+ Assert.assertEquals(millis, instant.toEpochMilli());
+ }
+
+ @Test
+ public void givenDate_WhenGetTime_ThenMillis() {
+ Date date = new Date(millis);
+ Assert.assertEquals(millis, date.getTime());
+ }
+
+ @Test
+ public void givenCalendar_WhenGetTimeInMillis_ThenMillis() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(new Date(millis));
+ Assert.assertEquals(millis, calendar.getTimeInMillis());
+ }
+
+ @Test
+ public void givenJodaInstant_WhenGetMillis_ThenMillis() {
+ Instant jodaInstant = Instant.ofEpochMilli(millis);
+ Assert.assertEquals(millis, jodaInstant.getMillis());
+ }
+
+ @Test
+ public void givenJODADateTime_WhenGetMillis_ThenMillis() {
+ org.joda.time.DateTime jodaDateTime = new org.joda.time.DateTime(millis);
+ Assert.assertEquals(millis, jodaDateTime.getMillis());
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/Application.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/Application.java
new file mode 100644
index 0000000000..3b96f68583
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/Application.java
@@ -0,0 +1,14 @@
+package com.baeldung.jpadefaultvalues.application;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+
+@SpringBootApplication
+public class Application {
+ private static ApplicationContext applicationContext;
+
+ public static void main(String[] args) {
+ applicationContext = SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/User.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/User.java
new file mode 100644
index 0000000000..e271c01815
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/User.java
@@ -0,0 +1,55 @@
+package com.baeldung.jpadefaultvalues.application;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Column(columnDefinition = "varchar(255) default 'John Snow'")
+ private String name = "John Snow";
+
+ @Column(columnDefinition = "integer default 25")
+ private Integer age = 25;
+
+ @Column(columnDefinition = "boolean default false")
+ private Boolean locked = false;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ public Boolean getLocked() {
+ return locked;
+ }
+
+ public void setLocked(Boolean locked) {
+ this.locked = locked;
+ }
+}
diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/UserRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/UserRepository.java
new file mode 100644
index 0000000000..ca0e4c4d71
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/jpadefaultvalues/application/UserRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.jpadefaultvalues.application;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserRepository extends JpaRepository {
+}
diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/jpadefaultvalues/application/UserDefaultValuesUnitTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/jpadefaultvalues/application/UserDefaultValuesUnitTest.java
new file mode 100644
index 0000000000..52a5c4dcd6
--- /dev/null
+++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/jpadefaultvalues/application/UserDefaultValuesUnitTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.jpadefaultvalues.application;
+
+import com.baeldung.jpadefaultvalues.application.User;
+import com.baeldung.jpadefaultvalues.application.UserRepository;
+
+import org.junit.Test;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class UserDefaultValuesUnitTest {
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Test
+ @Ignore // SQL default values are also defined
+ public void saveUser_shouldSaveWithDefaultFieldValues() {
+ User user = new User();
+ user = userRepository.save(user);
+
+ assertEquals(user.getName(), "John Snow");
+ assertEquals(25, (int) user.getAge());
+ assertFalse(user.getLocked());
+ }
+
+ @Test
+ @Ignore // SQL default values are also defined
+ public void saveUser_shouldSaveWithNullName() {
+ User user = new User();
+ user.setName(null);
+ user = userRepository.save(user);
+
+ assertNull(user.getName());
+ assertEquals(25, (int) user.getAge());
+ assertFalse(user.getLocked());
+ }
+
+ @Test
+ public void saveUser_shouldSaveWithDefaultSqlValues() {
+ User user = new User();
+ user = userRepository.save(user);
+
+ assertEquals(user.getName(), "John Snow");
+ assertEquals(25, (int) user.getAge());
+ assertFalse(user.getLocked());
+ }
+
+}