diff --git a/aspectj/pom.xml b/aspectj/pom.xml
index 2a1cff11c8..1c409483ec 100644
--- a/aspectj/pom.xml
+++ b/aspectj/pom.xml
@@ -98,13 +98,14 @@
compile
- test-compile
+ test-compile
-
+
+ -->
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Account.java b/aspectj/src/main/java/com/baeldung/aspectj/Account.java
index 59cab72ebf..bc9ca375aa 100644
--- a/aspectj/src/main/java/com/baeldung/aspectj/Account.java
+++ b/aspectj/src/main/java/com/baeldung/aspectj/Account.java
@@ -4,10 +4,10 @@ public class Account {
int balance = 20;
public boolean withdraw(int amount) {
- if (balance - amount > 0) {
- balance = balance - amount;
- return true;
- } else
+ if (balance < amount) {
return false;
+ }
+ balance = balance - amount;
+ return true;
}
}
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
index 2ddf03192b..8423c1da97 100644
--- a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
+++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
@@ -16,12 +16,11 @@ public aspect AccountAspect {
}
boolean around(int amount, Account account) : callWithDraw(amount, account) {
- if (account.balance - amount >= MIN_BALANCE)
- return proceed(amount, account);
- else {
+ if (account.balance < amount) {
logger.info("Withdrawal Rejected!");
return false;
}
+ return proceed(amount, account);
}
after(int amount, Account balance) : callWithDraw(amount, balance) {
diff --git a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java
index 9c8fc86e7a..4fa164cadc 100644
--- a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java
+++ b/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java
@@ -1,6 +1,5 @@
package com.baeldung.hashing;
-
import com.google.common.hash.Hashing;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.util.encoders.Hex;
@@ -11,17 +10,14 @@ import java.security.NoSuchAlgorithmException;
public class SHA256Hashing {
- public static String HashWithJavaMessageDigest(final String originalString)
- throws NoSuchAlgorithmException {
+ public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
- final byte[] encodedhash = digest.digest(
- originalString.getBytes(StandardCharsets.UTF_8));
+ final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedhash);
}
public static String HashWithGuava(final String originalString) {
- final String sha256hex = Hashing.sha256().hashString(
- originalString, StandardCharsets.UTF_8).toString();
+ final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString();
return sha256hex;
}
@@ -30,11 +26,9 @@ public class SHA256Hashing {
return sha256hex;
}
- public static String HashWithBouncyCastle(final String originalString)
- throws NoSuchAlgorithmException {
+ public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
- final byte[] hash = digest.digest(
- originalString.getBytes(StandardCharsets.UTF_8));
+ final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
final String sha256hex = new String(Hex.encode(hash));
return sha256hex;
}
@@ -43,7 +37,8 @@ public class SHA256Hashing {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
- if(hex.length() == 1) hexString.append('0');
+ if (hex.length() == 1)
+ hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
diff --git a/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java
new file mode 100644
index 0000000000..b1b790f541
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileSearchExample.java
@@ -0,0 +1,56 @@
+package com.baeldung.java.nio2.visitor;
+
+import java.io.IOException;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+
+import static java.nio.file.FileVisitResult.CONTINUE;
+import static java.nio.file.FileVisitResult.TERMINATE;
+
+public class FileSearchExample implements FileVisitor {
+ private final String fileName;
+ private final Path startDir;
+
+ public FileSearchExample(String fileName, Path startingDir) {
+ this.fileName = fileName;
+ startDir = startingDir;
+ }
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ String fileName = file.getFileName().toString();
+ if (this.fileName.equals(fileName)) {
+ System.out.println("File found: " + file.toString());
+ return TERMINATE;
+ }
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+ System.out.println("Failed to access file: " + file.toString());
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ boolean finishedSearch = Files.isSameFile(dir, startDir);
+ if (finishedSearch) {
+ System.out.println("File:" + fileName + " not found");
+ return TERMINATE;
+ }
+ return CONTINUE;
+ }
+
+ public static void main(String[] args) throws IOException {
+ Path startingDir = Paths.get("C:/Users/new/Desktop");
+ FileSearchExample crawler = new FileSearchExample("hibernate.txt", startingDir);
+ Files.walkFileTree(startingDir, crawler);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java
new file mode 100644
index 0000000000..aa769b5091
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/nio2/visitor/FileVisitorImpl.java
@@ -0,0 +1,30 @@
+package com.baeldung.java.nio2.visitor;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Path;
+import java.nio.file.attribute.BasicFileAttributes;
+
+public class FileVisitorImpl implements FileVisitor {
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
+ return null;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
+ return null;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) {
+ return null;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java b/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java
new file mode 100644
index 0000000000..ffc58a1c50
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java
@@ -0,0 +1,25 @@
+package com.baeldung.java.nio2.watcher;
+
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardWatchEventKinds;
+import java.nio.file.WatchEvent;
+import java.nio.file.WatchKey;
+import java.nio.file.WatchService;
+
+public class DirectoryWatcherExample {
+ public static void main(String[] args) throws IOException, InterruptedException {
+ WatchService watchService = FileSystems.getDefault().newWatchService();
+ Path path = Paths.get(System.getProperty("user.home"));
+ path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
+ WatchKey key;
+ while ((key = watchService.take()) != null) {
+ for (WatchEvent> event : key.pollEvents()) {
+ System.out.println("Event kind:" + event.kind() + ". File affected: " + event.context() + ".");
+ }
+ key.reset();
+ }
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/java_8_features/Person.java b/core-java/src/main/java/com/baeldung/java_8_features/Person.java
new file mode 100644
index 0000000000..82b6819699
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/java_8_features/Person.java
@@ -0,0 +1,39 @@
+package com.baeldung.java_8_features;
+
+import java.util.Optional;
+
+public class Person {
+ private String name;
+ private int age;
+ private String password;
+
+ public Person(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public Optional getName() {
+ return Optional.ofNullable(name);
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Optional getAge() {
+ return Optional.ofNullable(age);
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Optional getPassword() {
+ return Optional.ofNullable(password);
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java b/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java
index 3319716dc6..16d0cb570b 100644
--- a/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/file/FileOperationsUnitTest.java
@@ -1,11 +1,12 @@
package com.baeldung.file;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import org.apache.commons.io.FileUtils;
+import org.hamcrest.CoreMatchers;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
@@ -14,12 +15,6 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
-import org.apache.commons.io.FileUtils;
-import org.hamcrest.CoreMatchers;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
-import org.junit.Test;
-
public class FileOperationsUnitTest {
@Test
@@ -58,9 +53,9 @@ public class FileOperationsUnitTest {
@Test
public void givenURLName_whenUsingURL_thenFileData() throws IOException {
- String expectedData = "Baeldung";
+ String expectedData = "Example Domain";
- URL urlObject = new URL("http://www.baeldung.com/");
+ URL urlObject = new URL("http://www.example.com/");
URLConnection urlConnection = urlObject.openConnection();
diff --git a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java
index dc496d589b..ce77b824d8 100644
--- a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java
+++ b/core-java/src/test/java/com/baeldung/hashing/SHA256HashingTest.java
@@ -4,12 +4,10 @@ import org.junit.Test;
import static org.junit.Assert.*;
-
public class SHA256HashingTest {
private static String originalValue = "abc123";
- private static String hashedValue =
- "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090";
+ private static String hashedValue = "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090";
@Test
public void testHashWithJavaMessageDigest() throws Exception {
diff --git a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java
index 09cacd0a29..9a4ac053af 100644
--- a/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java
+++ b/core-java/src/test/java/com/baeldung/java/conversion/StringConversionTest.java
@@ -119,8 +119,7 @@ public class StringConversionTest {
int afterConvCalendarDay = 03;
Month afterConvCalendarMonth = Month.DECEMBER;
int afterConvCalendarYear = 2007;
- LocalDateTime afterConvDate
- = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str);
+ LocalDateTime afterConvDate = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str);
assertEquals(afterConvDate.getDayOfMonth(), afterConvCalendarDay);
assertEquals(afterConvDate.getMonth(), afterConvCalendarMonth);
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java b/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java
index 64fbb4ae25..587f4ab34a 100644
--- a/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java
+++ b/core-java/src/test/java/com/baeldung/java/nio2/FileTest.java
@@ -1,64 +1,72 @@
package com.baeldung.java.nio2;
+import org.apache.commons.io.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.*;
+import java.util.UUID;
+
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import java.io.IOException;
-import java.nio.file.DirectoryNotEmptyException;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.Files;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.UUID;
-
-import org.junit.Test;
-
public class FileTest {
- private static final String HOME = System.getProperty("user.home");
+ private static final String TEMP_DIR = String.format("%s/temp%s", System.getProperty("user.home"), UUID.randomUUID().toString());
+
+ @BeforeClass
+ public static void setup() throws IOException {
+ Files.createDirectory(Paths.get(TEMP_DIR));
+ }
+
+ @AfterClass
+ public static void cleanup() throws IOException {
+ FileUtils.deleteDirectory(new File(TEMP_DIR));
+ }
// checking file or dir
@Test
public void givenExistentPath_whenConfirmsFileExists_thenCorrect() {
- Path p = Paths.get(HOME);
+ Path p = Paths.get(TEMP_DIR);
assertTrue(Files.exists(p));
}
@Test
public void givenNonexistentPath_whenConfirmsFileNotExists_thenCorrect() {
- Path p = Paths.get(HOME + "/inexistent_file.txt");
+ Path p = Paths.get(TEMP_DIR + "/inexistent_file.txt");
assertTrue(Files.notExists(p));
}
@Test
public void givenDirPath_whenConfirmsNotRegularFile_thenCorrect() {
- Path p = Paths.get(HOME);
+ Path p = Paths.get(TEMP_DIR);
assertFalse(Files.isRegularFile(p));
}
@Test
public void givenExistentDirPath_whenConfirmsReadable_thenCorrect() {
- Path p = Paths.get(HOME);
+ Path p = Paths.get(TEMP_DIR);
assertTrue(Files.isReadable(p));
}
@Test
public void givenExistentDirPath_whenConfirmsWritable_thenCorrect() {
- Path p = Paths.get(HOME);
+ Path p = Paths.get(System.getProperty("user.home"));
assertTrue(Files.isWritable(p));
}
@Test
public void givenExistentDirPath_whenConfirmsExecutable_thenCorrect() {
- Path p = Paths.get(HOME);
+ Path p = Paths.get(System.getProperty("user.home"));
assertTrue(Files.isExecutable(p));
}
@Test
public void givenSameFilePaths_whenConfirmsIsSame_thenCorrect() throws IOException {
- Path p1 = Paths.get(HOME);
- Path p2 = Paths.get(HOME);
+ Path p1 = Paths.get(TEMP_DIR);
+ Path p2 = Paths.get(TEMP_DIR);
assertTrue(Files.isSameFile(p1, p2));
}
@@ -67,7 +75,7 @@ public class FileTest {
@Test
public void givenFilePath_whenCreatesNewFile_thenCorrect() throws IOException {
String fileName = "myfile_" + UUID.randomUUID().toString() + ".txt";
- Path p = Paths.get(HOME + "/" + fileName);
+ Path p = Paths.get(TEMP_DIR + "/" + fileName);
assertFalse(Files.exists(p));
Files.createFile(p);
assertTrue(Files.exists(p));
@@ -77,7 +85,7 @@ public class FileTest {
@Test
public void givenDirPath_whenCreatesNewDir_thenCorrect() throws IOException {
String dirName = "myDir_" + UUID.randomUUID().toString();
- Path p = Paths.get(HOME + "/" + dirName);
+ Path p = Paths.get(TEMP_DIR + "/" + dirName);
assertFalse(Files.exists(p));
Files.createDirectory(p);
assertTrue(Files.exists(p));
@@ -89,7 +97,7 @@ public class FileTest {
@Test(expected = NoSuchFileException.class)
public void givenDirPath_whenFailsToCreateRecursively_thenCorrect() throws IOException {
String dirName = "myDir_" + UUID.randomUUID().toString() + "/subdir";
- Path p = Paths.get(HOME + "/" + dirName);
+ Path p = Paths.get(TEMP_DIR + "/" + dirName);
assertFalse(Files.exists(p));
Files.createDirectory(p);
@@ -97,7 +105,7 @@ public class FileTest {
@Test
public void givenDirPath_whenCreatesRecursively_thenCorrect() throws IOException {
- Path dir = Paths.get(HOME + "/myDir_" + UUID.randomUUID().toString());
+ Path dir = Paths.get(TEMP_DIR + "/myDir_" + UUID.randomUUID().toString());
Path subdir = dir.resolve("subdir");
assertFalse(Files.exists(dir));
assertFalse(Files.exists(subdir));
@@ -110,7 +118,7 @@ public class FileTest {
public void givenFilePath_whenCreatesTempFile_thenCorrect() throws IOException {
String prefix = "log_";
String suffix = ".txt";
- Path p = Paths.get(HOME + "/");
+ Path p = Paths.get(TEMP_DIR + "/");
p = Files.createTempFile(p, prefix, suffix);
// like log_8821081429012075286.txt
assertTrue(Files.exists(p));
@@ -119,7 +127,7 @@ public class FileTest {
@Test
public void givenPath_whenCreatesTempFileWithDefaults_thenCorrect() throws IOException {
- Path p = Paths.get(HOME + "/");
+ Path p = Paths.get(TEMP_DIR + "/");
p = Files.createTempFile(p, null, null);
// like 8600179353689423985.tmp
assertTrue(Files.exists(p));
@@ -136,7 +144,7 @@ public class FileTest {
// delete file
@Test
public void givenPath_whenDeletes_thenCorrect() throws IOException {
- Path p = Paths.get(HOME + "/fileToDelete.txt");
+ Path p = Paths.get(TEMP_DIR + "/fileToDelete.txt");
assertFalse(Files.exists(p));
Files.createFile(p);
assertTrue(Files.exists(p));
@@ -147,7 +155,7 @@ public class FileTest {
@Test(expected = DirectoryNotEmptyException.class)
public void givenPath_whenFailsToDeleteNonEmptyDir_thenCorrect() throws IOException {
- Path dir = Paths.get(HOME + "/emptyDir" + UUID.randomUUID().toString());
+ Path dir = Paths.get(TEMP_DIR + "/emptyDir" + UUID.randomUUID().toString());
Files.createDirectory(dir);
assertTrue(Files.exists(dir));
Path file = dir.resolve("file.txt");
@@ -160,7 +168,7 @@ public class FileTest {
@Test(expected = NoSuchFileException.class)
public void givenInexistentFile_whenDeleteFails_thenCorrect() throws IOException {
- Path p = Paths.get(HOME + "/inexistentFile.txt");
+ Path p = Paths.get(TEMP_DIR + "/inexistentFile.txt");
assertFalse(Files.exists(p));
Files.delete(p);
@@ -168,7 +176,7 @@ public class FileTest {
@Test
public void givenInexistentFile_whenDeleteIfExistsWorks_thenCorrect() throws IOException {
- Path p = Paths.get(HOME + "/inexistentFile.txt");
+ Path p = Paths.get(TEMP_DIR + "/inexistentFile.txt");
assertFalse(Files.exists(p));
Files.deleteIfExists(p);
@@ -177,8 +185,8 @@ public class FileTest {
// copy file
@Test
public void givenFilePath_whenCopiesToNewLocation_thenCorrect() throws IOException {
- Path dir1 = Paths.get(HOME + "/firstdir_" + UUID.randomUUID().toString());
- Path dir2 = Paths.get(HOME + "/otherdir_" + UUID.randomUUID().toString());
+ Path dir1 = Paths.get(TEMP_DIR + "/firstdir_" + UUID.randomUUID().toString());
+ Path dir2 = Paths.get(TEMP_DIR + "/otherdir_" + UUID.randomUUID().toString());
Files.createDirectory(dir1);
Files.createDirectory(dir2);
Path file1 = dir1.resolve("filetocopy.txt");
@@ -193,8 +201,8 @@ public class FileTest {
@Test(expected = FileAlreadyExistsException.class)
public void givenPath_whenCopyFailsDueToExistingFile_thenCorrect() throws IOException {
- Path dir1 = Paths.get(HOME + "/firstdir_" + UUID.randomUUID().toString());
- Path dir2 = Paths.get(HOME + "/otherdir_" + UUID.randomUUID().toString());
+ Path dir1 = Paths.get(TEMP_DIR + "/firstdir_" + UUID.randomUUID().toString());
+ Path dir2 = Paths.get(TEMP_DIR + "/otherdir_" + UUID.randomUUID().toString());
Files.createDirectory(dir1);
Files.createDirectory(dir2);
Path file1 = dir1.resolve("filetocopy.txt");
@@ -210,8 +218,8 @@ public class FileTest {
// moving files
@Test
public void givenFilePath_whenMovesToNewLocation_thenCorrect() throws IOException {
- Path dir1 = Paths.get(HOME + "/firstdir_" + UUID.randomUUID().toString());
- Path dir2 = Paths.get(HOME + "/otherdir_" + UUID.randomUUID().toString());
+ Path dir1 = Paths.get(TEMP_DIR + "/firstdir_" + UUID.randomUUID().toString());
+ Path dir2 = Paths.get(TEMP_DIR + "/otherdir_" + UUID.randomUUID().toString());
Files.createDirectory(dir1);
Files.createDirectory(dir2);
Path file1 = dir1.resolve("filetocopy.txt");
@@ -227,8 +235,8 @@ public class FileTest {
@Test(expected = FileAlreadyExistsException.class)
public void givenFilePath_whenMoveFailsDueToExistingFile_thenCorrect() throws IOException {
- Path dir1 = Paths.get(HOME + "/firstdir_" + UUID.randomUUID().toString());
- Path dir2 = Paths.get(HOME + "/otherdir_" + UUID.randomUUID().toString());
+ Path dir1 = Paths.get(TEMP_DIR + "/firstdir_" + UUID.randomUUID().toString());
+ Path dir2 = Paths.get(TEMP_DIR + "/otherdir_" + UUID.randomUUID().toString());
Files.createDirectory(dir1);
Files.createDirectory(dir2);
Path file1 = dir1.resolve("filetocopy.txt");
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java
new file mode 100644
index 0000000000..d64fbc763e
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoClient.java
@@ -0,0 +1,81 @@
+package com.baeldung.java.nio2.async;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class AsyncEchoClient {
+ private AsynchronousSocketChannel client;
+ private Future future;
+ private static AsyncEchoClient instance;
+
+ private AsyncEchoClient() {
+ try {
+ client = AsynchronousSocketChannel.open();
+ InetSocketAddress hostAddress = new InetSocketAddress("localhost", 4999);
+ future = client.connect(hostAddress);
+ start();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static AsyncEchoClient getInstance() {
+ if (instance == null)
+ instance = new AsyncEchoClient();
+ return instance;
+ }
+
+ private void start() {
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public String sendMessage(String message) {
+ byte[] byteMsg = new String(message).getBytes();
+ ByteBuffer buffer = ByteBuffer.wrap(byteMsg);
+ Future writeResult = client.write(buffer);
+
+ //run some code
+ writeResult.get();
+ buffer.flip();
+ Future readResult = client.read(buffer);
+
+ //run some code
+ readResult.get();
+ String echo = new String(buffer.array()).trim();
+ buffer.clear();
+ return echo;
+ }
+
+ public void stop() {
+ try {
+ client.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+ AsyncEchoClient client = AsyncEchoClient.getInstance();
+ client.start();
+ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+ String line = null;
+ System.out.println("Message to server:");
+ while ((line = br.readLine()) != null) {
+ String response = client.sendMessage(line);
+ System.out.println("response from server: " + response);
+ System.out.println("Message to server:");
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java
new file mode 100644
index 0000000000..5c3d204863
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer.java
@@ -0,0 +1,80 @@
+package com.baeldung.java.nio2.async;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousServerSocketChannel;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class AsyncEchoServer {
+ private AsynchronousServerSocketChannel serverChannel;
+ private Future acceptResult;
+ private AsynchronousSocketChannel clientChannel;
+
+ public AsyncEchoServer() {
+ try {
+ serverChannel = AsynchronousServerSocketChannel.open();
+ InetSocketAddress hostAddress = new InetSocketAddress("localhost", 4999);
+ serverChannel.bind(hostAddress);
+ acceptResult = serverChannel.accept();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void runServer() {
+ try {
+ clientChannel = acceptResult.get();
+ if ((clientChannel != null) && (clientChannel.isOpen())) {
+ while (true) {
+
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ Future readResult = clientChannel.read(buffer);
+
+ //do some computation
+
+ readResult.get();
+
+ buffer.flip();
+ String message = new String(buffer.array()).trim();
+ if (message.equals("bye")) {
+ break; // while loop
+ }
+ buffer = ByteBuffer.wrap(new String(message).getBytes());
+ Future writeResult = clientChannel.write(buffer);
+
+ //do some computation
+ writeResult.get();
+ buffer.clear();
+
+ } // while()
+
+ clientChannel.close();
+ serverChannel.close();
+
+ }
+ } catch (InterruptedException | ExecutionException | IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static void main(String[] args) {
+ AsyncEchoServer server = new AsyncEchoServer();
+ server.runServer();
+ }
+
+ public static Process start() throws IOException, InterruptedException {
+ String javaHome = System.getProperty("java.home");
+ String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
+ String classpath = System.getProperty("java.class.path");
+ String className = AsyncEchoServer.class.getCanonicalName();
+
+ ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);
+
+ return builder.start();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java
new file mode 100644
index 0000000000..a7432da464
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoServer2.java
@@ -0,0 +1,98 @@
+package com.baeldung.java.nio2.async;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousServerSocketChannel;
+import java.nio.channels.AsynchronousSocketChannel;
+import java.nio.channels.CompletionHandler;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AsyncEchoServer2 {
+ private AsynchronousServerSocketChannel serverChannel;
+ private AsynchronousSocketChannel clientChannel;
+
+ public AsyncEchoServer2() {
+ try {
+ serverChannel = AsynchronousServerSocketChannel.open();
+ InetSocketAddress hostAddress = new InetSocketAddress("localhost", 4999);
+ serverChannel.bind(hostAddress);
+ while (true) {
+
+ serverChannel.accept(null, new CompletionHandler() {
+
+ @Override
+ public void completed(AsynchronousSocketChannel result, Object attachment) {
+ if (serverChannel.isOpen())
+ serverChannel.accept(null, this);
+ clientChannel = result;
+ if ((clientChannel != null) && (clientChannel.isOpen())) {
+ ReadWriteHandler handler = new ReadWriteHandler();
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ Map readInfo = new HashMap<>();
+ readInfo.put("action", "read");
+ readInfo.put("buffer", buffer);
+ clientChannel.read(buffer, readInfo, handler);
+ }
+ }
+
+ @Override
+ public void failed(Throwable exc, Object attachment) {
+ // process error
+ }
+ });
+ try {
+ System.in.read();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ class ReadWriteHandler implements CompletionHandler> {
+
+ @Override
+ public void completed(Integer result, Map attachment) {
+ String action = (String) attachment.get("action");
+ if ("read".equals(action)) {
+ ByteBuffer buffer = (ByteBuffer) attachment.get("buffer");
+ buffer.flip();
+ attachment.put("action", "write");
+ clientChannel.write(buffer, attachment, this);
+ buffer.clear();
+ } else if ("write".equals(action)) {
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ attachment.put("action", "read");
+ attachment.put("buffer", buffer);
+ clientChannel.read(buffer, attachment, this);
+ }
+
+ }
+
+ @Override
+ public void failed(Throwable exc, Map attachment) {
+
+ }
+
+ }
+
+ public static void main(String[] args) {
+ new AsyncEchoServer2();
+ }
+
+ public static Process start() throws IOException, InterruptedException {
+ String javaHome = System.getProperty("java.home");
+ String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
+ String classpath = System.getProperty("java.class.path");
+ String className = AsyncEchoServer2.class.getCanonicalName();
+
+ ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);
+
+ return builder.start();
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoTest.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoTest.java
new file mode 100644
index 0000000000..7ac388fb09
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncEchoTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.java.nio2.async;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AsyncEchoTest {
+
+ Process server;
+ AsyncEchoClient client;
+
+ @Before
+ public void setup() throws IOException, InterruptedException {
+ server = AsyncEchoServer2.start();
+ client = AsyncEchoClient.getInstance();
+ }
+
+ @Test
+ public void givenServerClient_whenServerEchosMessage_thenCorrect() {
+ String resp1 = client.sendMessage("hello");
+ String resp2 = client.sendMessage("world");
+ assertEquals("hello", resp1);
+ assertEquals("world", resp2);
+ }
+
+ @After
+ public void teardown() throws IOException {
+ server.destroy();
+ client.stop();
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileTest.java b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileTest.java
new file mode 100644
index 0000000000..4395017e63
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/async/AsyncFileTest.java
@@ -0,0 +1,126 @@
+package com.baeldung.java.nio2.async;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.channels.AsynchronousFileChannel;
+import java.nio.channels.CompletionHandler;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import static org.junit.Assert.assertEquals;
+
+public class AsyncFileTest {
+ @Test
+ public void givenPath_whenReadsContentWithFuture_thenCorrect() throws IOException, ExecutionException, InterruptedException {
+ Path path = Paths.get(URI.create(this.getClass().getClassLoader().getResource("file.txt").toString()));
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ Future operation = fileChannel.read(buffer, 0);
+
+ operation.get();
+
+ String fileContent = new String(buffer.array()).trim();
+ buffer.clear();
+
+ assertEquals(fileContent, "baeldung.com");
+ }
+
+ @Test
+ public void givenPath_whenReadsContentWithCompletionHandler_thenCorrect() throws IOException {
+ Path path = Paths.get(URI.create(AsyncFileTest.class.getResource("/file.txt").toString()));
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ fileChannel.read(buffer, 0, buffer, new CompletionHandler() {
+
+ @Override
+ public void completed(Integer result, ByteBuffer attachment) {
+ // result is number of bytes read
+ // attachment is the buffer
+
+ }
+
+ @Override
+ public void failed(Throwable exc, ByteBuffer attachment) {
+
+ }
+ });
+ }
+
+ @Test
+ public void givenPathAndContent_whenWritesToFileWithFuture_thenCorrect() throws IOException, ExecutionException, InterruptedException {
+ String fileName = "temp";
+ Path path = Paths.get(fileName);
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ long position = 0;
+
+ buffer.put("hello world".getBytes());
+ buffer.flip();
+
+ Future operation = fileChannel.write(buffer, position);
+ buffer.clear();
+
+ operation.get();
+
+ String content = readContent(path);
+ assertEquals("hello world", content);
+ }
+
+ @Test
+ public void givenPathAndContent_whenWritesToFileWithHandler_thenCorrect() throws IOException {
+ String fileName = UUID.randomUUID().toString();
+ Path path = Paths.get(fileName);
+ AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE);
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ buffer.put("hello world".getBytes());
+ buffer.flip();
+
+ fileChannel.write(buffer, 0, buffer, new CompletionHandler() {
+
+ @Override
+ public void completed(Integer result, ByteBuffer attachment) {
+ // result is number of bytes written
+ // attachment is the buffer
+
+ }
+
+ @Override
+ public void failed(Throwable exc, ByteBuffer attachment) {
+
+ }
+ });
+ }
+
+ public static String readContent(Path file) throws ExecutionException, InterruptedException {
+ AsynchronousFileChannel fileChannel = null;
+ try {
+ fileChannel = AsynchronousFileChannel.open(file, StandardOpenOption.READ);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+ Future operation = fileChannel.read(buffer, 0);
+
+ operation.get();
+
+ String fileContent = new String(buffer.array()).trim();
+ buffer.clear();
+ return fileContent;
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsTest.java b/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsTest.java
new file mode 100644
index 0000000000..24097542d0
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java/nio2/attributes/BasicAttribsTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.java.nio2.attributes;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.BasicFileAttributeView;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class BasicAttribsTest {
+ private static final String HOME = System.getProperty("user.home");
+ private static BasicFileAttributes basicAttribs;
+
+ @BeforeClass
+ public static void setup() throws IOException {
+ Path home = Paths.get(HOME);
+ BasicFileAttributeView basicView = Files.getFileAttributeView(home, BasicFileAttributeView.class);
+ basicAttribs = basicView.readAttributes();
+ }
+
+ @Test
+ public void givenFileTimes_whenComparesThem_ThenCorrect() {
+ FileTime created = basicAttribs.creationTime();
+ FileTime modified = basicAttribs.lastModifiedTime();
+ FileTime accessed = basicAttribs.lastAccessTime();
+
+ System.out.println("Created: " + created);
+ System.out.println("Modified: " + modified);
+ System.out.println("Accessed: " + accessed);
+
+ }
+
+ @Test
+ public void givenPath_whenGetsFileSize_thenCorrect() {
+ long size = basicAttribs.size();
+ assertTrue(size > 0);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfDirectory_thenCorrect() {
+ boolean isDir = basicAttribs.isDirectory();
+ assertTrue(isDir);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfFile_thenCorrect() {
+ boolean isFile = basicAttribs.isRegularFile();
+ assertFalse(isFile);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfSymLink_thenCorrect() {
+ boolean isSymLink = basicAttribs.isSymbolicLink();
+ assertFalse(isSymLink);
+ }
+
+ @Test
+ public void givenPath_whenChecksIfOther_thenCorrect() {
+ boolean isOther = basicAttribs.isOther();
+ assertFalse(isOther);
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java b/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java
new file mode 100644
index 0000000000..cd092fdd70
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/java8/optional/OptionalTest.java
@@ -0,0 +1,211 @@
+package com.baeldung.java8.optional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import com.baeldung.java_8_features.Person;
+
+import org.junit.Test;
+
+public class OptionalTest {
+ // creating Optional
+ @Test
+ public void whenCreatesEmptyOptional_thenCorrect() {
+ Optional empty = Optional.empty();
+ assertFalse(empty.isPresent());
+ }
+
+ @Test
+ public void givenNonNull_whenCreatesNonNullable_thenCorrect() {
+ String name = "baeldung";
+ Optional.of(name);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNull_whenThrowsErrorOnCreate_thenCorrect() {
+ String name = null;
+ Optional opt = Optional.of(name);
+ }
+
+ @Test
+ public void givenNonNull_whenCreatesOptional_thenCorrect() {
+ String name = "baeldung";
+ Optional opt = Optional.of(name);
+ assertEquals("Optional[baeldung]", opt.toString());
+ }
+
+ @Test
+ public void givenNonNull_whenCreatesNullable_thenCorrect() {
+ String name = "baeldung";
+ Optional opt = Optional.ofNullable(name);
+ assertEquals("Optional[baeldung]", opt.toString());
+ }
+
+ @Test
+ public void givenNull_whenCreatesNullable_thenCorrect() {
+ String name = null;
+ Optional opt = Optional.ofNullable(name);
+ assertEquals("Optional.empty", opt.toString());
+ }
+ // Checking Value With isPresent()
+
+ @Test
+ public void givenOptional_whenIsPresentWorks_thenCorrect() {
+ Optional opt = Optional.of("Baeldung");
+ assertTrue(opt.isPresent());
+
+ opt = Optional.ofNullable(null);
+ assertFalse(opt.isPresent());
+ }
+
+ // Condition Action With ifPresent()
+ @Test
+ public void givenOptional_whenIfPresentWorks_thenCorrect() {
+ Optional opt = Optional.of("baeldung");
+ opt.ifPresent(name -> System.out.println(name.length()));
+ opt.ifPresent(String::length);
+ }
+
+ // returning Value With get()
+ @Test
+ public void givenOptional_whenGetsValue_thenCorrect() {
+ Optional opt = Optional.of("baeldung");
+ String name = opt.get();
+ assertEquals("baeldung", name);
+ }
+
+ @Test(expected = NoSuchElementException.class)
+ public void givenOptionalWithNull_whenGetThrowsException_thenCorrect() {
+ Optional opt = Optional.ofNullable(null);
+ String name = opt.get();
+ }
+
+ // Conditional Return With filter()
+ @Test
+ public void whenOptionalFilterWorks_thenCorrect() {
+ Integer year = 2016;
+ Optional yearOptional = Optional.of(year);
+ boolean is2016 = yearOptional.filter(y -> y == 2016).isPresent();
+ assertTrue(is2016);
+ boolean is2017 = yearOptional.filter(y -> y == 2017).isPresent();
+ assertFalse(is2017);
+ }
+
+ // Transforming Value With map()
+ @Test
+ public void givenOptional_whenMapWorks_thenCorrect() {
+ List companyNames = Arrays.asList("paypal", "oracle", "", "microsoft", "", "apple");
+ Optional> listOptional = Optional.of(companyNames);
+
+ int size = listOptional.map(list -> list.size()).get();
+ assertEquals(6, size);
+ }
+
+ @Test
+ public void givenOptional_whenMapWorks_thenCorrect2() {
+ String name = "baeldung";
+ Optional nameOptional = Optional.of(name);
+
+ int len = nameOptional.map(s -> s.length()).get();
+ assertEquals(8, len);
+ }
+
+ @Test
+ public void givenOptional_whenMapWorksWithFilter_thenCorrect() {
+ String password = " password ";
+ Optional passOpt = Optional.of(password);
+ boolean correctPassword = passOpt.filter(pass -> pass.equals("password")).isPresent();
+ assertFalse(correctPassword);
+
+ correctPassword = passOpt.map(pass -> pass.trim()).filter(pass -> pass.equals("password")).isPresent();
+ assertTrue(correctPassword);
+ }
+
+ // Transforming Value With flatMap()
+ @Test
+ public void givenOptional_whenFlatMapWorks_thenCorrect2() {
+ Person person = new Person("john", 26);
+ Optional personOptional = Optional.of(person);
+
+ Optional> nameOptionalWrapper = personOptional.map(p -> p.getName());
+ Optional nameOptional = nameOptionalWrapper.get();
+ String name1 = nameOptional.get();
+ assertEquals("john", name1);
+
+ String name = personOptional.flatMap(p -> p.getName()).get();
+ assertEquals("john", name);
+ }
+
+ @Test
+ public void givenOptional_whenFlatMapWorksWithFilter_thenCorrect() {
+ Person person = new Person("john", 26);
+ person.setPassword("password");
+ Optional personOptional = Optional.of(person);
+
+ String password = personOptional.flatMap(p -> p.getPassword()).filter(cleanPass -> cleanPass.equals("password")).get();
+ assertEquals("password", password);
+ }
+
+ // Default Value With orElse
+ @Test
+ public void whenOrElseWorks_thenCorrect() {
+ String nullName = null;
+ String name = Optional.ofNullable(nullName).orElse("john");
+ assertEquals("john", name);
+ }
+
+ // Default Value With orElseGet
+ @Test
+ public void whenOrElseGetWorks_thenCorrect() {
+ String nullName = null;
+ String name = Optional.ofNullable(nullName).orElseGet(() -> "john");
+ assertEquals("john", name);
+
+ name = Optional.ofNullable(nullName).orElseGet(() -> {
+ return "doe";
+ });
+ assertEquals("doe", name);
+
+ }
+
+ @Test
+ public void whenOrElseGetAndOrElseOverlap_thenCorrect() {
+ String text = null;
+ System.out.println("Using orElseGet:");
+ String defaultText = Optional.ofNullable(text).orElseGet(this::getMyDefault);
+ assertEquals("Default Value", defaultText);
+
+ System.out.println("Using orElse:");
+ defaultText = Optional.ofNullable(text).orElse(getMyDefault());
+ assertEquals("Default Value", defaultText);
+ }
+
+ @Test
+ public void whenOrElseGetAndOrElseDiffer_thenCorrect() {
+ String text = "Text present";
+ System.out.println("Using orElseGet:");
+ String defaultText = Optional.ofNullable(text).orElseGet(this::getMyDefault);
+ assertEquals("Text present", defaultText);
+
+ System.out.println("Using orElse:");
+ defaultText = Optional.ofNullable(text).orElse(getMyDefault());
+ assertEquals("Text present", defaultText);
+ }
+
+ // Exceptions With orElseThrow
+ @Test(expected = IllegalArgumentException.class)
+ public void whenOrElseThrowWorks_thenCorrect() {
+ String nullName = null;
+ String name = Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);
+ }
+
+ public String getMyDefault() {
+ System.out.println("Getting default value...");
+ return "Default Value";
+ }
+}
diff --git a/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java b/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
new file mode 100644
index 0000000000..0d913db1bd
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
@@ -0,0 +1,110 @@
+package org.baeldung.java.collections;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.Arrays.asList;
+
+public class CollectionsConcatenateUnitTest {
+
+ @Test
+ public void givenUsingJava8_whenConcatenatingUsingConcat_thenCorrect() {
+ Collection collectionA = asList("S", "T");
+ Collection collectionB = asList("U", "V");
+ Collection collectionC = asList("W", "X");
+
+ Stream combinedStream = Stream.concat(Stream.concat(collectionA.stream(), collectionB.stream()), collectionC.stream());
+ Collection collectionCombined = combinedStream.collect(Collectors.toList());
+
+ Assert.assertEquals(asList("S", "T", "U", "V", "W", "X"), collectionCombined);
+ }
+
+ @Test
+ public void givenUsingJava8_whenConcatenatingUsingflatMap_thenCorrect() {
+ Collection collectionA = asList("S", "T");
+ Collection collectionB = asList("U", "V");
+
+ Stream combinedStream = Stream.of(collectionA, collectionB).flatMap(Collection::stream);
+ Collection collectionCombined = combinedStream.collect(Collectors.toList());
+
+ Assert.assertEquals(asList("S", "T", "U", "V"), collectionCombined);
+ }
+
+ @Test
+ public void givenUsingGuava_whenConcatenatingUsingIterables_thenCorrect() {
+ Collection collectionA = asList("S", "T");
+ Collection collectionB = asList("U", "V");
+
+ Iterable combinedIterables = Iterables.unmodifiableIterable(Iterables.concat(collectionA, collectionB));
+ Collection collectionCombined = Lists.newArrayList(combinedIterables);
+
+ Assert.assertEquals(asList("S", "T", "U", "V"), collectionCombined);
+ }
+
+ @Test
+ public void givenUsingJava7_whenConcatenatingUsingIterables_thenCorrect() {
+ Collection collectionA = asList("S", "T");
+ Collection collectionB = asList("U", "V");
+
+ Iterable combinedIterables = concat(collectionA, collectionB);
+ Collection collectionCombined = makeListFromIterable(combinedIterables);
+ Assert.assertEquals(Arrays.asList("S", "T", "U", "V"), collectionCombined);
+ }
+
+ public static Iterable concat(Iterable extends E> i1, Iterable extends E> i2) {
+ return new Iterable() {
+ public Iterator iterator() {
+ return new Iterator() {
+ Iterator extends E> listIterator = i1.iterator();
+ Boolean checkedHasNext;
+ E nextValue;
+ private boolean startTheSecond;
+
+ void theNext() {
+ if (listIterator.hasNext()) {
+ checkedHasNext = true;
+ nextValue = listIterator.next();
+ } else if (startTheSecond)
+ checkedHasNext = false;
+ else {
+ startTheSecond = true;
+ listIterator = i2.iterator();
+ theNext();
+ }
+ }
+
+ public boolean hasNext() {
+ if (checkedHasNext == null)
+ theNext();
+ return checkedHasNext;
+ }
+
+ public E next() {
+ if (!hasNext())
+ throw new NoSuchElementException();
+ checkedHasNext = null;
+ return nextValue;
+ }
+
+ public void remove() {
+ listIterator.remove();
+ }
+ };
+ }
+ };
+ }
+
+ public static List makeListFromIterable(Iterable iter) {
+ List list = new ArrayList<>();
+ for (E item : iter) {
+ list.add(item);
+ }
+ return list;
+ }
+}
diff --git a/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java b/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
new file mode 100644
index 0000000000..7e43fef9fa
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
@@ -0,0 +1,179 @@
+package org.baeldung.java.collections;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+public class JoinSplitCollectionsUnitTest {
+
+ @Test
+ public void whenJoiningTwoArrays_thenJoined() {
+ String[] animals1 = new String[] { "Dog", "Cat" };
+ String[] animals2 = new String[] { "Bird", "Cow" };
+ String[] result = Stream.concat(Arrays.stream(animals1), Arrays.stream(animals2))
+ .toArray(String[]::new);
+
+ assertArrayEquals(result, new String[] { "Dog", "Cat", "Bird", "Cow" });
+ }
+
+ @Test
+ public void whenJoiningTwoCollections_thenJoined() {
+ Collection collection1 = Arrays.asList(7, 8, 9);
+ Collection collection2 = Arrays.asList(10, 11, 12);
+ Collection result = Stream.concat(collection1.stream(), collection2.stream())
+ .collect(Collectors.toList());
+
+ assertTrue(result.equals(Arrays.asList(7, 8, 9, 10, 11, 12)));
+ }
+
+ @Test
+ public void whenJoiningTwoCollectionsWithFilter_thenJoined() {
+ Collection collection1 = Arrays.asList(7, 8, 11);
+ Collection collection2 = Arrays.asList(9, 12, 10);
+ Collection result = Stream.concat(collection1.stream(), collection2.stream())
+ .filter(next -> next <= 10)
+ .collect(Collectors.toList());
+
+ assertTrue(result.equals(Arrays.asList(7, 8, 9, 10)));
+ }
+
+ @Test
+ public void whenConvertArrayToString_thenConverted() {
+ String[] colors = new String[] { "Red", "Blue", "Green", "Yellow" };
+ String result = Arrays.stream(colors)
+ .collect(Collectors.joining(", "));
+
+ assertEquals(result, "Red, Blue, Green, Yellow");
+ }
+
+ @Test
+ public void whenConvertCollectionToString_thenConverted() {
+ Collection directions = Arrays.asList("Left", "Right", "Top", "Bottom");
+ String result = directions.stream()
+ .collect(Collectors.joining(", "));
+
+ assertEquals(result, "Left, Right, Top, Bottom");
+ }
+
+ @Test
+ public void whenConvertMapToString_thenConverted() {
+ Map users = new HashMap<>();
+ users.put(1, "John Doe");
+ users.put(2, "Paul Smith");
+ users.put(3, "Susan Anderson");
+
+ String result = users.entrySet().stream().map(entry -> entry.getKey() + " = " + entry.getValue())
+ .collect(Collectors.joining(", "));
+
+ assertEquals(result, "1 = John Doe, 2 = Paul Smith, 3 = Susan Anderson");
+ }
+
+ @Test
+ public void whenConvertNestedCollectionToString_thenConverted() {
+ Collection> nested = new ArrayList<>();
+ nested.add(Arrays.asList("Left", "Right", "Top", "Bottom"));
+ nested.add(Arrays.asList("Red", "Blue", "Green", "Yellow"));
+
+ String result = nested.stream()
+ .map(nextList -> nextList.stream()
+ .collect(Collectors.joining("-")))
+ .collect(Collectors.joining("; "));
+
+ assertEquals(result, "Left-Right-Top-Bottom; Red-Blue-Green-Yellow");
+ }
+
+ @Test
+ public void whenConvertCollectionToStringAndSkipNull_thenConverted() {
+ Collection fruits = Arrays.asList("Apple", "Orange", null, "Grape");
+ String result = fruits.stream()
+ .filter(next -> next != null)
+ .collect(Collectors.joining(", "));
+
+ assertEquals(result, "Apple, Orange, Grape");
+ }
+
+ @Test
+ public void whenSplitCollectionHalf_thenConverted() {
+ Collection numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ Collection result1 = new ArrayList<>();
+ Collection result2 = new ArrayList<>();
+ AtomicInteger count = new AtomicInteger();
+ int midpoint = Math.round(numbers.size() / 2);
+
+ numbers.forEach(next -> {
+ int index = count.getAndIncrement();
+ if(index < midpoint){
+ result1.add(next);
+ }else{
+ result2.add(next);
+ }
+ });
+
+ assertTrue(result1.equals(Arrays.asList(1, 2, 3, 4, 5)));
+ assertTrue(result2.equals(Arrays.asList(6, 7, 8, 9, 10)));
+ }
+
+ @Test
+ public void whenSplitArrayByWordLength_thenConverted() {
+ String[] words = new String[]{"bye", "cold", "it", "and", "my", "word"};
+ Map> result = Arrays.stream(words)
+ .collect(Collectors.groupingBy(word -> word.length()));
+
+ assertTrue(result.get(2).equals(Arrays.asList("it", "my")));
+ assertTrue(result.get(3).equals(Arrays.asList("bye", "and")));
+ assertTrue(result.get(4).equals(Arrays.asList("cold", "word")));
+ }
+
+ @Test
+ public void whenConvertStringToArray_thenConverted() {
+ String colors = "Red, Blue, Green, Yellow";
+ String[] result = colors.split(", ");
+
+ assertArrayEquals(result, new String[] { "Red", "Blue", "Green", "Yellow" });
+ }
+
+ @Test
+ public void whenConvertStringToCollection_thenConverted() {
+ String colors = "Left, Right, Top, Bottom";
+ Collection result = Arrays.asList(colors.split(", "));
+
+ assertTrue(result.equals(Arrays.asList("Left", "Right", "Top", "Bottom")));
+ }
+
+ @Test
+ public void whenConvertStringToMap_thenConverted() {
+ String users = "1 = John Doe, 2 = Paul Smith, 3 = Susan Anderson";
+
+ Map result = Arrays.stream(users.split(", "))
+ .map(next -> next.split(" = "))
+ .collect(Collectors.toMap(entry -> Integer.parseInt(entry[0]), entry -> entry[1]));
+
+ assertEquals(result.get(1), "John Doe");
+ assertEquals(result.get(2), "Paul Smith");
+ assertEquals(result.get(3), "Susan Anderson");
+ }
+
+ @Test
+ public void whenConvertCollectionToStringMultipleSeparators_thenConverted() {
+ String fruits = "Apple. , Orange, Grape. Lemon";
+
+ Collection result = Arrays.stream(fruits.split("[,|.]"))
+ .map(String::trim)
+ .filter(next -> !next.isEmpty())
+ .collect(Collectors.toList());
+
+ assertTrue(result.equals(Arrays.asList("Apple", "Orange", "Grape", "Lemon")));
+ }
+}
diff --git a/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java b/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java
index 4b56a97325..6d972611f1 100644
--- a/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java
+++ b/core-java/src/test/java/org/baeldung/java/io/JavaFileUnitTest.java
@@ -1,7 +1,9 @@
package org.baeldung.java.io;
-import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
-import static org.junit.Assert.assertTrue;
+import org.apache.commons.io.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
import java.io.File;
import java.io.IOException;
@@ -9,17 +11,28 @@ import java.nio.file.FileSystemException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.UUID;
-import org.apache.commons.io.FileUtils;
-import org.junit.Test;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.junit.Assert.assertTrue;
public class JavaFileUnitTest {
- // create a file
+ private static final String TEMP_DIR = "src/test/resources/temp" + UUID.randomUUID().toString();
+
+ @BeforeClass
+ public static void setup() throws IOException {
+ Files.createDirectory(Paths.get(TEMP_DIR));
+ }
+
+ @AfterClass
+ public static void cleanup() throws IOException {
+ FileUtils.deleteDirectory(new File(TEMP_DIR));
+ }
@Test
public final void givenUsingJDK6_whenCreatingFile_thenCorrect() throws IOException {
- final File newFile = new File("src/test/resources/newFile_jdk6.txt");
+ final File newFile = new File(TEMP_DIR + "/newFile_jdk6.txt");
final boolean success = newFile.createNewFile();
assertTrue(success);
@@ -27,48 +40,48 @@ public class JavaFileUnitTest {
@Test
public final void givenUsingJDK7nio2_whenCreatingFile_thenCorrect() throws IOException {
- final Path newFilePath = Paths.get("src/test/resources/newFile_jdk7.txt");
+ final Path newFilePath = Paths.get(TEMP_DIR + "/newFile_jdk7.txt");
Files.createFile(newFilePath);
}
@Test
public final void givenUsingCommonsIo_whenCreatingFile_thenCorrect() throws IOException {
- FileUtils.touch(new File("src/test/resources/newFile_commonsio.txt"));
+ FileUtils.touch(new File(TEMP_DIR + "/newFile_commonsio.txt"));
}
@Test
public final void givenUsingGuava_whenCreatingFile_thenCorrect() throws IOException {
- com.google.common.io.Files.touch(new File("src/test/resources/newFile_guava.txt"));
+ com.google.common.io.Files.touch(new File(TEMP_DIR + "/newFile_guava.txt"));
}
// move a file
@Test
public final void givenUsingJDK6_whenMovingFile_thenCorrect() throws IOException {
- final File fileToMove = new File("src/test/resources/toMoveFile_jdk6.txt");
+ final File fileToMove = new File(TEMP_DIR + "/toMoveFile_jdk6.txt");
fileToMove.createNewFile();// .exists();
- final File destDir = new File("src/test/resources/");
+ final File destDir = new File(TEMP_DIR + "/");
destDir.mkdir();
- final boolean isMoved = fileToMove.renameTo(new File("src/test/resources/movedFile_jdk6.txt"));
+ final boolean isMoved = fileToMove.renameTo(new File(TEMP_DIR + "/movedFile_jdk6.txt"));
if (!isMoved) {
- throw new FileSystemException("src/test/resources/movedFile_jdk6.txt");
+ throw new FileSystemException(TEMP_DIR + "/movedFile_jdk6.txt");
}
}
@Test
public final void givenUsingJDK7Nio2_whenMovingFile_thenCorrect() throws IOException {
- final Path fileToMovePath = Files.createFile(Paths.get("src/test/resources/" + randomAlphabetic(5) + ".txt"));
- final Path targetPath = Paths.get("src/main/resources/");
+ final Path fileToMovePath = Files.createFile(Paths.get(TEMP_DIR + "/" + randomAlphabetic(5) + ".txt"));
+ final Path targetPath = Paths.get(TEMP_DIR + "/");
Files.move(fileToMovePath, targetPath.resolve(fileToMovePath.getFileName()));
}
@Test
public final void givenUsingGuava_whenMovingFile_thenCorrect() throws IOException {
- final File fileToMove = new File("src/test/resources/fileToMove.txt");
+ final File fileToMove = new File(TEMP_DIR + "/fileToMove.txt");
fileToMove.createNewFile();
- final File destDir = new File("src/main/resources/");
+ final File destDir = new File(TEMP_DIR + "/temp");
final File targetFile = new File(destDir, fileToMove.getName());
com.google.common.io.Files.createParentDirs(targetFile);
com.google.common.io.Files.move(fileToMove, targetFile);
@@ -76,23 +89,24 @@ public class JavaFileUnitTest {
@Test
public final void givenUsingApache_whenMovingFile_thenCorrect() throws IOException {
- FileUtils.touch(new File("src/test/resources/fileToMove_apache.txt"));
- FileUtils.moveFile(FileUtils.getFile("src/test/resources/fileToMove_apache.txt"), FileUtils.getFile("src/test/resources/fileMoved_apache2.txt"));
+ FileUtils.touch(new File(TEMP_DIR + "/fileToMove_apache.txt"));
+ FileUtils.moveFile(FileUtils.getFile(TEMP_DIR + "/fileToMove_apache.txt"), FileUtils.getFile(TEMP_DIR + "/fileMoved_apache2.txt"));
}
@Test
public final void givenUsingApache_whenMovingFileApproach2_thenCorrect() throws IOException {
- FileUtils.touch(new File("src/test/resources/fileToMove_apache.txt"));
- FileUtils.moveFileToDirectory(FileUtils.getFile("src/test/resources/fileToMove_apache.txt"), FileUtils.getFile("src/main/resources/"), true);
+ FileUtils.touch(new File(TEMP_DIR + "/fileToMove_apache.txt"));
+ Files.createDirectory(Paths.get(TEMP_DIR + "/temp"));
+ FileUtils.moveFileToDirectory(FileUtils.getFile(TEMP_DIR + "/fileToMove_apache.txt"), FileUtils.getFile(TEMP_DIR + "/temp"), true);
}
// delete a file
@Test
public final void givenUsingJDK6_whenDeletingAFile_thenCorrect() throws IOException {
- new File("src/test/resources/fileToDelete_jdk6.txt").createNewFile();
+ new File(TEMP_DIR + "/fileToDelete_jdk6.txt").createNewFile();
- final File fileToDelete = new File("src/test/resources/fileToDelete_jdk6.txt");
+ final File fileToDelete = new File(TEMP_DIR + "/fileToDelete_jdk6.txt");
final boolean success = fileToDelete.delete();
assertTrue(success);
@@ -100,17 +114,17 @@ public class JavaFileUnitTest {
@Test
public final void givenUsingJDK7nio2_whenDeletingAFile_thenCorrect() throws IOException {
- Files.createFile(Paths.get("src/test/resources/fileToDelete_jdk7.txt"));
+ Files.createFile(Paths.get(TEMP_DIR + "/fileToDelete_jdk7.txt"));
- final Path fileToDeletePath = Paths.get("src/test/resources/fileToDelete_jdk7.txt");
+ final Path fileToDeletePath = Paths.get(TEMP_DIR + "/fileToDelete_jdk7.txt");
Files.delete(fileToDeletePath);
}
@Test
public final void givenUsingCommonsIo_whenDeletingAFileV1_thenCorrect() throws IOException {
- FileUtils.touch(new File("src/test/resources/fileToDelete_commonsIo.txt"));
+ FileUtils.touch(new File(TEMP_DIR + "/fileToDelete_commonsIo.txt"));
- final File fileToDelete = FileUtils.getFile("src/test/resources/fileToDelete_commonsIo.txt");
+ final File fileToDelete = FileUtils.getFile(TEMP_DIR + "/fileToDelete_commonsIo.txt");
final boolean success = FileUtils.deleteQuietly(fileToDelete);
assertTrue(success);
@@ -118,9 +132,9 @@ public class JavaFileUnitTest {
@Test
public void givenUsingCommonsIo_whenDeletingAFileV2_thenCorrect() throws IOException {
- FileUtils.touch(new File("src/test/resources/fileToDelete.txt"));
+ FileUtils.touch(new File(TEMP_DIR + "/fileToDelete.txt"));
- FileUtils.forceDelete(FileUtils.getFile("src/test/resources/fileToDelete.txt"));
+ FileUtils.forceDelete(FileUtils.getFile(TEMP_DIR + "/fileToDelete.txt"));
}
}
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java/src/test/java/org/baeldung/java/sorting/Employee.java
new file mode 100644
index 0000000000..477092bfcb
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/sorting/Employee.java
@@ -0,0 +1,55 @@
+package org.baeldung.java.sorting;
+
+public class Employee implements Comparable {
+
+ private String name;
+ private int age;
+ private double salary;
+
+ public Employee(String name, int age, double salary) {
+ this.name = name;
+ this.age = age;
+ this.salary = salary;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return ((Employee) obj).getName().equals(getName());
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ Employee e = (Employee) o;
+ return getName().compareTo(e.getName());
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuffer().append("(").append(getName()).append(getAge()).append(",").append(getSalary()).append(")").toString();
+ }
+
+}
diff --git a/core-java/src/test/java/org/baeldung/java/sorting/JavaSorting.java b/core-java/src/test/java/org/baeldung/java/sorting/JavaSorting.java
new file mode 100644
index 0000000000..72730aeb8b
--- /dev/null
+++ b/core-java/src/test/java/org/baeldung/java/sorting/JavaSorting.java
@@ -0,0 +1,186 @@
+package org.baeldung.java.sorting;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.primitives.Ints;
+
+public class JavaSorting {
+
+ private int[] toSort;
+ private int[] sortedInts;
+ private int[] sortedRangeInts;
+ // private Integer [] integers;
+ // private Integer [] sortedIntegers;
+ // private List integersList;
+ // private List sortedIntegersList;
+ private Employee[] employees;
+ private Employee[] employeesSorted;
+ private Employee[] employeesSortedByAge;
+ private HashMap map;
+
+ @Before
+ public void initVariables() {
+
+ toSort = new int[] { 5, 1, 89, 255, 7, 88, 200, 123, 66 };
+ sortedInts = new int[] { 1, 5, 7, 66, 88, 89, 123, 200, 255 };
+ sortedRangeInts = new int[] { 5, 1, 89, 7, 88, 200, 255, 123, 66 };
+
+ // integers = new Integer[]
+ // { 5, 1, 89, 255, 7, 88, 200, 123, 66 };
+ // sortedIntegers = new Integer[]
+ // {1, 5, 7, 66, 88, 89, 123, 200, 255};
+ //
+ // integersList = Arrays.asList(new Integer[] { 5, 1, 89, 255, 7, 88, 200, 123, 66 });
+ // sortedIntegersList = Arrays.asList(new Integer[] {1, 5, 7, 66, 88, 89, 123, 200, 255});
+
+ employees = new Employee[] { new Employee("John", 23, 5000), new Employee("Steve", 26, 6000), new Employee("Frank", 33, 7000), new Employee("Earl", 43, 10000), new Employee("Jessica", 23, 4000), new Employee("Pearl", 33, 6000) };
+ employeesSorted = new Employee[] { new Employee("Earl", 43, 10000), new Employee("Frank", 33, 70000), new Employee("Jessica", 23, 4000), new Employee("John", 23, 5000), new Employee("Pearl", 33, 4000), new Employee("Steve", 26, 6000) };
+ employeesSortedByAge = new Employee[] { new Employee("John", 23, 5000), new Employee("Jessica", 23, 4000), new Employee("Steve", 26, 6000), new Employee("Frank", 33, 70000), new Employee("Pearl", 33, 4000), new Employee("Earl", 43, 10000) };
+
+ HashMap map = new HashMap<>();
+ map.put(55, "John");
+ map.put(22, "Apple");
+ map.put(66, "Earl");
+ map.put(77, "Pearl");
+ map.put(12, "George");
+ map.put(6, "Rocky");
+
+ }
+
+ @Test
+ public void givenIntArray_whenUsingSort_thenSortedArray() {
+ Arrays.sort(toSort);
+
+ assertTrue(Arrays.equals(toSort, sortedInts));
+ }
+
+ @Test
+ public void givenIntegerArray_whenUsingSort_thenSortedArray() {
+ Integer[] integers = ArrayUtils.toObject(toSort);
+ Arrays.sort(integers, new Comparator() {
+ @Override
+ public int compare(Integer a, Integer b) {
+ return a - b;
+ }
+ });
+
+ assertTrue(Arrays.equals(integers, ArrayUtils.toObject(sortedInts)));
+ }
+
+ @Test
+ public void givenArray_whenUsingSortWithLambdas_thenSortedArray() {
+ Integer[] integersToSort = ArrayUtils.toObject(toSort);
+ Arrays.sort(integersToSort, (a, b) -> {
+ return a - b;
+ });
+
+ assertTrue(Arrays.equals(integersToSort, ArrayUtils.toObject(sortedInts)));
+ }
+
+ @Test
+ public void givenEmpArray_SortEmpArray_thenSortedArrayinNaturalOrder() {
+ Arrays.sort(employees);
+
+ assertTrue(Arrays.equals(employees, employeesSorted));
+ }
+
+ @Test
+ public void givenIntArray_whenUsingRangeSort_thenRangeSortedArray() {
+ Arrays.sort(toSort, 3, 7);
+
+ assertTrue(Arrays.equals(toSort, sortedRangeInts));
+ }
+
+ @Test
+ public void givenIntArray_whenUsingParallelSort_thenArraySorted() {
+ Arrays.parallelSort(toSort);
+
+ assertTrue(Arrays.equals(toSort, sortedInts));
+ }
+
+ @Test
+ public void givenArrayObjects_whenUsingComparing_thenSortedArrayObjects() {
+ List employeesList = Arrays.asList(employees);
+
+ employeesList.sort(Comparator.comparing(Employee::getAge));// .thenComparing(Employee::getName));
+
+ assertTrue(Arrays.equals(employeesList.toArray(), employeesSortedByAge));
+ }
+
+ @Test
+ public void givenList_whenUsingSort_thenSortedList() {
+ List toSortList = Ints.asList(toSort);
+ Collections.sort(toSortList);
+
+ assertTrue(Arrays.equals(toSortList.toArray(), ArrayUtils.toObject(sortedInts)));
+ }
+
+ @Test
+ public void givenMap_whenSortingByKeys_thenSortedMap() {
+ Integer[] sortedKeys = new Integer[] { 6, 12, 22, 55, 66, 77 };
+
+ List> entries = new ArrayList<>(map.entrySet());
+ Collections.sort(entries, new Comparator>() {
+ @Override
+ public int compare(Entry o1, Entry o2) {
+ return o1.getKey().compareTo(o2.getKey());
+ }
+ });
+ HashMap sortedMap = new LinkedHashMap<>();
+ for (Map.Entry entry : entries) {
+ sortedMap.put(entry.getKey(), entry.getValue());
+ }
+
+ assertTrue(Arrays.equals(sortedMap.keySet().toArray(), sortedKeys));
+ }
+
+ @Test
+ public void givenMap_whenSortingByValues_thenSortedMap() {
+ String[] sortedValues = new String[] { "Apple", "Earl", "George", "John", "Pearl", "Rocky" };
+
+ List> entries = new ArrayList<>(map.entrySet());
+ Collections.sort(entries, new Comparator>() {
+ @Override
+ public int compare(Entry o1, Entry o2) {
+ return o1.getValue().compareTo(o2.getValue());
+ }
+ });
+ HashMap sortedMap = new LinkedHashMap<>();
+ for (Map.Entry entry : entries) {
+ sortedMap.put(entry.getKey(), entry.getValue());
+ }
+
+ assertTrue(Arrays.equals(sortedMap.values().toArray(), sortedValues));
+ }
+
+ @Test
+ public void givenSet_whenUsingSort_thenSortedSet() {
+ HashSet integersSet = new LinkedHashSet<>(Ints.asList(toSort));
+ HashSet descSortedIntegersSet = new LinkedHashSet<>(Arrays.asList(new Integer[] { 255, 200, 123, 89, 88, 66, 7, 5, 1 }));
+
+ ArrayList list = new ArrayList(integersSet);
+ Collections.sort(list, (i1, i2) -> {
+ return i2 - i1;
+ });
+ integersSet = new LinkedHashSet<>(list);
+
+ assertTrue(Arrays.equals(integersSet.toArray(), descSortedIntegersSet.toArray()));
+ }
+
+}
diff --git a/core-java/src/test/resources/file.txt b/core-java/src/test/resources/file.txt
new file mode 100644
index 0000000000..558d8bbf35
--- /dev/null
+++ b/core-java/src/test/resources/file.txt
@@ -0,0 +1 @@
+baeldung.com
\ No newline at end of file
diff --git a/ejb/ejb-client/pom.xml b/ejb/ejb-client/pom.xml
index 772e4056d3..6ece63572d 100755
--- a/ejb/ejb-client/pom.xml
+++ b/ejb/ejb-client/pom.xml
@@ -1,20 +1,15 @@
- 4.0.0
-
- com.baeldung.ejb
- ejb
- 1.0-SNAPSHOT
-
- ejb-client
- EJB3 Client Maven
- EJB3 Client Maven
-
- 4.12
- 2.19.1
-
-
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ 4.0.0
+
+ com.baeldung.ejb
+ ejb
+ 1.0-SNAPSHOT
+
+ ejb-client
+ EJB3 Client Maven
+ EJB3 Client Maven
org.wildfly
@@ -49,6 +44,4 @@
-
-
\ No newline at end of file
diff --git a/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties b/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
index 077cd7583f..a01a675e44 100755
--- a/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
+++ b/ejb/ejb-client/src/main/resources/jboss-ejb-client.properties
@@ -5,4 +5,4 @@ remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMO
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=${host.auth:JBOSS-LOCAL-USER}
remote.connection.default.username=testUser
-remote.connection.default.password=admin1234!
\ No newline at end of file
+remote.connection.default.password=admin1234!
diff --git a/ejb/ejb-remote/pom.xml b/ejb/ejb-remote/pom.xml
index 65bfc6dbec..d102edd8e3 100755
--- a/ejb/ejb-remote/pom.xml
+++ b/ejb/ejb-remote/pom.xml
@@ -12,11 +12,12 @@
-
- org.jboss.spec.javax.ejb
- jboss-ejb-api_3.2_spec
- provided
-
+
+ javax
+ javaee-api
+ 7.0
+ provided
+
diff --git a/ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java b/ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java
index 4b88747e6a..f34153d83a 100755
--- a/ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java
+++ b/ejb/ejb-remote/src/main/java/com/baeldung/ejb/tutorial/HelloWorldBean.java
@@ -1,13 +1,19 @@
package com.baeldung.ejb.tutorial;
+import javax.annotation.Resource;
+import javax.ejb.SessionContext;
import javax.ejb.Stateless;
@Stateless(name = "HelloWorld")
public class HelloWorldBean implements HelloWorld {
+ @Resource
+ private SessionContext context;
+
@Override
public String getHelloWorld() {
return "Welcome to EJB Tutorial!";
}
+
}
diff --git a/ejb/pom.xml b/ejb/pom.xml
index 5c54cdcf72..8176de7936 100755
--- a/ejb/pom.xml
+++ b/ejb/pom.xml
@@ -36,11 +36,10 @@
- org.jboss.spec
- jboss-javaee-7.0
- 1.0.1.Final
- pom
- import
+ javax
+ javaee-api
+ 7.0
+ provided
diff --git a/pom.xml b/pom.xml
index b8d0303160..77cf615a98 100644
--- a/pom.xml
+++ b/pom.xml
@@ -109,6 +109,7 @@
spring-katharsis
spring-mockito
spring-mvc-java
+ spring-mvc-forms
spring-mvc-no-xml
spring-mvc-tiles
spring-mvc-velocity
diff --git a/spring-core/README.md b/spring-core/README.md
index 5554412c31..f05ba9384f 100644
--- a/spring-core/README.md
+++ b/spring-core/README.md
@@ -1,2 +1,5 @@
### Relevant Articles:
- [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire)
+- [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory)
+- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean)
+
diff --git a/spring-core/pom.xml b/spring-core/pom.xml
index 798a717d01..bf8c8f3ebc 100644
--- a/spring-core/pom.xml
+++ b/spring-core/pom.xml
@@ -4,14 +4,11 @@
4.0.0
com.baeldung
- dependency-injection
+ spring-core
0.0.1-SNAPSHOT
war
- dependency-injection
- Accompanying the demonstration of the use of the annotations related to injection mechanisms, namely
- Resource, Inject, and Autowired
-
+ spring-core
@@ -50,6 +47,11 @@
4.12
test
+
+ com.google.guava
+ guava
+ 20.0
+
diff --git a/spring-core/src/main/java/com/baeldung/constructordi/Config.java b/spring-core/src/main/java/com/baeldung/constructordi/Config.java
new file mode 100644
index 0000000000..07568018f3
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/constructordi/Config.java
@@ -0,0 +1,23 @@
+package com.baeldung.constructordi;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+import com.baeldung.constructordi.domain.Engine;
+import com.baeldung.constructordi.domain.Transmission;
+
+@Configuration
+@ComponentScan("com.baeldung.constructordi")
+public class Config {
+
+ @Bean
+ public Engine engine() {
+ return new Engine("v8", 5);
+ }
+
+ @Bean
+ public Transmission transmission() {
+ return new Transmission("sliding");
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java b/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java
new file mode 100644
index 0000000000..623739f036
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java
@@ -0,0 +1,31 @@
+package com.baeldung.constructordi;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import com.baeldung.constructordi.domain.Car;
+
+public class SpringRunner {
+ public static void main(String[] args) {
+ Car toyota = getCarFromXml();
+
+ System.out.println(toyota);
+
+ toyota = getCarFromJavaConfig();
+
+ System.out.println(toyota);
+ }
+
+ private static Car getCarFromJavaConfig() {
+ ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
+
+ return context.getBean(Car.class);
+ }
+
+ private static Car getCarFromXml() {
+ ApplicationContext context = new ClassPathXmlApplicationContext("baeldung.xml");
+
+ return context.getBean(Car.class);
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java b/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java
new file mode 100644
index 0000000000..9f68ba5cd9
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java
@@ -0,0 +1,21 @@
+package com.baeldung.constructordi.domain;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Car {
+ private Engine engine;
+ private Transmission transmission;
+
+ @Autowired
+ public Car(Engine engine, Transmission transmission) {
+ this.engine = engine;
+ this.transmission = transmission;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Engine: %s Transmission: %s", engine, transmission);
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java b/spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java
new file mode 100644
index 0000000000..f2987988eb
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java
@@ -0,0 +1,16 @@
+package com.baeldung.constructordi.domain;
+
+public class Engine {
+ private String type;
+ private int volume;
+
+ public Engine(String type, int volume) {
+ this.type = type;
+ this.volume = volume;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s %d", type, volume);
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java b/spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java
new file mode 100644
index 0000000000..85271e1f2a
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java
@@ -0,0 +1,14 @@
+package com.baeldung.constructordi.domain;
+
+public class Transmission {
+ private String type;
+
+ public Transmission(String type) {
+ this.type = type;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s", type);
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java b/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java
new file mode 100644
index 0000000000..e5e6d2ec05
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.factorybean;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class FactoryBeanAppConfig {
+
+ @Bean(name = "tool")
+ public ToolFactory toolFactory() {
+ ToolFactory factory = new ToolFactory();
+ factory.setFactoryId(7070);
+ factory.setToolId(2);
+ return factory;
+ }
+}
\ No newline at end of file
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java
new file mode 100644
index 0000000000..981df2206f
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java
@@ -0,0 +1,39 @@
+package com.baeldung.factorybean;
+
+import org.springframework.beans.factory.config.AbstractFactoryBean;
+
+public class NonSingleToolFactory extends AbstractFactoryBean {
+
+ private int factoryId;
+ private int toolId;
+
+ public NonSingleToolFactory() {
+ setSingleton(false);
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return Tool.class;
+ }
+
+ @Override
+ protected Tool createInstance() throws Exception {
+ return new Tool(toolId);
+ }
+
+ public int getFactoryId() {
+ return factoryId;
+ }
+
+ public void setFactoryId(int factoryId) {
+ this.factoryId = factoryId;
+ }
+
+ public int getToolId() {
+ return toolId;
+ }
+
+ public void setToolId(int toolId) {
+ this.toolId = toolId;
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java
new file mode 100644
index 0000000000..76b87bbbbf
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java
@@ -0,0 +1,36 @@
+package com.baeldung.factorybean;
+
+import org.springframework.beans.factory.config.AbstractFactoryBean;
+
+//no need to set singleton property because default value is true
+public class SingleToolFactory extends AbstractFactoryBean {
+
+ private int factoryId;
+ private int toolId;
+
+ @Override
+ public Class> getObjectType() {
+ return Tool.class;
+ }
+
+ @Override
+ protected Tool createInstance() throws Exception {
+ return new Tool(toolId);
+ }
+
+ public int getFactoryId() {
+ return factoryId;
+ }
+
+ public void setFactoryId(int factoryId) {
+ this.factoryId = factoryId;
+ }
+
+ public int getToolId() {
+ return toolId;
+ }
+
+ public void setToolId(int toolId) {
+ this.toolId = toolId;
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/Tool.java b/spring-core/src/main/java/com/baeldung/factorybean/Tool.java
new file mode 100644
index 0000000000..be56745b3d
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/factorybean/Tool.java
@@ -0,0 +1,20 @@
+package com.baeldung.factorybean;
+
+public class Tool {
+ private int id;
+
+ public Tool() {
+ }
+
+ public Tool(int id) {
+ this.id = id;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
diff --git a/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java b/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java
new file mode 100644
index 0000000000..2a17574f8e
--- /dev/null
+++ b/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java
@@ -0,0 +1,40 @@
+package com.baeldung.factorybean;
+
+import org.springframework.beans.factory.FactoryBean;
+
+public class ToolFactory implements FactoryBean {
+
+ private int factoryId;
+ private int toolId;
+
+ @Override
+ public Tool getObject() throws Exception {
+ return new Tool(toolId);
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return Tool.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return false;
+ }
+
+ public int getFactoryId() {
+ return factoryId;
+ }
+
+ public void setFactoryId(int factoryId) {
+ this.factoryId = factoryId;
+ }
+
+ public int getToolId() {
+ return toolId;
+ }
+
+ public void setToolId(int toolId) {
+ this.toolId = toolId;
+ }
+}
diff --git a/spring-core/src/main/resources/baeldung.xml b/spring-core/src/main/resources/baeldung.xml
new file mode 100644
index 0000000000..d84492f1d4
--- /dev/null
+++ b/spring-core/src/main/resources/baeldung.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml
new file mode 100644
index 0000000000..a82b884ee5
--- /dev/null
+++ b/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core/src/main/resources/factorybean-spring-ctx.xml b/spring-core/src/main/resources/factorybean-spring-ctx.xml
new file mode 100644
index 0000000000..3231fda676
--- /dev/null
+++ b/spring-core/src/main/resources/factorybean-spring-ctx.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java b/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java
new file mode 100644
index 0000000000..aa6d7c2cd2
--- /dev/null
+++ b/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.factorybean;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import javax.annotation.Resource;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:factorybean-abstract-spring-ctx.xml" })
+public class AbstractFactoryBeanTest {
+
+ @Resource(name = "singleTool")
+ private Tool tool1;
+ @Resource(name = "singleTool")
+ private Tool tool2;
+ @Resource(name = "nonSingleTool")
+ private Tool tool3;
+ @Resource(name = "nonSingleTool")
+ private Tool tool4;
+
+ @Test
+ public void testSingleToolFactory() {
+ assertThat(tool1.getId(), equalTo(1));
+ assertTrue(tool1 == tool2);
+ }
+
+ @Test
+ public void testNonSingleToolFactory() {
+ assertThat(tool3.getId(), equalTo(2));
+ assertThat(tool4.getId(), equalTo(2));
+ assertTrue(tool3 != tool4);
+ }
+}
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigTest.java b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigTest.java
new file mode 100644
index 0000000000..c725f786dc
--- /dev/null
+++ b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.factorybean;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import javax.annotation.Resource;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = FactoryBeanAppConfig.class)
+public class FactoryBeanJavaConfigTest {
+
+ @Autowired
+ private Tool tool;
+
+ @Resource(name = "&tool")
+ private ToolFactory toolFactory;
+
+ @Test
+ public void testConstructWorkerByJava() {
+ assertThat(tool.getId(), equalTo(2));
+ assertThat(toolFactory.getFactoryId(), equalTo(7070));
+ }
+}
\ No newline at end of file
diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigTest.java b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigTest.java
new file mode 100644
index 0000000000..443515f872
--- /dev/null
+++ b/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.factorybean;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import javax.annotation.Resource;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:factorybean-spring-ctx.xml" })
+public class FactoryBeanXmlConfigTest {
+
+ @Autowired
+ private Tool tool;
+ @Resource(name = "&tool")
+ private ToolFactory toolFactory;
+
+ @Test
+ public void testConstructWorkerByXml() {
+ assertThat(tool.getId(), equalTo(1));
+ assertThat(toolFactory.getFactoryId(), equalTo(9090));
+ }
+}
\ No newline at end of file
diff --git a/spring-mvc-forms/pom.xml b/spring-mvc-forms/pom.xml
new file mode 100644
index 0000000000..370fd7feb2
--- /dev/null
+++ b/spring-mvc-forms/pom.xml
@@ -0,0 +1,99 @@
+
+
+
+ 4.0.0
+ com.baeldung
+ 0.1-SNAPSHOT
+ spring-mvc-forms
+
+ spring-mvc-forms
+ war
+
+
+
+ org.springframework
+ spring-webmvc
+ ${springframework.version}
+
+
+
+ javax.servlet
+ javax.servlet-api
+ ${javax.servlet-api.version}
+
+
+
+ javax.servlet.jsp
+ javax.servlet.jsp-api
+ ${javax.servlet.jsp-api.version}
+
+
+
+ javax.servlet
+ jstl
+ ${jstl.version}
+
+
+
+ org.hibernate
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+
+
+
+
+
+ spring-mvc-forms
+
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven-compiler-plugin.source}
+ ${maven-compiler-plugin.source}
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ ${maven-war-plugin.version}
+
+ src/main/webapp
+ spring-mvc-forms
+ false
+ ${deploy-path}
+
+
+
+
+
+ spring-mvc-forms
+
+
+
+
+
+ 4.0.6.RELEASE
+ 2.4
+ 1.2
+ 2.3.1
+ 3.1.0
+ 3.5.1
+ 1.8
+ 5.1.1.Final
+ enter-location-of-server
+
+
+
+
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
new file mode 100644
index 0000000000..998f070c02
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/ApplicationConfiguration.java
@@ -0,0 +1,29 @@
+package com.baeldung.springmvcforms.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+
+@Configuration
+@EnableWebMvc
+@ComponentScan(basePackages = "com.baeldung.springmvcforms")
+class ApplicationConfiguration extends WebMvcConfigurerAdapter {
+
+ @Override
+ public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+ configurer.enable();
+ }
+
+ @Bean
+ public InternalResourceViewResolver jspViewResolver() {
+ InternalResourceViewResolver bean = new InternalResourceViewResolver();
+ bean.setPrefix("/WEB-INF/views/");
+ bean.setSuffix(".jsp");
+ return bean;
+ }
+
+}
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java
new file mode 100644
index 0000000000..c602ea6454
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/configuration/WebInitializer.java
@@ -0,0 +1,47 @@
+package com.baeldung.springmvcforms.configuration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.ContextLoaderListener;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+public class WebInitializer implements WebApplicationInitializer {
+
+ public void onStartup(ServletContext container) throws ServletException {
+
+ AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
+ ctx.register(ApplicationConfiguration.class);
+ ctx.setServletContext(container);
+
+ // Manage the lifecycle of the root application context
+ container.addListener(new ContextLoaderListener(ctx));
+
+ ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx));
+
+ servlet.setLoadOnStartup(1);
+ servlet.addMapping("/");
+ }
+// @Override
+// public void onStartup(ServletContext container) {
+// // Create the 'root' Spring application context
+// AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
+// rootContext.register(ServiceConfig.class, JPAConfig.class, SecurityConfig.class);
+//
+// // Manage the lifecycle of the root application context
+// container.addListener(new ContextLoaderListener(rootContext));
+//
+// // Create the dispatcher servlet's Spring application context
+// AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext();
+// dispatcherServlet.register(MvcConfig.class);
+//
+// // Register and map the dispatcher servlet
+// ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet));
+// dispatcher.setLoadOnStartup(1);
+// dispatcher.addMapping("/");
+//
+// }
+}
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java
new file mode 100644
index 0000000000..3ece77bb18
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/controller/EmployeeController.java
@@ -0,0 +1,41 @@
+package com.baeldung.springmvcforms.controller;
+
+import com.baeldung.springmvcforms.domain.Employee;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+public class EmployeeController {
+
+ Map employeeMap = new HashMap<>();
+
+ @RequestMapping(value = "/employee", method = RequestMethod.GET)
+ public ModelAndView showForm() {
+ return new ModelAndView("employeeHome", "employee", new Employee());
+ }
+
+ @RequestMapping(value = "/employee/{Id}", produces = { "application/json", "application/xml" }, method = RequestMethod.GET)
+ public @ResponseBody Employee getEmployeeById(@PathVariable final long Id) {
+ return employeeMap.get(Id);
+ }
+
+ @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
+ public String submit(@Valid @ModelAttribute("employee") final Employee employee, final BindingResult result, final ModelMap model) {
+ if (result.hasErrors()) {
+ return "error";
+ }
+ model.addAttribute("name", employee.getName());
+ model.addAttribute("contactNumber", employee.getContactNumber());
+ model.addAttribute("id", employee.getId());
+ employeeMap.put(employee.getId(), employee);
+ return "employeeView";
+ }
+
+}
diff --git a/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java
new file mode 100644
index 0000000000..23cb72b3dc
--- /dev/null
+++ b/spring-mvc-forms/src/main/java/com/baeldung/springmvcforms/domain/Employee.java
@@ -0,0 +1,46 @@
+package com.baeldung.springmvcforms.domain;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+public class Employee {
+
+ private long id;
+
+ @NotNull
+ @Size(min = 5)
+ private String name;
+
+ @NotNull
+ @Size(min = 7)
+ private String contactNumber;
+
+ public Employee() {
+ super();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final long id) {
+ this.id = id;
+ }
+
+ public String getContactNumber() {
+ return contactNumber;
+ }
+
+ public void setContactNumber(final String contactNumber) {
+ this.contactNumber = contactNumber;
+ }
+
+}
diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp
new file mode 100644
index 0000000000..5ed572000a
--- /dev/null
+++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeHome.jsp
@@ -0,0 +1,33 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
+
+
+
+Form Example - Register an Employee
+
+
+ Welcome, Enter The Employee Details
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp
new file mode 100644
index 0000000000..1457bc5fc8
--- /dev/null
+++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/employeeView.jsp
@@ -0,0 +1,24 @@
+<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+
+
+Spring MVC Form Handling
+
+
+
+ Submitted Employee Information
+
+
+ | Name : |
+ ${name} |
+
+
+ | ID : |
+ ${id} |
+
+
+ | Contact Number : |
+ ${contactNumber} |
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp b/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp
new file mode 100644
index 0000000000..8f3d83af17
--- /dev/null
+++ b/spring-mvc-forms/src/main/webapp/WEB-INF/views/error.jsp
@@ -0,0 +1,20 @@
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+
+
+
+SpringMVCExample
+
+
+
+ Pleas enter the correct details
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-mvc-java/src/main/webapp/WEB-INF/templates/message.html b/spring-mvc-java/src/main/webapp/WEB-INF/templates/message.html
new file mode 100644
index 0000000000..291e8312ae
--- /dev/null
+++ b/spring-mvc-java/src/main/webapp/WEB-INF/templates/message.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java
new file mode 100644
index 0000000000..8395a49581
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.htmlunit;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+public class HtmlUnitAndJUnitTest {
+
+ @Before
+ public void init() throws Exception {
+ webClient = new WebClient();
+ }
+
+ @After
+ public void close() throws Exception {
+ webClient.close();
+ }
+
+ @Test
+ public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk()
+ throws Exception {
+ webClient.getOptions().setThrowExceptionOnScriptError(false);
+ HtmlPage page = webClient.getPage("http://www.baeldung.com/");
+ Assert.assertEquals(
+ "Baeldung | Java, Spring and Web Development tutorials",
+ page.getTitleText());
+ }
+
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringIntegrationTest.java
deleted file mode 100644
index 406975b6cc..0000000000
--- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringIntegrationTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.baeldung.htmlunit;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder;
-import org.springframework.web.context.WebApplicationContext;
-
-import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
-import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.html.HtmlForm;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
-import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
-import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(classes = { TestConfig.class })
-public class HtmlUnitAndSpringIntegrationTest {
-
- @Autowired
- private WebApplicationContext wac;
-
- private WebClient webClient;
-
- @Before
- public void setup() {
- webClient = MockMvcWebClientBuilder.webAppContextSetup(wac).build();
- }
-
- //
-
- @Test
- @Ignore("Related view message.html does not exist check MessageController")
- public void givenAMessage_whenSent_thenItShows() throws FailingHttpStatusCodeException, MalformedURLException, IOException {
- final String text = "Hello world!";
- final HtmlPage page = webClient.getPage("http://localhost/message/showForm");
- System.out.println(page.asXml());
-
- final HtmlTextInput messageText = page.getHtmlElementById("message");
- messageText.setValueAttribute(text);
-
- final HtmlForm form = page.getForms().get(0);
- final HtmlSubmitInput submit = form.getOneHtmlElementByAttribute("input", "type", "submit");
- final HtmlPage newPage = submit.click();
-
- final String receivedText = newPage.getHtmlElementById("received").getTextContent();
-
- Assert.assertEquals(receivedText, text);
- System.out.println(newPage.asXml());
- }
-
- @Test
- public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect() throws Exception {
- try (final WebClient client = new WebClient()) {
- webClient.getOptions().setThrowExceptionOnScriptError(false);
-
- final HtmlPage page = webClient.getPage("http://www.baeldung.com/");
- Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText());
- }
- }
-
-}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java
new file mode 100644
index 0000000000..45e441f47f
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.htmlunit;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder;
+import org.springframework.web.context.WebApplicationContext;
+
+import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(classes = { TestConfig.class })
+public class HtmlUnitAndSpringTest {
+
+ @Autowired
+ private WebApplicationContext wac;
+
+ private WebClient webClient;
+
+ @Before
+ public void setup() {
+ webClient = MockMvcWebClientBuilder
+ .webAppContextSetup(wac).build();
+ }
+
+ @Test
+ public void givenAMessage_whenSent_thenItShows() throws Exception {
+ String text = "Hello world!";
+ HtmlPage page;
+
+ String url = "http://localhost/message/showForm";
+ page = webClient.getPage(url);
+
+ HtmlTextInput messageText = page.getHtmlElementById("message");
+ messageText.setValueAttribute(text);
+
+ HtmlForm form = page.getForms().get(0);
+ HtmlSubmitInput submit = form.getOneHtmlElementByAttribute(
+ "input", "type", "submit");
+ HtmlPage newPage = submit.click();
+
+ String receivedText = newPage.getHtmlElementById("received")
+ .getTextContent();
+
+ Assert.assertEquals(receivedText, text);
+ }
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitTest.java
deleted file mode 100644
index 6a7e961eb1..0000000000
--- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.htmlunit;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import com.gargoylesoftware.htmlunit.WebClient;
-import com.gargoylesoftware.htmlunit.html.HtmlPage;
-
-public class HtmlUnitTest {
-
- @Test
- public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect() throws Exception {
- try (final WebClient webClient = new WebClient()) {
- webClient.getOptions().setThrowExceptionOnScriptError(false);
-
- final HtmlPage page = webClient.getPage("http://www.baeldung.com/");
- Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText());
- }
- }
-
-}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
index 9919d7571d..f97bedddef 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
@@ -5,36 +5,38 @@ import java.util.List;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlHeading1;
-import com.gargoylesoftware.htmlunit.html.HtmlHeading2;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class HtmlUnitWebScraping {
- public static void main(final String[] args) throws Exception {
- try (final WebClient webClient = new WebClient()) {
+ private WebClient webClient;
- webClient.getOptions().setCssEnabled(false);
- webClient.getOptions().setJavaScriptEnabled(false);
+ @Before
+ public void init() throws Exception {
+ webClient = new WebClient();
+ }
- final HtmlPage page = webClient.getPage("http://www.baeldung.com/full_archive");
- final HtmlAnchor latestPostLink = (HtmlAnchor) page.getByXPath("(//ul[@class='car-monthlisting']/li)[1]/a").get(0);
+ @After
+ public void close() throws Exception {
+ webClient.close();
+ }
- System.out.println("Entering: " + latestPostLink.getHrefAttribute());
+ @Test
+ public void givenBaeldungArchive_whenRetrievingArticle_thenHasH1()
+ throws Exception {
+ webClient.getOptions().setCssEnabled(false);
+ webClient.getOptions().setJavaScriptEnabled(false);
- final HtmlPage postPage = latestPostLink.click();
+ String url = "http://www.baeldung.com/full_archive";
+ HtmlPage page = webClient.getPage(url);
+ String xpath = "(//ul[@class='car-monthlisting']/li)[1]/a";
+ HtmlAnchor latestPostLink
+ = (HtmlAnchor) page.getByXPath(xpath).get(0);
+ HtmlPage postPage = latestPostLink.click();
- final HtmlHeading1 heading1 = (HtmlHeading1) postPage.getByXPath("//h1").get(0);
- System.out.println("Title: " + heading1.getTextContent());
-
- final List headings2 = (List) postPage.getByXPath("//h2");
-
- final StringBuilder sb = new StringBuilder(heading1.getTextContent());
- for (final HtmlHeading2 h2 : headings2) {
- sb.append("\n").append(h2.getTextContent());
- }
-
- System.out.println(sb.toString());
- }
- }
+ List h1
+ = (List) postPage.getByXPath("//h1");
+ Assert.assertTrue(h1.size() > 0);
+ }
}
diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md
index 783bbb2ef4..e96a8d0392 100644
--- a/spring-mvc-xml/README.md
+++ b/spring-mvc-xml/README.md
@@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Servlet Session Timeout](http://www.baeldung.com/servlet-session-timeout)
- [Basic Forms with Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial)
- [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data)
+- [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind)
diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java
index 0a292ab1e9..af3ce8cfb3 100644
--- a/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java
+++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/service/RawDBDemoGeoIPLocationService.java
@@ -13,7 +13,7 @@ public class RawDBDemoGeoIPLocationService{
private DatabaseReader dbReader;
public RawDBDemoGeoIPLocationService() throws IOException {
- File database = new File("C:\\Users\\Parth Joshi\\Desktop\\GeoLite2-City.mmdb\\GeoLite2-City.mmdb");
+ File database = new File("your-path-to-db-file");
dbReader = new DatabaseReader.Builder(database).build();
}
diff --git a/spring-mvc-xml/src/main/webapp/GeoIpTest.jsp b/spring-mvc-xml/src/main/webapp/GeoIpTest.jsp
index 431f6162bc..c2a60d5197 100644
--- a/spring-mvc-xml/src/main/webapp/GeoIpTest.jsp
+++ b/spring-mvc-xml/src/main/webapp/GeoIpTest.jsp
@@ -77,8 +77,8 @@
-
-