Merge branch 'master' into master
This commit is contained in:
		
						commit
						6ccc6052a1
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -65,6 +65,7 @@ core-java-io/target_link.txt | ||||
| core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF | ||||
| ethereum/logs/ | ||||
| jmeter/src/main/resources/*-JMeter.csv | ||||
| ninja/devDb.mv.db | ||||
| 
 | ||||
| **/node_modules/ | ||||
| **/dist | ||||
|  | ||||
| @ -7,6 +7,8 @@ import akka.http.javadsl.model.HttpEntities; | ||||
| import akka.http.javadsl.model.HttpRequest; | ||||
| import akka.http.javadsl.testkit.JUnitRouteTest; | ||||
| import akka.http.javadsl.testkit.TestRoute; | ||||
| 
 | ||||
| import org.junit.Ignore; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class UserServerUnitTest extends JUnitRouteTest { | ||||
| @ -17,6 +19,7 @@ public class UserServerUnitTest extends JUnitRouteTest { | ||||
| 
 | ||||
|   TestRoute appRoute = testRoute(new UserServer(userActorRef).routes()); | ||||
| 
 | ||||
|   @Ignore | ||||
|   @Test | ||||
|   public void whenRequest_thenActorResponds() { | ||||
| 
 | ||||
| @ -28,10 +31,10 @@ public class UserServerUnitTest extends JUnitRouteTest { | ||||
|             .assertStatusCode(404); | ||||
| 
 | ||||
|     appRoute.run(HttpRequest.DELETE("/users/1")) | ||||
|             .assertStatusCode(200); | ||||
|             .assertStatusCode(405); | ||||
| 
 | ||||
|     appRoute.run(HttpRequest.DELETE("/users/42")) | ||||
|             .assertStatusCode(200); | ||||
|             .assertStatusCode(405); | ||||
| 
 | ||||
|     appRoute.run(HttpRequest.POST("/users") | ||||
|             .withEntity(HttpEntities.create(ContentTypes.APPLICATION_JSON, zaphod()))) | ||||
|  | ||||
| @ -64,7 +64,7 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.codehaus.mojo</groupId> | ||||
|                 <artifactId>cobertura-maven-plugin</artifactId> | ||||
|                 <version>2.7</version> | ||||
|                 <version>${cobertura.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <instrumentation> | ||||
|                         <ignores> | ||||
| @ -85,6 +85,7 @@ | ||||
|         <commons-codec.version>1.11</commons-codec.version> | ||||
|         <guava.version>27.0.1-jre</guava.version> | ||||
|         <combinatoricslib3.version>3.3.0</combinatoricslib3.version> | ||||
|         <cobertura.plugin.version>2.7</cobertura.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -13,4 +13,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. | ||||
| - [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku) | ||||
| - [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words) | ||||
| - [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations) | ||||
| - [Implementing A* Pathfinding in Java](https://www.baeldung.com/java-a-star-pathfinding) | ||||
| - More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3) | ||||
|  | ||||
| @ -98,7 +98,7 @@ public class SlopeOne { | ||||
|             for (Item j : InputData.items) { | ||||
|                 if (e.getValue().containsKey(j)) { | ||||
|                     clean.put(j, e.getValue().get(j)); | ||||
|                 } else { | ||||
|                 } else if (!clean.containsKey(j)) { | ||||
|                     clean.put(j, -1.0); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @ -46,13 +46,13 @@ | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-lang3</artifactId> | ||||
|             <version>3.8.1</version> | ||||
|             <version>${commons.lang3.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>pl.pragmatists</groupId> | ||||
|             <artifactId>JUnitParams</artifactId> | ||||
|             <version>1.1.0</version> | ||||
|             <version>${JUnitParams.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
| @ -91,6 +91,8 @@ | ||||
|         <retrofit.version>2.6.0</retrofit.version> | ||||
|         <jmh-core.version>1.19</jmh-core.version> | ||||
|         <jmh-generator.version>1.19</jmh-generator.version> | ||||
|         <commons.lang3.version>3.8.1</commons.lang3.version> | ||||
|         <JUnitParams.version>1.1.0</JUnitParams.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -12,4 +12,12 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. | ||||
| - [How to Determine if a Binary Tree is Balanced](https://www.baeldung.com/java-balanced-binary-tree) | ||||
| - [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher) | ||||
| - [Overview of Combinatorial Problems in Java](https://www.baeldung.com/java-combinatorial-algorithms) | ||||
| - [Prim’s Algorithm](https://www.baeldung.com/java-prim-algorithm) | ||||
| - [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray) | ||||
| - [How to Merge Two Sorted Arrays](https://www.baeldung.com/java-merge-sorted-arrays) | ||||
| - [Median of Stream of Integers using Heap](https://www.baeldung.com/java-stream-integers-median-using-heap) | ||||
| - [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal) | ||||
| - [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm) | ||||
| - [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences) | ||||
| - [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms) | ||||
| - More articles: [[<-- prev]](/../algorithms-miscellaneous-4) | ||||
|  | ||||
| @ -37,7 +37,7 @@ | ||||
|         <dependency> | ||||
|             <groupId>com.google.guava</groupId> | ||||
|             <artifactId>guava</artifactId> | ||||
|             <version>28.1-jre</version> | ||||
|             <version>${guava.version}</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
| @ -65,6 +65,7 @@ | ||||
|         <org.assertj.core.version>3.9.0</org.assertj.core.version> | ||||
|         <commons-codec.version>1.11</commons-codec.version> | ||||
|         <commons-math3.version>3.6.1</commons-math3.version> | ||||
|         <guava.version>28.1-jre</guava.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,141 @@ | ||||
| package com.baeldung.algorithms.balancedbinarytree; | ||||
| 
 | ||||
| public class AVLTree { | ||||
| 
 | ||||
|     public class Node { | ||||
|         int key; | ||||
|         int height; | ||||
|         Node left; | ||||
|         Node right; | ||||
| 
 | ||||
|         Node(int key) { | ||||
|             this.key = key; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private Node root; | ||||
| 
 | ||||
|     public Node find(int key) { | ||||
|         Node current = root; | ||||
|         while (current != null) { | ||||
|             if (current.key == key) { | ||||
|                break; | ||||
|             } | ||||
|             current = current.key < key ? current.right : current.left; | ||||
|         } | ||||
|         return current; | ||||
|     } | ||||
| 
 | ||||
|     public void insert(int key) { | ||||
|         root = insert(root, key); | ||||
|     } | ||||
| 
 | ||||
|     public void delete(int key) { | ||||
|         root = delete(root, key); | ||||
|     } | ||||
| 
 | ||||
|     public Node getRoot() { | ||||
|         return root; | ||||
|     } | ||||
| 
 | ||||
|     public int height() { | ||||
|         return root == null ? -1 : root.height; | ||||
|     } | ||||
| 
 | ||||
|     private Node insert(Node node, int key) { | ||||
|         if (node == null) { | ||||
|             return new Node(key); | ||||
|         } else if (node.key > key) { | ||||
|             node.left = insert(node.left, key); | ||||
|         } else if (node.key < key) { | ||||
|             node.right = insert(node.right, key); | ||||
|         } else { | ||||
|             throw new RuntimeException("duplicate Key!"); | ||||
|         } | ||||
|         return rebalance(node); | ||||
|     } | ||||
| 
 | ||||
|     private Node delete(Node node, int key) { | ||||
|         if (node == null) { | ||||
|             return node; | ||||
|         } else if (node.key > key) { | ||||
|             node.left = delete(node.left, key); | ||||
|         } else if (node.key < key) { | ||||
|             node.right = delete(node.right, key); | ||||
|         } else { | ||||
|             if (node.left == null || node.right == null) { | ||||
|                 node = (node.left == null) ? node.right : node.left; | ||||
|             } else { | ||||
|                 Node mostLeftChild = mostLeftChild(node.right); | ||||
|                 node.key = mostLeftChild.key; | ||||
|                 node.right = delete(node.right, node.key); | ||||
|             } | ||||
|         } | ||||
|         if (node != null) { | ||||
|             node = rebalance(node); | ||||
|         } | ||||
|         return node; | ||||
|     } | ||||
| 
 | ||||
|     private Node mostLeftChild(Node node) { | ||||
|         Node current = node; | ||||
|         /* loop down to find the leftmost leaf */ | ||||
|         while (current.left != null) { | ||||
|             current = current.left; | ||||
|         } | ||||
|         return current; | ||||
|     } | ||||
| 
 | ||||
|     private Node rebalance(Node z) { | ||||
|         updateHeight(z); | ||||
|         int balance = getBalance(z); | ||||
|         if (balance > 1) { | ||||
|             if (height(z.right.right) > height(z.right.left)) { | ||||
|                 z = rotateLeft(z); | ||||
|             } else { | ||||
|                 z.right = rotateRight(z.right); | ||||
|                 z = rotateLeft(z); | ||||
|             } | ||||
|         } else if (balance < -1) { | ||||
|             if (height(z.left.left) > height(z.left.right)) { | ||||
|                 z = rotateRight(z); | ||||
|             } else { | ||||
|                 z.left = rotateLeft(z.left); | ||||
|                 z = rotateRight(z); | ||||
|             } | ||||
|         } | ||||
|         return z; | ||||
|     } | ||||
| 
 | ||||
|     private Node rotateRight(Node y) { | ||||
|         Node x = y.left; | ||||
|         Node z = x.right; | ||||
|         x.right = y; | ||||
|         y.left = z; | ||||
|         updateHeight(y); | ||||
|         updateHeight(x); | ||||
|         return x; | ||||
|     } | ||||
| 
 | ||||
|     private Node rotateLeft(Node y) { | ||||
|         Node x = y.right; | ||||
|         Node z = x.left; | ||||
|         x.left = y; | ||||
|         y.right = z; | ||||
|         updateHeight(y); | ||||
|         updateHeight(x); | ||||
|         return x; | ||||
|     } | ||||
| 
 | ||||
|     private void updateHeight(Node n) { | ||||
|         n.height = 1 + Math.max(height(n.left), height(n.right)); | ||||
|     } | ||||
| 
 | ||||
|     private int height(Node n) { | ||||
|         return n == null ? -1 : n.height; | ||||
|     } | ||||
| 
 | ||||
|     public int getBalance(Node n) { | ||||
|         return (n == null) ? 0 : height(n.right) - height(n.left); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,36 @@ | ||||
| package com.baeldung.algorithms.balancedbrackets; | ||||
| 
 | ||||
| import java.util.Deque; | ||||
| import java.util.LinkedList; | ||||
| 
 | ||||
| public class BalancedBracketsUsingDeque { | ||||
| 
 | ||||
|     public boolean isBalanced(String str) { | ||||
|         if (null == str || ((str.length() % 2) != 0)) { | ||||
|             return false; | ||||
|         } else { | ||||
|             char[] ch = str.toCharArray(); | ||||
|             for (char c : ch) { | ||||
|                 if (!(c == '{' || c == '[' || c == '(' || c == '}' || c == ']' || c == ')')) { | ||||
|                     return false; | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Deque<Character> deque = new LinkedList<>(); | ||||
|         for (char ch : str.toCharArray()) { | ||||
|             if (ch == '{' || ch == '[' || ch == '(') { | ||||
|                 deque.addFirst(ch); | ||||
|             } else { | ||||
|                 if (!deque.isEmpty() && ((deque.peekFirst() == '{' && ch == '}') || (deque.peekFirst() == '[' && ch == ']') || (deque.peekFirst() == '(' && ch == ')'))) { | ||||
|                     deque.removeFirst(); | ||||
|                 } else { | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.baeldung.algorithms.balancedbrackets; | ||||
| 
 | ||||
| public class BalancedBracketsUsingString { | ||||
| 
 | ||||
|     public boolean isBalanced(String str) { | ||||
|         if (null == str || ((str.length() % 2) != 0)) { | ||||
|             return false; | ||||
|         } else { | ||||
|             char[] ch = str.toCharArray(); | ||||
|             for (char c : ch) { | ||||
|                 if (!(c == '{' || c == '[' || c == '(' || c == '}' || c == ']' || c == ')')) { | ||||
|                     return false; | ||||
|                 } | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         while (str.contains("()") || str.contains("[]") || str.contains("{}")) { | ||||
|             str = str.replaceAll("\\(\\)", "") | ||||
|                 .replaceAll("\\[\\]", "") | ||||
|                 .replaceAll("\\{\\}", ""); | ||||
|         } | ||||
|         return (str.length() == 0); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,83 @@ | ||||
| package com.baeldung.algorithms.balancedbinarytree; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class AVLTreeUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEmptyTree_whenHeightCalled_shouldReturnMinus1() { | ||||
|         AVLTree tree = new AVLTree(); | ||||
|         Assert.assertEquals(-1, tree.height()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEmptyTree_whenInsertCalled_heightShouldBeZero() { | ||||
|         AVLTree tree = new AVLTree(); | ||||
|         tree.insert(1); | ||||
|         Assert.assertEquals(0, tree.height()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEmptyTree_whenInsertCalled_treeShouldBeAvl() { | ||||
|         AVLTree tree = new AVLTree(); | ||||
|         tree.insert(1); | ||||
|         Assert.assertTrue(isAVL(tree)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenSampleTree_whenInsertCalled_treeShouldBeAvl() { | ||||
|         AVLTree tree = getSampleAVLTree(); | ||||
|         int newKey = 11; | ||||
|         tree.insert(newKey); | ||||
|         Assert.assertTrue(isAVL(tree)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenSampleTree_whenFindExistingKeyCalled_shouldReturnMatchedNode() { | ||||
|         AVLTree tree = getSampleAVLTree(); | ||||
|         int existingKey = 2; | ||||
|         AVLTree.Node result = tree.find(existingKey); | ||||
|         Assert.assertEquals(result.key, existingKey); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenSampleTree_whenFindNotExistingKeyCalled_shouldReturnNull() { | ||||
|         AVLTree tree = getSampleAVLTree(); | ||||
|         int notExistingKey = 11; | ||||
|         AVLTree.Node result = tree.find(notExistingKey); | ||||
|         Assert.assertNull(result); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEmptyTree_whenDeleteCalled_treeShouldBeAvl() { | ||||
|         AVLTree tree = new AVLTree(); | ||||
|         tree.delete(1); | ||||
|         Assert.assertTrue(isAVL(tree)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenSampleTree_whenDeleteCalled_treeShouldBeAvl() { | ||||
|         AVLTree tree = getSampleAVLTree(); | ||||
|         tree.delete(1); | ||||
|         Assert.assertTrue(isAVL(tree, tree.getRoot())); | ||||
|     } | ||||
| 
 | ||||
|     private boolean isAVL(AVLTree tree) { | ||||
|        return isAVL(tree, tree.getRoot()); | ||||
|     } | ||||
| 
 | ||||
|     private boolean isAVL(AVLTree tree, AVLTree.Node node) { | ||||
|         if ( node == null ) | ||||
|             return true; | ||||
|         int balance = tree.getBalance(node); | ||||
|         return (balance <= 1 && balance >= -1) && isAVL(tree, node.left) && isAVL(tree, node.right); | ||||
|     } | ||||
| 
 | ||||
|     private AVLTree getSampleAVLTree() { | ||||
|         AVLTree avlTree = new AVLTree(); | ||||
|         for (int i = 0; i < 10; i++) | ||||
|             avlTree.insert(i); | ||||
|         return avlTree; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,76 @@ | ||||
| package com.baeldung.algorithms.balancedbrackets; | ||||
| 
 | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| public class BalancedBracketsUsingDequeUnitTest { | ||||
|     private BalancedBracketsUsingDeque balancedBracketsUsingDeque; | ||||
| 
 | ||||
|     @Before | ||||
|     public void setup() { | ||||
|         balancedBracketsUsingDeque = new BalancedBracketsUsingDeque(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenNullInput_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced(null); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced(""); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("abc[](){}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{{[]()}}}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{{[]()}}}}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{[(])}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{[()]}"); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{{[[(())]]}}"); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{{([])}}"); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingDeque.isBalanced("{{)[](}}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,76 @@ | ||||
| package com.baeldung.algorithms.balancedbrackets; | ||||
| 
 | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| public class BalancedBracketsUsingStringUnitTest { | ||||
|     private BalancedBracketsUsingString balancedBracketsUsingString; | ||||
| 
 | ||||
|     @Before | ||||
|     public void setup() { | ||||
|         balancedBracketsUsingString = new BalancedBracketsUsingString(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenNullInput_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced(null); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEmptyString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced(""); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenInvalidCharacterString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("abc[](){}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenOddLengthString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{{[]()}}}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEvenLengthString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{{[]()}}}}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEvenLengthUnbalancedString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{[(])}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenEvenLengthBalancedString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{[()]}"); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenBalancedString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{{[[(())]]}}"); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnotherBalancedString_whenCheckingForBalance_shouldReturnTrue() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{{([])}}"); | ||||
|         assertThat(result).isTrue(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenUnBalancedString_whenCheckingForBalance_shouldReturnFalse() { | ||||
|         boolean result = balancedBracketsUsingString.isBalanced("{{)[](}}"); | ||||
|         assertThat(result).isFalse(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										3
									
								
								algorithms-sorting-2/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								algorithms-sorting-2/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ### Relevant Articles: | ||||
| 
 | ||||
| - [Partitioning and Sorting Arrays with Many Repeated Entries](https://www.baeldung.com/java-sorting-arrays-with-repeated-entries) | ||||
| @ -18,19 +18,19 @@ | ||||
|         <dependency> | ||||
|             <groupId>javax.ws.rs</groupId> | ||||
|             <artifactId>javax.ws.rs-api</artifactId> | ||||
|             <version>2.1</version> | ||||
|             <version>${rs-api.version}</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>javax.enterprise</groupId> | ||||
|             <artifactId>cdi-api</artifactId> | ||||
|             <version>2.0</version> | ||||
|             <version>${cdi-api.version}</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>javax.json.bind</groupId> | ||||
|             <artifactId>javax.json.bind-api</artifactId> | ||||
|             <version>1.0</version> | ||||
|             <version>${bind-api.version}</version> | ||||
|             <scope>provided</scope> | ||||
|         </dependency> | ||||
| 
 | ||||
| @ -80,6 +80,9 @@ | ||||
|         <liberty-maven-plugin.version>2.4.2</liberty-maven-plugin.version> | ||||
|         <failOnMissingWebXml>false</failOnMissingWebXml> | ||||
|         <openliberty-version>18.0.0.2</openliberty-version> | ||||
|         <rs-api.version>2.1</rs-api.version> | ||||
|         <cdi-api.version>2.0</cdi-api.version> | ||||
|         <bind-api.version>1.0</bind-api.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -6,3 +6,6 @@ This module contains articles about Apache POI | ||||
| - [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi) | ||||
| - [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel) | ||||
| - [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow) | ||||
| - [Merge Cells in Excel Using Apache POI](https://www.baeldung.com/java-apache-poi-merge-cells) | ||||
| - [Get String Value of Excel Cell with Apache POI](https://www.baeldung.com/java-apache-poi-cell-string-value) | ||||
| - [Read Excel Cell Value Rather Than Formula With Apache POI](https://github.com/eugenp/tutorials/tree/master/apache-poi) | ||||
|  | ||||
| @ -0,0 +1,53 @@ | ||||
| package com.baeldung.poi.excel.merge; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.net.URISyntaxException; | ||||
| import java.nio.file.Paths; | ||||
| 
 | ||||
| import org.apache.poi.ss.usermodel.Sheet; | ||||
| import org.apache.poi.ss.usermodel.Workbook; | ||||
| import org.apache.poi.ss.util.CellRangeAddress; | ||||
| import org.apache.poi.xssf.usermodel.XSSFWorkbook; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class ExcelCellMergerUnitTest { | ||||
|     private static final String FILE_NAME = "ExcelCellFormatterTest.xlsx"; | ||||
|     private String fileLocation; | ||||
| 
 | ||||
|     @Before | ||||
|     public void setup() throws IOException, URISyntaxException { | ||||
|             fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCellIndex_whenAddMergeRegion_thenMergeRegionCreated() throws IOException { | ||||
|         Workbook workbook = new XSSFWorkbook(fileLocation); | ||||
|         Sheet sheet = workbook.getSheetAt(0); | ||||
| 
 | ||||
|         assertEquals(0, sheet.getNumMergedRegions()); | ||||
|         int firstRow = 0;  | ||||
|         int lastRow = 0;  | ||||
|         int firstCol = 0;  | ||||
|         int lastCol = 2; | ||||
|         sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol)); | ||||
|         assertEquals(1, sheet.getNumMergedRegions()); | ||||
| 
 | ||||
|         workbook.close(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCellRefString_whenAddMergeRegion_thenMergeRegionCreated() throws IOException { | ||||
|         Workbook workbook = new XSSFWorkbook(fileLocation); | ||||
|         Sheet sheet = workbook.getSheetAt(0); | ||||
| 
 | ||||
|         assertEquals(0, sheet.getNumMergedRegions());         | ||||
|         sheet.addMergedRegion(CellRangeAddress.valueOf("A1:C1")); | ||||
|         assertEquals(1, sheet.getNumMergedRegions()); | ||||
| 
 | ||||
|         workbook.close(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -3,3 +3,5 @@ | ||||
| This module contains articles about Apache RocketMQ | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| 
 | ||||
| - [Apache RocketMQ with Spring Boot](https://www.baeldung.com/apache-rocketmq-spring-boot) | ||||
|  | ||||
| @ -17,11 +17,12 @@ | ||||
|         <dependency> | ||||
|             <groupId>org.apache.rocketmq</groupId> | ||||
|             <artifactId>rocketmq-spring-boot-starter</artifactId> | ||||
|             <version>2.0.4</version> | ||||
|             <version>${rocketmq.version}</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <properties> | ||||
|         <geode.core>1.6.0</geode.core> | ||||
|         <rocketmq.version>2.0.4</rocketmq.version> | ||||
|     </properties> | ||||
| </project> | ||||
|  | ||||
| @ -7,4 +7,4 @@ This module contains articles about Apache Spark | ||||
| - [Introduction to Apache Spark](https://www.baeldung.com/apache-spark) | ||||
| - [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline) | ||||
| - [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning) | ||||
| 
 | ||||
| - [Introduction to Spark Graph Processing with GraphFrames](https://www.baeldung.com/spark-graph-graphframes) | ||||
|  | ||||
							
								
								
									
										3
									
								
								apache-tapestry/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								apache-tapestry/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ### Relevant Articles | ||||
| 
 | ||||
| - [Intro to Apache Tapestry](https://www.baeldung.com/apache-tapestry) | ||||
| @ -81,10 +81,10 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>2.3.2</version> | ||||
|                 <version>${compiler.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
|                     <target>1.8</target> | ||||
|                     <source>${source.version}</source> | ||||
|                     <target>${target.version}</target> | ||||
|                     <optimize>true</optimize> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
| @ -92,7 +92,7 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>2.7.2</version> | ||||
|                 <version>${compiler.surefire.version}</version> | ||||
|                 <configuration> | ||||
|                     <systemPropertyVariables> | ||||
|                         <tapestry.execution-mode>Qa</tapestry.execution-mode> | ||||
| @ -104,7 +104,7 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's | ||||
|             <plugin> | ||||
|                 <groupId>org.mortbay.jetty</groupId> | ||||
|                 <artifactId>maven-jetty-plugin</artifactId> | ||||
|                 <version>6.1.16</version> | ||||
|                 <version>${compiler.jetty.version}</version> | ||||
|                 <configuration> | ||||
|                     <!-- Log to the console. --> | ||||
|                     <requestLog implementation="org.mortbay.jetty.NCSARequestLog"> | ||||
| @ -140,6 +140,11 @@ of testing facilities designed for use with TestNG (http://testng.org/), so it's | ||||
|     </repositories> | ||||
| 
 | ||||
|     <properties> | ||||
|         <compiler.jetty.version>6.1.16</compiler.jetty.version> | ||||
|         <compiler.surefire.version>2.7.2</compiler.surefire.version> | ||||
|         <compiler.plugin.version>2.3.2</compiler.plugin.version> | ||||
|         <source.version>1.8</source.version> | ||||
|         <target.version>1.8</target.version> | ||||
|         <tapestry-release-version>5.4.5</tapestry-release-version> | ||||
|         <servlet-api-release-version>2.5</servlet-api-release-version> | ||||
|         <testng-release-version>6.8.21</testng-release-version> | ||||
|  | ||||
							
								
								
									
										3
									
								
								aws-reactive/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								aws-reactive/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ### Relevant Articles: | ||||
| 
 | ||||
| - [AWS S3 with Java – Reactive Support](https://www.baeldung.com/java-aws-s3-reactive) | ||||
| @ -17,6 +17,8 @@ | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<java.version>1.8</java.version> | ||||
|         <spring.version>2.2.1.RELEASE</spring.version> | ||||
|         <awssdk.version>2.10.27</awssdk.version> | ||||
| 	</properties> | ||||
| 
 | ||||
| 	<dependencyManagement> | ||||
| @ -26,7 +28,7 @@ | ||||
| 				<!-- Import dependency management from Spring Boot --> | ||||
| 				<groupId>org.springframework.boot</groupId> | ||||
| 				<artifactId>spring-boot-dependencies</artifactId> | ||||
| 				<version>2.2.1.RELEASE</version> | ||||
| 				<version>${spring.version}</version> | ||||
| 				<type>pom</type> | ||||
| 				<scope>import</scope> | ||||
| 			</dependency> | ||||
| @ -34,7 +36,7 @@ | ||||
| 			<dependency> | ||||
| 				<groupId>software.amazon.awssdk</groupId> | ||||
| 				<artifactId>bom</artifactId> | ||||
| 				<version>2.10.27</version> | ||||
| 				<version>${awssdk.version}</version> | ||||
| 				<type>pom</type> | ||||
| 				<scope>import</scope> | ||||
| 			</dependency> | ||||
|  | ||||
| @ -106,7 +106,7 @@ | ||||
|                             <arguments> | ||||
|                                 <argument>java</argument> | ||||
|                                 <argument>-jar</argument> | ||||
|                                 <argument>sample-blade-app.jar</argument> | ||||
|                                 <argument>blade.jar</argument> | ||||
|                             </arguments> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
| @ -124,7 +124,7 @@ | ||||
| 
 | ||||
|             <plugin> | ||||
|                 <artifactId>maven-assembly-plugin</artifactId> | ||||
|                 <version>3.1.0</version> | ||||
|                 <version>${assembly.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <finalName>${project.build.finalName}</finalName> | ||||
|                     <appendAssemblyId>false</appendAssemblyId> | ||||
| @ -161,6 +161,7 @@ | ||||
|         <assertj-core.version>3.11.1</assertj-core.version> | ||||
|         <maven-failsafe-plugin.version>3.0.0-M3</maven-failsafe-plugin.version> | ||||
|         <process-exec-maven-plugin.version>0.7</process-exec-maven-plugin.version> | ||||
|         <assembly.plugin.version>3.1.0</assembly.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
							
								
								
									
										21
									
								
								cloud-foundry-uaa/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								cloud-foundry-uaa/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>cloud-foundry-uaa</artifactId> | ||||
|     <version>0.0.1-SNAPSHOT</version> | ||||
|     <name>cloud-foundry-uaa</name> | ||||
|     <packaging>pom</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>parent-modules</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|     </parent> | ||||
| 
 | ||||
|     <modules> | ||||
|         <module>cf-uaa-oauth2-client</module> | ||||
|         <module>cf-uaa-oauth2-resource-server</module> | ||||
|     </modules> | ||||
| 
 | ||||
| </project> | ||||
| @ -62,12 +62,12 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.codehaus.groovy</groupId> | ||||
|                 <artifactId>groovy-eclipse-compiler</artifactId> | ||||
|                 <version>3.3.0-01</version> | ||||
|                 <version>${groovy.compiler.version}</version> | ||||
|                 <extensions>true</extensions> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>3.8.0</version> | ||||
|                 <version>${compiler.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <compilerId>groovy-eclipse-compiler</compilerId> | ||||
|                     <source>${java.version}</source> | ||||
| @ -77,7 +77,7 @@ | ||||
|                     <dependency> | ||||
|                         <groupId>org.codehaus.groovy</groupId> | ||||
|                         <artifactId>groovy-eclipse-compiler</artifactId> | ||||
|                         <version>3.3.0-01</version> | ||||
|                         <version>${groovy.compiler.version}</version> | ||||
|                     </dependency> | ||||
|                     <dependency> | ||||
|                         <groupId>org.codehaus.groovy</groupId> | ||||
| @ -113,7 +113,7 @@ | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>2.20.1</version> | ||||
|                 <version>${surefire.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <useFile>false</useFile> | ||||
|                     <includes> | ||||
| @ -126,7 +126,7 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-assembly-plugin</artifactId> | ||||
|                 <version>3.1.0</version> | ||||
|                 <version>${assembly.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <!-- get all project dependencies --> | ||||
|                     <descriptorRefs> | ||||
| @ -183,6 +183,10 @@ | ||||
|         <groovy-wslite.version>1.1.3</groovy-wslite.version> | ||||
|         <logback.version>1.2.3</logback.version> | ||||
|         <groovy.version>2.5.7</groovy.version> | ||||
|         <assembly.plugin.version>3.1.0</assembly.plugin.version> | ||||
|         <surefire.plugin.version>2.20.1</surefire.plugin.version> | ||||
|         <compiler.plugin.version>3.8.0</compiler.plugin.version> | ||||
|         <groovy.compiler.version>3.3.0-01</groovy.compiler.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -9,7 +9,7 @@ import wslite.soap.SOAPMessageBuilder | ||||
| import wslite.http.auth.HTTPBasicAuthorization | ||||
| import org.junit.Test | ||||
| 
 | ||||
| class WebserviceUnitTest extends GroovyTestCase { | ||||
| class WebserviceManualTest extends GroovyTestCase { | ||||
| 
 | ||||
|     JsonSlurper jsonSlurper = new JsonSlurper() | ||||
| 
 | ||||
| @ -75,7 +75,6 @@ class WebserviceUnitTest extends GroovyTestCase { | ||||
|         assert stories.size() == 5 | ||||
|     } | ||||
|      | ||||
|     /* see BAEL-3753 | ||||
|     void test_whenConsumingSoap_thenReceiveResponse() { | ||||
|         def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso" | ||||
|         def soapClient = new SOAPClient(url) | ||||
| @ -90,7 +89,6 @@ class WebserviceUnitTest extends GroovyTestCase { | ||||
|         def words = response.NumberToWordsResponse | ||||
|         assert words == "one thousand two hundred and thirty four " | ||||
|     } | ||||
|     */ | ||||
| 
 | ||||
|     void test_whenConsumingRestGet_thenReceiveResponse() { | ||||
|         def path = "/get" | ||||
|  | ||||
| @ -99,7 +99,7 @@ | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>2.20.1</version> | ||||
|                 <version>${surefire.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <useFile>false</useFile> | ||||
|                     <includes> | ||||
| @ -126,6 +126,7 @@ | ||||
|         <hsqldb.version>2.4.0</hsqldb.version> | ||||
|         <spock-core.version>1.1-groovy-2.4</spock-core.version> | ||||
|         <gmavenplus-plugin.version>1.6</gmavenplus-plugin.version> | ||||
|         <surefire.plugin.version>2.20.1</surefire.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| package com.baeldung.file | ||||
| 
 | ||||
| import spock.lang.Specification | ||||
| import spock.lang.Ignore | ||||
| 
 | ||||
| class ReadFileUnitTest extends Specification { | ||||
| 
 | ||||
|  | ||||
| @ -13,3 +13,4 @@ This module contains articles about Java 11 core features | ||||
| - [Guide to jlink](https://www.baeldung.com/jlink) | ||||
| - [Negate a Predicate Method Reference with Java 11](https://www.baeldung.com/java-negate-predicate-method-reference) | ||||
| - [Benchmark JDK Collections vs Eclipse Collections](https://www.baeldung.com/jdk-collections-vs-eclipse-collections) | ||||
| - [Pre-compile Regex Patterns Into Pattern Objects](https://www.baeldung.com/java-regex-pre-compile) | ||||
|  | ||||
| @ -42,12 +42,12 @@ | ||||
|         <dependency> | ||||
|             <groupId>org.eclipse.collections</groupId> | ||||
|             <artifactId>eclipse-collections</artifactId> | ||||
|             <version>10.0.0</version> | ||||
|             <version>${eclipse.collections.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.eclipse.collections</groupId> | ||||
|             <artifactId>eclipse-collections-api</artifactId> | ||||
|             <version>10.0.0</version> | ||||
|             <version>${eclipse.collections.version}</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
| @ -65,7 +65,7 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-shade-plugin</artifactId> | ||||
|                 <version>3.2.1</version> | ||||
|                 <version>${shade.plugin.version}</version> | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <phase>package</phase> | ||||
| @ -108,6 +108,8 @@ | ||||
|         <assertj.version>3.11.1</assertj.version> | ||||
|         <uberjar.name>benchmarks</uberjar.name> | ||||
|         <jmh.version>1.22</jmh.version> | ||||
|         <eclipse.collections.version>10.0.0</eclipse.collections.version> | ||||
|         <shade.plugin.version>10.0.0</shade.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
							
								
								
									
										4
									
								
								core-java-modules/core-java-13/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								core-java-modules/core-java-13/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| ### Relevant articles: | ||||
| 
 | ||||
| - [Java Switch Statement](https://www.baeldung.com/java-switch) | ||||
| - [New Java 13 Features](https://www.baeldung.com/java-13-new-features) | ||||
| @ -41,7 +41,7 @@ | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>3.0.0-M3</version> | ||||
|                 <version>${surefire.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <argLine>--enable-preview</argLine> | ||||
|                 </configuration> | ||||
| @ -53,6 +53,7 @@ | ||||
|         <maven.compiler.source.version>13</maven.compiler.source.version> | ||||
|         <maven.compiler.target.version>13</maven.compiler.target.version> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|         <surefire.plugin.version>3.0.0-M3</surefire.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,27 @@ | ||||
| package com.baeldung.newfeatures; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class SwitchExpressionsWithYieldUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     @SuppressWarnings("preview") | ||||
|     public void whenSwitchingOnOperationSquareMe_thenWillReturnSquare() { | ||||
|         var me = 4; | ||||
|         var operation = "squareMe"; | ||||
|         var result = switch (operation) { | ||||
|         case "doubleMe" -> { | ||||
|             yield me * 2; | ||||
|         } | ||||
|         case "squareMe" -> { | ||||
|             yield me * me; | ||||
|         } | ||||
|         default -> me; | ||||
|         }; | ||||
| 
 | ||||
|         assertEquals(16, result); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,39 @@ | ||||
| package com.baeldung.newfeatures; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class TextBlocksUnitTest { | ||||
| 
 | ||||
|     private static final String JSON_STRING = "{\r\n" + "\"name\" : \"Baeldung\",\r\n" + "\"website\" : \"https://www.%s.com/\"\r\n" + "}"; | ||||
| 
 | ||||
|     @SuppressWarnings("preview") | ||||
|     private static final String TEXT_BLOCK_JSON = """ | ||||
|             { | ||||
|             "name" : "Baeldung", | ||||
|             "website" : "https://www.%s.com/" | ||||
|             } | ||||
|         """; | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenTextBlocks_thenStringOperationsWork() { | ||||
| 
 | ||||
|         assertThat(TEXT_BLOCK_JSON.contains("Baeldung")).isTrue(); | ||||
|         assertThat(TEXT_BLOCK_JSON.indexOf("www")).isGreaterThan(0); | ||||
|         assertThat(TEXT_BLOCK_JSON.length()).isGreaterThan(0); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @SuppressWarnings("removal") | ||||
|     @Test | ||||
|     public void whenTextBlocks_thenFormattedWorksAsFormat() { | ||||
|         assertThat(TEXT_BLOCK_JSON.formatted("baeldung") | ||||
|             .contains("www.baeldung.com")).isTrue(); | ||||
| 
 | ||||
|         assertThat(String.format(JSON_STRING, "baeldung") | ||||
|             .contains("www.baeldung.com")).isTrue(); | ||||
| 
 | ||||
|     } | ||||
|     | ||||
| } | ||||
							
								
								
									
										1
									
								
								core-java-modules/core-java-14/.mvn/jvm.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								core-java-modules/core-java-14/.mvn/jvm.config
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| --enable-preview | ||||
							
								
								
									
										7
									
								
								core-java-modules/core-java-14/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								core-java-modules/core-java-14/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| ## Core Java 14 | ||||
| 
 | ||||
| This module contains articles about Java 14.  | ||||
| 
 | ||||
| ### Relevant articles | ||||
| 
 | ||||
| - [Guide to the @Serial Annotation in Java 14](https://www.baeldung.com/java-14-serial-annotation) | ||||
| @ -1,52 +1,66 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
| 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<groupId>com.baeldung</groupId> | ||||
| 	<artifactId>core-java-14</artifactId> | ||||
| 	<version>1.0.0-SNAPSHOT</version> | ||||
| 	<name>core-java-14</name> | ||||
| 	<packaging>jar</packaging> | ||||
| 	<url>http://maven.apache.org</url> | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>core-java-14</artifactId> | ||||
|     <name>core-java-14</name> | ||||
|     <packaging>jar</packaging> | ||||
|     <url>http://maven.apache.org</url> | ||||
| 
 | ||||
| 	<parent> | ||||
| 		<groupId>com.baeldung</groupId> | ||||
| 		<artifactId>parent-modules</artifactId> | ||||
| 		<version>1.0.0-SNAPSHOT</version> | ||||
| 		<relativePath>../../</relativePath> | ||||
| 	</parent> | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>parent-modules</artifactId> | ||||
|         <version>1.0.0-SNAPSHOT</version> | ||||
|         <relativePath>../../</relativePath> | ||||
|     </parent> | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
|             <version>${assertj.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.junit.jupiter</groupId> | ||||
|             <artifactId>junit-jupiter-engine</artifactId> | ||||
|             <version>${junit-jupiter.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.junit.jupiter</groupId> | ||||
|             <artifactId>junit-jupiter-api</artifactId> | ||||
|             <version>${junit-jupiter.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|     <build> | ||||
|         <plugins> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>${maven-compiler-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <release>${maven.compiler.release}</release> | ||||
|                     <compilerArgs>--enable-preview</compilerArgs> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>${surefire.plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <argLine>--enable-preview</argLine> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
| 
 | ||||
| 	<build> | ||||
| 		<plugins> | ||||
| 			<plugin> | ||||
| 				<groupId>org.apache.maven.plugins</groupId> | ||||
| 				<artifactId>maven-compiler-plugin</artifactId> | ||||
| 				<version>${maven-compiler-plugin.version}</version> | ||||
| 				<configuration> | ||||
| 					<source>${maven.compiler.source.version}</source> | ||||
| 					<target>${maven.compiler.target.version}</target> | ||||
| 					<compilerArgs> | ||||
| 						<compilerArg> | ||||
| 							--enable-preview | ||||
| 						</compilerArg> | ||||
| 					</compilerArgs> | ||||
| 				</configuration> | ||||
| 			</plugin> | ||||
| 			<plugin> | ||||
| 				<groupId>org.apache.maven.plugins</groupId> | ||||
| 				<artifactId>maven-surefire-plugin</artifactId> | ||||
| 				<version>3.0.0-M3</version> | ||||
| 				<configuration> | ||||
| 					<argLine>--enable-preview</argLine> | ||||
| 				</configuration> | ||||
| 			</plugin> | ||||
| 		</plugins> | ||||
| 	</build> | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<maven.compiler.source.version>14</maven.compiler.source.version> | ||||
| 		<maven.compiler.target.version>14</maven.compiler.target.version> | ||||
| 	</properties> | ||||
|     <properties> | ||||
|         <maven.compiler.release>14</maven.compiler.release> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|         <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version> | ||||
|         <surefire.plugin.version>3.0.0-M3</surefire.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,46 @@ | ||||
| package com.baeldung.java14.textblocks; | ||||
| 
 | ||||
| public class TextBlocks13 { | ||||
|     public String getBlockOfHtml() { | ||||
|         return """ | ||||
|             <html> | ||||
| 
 | ||||
|                 <body> | ||||
|                     <span>example text</span> | ||||
|                 </body> | ||||
|             </html>"""; | ||||
|     } | ||||
| 
 | ||||
|     public String getNonStandardIndent() { | ||||
|         return """ | ||||
|                 Indent | ||||
|             """; | ||||
|     } | ||||
| 
 | ||||
|     public String getQuery() { | ||||
|         return """ | ||||
|             select "id", "user" | ||||
|             from "table" | ||||
|             """; | ||||
|     } | ||||
| 
 | ||||
|     public String getTextWithCarriageReturns() { | ||||
|         return """ | ||||
|             separated with\r | ||||
|             carriage returns"""; | ||||
|     } | ||||
| 
 | ||||
|     public String getTextWithEscapes() { | ||||
|         return """ | ||||
|             fun with\n | ||||
|             whitespace\t\r | ||||
|             and other escapes \""" | ||||
|             """; | ||||
|     } | ||||
| 
 | ||||
|     public String getFormattedText(String parameter) { | ||||
|         return """ | ||||
|             Some parameter: %s | ||||
|             """.formatted(parameter); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,16 @@ | ||||
| package com.baeldung.java14.textblocks; | ||||
| 
 | ||||
| public class TextBlocks14 { | ||||
|     public String getIgnoredNewLines() { | ||||
|         return """ | ||||
|             This is a long test which looks to \ | ||||
|             have a newline but actually does not"""; | ||||
|     } | ||||
| 
 | ||||
|     public String getEscapedSpaces() { | ||||
|         return """ | ||||
|             line 1 | ||||
|             line 2       \s | ||||
|             """; | ||||
|     } | ||||
| } | ||||
| @ -10,41 +10,41 @@ import java.io.Serializable; | ||||
| 
 | ||||
| /** | ||||
|  * Class showcasing the usage of the Java 14 @Serial annotation. | ||||
|  *  | ||||
|  * | ||||
|  * @author Donato Rimenti | ||||
|  */ | ||||
| public class MySerialClass implements Serializable { | ||||
| 	 | ||||
| 	@Serial | ||||
| 	private static final ObjectStreamField[] serialPersistentFields = null; | ||||
| 	 | ||||
| 	@Serial | ||||
| 	private static final long serialVersionUID = 1; | ||||
| 
 | ||||
| 	@Serial | ||||
| 	private void writeObject(ObjectOutputStream stream) throws IOException { | ||||
| 		// ... | ||||
| 	} | ||||
|     @Serial | ||||
|     private static final ObjectStreamField[] serialPersistentFields = null; | ||||
| 
 | ||||
| 	@Serial | ||||
| 	private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { | ||||
| 		// ... | ||||
| 	} | ||||
|     @Serial | ||||
|     private static final long serialVersionUID = 1; | ||||
| 
 | ||||
| 	@Serial | ||||
| 	private void readObjectNoData() throws ObjectStreamException { | ||||
| 		// ... | ||||
| 	} | ||||
|     @Serial | ||||
|     private void writeObject(ObjectOutputStream stream) throws IOException { | ||||
|         // ... | ||||
|     } | ||||
| 
 | ||||
| 	@Serial | ||||
| 	private Object writeReplace() throws ObjectStreamException { | ||||
| 		// ... | ||||
| 		return null; | ||||
| 	} | ||||
|     @Serial | ||||
|     private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { | ||||
|         // ... | ||||
|     } | ||||
| 
 | ||||
| 	@Serial | ||||
| 	private Object readResolve() throws ObjectStreamException { | ||||
| 		// ... | ||||
| 		return null; | ||||
| 	} | ||||
|     @Serial | ||||
|     private void readObjectNoData() throws ObjectStreamException { | ||||
|         // ... | ||||
|     } | ||||
| 
 | ||||
|     @Serial | ||||
|     private Object writeReplace() throws ObjectStreamException { | ||||
|         // ... | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     @Serial | ||||
|     private Object readResolve() throws ObjectStreamException { | ||||
|         // ... | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,58 @@ | ||||
| package com.baeldung.java14.textblocks; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| class TextBlocks13UnitTest { | ||||
|     private TextBlocks13 subject = new TextBlocks13(); | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() { | ||||
|         String expected = "<html>\n" | ||||
|           + "\n" | ||||
|           + "    <body>\n" | ||||
|           + "        <span>example text</span>\n" | ||||
|           + "    </body>\n" | ||||
|           + "</html>"; | ||||
|         assertThat(subject.getBlockOfHtml()).isEqualTo(expected); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() { | ||||
|         String expected = "<html>\n\n    <body>\n        <span>example text</span>\n    </body>\n</html>"; | ||||
|         assertThat(subject.getBlockOfHtml()).isEqualTo(expected); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAnIndentedString_thenMatchesIndentedOldStyle() { | ||||
|         assertThat(subject.getNonStandardIndent()).isEqualTo("    Indent\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAMultilineQuery_thenItCanContainUnescapedQuotes() { | ||||
|         assertThat(subject.getQuery()).contains("select \"id\", \"user\""); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAMultilineQuery_thenItEndWithANewline() { | ||||
|         assertThat(subject.getQuery()).endsWith("\n"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenATextWithCarriageReturns_thenItContainsBoth() { | ||||
|         assertThat(subject.getTextWithCarriageReturns()).isEqualTo("separated with\r\ncarriage returns"); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAStringWithEscapedWhitespace_thenItAppearsInTheResultingString() { | ||||
|         assertThat(subject.getTextWithEscapes()).contains("fun with\n\n") | ||||
|             .contains("whitespace\t\r\n") | ||||
|             .contains("and other escapes \"\"\""); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAFormattedString_thenTheParameterIsReplaced() { | ||||
|         assertThat(subject.getFormattedText("parameter")).contains("Some parameter: parameter"); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,21 @@ | ||||
| package com.baeldung.java14.textblocks; | ||||
| 
 | ||||
| import static org.assertj.core.api.Assertions.assertThat; | ||||
| 
 | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| class TextBlocks14UnitTest { | ||||
|     private TextBlocks14 subject = new TextBlocks14(); | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() { | ||||
|         String expected = "This is a long test which looks to have a newline but actually does not"; | ||||
|         assertThat(subject.getIgnoredNewLines()).isEqualTo(expected); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() { | ||||
|         String expected = "line 1\nline 2        \n"; | ||||
|         assertThat(subject.getEscapedSpaces()).isEqualTo(expected); | ||||
|     } | ||||
| } | ||||
| @ -61,7 +61,7 @@ | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <classifier>spring-boot</classifier> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                             <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|  | ||||
| @ -9,6 +9,7 @@ This module contains articles about Java 9 core features | ||||
| - [Iterate Through a Range of Dates in Java](https://www.baeldung.com/java-iterate-date-range) | ||||
| - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) | ||||
| - [Immutable Set in Java](https://www.baeldung.com/java-immutable-set) | ||||
| - [Immutable ArrayList in Java](https://www.baeldung.com/java-immutable-list) | ||||
| 
 | ||||
| Note: also contains part of the code for the article | ||||
| [How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering). | ||||
|  | ||||
| @ -37,6 +37,11 @@ | ||||
|             <version>${junit.platform.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-collections4</artifactId> | ||||
|             <version>${commons-collections4.version}</version> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <build> | ||||
| @ -69,6 +74,7 @@ | ||||
|         <maven.compiler.source>1.9</maven.compiler.source> | ||||
|         <maven.compiler.target>1.9</maven.compiler.target> | ||||
|         <guava.version>25.1-jre</guava.version> | ||||
|         <commons-collections4.version>4.1</commons-collections4.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -1,56 +1,48 @@ | ||||
| package org.baeldung.java.collections; | ||||
| package com.baeldung.java9.list.immutable; | ||||
| 
 | ||||
| import com.google.common.collect.ImmutableList; | ||||
| import org.apache.commons.collections4.ListUtils; | ||||
| import org.junit.Test; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class CoreJavaCollectionsUnitTest { | ||||
| 
 | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(CoreJavaCollectionsUnitTest.class); | ||||
| 
 | ||||
| 
 | ||||
|     // tests - | ||||
| 
 | ||||
|     @Test | ||||
|     public final void givenUsingTheJdk_whenArrayListIsSynchronized_thenCorrect() { | ||||
|         final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three")); | ||||
|         final List<String> synchronizedList = Collections.synchronizedList(list); | ||||
|         LOG.debug("Synchronized List is: " + synchronizedList); | ||||
|     } | ||||
| public class ImmutableArrayListUnitTest { | ||||
| 
 | ||||
|     @Test(expected = UnsupportedOperationException.class) | ||||
|     public final void givenUsingTheJdk_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() { | ||||
|         final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three")); | ||||
|     public final void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() { | ||||
|         final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three")); | ||||
|         final List<String> unmodifiableList = Collections.unmodifiableList(list); | ||||
|         unmodifiableList.add("four"); | ||||
|     } | ||||
| 
 | ||||
|     @Test(expected = UnsupportedOperationException.class) | ||||
|     public final void givenUsingGuava_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() { | ||||
|         final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three")); | ||||
|     public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() { | ||||
|         final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three")); | ||||
|         final List<String> unmodifiableList = List.of(list.toArray(new String[]{})); | ||||
|         unmodifiableList.add("four"); | ||||
|     } | ||||
| 
 | ||||
|     @Test(expected = UnsupportedOperationException.class) | ||||
|     public final void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() { | ||||
|         final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three")); | ||||
|         final List<String> unmodifiableList = ImmutableList.copyOf(list); | ||||
|         unmodifiableList.add("four"); | ||||
|     } | ||||
| 
 | ||||
|     @Test(expected = UnsupportedOperationException.class) | ||||
|     public final void givenUsingGuavaBuilder_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() { | ||||
|         final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three")); | ||||
|     public final void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() { | ||||
|         final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three")); | ||||
|         final ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build(); | ||||
|         unmodifiableList.add("four"); | ||||
|     } | ||||
| 
 | ||||
|     @Test(expected = UnsupportedOperationException.class) | ||||
|     public final void givenUsingCommonsCollections_whenUnmodifiableListIsCreatedFromOriginal_thenNoLongerModifiable() { | ||||
|         final List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three")); | ||||
|     public final void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() { | ||||
|         final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three")); | ||||
|         final List<String> unmodifiableList = ListUtils.unmodifiableList(list); | ||||
|         unmodifiableList.add("four"); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -13,4 +13,5 @@ This module contains articles about Java arrays | ||||
| - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) | ||||
| - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) | ||||
| - [Adding an Element to a Java Array vs an ArrayList](https://www.baeldung.com/java-add-element-to-array-vs-list) | ||||
| - [Arrays.sort vs Arrays.parallelSort](https://www.baeldung.com/java-arrays-sort-vs-parallelsort) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-arrays) | ||||
|  | ||||
| @ -51,7 +51,7 @@ | ||||
| 			<plugin> | ||||
| 				<groupId>org.apache.maven.plugins</groupId> | ||||
| 				<artifactId>maven-shade-plugin</artifactId> | ||||
| 				<version>3.2.0</version> | ||||
| 				<version>${shade.plugin.version}</version> | ||||
| 				<executions> | ||||
| 					<execution> | ||||
| 						<phase>package</phase> | ||||
| @ -79,6 +79,7 @@ | ||||
|         <commons-lang3.version>3.9</commons-lang3.version> | ||||
|         <!-- testing --> | ||||
|         <assertj-core.version>3.10.0</assertj-core.version> | ||||
|         <shade.plugin.version>3.2.0</shade.plugin.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -69,7 +69,7 @@ public class SortComparisonUnitTest { | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenArrayOfIntegers_whenUsingArraysSortMethodWithRange_thenSortRangeOfArrayInAscendingOrder() { | ||||
|     public void givenArrayOfIntegers_whenUsingArraysSortWithRange_thenSortRangeOfArrayAsc() { | ||||
|         int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 }; | ||||
|         int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 }; | ||||
| 
 | ||||
| @ -89,7 +89,7 @@ public class SortComparisonUnitTest { | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenArrayOfIntegers_whenUsingArraysParallelSortMethodWithRange_thenSortRangeOfArrayInAscendingOrder() { | ||||
|     public void givenArrayOfIntegers_whenUsingArraysParallelSortWithRange_thenSortRangeOfArrayAsc() { | ||||
|         int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 }; | ||||
|         int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 }; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										5
									
								
								core-java-modules/core-java-arrays-3/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								core-java-modules/core-java-arrays-3/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| ## Core Java Arrays (Part 3) | ||||
| 
 | ||||
| This module contains articles about Java arrays | ||||
| 
 | ||||
| ## Relevant Articles | ||||
							
								
								
									
										31
									
								
								core-java-modules/core-java-arrays-3/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								core-java-modules/core-java-arrays-3/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
| 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 	<artifactId>core-java-arrays-3</artifactId> | ||||
| 	<version>0.1.0-SNAPSHOT</version> | ||||
| 	<name>core-java-arrays-3</name> | ||||
| 	<packaging>jar</packaging> | ||||
| 
 | ||||
| 	<parent> | ||||
| 		<groupId>com.baeldung</groupId> | ||||
| 		<artifactId>parent-java</artifactId> | ||||
| 		<version>0.0.1-SNAPSHOT</version> | ||||
| 		<relativePath>../../parent-java</relativePath> | ||||
| 	</parent> | ||||
| 
 | ||||
| 	<dependencies> | ||||
| 		<dependency> | ||||
| 			<groupId>org.assertj</groupId> | ||||
| 			<artifactId>assertj-core</artifactId> | ||||
| 			<version>${assertj.version}</version> | ||||
| 			<scope>test</scope> | ||||
| 		</dependency> | ||||
| 	</dependencies> | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<assertj.version>3.14.0</assertj.version> | ||||
| 	</properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,96 @@ | ||||
| package com.baeldung.arrays.deepequals; | ||||
| 
 | ||||
| import static org.junit.Assert.assertFalse; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.Objects; | ||||
| import org.junit.jupiter.api.Test; | ||||
| 
 | ||||
| public class ArraysDeepEqualsUnitTest { | ||||
| 
 | ||||
|     class Person { | ||||
|         private int id; | ||||
|         private String name; | ||||
|         private int age; | ||||
| 
 | ||||
|         Person(int id, String name, int age) { | ||||
|             this.id = id; | ||||
|             this.name = name; | ||||
|             this.age = age; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public boolean equals(Object obj) { | ||||
|             if (this == obj) { | ||||
|                 return true; | ||||
|             } | ||||
|             if (obj == null) { | ||||
|                 return false; | ||||
|             } | ||||
|             if (!(obj instanceof Person)) | ||||
|                 return false; | ||||
|             Person person = (Person) obj; | ||||
|             return id == person.id && name.equals(person.name) && age == person.age; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public int hashCode() { | ||||
|             return Objects.hash(id, name, age); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTwoUnidimensionalObjectTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnTrue() { | ||||
|         Object[] anArray = new Object[] { "string1", "string2", "string3" }; | ||||
|         Object[] anotherArray = new Object[] { "string1", "string2", "string3" }; | ||||
| 
 | ||||
|         assertTrue(Arrays.equals(anArray, anotherArray)); | ||||
|         assertTrue(Arrays.deepEquals(anArray, anotherArray)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTwoUnidimensionalObjectTypeArraysWithNullElements_whenUsingEqualsAndDeepEquals_thenBothShouldReturnTrue() { | ||||
|         Object[] anArray = new Object[] { "string1", null, "string3" }; | ||||
|         Object[] anotherArray = new Object[] { "string1", null, "string3" }; | ||||
| 
 | ||||
|         assertTrue(Arrays.equals(anArray, anotherArray)); | ||||
|         assertTrue(Arrays.deepEquals(anArray, anotherArray)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTwoUnidimensionalObjectTypeArraysWithNestedElements_whenUsingEqualsAndDeepEquals_thenShouldReturnDifferently() { | ||||
|         Object[] anArray = new Object[] { "string1", null, new String[] { "nestedString1", "nestedString2" } }; | ||||
|         Object[] anotherArray = new Object[] { "string1", null, new String[] { "nestedString1", "nestedString2" } }; | ||||
| 
 | ||||
|         assertFalse(Arrays.equals(anArray, anotherArray)); | ||||
|         assertTrue(Arrays.deepEquals(anArray, anotherArray)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTwoMultidimensionalPrimitiveTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnDifferently() { | ||||
|         int[][] anArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } }; | ||||
|         int[][] anotherArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } }; | ||||
| 
 | ||||
|         assertFalse(Arrays.equals(anArray, anotherArray)); | ||||
|         assertTrue(Arrays.deepEquals(anArray, anotherArray)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTwoMultidimensionalObjectTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnDifferently() { | ||||
|         Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } }; | ||||
|         Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } }; | ||||
| 
 | ||||
|         assertFalse(Arrays.equals(personArray1, personArray2)); | ||||
|         assertTrue(Arrays.deepEquals(personArray1, personArray2)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     void givenTwoMultidimensionalObjectTypeArrays_whenUsingDeepEqualsFromObjectsAndArraysClasses_thenBothShouldReturnTrue() { | ||||
|         Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } }; | ||||
|         Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) }, { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } }; | ||||
| 
 | ||||
|         assertTrue(Objects.deepEquals(personArray1, personArray2)); | ||||
|         assertTrue(Arrays.deepEquals(personArray1, personArray2)); | ||||
|     } | ||||
| } | ||||
| @ -75,7 +75,7 @@ | ||||
|                         <manifest> | ||||
|                             <addClasspath>true</addClasspath> | ||||
|                             <classpathPrefix>libs/</classpathPrefix> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                             <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                         </manifest> | ||||
|                     </archive> | ||||
|                 </configuration> | ||||
| @ -94,7 +94,7 @@ | ||||
|                             <archiveBaseDirectory>${project.basedir}</archiveBaseDirectory> | ||||
|                             <archive> | ||||
|                                 <manifest> | ||||
|                                     <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                                     <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                                 </manifest> | ||||
|                             </archive> | ||||
|                             <descriptorRefs> | ||||
| @ -118,7 +118,7 @@ | ||||
|                             <shadedArtifactAttached>true</shadedArtifactAttached> | ||||
|                             <transformers> | ||||
|                                 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> | ||||
|                                     <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                                     <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                                 </transformer> | ||||
|                             </transformers> | ||||
|                         </configuration> | ||||
| @ -133,7 +133,7 @@ | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <configuration> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                             <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                             <attachToBuild>true</attachToBuild> | ||||
|                             <filename>${project.build.finalName}-onejar.${project.packaging}</filename> | ||||
|                         </configuration> | ||||
| @ -155,7 +155,7 @@ | ||||
|                         </goals> | ||||
|                         <configuration> | ||||
|                             <classifier>spring-boot</classifier> | ||||
|                             <mainClass>org.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                             <mainClass>com.baeldung.executable.ExecutableMavenJar</mainClass> | ||||
|                         </configuration> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
| @ -183,8 +183,8 @@ | ||||
|                 <artifactId>maven-javadoc-plugin</artifactId> | ||||
|                 <version>${maven-javadoc-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <source>1.8</source> | ||||
|                     <target>1.8</target> | ||||
|                     <source>${source.version}</source> | ||||
|                     <target>${target.version}</target> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
| @ -373,6 +373,8 @@ | ||||
|         <maven-shade-plugin.version>3.1.1</maven-shade-plugin.version> | ||||
|         <spring-boot-maven-plugin.version>2.0.3.RELEASE</spring-boot-maven-plugin.version> | ||||
|         <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> | ||||
|         <source.version>1.8</source.version> | ||||
|         <target.version>1.8</target.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -1,20 +0,0 @@ | ||||
| package com.baeldung.array; | ||||
| 
 | ||||
| public class Find2ndLargestInArray { | ||||
| 
 | ||||
|     public static int find2ndLargestElement(int[] array) { | ||||
|         int maxElement = array[0]; | ||||
|         int secondLargestElement = -1; | ||||
| 
 | ||||
|         for (int index = 0; index < array.length; index++) { | ||||
|             if (maxElement <= array[index]) { | ||||
|                 secondLargestElement = maxElement; | ||||
|                 maxElement = array[index]; | ||||
|             } else if (secondLargestElement < array[index]) { | ||||
|                 secondLargestElement = array[index]; | ||||
|             } | ||||
|         } | ||||
|         return secondLargestElement; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,22 +0,0 @@ | ||||
| package com.baeldung.array; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| 
 | ||||
| public class FindElementInArray { | ||||
| 
 | ||||
|     public static boolean findGivenElementInArrayWithoutUsingStream(int[] array, int element) { | ||||
|         boolean actualResult = false; | ||||
| 
 | ||||
|         for (int index = 0; index < array.length; index++) { | ||||
|             if (element == array[index]) { | ||||
|                 actualResult = true; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         return actualResult; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean findGivenElementInArrayUsingStream(int[] array, int element) { | ||||
|         return Arrays.stream(array).filter(x -> element == x).findFirst().isPresent(); | ||||
|     } | ||||
| } | ||||
| @ -1,16 +0,0 @@ | ||||
| package com.baeldung.array; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class Find2ndLargestInArrayUnitTest { | ||||
|     @Test | ||||
|     public void givenAnIntArray_thenFind2ndLargestElement() { | ||||
|         int[] array = { 1, 3, 24, 16, 87, 20 }; | ||||
|         int expected2ndLargest = 24; | ||||
| 
 | ||||
|         int actualSecondLargestElement = Find2ndLargestInArray.find2ndLargestElement(array); | ||||
| 
 | ||||
|         Assert.assertEquals(expected2ndLargest, actualSecondLargestElement); | ||||
|     } | ||||
| } | ||||
| @ -1,35 +0,0 @@ | ||||
| package com.baeldung.array; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class FindElementInArrayUnitTest { | ||||
|     @Test | ||||
|     public void givenAnIntArray_whenNotUsingStream_thenFindAnElement() { | ||||
|         int[] array = { 1, 3, 4, 8, 19, 20 }; | ||||
|         int element = 19; | ||||
|         boolean expectedResult = true; | ||||
|         boolean actualResult = FindElementInArray.findGivenElementInArrayWithoutUsingStream(array, element); | ||||
|         Assert.assertEquals(expectedResult, actualResult); | ||||
| 
 | ||||
|         element = 78; | ||||
|         expectedResult = false; | ||||
|         actualResult = FindElementInArray.findGivenElementInArrayWithoutUsingStream(array, element); | ||||
|         Assert.assertEquals(expectedResult, actualResult); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenAnIntArray_whenUsingStream_thenFindAnElement() { | ||||
|         int[] array = { 15, 16, 12, 18 }; | ||||
|         int element = 16; | ||||
|         boolean expectedResult = true; | ||||
|         boolean actualResult = FindElementInArray.findGivenElementInArrayUsingStream(array, element); | ||||
|         Assert.assertEquals(expectedResult, actualResult); | ||||
| 
 | ||||
|         element = 20; | ||||
|         expectedResult = false; | ||||
|         actualResult = FindElementInArray.findGivenElementInArrayUsingStream(array, element); | ||||
|         Assert.assertEquals(expectedResult, actualResult); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -3,9 +3,8 @@ | ||||
| This module contains articles about the Java ArrayList collection | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| - [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) | ||||
| - [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist) | ||||
| - [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list) | ||||
| - [Guide to the Java ArrayList](https://www.baeldung.com/java-arraylist) | ||||
| - [Add Multiple Items to an Java ArrayList](https://www.baeldung.com/java-add-items-array-list) | ||||
| - [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) | ||||
| - [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist) | ||||
| - [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element) | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung.java.collections; | ||||
| package com.baeldung.collections; | ||||
| 
 | ||||
| import com.google.common.collect.Sets; | ||||
| import org.junit.Before; | ||||
| @ -0,0 +1,25 @@ | ||||
| package com.baeldung.collections; | ||||
| 
 | ||||
| import com.google.common.collect.ImmutableList; | ||||
| import org.apache.commons.collections4.ListUtils; | ||||
| import org.junit.Test; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class CoreJavaCollectionsUnitTest { | ||||
| 
 | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(CoreJavaCollectionsUnitTest.class); | ||||
| 
 | ||||
|     @Test | ||||
|     public final void givenUsingTheJdk_whenArrayListIsSynchronized_thenCorrect() { | ||||
|         final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three")); | ||||
|         final List<String> synchronizedList = Collections.synchronizedList(list); | ||||
|         LOG.debug("Synchronized List is: " + synchronizedList); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -3,13 +3,13 @@ | ||||
| This module contains articles about the Java List collection | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| - [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) | ||||
| - [Check If Two Lists are Equal in Java](https://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) | ||||
| - [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) | ||||
| - [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) | ||||
| - [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception) | ||||
| - [A Guide to the Java LinkedList](https://www.baeldung.com/java-linkedlist) | ||||
| - [Java List UnsupportedOperationException](https://www.baeldung.com/java-list-unsupported-operation-exception) | ||||
| - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) | ||||
| - [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) | ||||
| - [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) | ||||
| - [Flattening Nested Collections in Java](https://www.baeldung.com/java-flatten-nested-collections) | ||||
| - [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) | ||||
| - [Searching for a String in an ArrayList](https://www.baeldung.com/java-search-string-arraylist) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-collections-list)[[Next -->]](/core-java-modules/core-java-collections-list-3) | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung.java.lists; | ||||
| package com.baeldung.java.list; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung.java.lists; | ||||
| package com.baeldung.java.list; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung.java.lists; | ||||
| package com.baeldung.java.list; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| @ -1,2 +0,0 @@ | ||||
| ### Relevant Articles: | ||||
| - [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung.java.collections; | ||||
| package com.baeldung.collections; | ||||
| 
 | ||||
| import static org.hamcrest.Matchers.hasSize; | ||||
| import static org.junit.Assert.assertThat; | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung; | ||||
| package com.baeldung.list.random; | ||||
| 
 | ||||
| import com.google.common.collect.Lists; | ||||
| import org.junit.Test; | ||||
| @ -1,22 +1,27 @@ | ||||
| package com.baeldung.threadlocalrandom; | ||||
| 
 | ||||
| import org.openjdk.jmh.runner.Runner; | ||||
| import org.openjdk.jmh.runner.options.Options; | ||||
| import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; | ||||
| import org.openjdk.jmh.runner.options.OptionsBuilder; | ||||
| 
 | ||||
| import com.google.common.collect.ImmutableList; | ||||
| 
 | ||||
| public class ThreadLocalRandomBenchMarkRunner { | ||||
| 
 | ||||
|     public static void main(String[] args) throws Exception { | ||||
| 
 | ||||
|         Options options = new OptionsBuilder().include(ThreadLocalRandomBenchMarker.class.getSimpleName()) | ||||
|             .threads(1) | ||||
|         ChainedOptionsBuilder options = new OptionsBuilder().include(ThreadLocalRandomBenchMarker.class.getSimpleName()) | ||||
|             .forks(1) | ||||
|             .shouldFailOnError(true) | ||||
|             .shouldDoGC(true) | ||||
|             .jvmArgs("-server") | ||||
|             .build(); | ||||
| 
 | ||||
|         new Runner(options).run(); | ||||
|             .jvmArgs("-server"); | ||||
| 
 | ||||
|         for (Integer i : ImmutableList.of(1, 2, 8, 32)) { | ||||
|             new Runner( | ||||
|                     options | ||||
|                             .threads(i) | ||||
|                             .build()) | ||||
|                     .run(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,64 +1,34 @@ | ||||
| package com.baeldung.threadlocalrandom; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Random; | ||||
| import java.util.concurrent.Callable; | ||||
| import java.util.concurrent.ExecutorService; | ||||
| import java.util.concurrent.Executors; | ||||
| import java.util.concurrent.ThreadLocalRandom; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import org.openjdk.jmh.annotations.Benchmark; | ||||
| import org.openjdk.jmh.annotations.BenchmarkMode; | ||||
| import org.openjdk.jmh.annotations.Level; | ||||
| import org.openjdk.jmh.annotations.Mode; | ||||
| import org.openjdk.jmh.annotations.OutputTimeUnit; | ||||
| import org.openjdk.jmh.annotations.Scope; | ||||
| import org.openjdk.jmh.annotations.Setup; | ||||
| import org.openjdk.jmh.annotations.State; | ||||
| import org.openjdk.jmh.annotations.Warmup; | ||||
| 
 | ||||
| @BenchmarkMode(Mode.AverageTime) | ||||
| @BenchmarkMode(Mode.Throughput) | ||||
| @Warmup(iterations = 1) | ||||
| @OutputTimeUnit(TimeUnit.MICROSECONDS) | ||||
| @State(Scope.Benchmark) | ||||
| public class ThreadLocalRandomBenchMarker { | ||||
|     private final Random random = new Random(); | ||||
| 
 | ||||
|     List<Callable<Integer>> randomCallables = new ArrayList<>(); | ||||
|     List<Callable<Integer>> threadLocalRandomCallables = new ArrayList<>(); | ||||
| 
 | ||||
|     @Setup(Level.Iteration) | ||||
|     public void init() { | ||||
|         Random random = new Random(); | ||||
|         randomCallables = new ArrayList<>(); | ||||
|         threadLocalRandomCallables = new ArrayList<>(); | ||||
|         for (int i = 0; i < 1000; i++) { | ||||
|             randomCallables.add(() -> { | ||||
|                 return random.nextInt(); | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         for (int i = 0; i < 1000; i++) { | ||||
|             threadLocalRandomCallables.add(() -> { | ||||
|                 return ThreadLocalRandom.current() | ||||
|                     .nextInt(); | ||||
|             }); | ||||
|         } | ||||
|     @Benchmark | ||||
|     public int randomValuesUsingRandom() { | ||||
|         return random.nextInt(); | ||||
|     } | ||||
| 
 | ||||
|     @Benchmark | ||||
|     public void randomValuesUsingRandom() throws InterruptedException { | ||||
|         ExecutorService executor = Executors.newWorkStealingPool(); | ||||
|         executor.invokeAll(randomCallables); | ||||
|         executor.shutdown(); | ||||
|     } | ||||
| 
 | ||||
|     @Benchmark | ||||
|     public void randomValuesUsingThreadLocalRandom() throws InterruptedException { | ||||
|         ExecutorService executor = Executors.newWorkStealingPool(); | ||||
|         executor.invokeAll(threadLocalRandomCallables); | ||||
|         executor.shutdown(); | ||||
|     public int randomValuesUsingThreadLocalRandom() { | ||||
|         return ThreadLocalRandom | ||||
|                 .current() | ||||
|                 .nextInt(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -8,4 +8,6 @@ This module contains articles about advanced topics about multithreading with co | ||||
| 
 | ||||
| - [Common Concurrency Pitfalls in Java](https://www.baeldung.com/java-common-concurrency-pitfalls) | ||||
| - [Guide to RejectedExecutionHandler](https://www.baeldung.com/java-rejectedexecutionhandler) | ||||
| [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2) | ||||
| - [Guide to Work Stealing in Java](https://www.baeldung.com/java-work-stealing) | ||||
| - [Asynchronous Programming in Java](https://www.baeldung.com/java-asynchronous-programming) | ||||
| - [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2) | ||||
|  | ||||
| @ -0,0 +1,85 @@ | ||||
| package com.baeldung.workstealing; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.ForkJoinTask; | ||||
| import java.util.concurrent.RecursiveAction; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| 
 | ||||
| public class PrimeNumbers extends RecursiveAction { | ||||
| 
 | ||||
|     private int lowerBound; | ||||
|     private int upperBound; | ||||
|     private int granularity; | ||||
|     static final List<Integer> GRANULARITIES | ||||
|       = Arrays.asList(1, 10, 100, 1000, 10000); | ||||
|     private AtomicInteger noOfPrimeNumbers; | ||||
| 
 | ||||
|     PrimeNumbers(int lowerBound, int upperBound, int granularity, AtomicInteger noOfPrimeNumbers) { | ||||
|         this.lowerBound = lowerBound; | ||||
|         this.upperBound = upperBound; | ||||
|         this.granularity = granularity; | ||||
|         this.noOfPrimeNumbers = noOfPrimeNumbers; | ||||
|     } | ||||
| 
 | ||||
|     PrimeNumbers(int upperBound) { | ||||
|         this(1, upperBound, 100, new AtomicInteger(0)); | ||||
|     } | ||||
| 
 | ||||
|     private PrimeNumbers(int lowerBound, int upperBound, AtomicInteger noOfPrimeNumbers) { | ||||
|         this(lowerBound, upperBound, 100, noOfPrimeNumbers); | ||||
|     } | ||||
| 
 | ||||
|     private List<PrimeNumbers> subTasks() { | ||||
|         List<PrimeNumbers> subTasks = new ArrayList<>(); | ||||
| 
 | ||||
|         for (int i = 1; i <= this.upperBound / granularity; i++) { | ||||
|             int upper = i * granularity; | ||||
|             int lower = (upper - granularity) + 1; | ||||
|             subTasks.add(new PrimeNumbers(lower, upper, noOfPrimeNumbers)); | ||||
|         } | ||||
|         return subTasks; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     protected void compute() { | ||||
|         if (((upperBound + 1) - lowerBound) > granularity) { | ||||
|             ForkJoinTask.invokeAll(subTasks()); | ||||
|         } else { | ||||
|             findPrimeNumbers(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     void findPrimeNumbers() { | ||||
|         for (int num = lowerBound; num <= upperBound; num++) { | ||||
|             if (isPrime(num)) { | ||||
|                 noOfPrimeNumbers.getAndIncrement(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private boolean isPrime(int number) { | ||||
|         if (number == 2) { | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         if (number == 1 || number % 2 == 0) { | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         int noOfNaturalNumbers = 0; | ||||
| 
 | ||||
|         for (int i = 1; i <= number; i++) { | ||||
|             if (number % i == 0) { | ||||
|                 noOfNaturalNumbers++; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return noOfNaturalNumbers == 2; | ||||
|     } | ||||
| 
 | ||||
|     public int noOfPrimeNumbers() { | ||||
|         return noOfPrimeNumbers.intValue(); | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,7 @@ | ||||
| package com.baeldung.rejection; | ||||
| 
 | ||||
| import org.junit.After; | ||||
| import org.junit.Ignore; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| @ -28,24 +29,26 @@ public class SaturationPolicyUnitTest { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Ignore | ||||
|     @Test | ||||
|     public void givenAbortPolicy_WhenSaturated_ThenShouldThrowRejectedExecutionException() { | ||||
|         executor = new ThreadPoolExecutor(1, 1, 0, MILLISECONDS, new SynchronousQueue<>(), new AbortPolicy()); | ||||
|         executor.execute(() -> waitFor(100)); | ||||
|         executor.execute(() -> waitFor(250)); | ||||
| 
 | ||||
|         assertThatThrownBy(() -> executor.execute(() -> System.out.println("Will be rejected"))).isInstanceOf(RejectedExecutionException.class); | ||||
|     } | ||||
| 
 | ||||
|     @Ignore | ||||
|     @Test | ||||
|     public void givenCallerRunsPolicy_WhenSaturated_ThenTheCallerThreadRunsTheTask() { | ||||
|         executor = new ThreadPoolExecutor(1, 1, 0, MILLISECONDS, new SynchronousQueue<>(), new CallerRunsPolicy()); | ||||
|         executor.execute(() -> waitFor(100)); | ||||
|         executor.execute(() -> waitFor(250)); | ||||
| 
 | ||||
|         long startTime = System.nanoTime(); | ||||
|         executor.execute(() -> waitFor(100)); | ||||
|         double blockedDuration = (System.nanoTime() - startTime) / 1_000_000.0; | ||||
|         long startTime = System.currentTimeMillis(); | ||||
|         executor.execute(() -> waitFor(500)); | ||||
|         long blockedDuration = System.currentTimeMillis() - startTime; | ||||
| 
 | ||||
|         assertThat(blockedDuration).isGreaterThanOrEqualTo(100); | ||||
|         assertThat(blockedDuration).isGreaterThanOrEqualTo(500); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|  | ||||
| @ -0,0 +1,101 @@ | ||||
| package com.baeldung.workstealing; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| import org.openjdk.jmh.annotations.*; | ||||
| import org.openjdk.jmh.runner.Runner; | ||||
| import org.openjdk.jmh.runner.RunnerException; | ||||
| import org.openjdk.jmh.runner.options.Options; | ||||
| import org.openjdk.jmh.runner.options.OptionsBuilder; | ||||
| 
 | ||||
| import java.util.concurrent.Executors; | ||||
| import java.util.concurrent.ForkJoinPool; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| import java.util.logging.Logger; | ||||
| 
 | ||||
| import static org.junit.Assert.fail; | ||||
| 
 | ||||
| public class PrimeNumbersUnitTest { | ||||
| 
 | ||||
|     private static Logger logger = Logger.getAnonymousLogger(); | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenPrimesCalculated_whenUsingPoolsAndOneThread_thenOneThreadSlowest() { | ||||
|         Options opt = new OptionsBuilder() | ||||
|           .include(Benchmarker.class.getSimpleName()) | ||||
|           .forks(1) | ||||
|           .build(); | ||||
| 
 | ||||
|         try { | ||||
|             new Runner(opt).run(); | ||||
|         } catch (RunnerException e) { | ||||
|             fail(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenNewWorkStealingPool_whenGettingPrimes_thenStealCountChanges() { | ||||
|         StringBuilder info = new StringBuilder(); | ||||
| 
 | ||||
|         for (int granularity : PrimeNumbers.GRANULARITIES) { | ||||
|             int parallelism = ForkJoinPool.getCommonPoolParallelism(); | ||||
|             ForkJoinPool pool = | ||||
|               (ForkJoinPool) Executors.newWorkStealingPool(parallelism); | ||||
| 
 | ||||
|             stealCountInfo(info, granularity, pool); | ||||
|         } | ||||
|         logger.info("\nExecutors.newWorkStealingPool ->" + info.toString()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenCommonPool_whenGettingPrimes_thenStealCountChangesSlowly() { | ||||
|         StringBuilder info = new StringBuilder(); | ||||
| 
 | ||||
|         for (int granularity : PrimeNumbers.GRANULARITIES) { | ||||
|             ForkJoinPool pool = ForkJoinPool.commonPool(); | ||||
|             stealCountInfo(info, granularity, pool); | ||||
|         } | ||||
|         logger.info("\nForkJoinPool.commonPool ->" + info.toString()); | ||||
|     } | ||||
| 
 | ||||
|     private void stealCountInfo(StringBuilder info, int granularity, ForkJoinPool forkJoinPool) { | ||||
|         PrimeNumbers primes = new PrimeNumbers(1, 10000, granularity, new AtomicInteger(0)); | ||||
|         forkJoinPool.invoke(primes); | ||||
|         forkJoinPool.shutdown(); | ||||
| 
 | ||||
|         long steals = forkJoinPool.getStealCount(); | ||||
|         String output = "\nGranularity: [" + granularity + "], Steals: [" + steals + "]"; | ||||
|         info.append(output); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     @BenchmarkMode(Mode.AverageTime) | ||||
|     @OutputTimeUnit(TimeUnit.MILLISECONDS) | ||||
|     @State(Scope.Benchmark) | ||||
|     @Fork(value = 2, warmups = 1, jvmArgs = {"-Xms2G", "-Xmx2G"}) | ||||
|     public static class Benchmarker { | ||||
| 
 | ||||
|         @Benchmark | ||||
|         public void singleThread() { | ||||
|             PrimeNumbers primes = new PrimeNumbers(10000); | ||||
|             primes.findPrimeNumbers(); // get prime numbers using a single thread | ||||
|         } | ||||
| 
 | ||||
|         @Benchmark | ||||
|         public void commonPoolBenchmark() { | ||||
|             PrimeNumbers primes = new PrimeNumbers(10000); | ||||
|             ForkJoinPool pool = ForkJoinPool.commonPool(); | ||||
|             pool.invoke(primes); | ||||
|             pool.shutdown(); | ||||
|         } | ||||
| 
 | ||||
|         @Benchmark | ||||
|         public void newWorkStealingPoolBenchmark() { | ||||
|             PrimeNumbers primes = new PrimeNumbers(10000); | ||||
|             int parallelism = ForkJoinPool.getCommonPoolParallelism(); | ||||
|             ForkJoinPool stealer = (ForkJoinPool) Executors.newWorkStealingPool(parallelism); | ||||
|             stealer.invoke(primes); | ||||
|             stealer.shutdown(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -4,7 +4,7 @@ package com.baeldung.concurrent.volatilekeyword; | ||||
| public class SharedObject { | ||||
|     private volatile int count=0; | ||||
| 
 | ||||
|     void increamentCount(){ | ||||
|     void incrementCount(){ | ||||
|         count++; | ||||
|     } | ||||
|     public int  getCount(){ | ||||
|  | ||||
| @ -10,7 +10,7 @@ public class SharedObjectManualTest { | ||||
|     public void whenOneThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException { | ||||
|         SharedObject sharedObject = new SharedObject(); | ||||
| 
 | ||||
|         Thread writer = new Thread(() -> sharedObject.increamentCount()); | ||||
|         Thread writer = new Thread(() -> sharedObject.incrementCount()); | ||||
|         writer.start(); | ||||
|         Thread.sleep(100); | ||||
| 
 | ||||
| @ -31,11 +31,11 @@ public class SharedObjectManualTest { | ||||
|     @Test | ||||
|     public void whenTwoThreadWrites_thenVolatileReadsFromMainMemory() throws InterruptedException { | ||||
|         SharedObject sharedObject = new SharedObject(); | ||||
|         Thread writerOne = new Thread(() -> sharedObject.increamentCount()); | ||||
|         Thread writerOne = new Thread(() -> sharedObject.incrementCount()); | ||||
|         writerOne.start(); | ||||
|         Thread.sleep(100); | ||||
| 
 | ||||
|         Thread writerTwo = new Thread(() -> sharedObject.increamentCount()); | ||||
|         Thread writerTwo = new Thread(() -> sharedObject.incrementCount()); | ||||
|         writerTwo.start(); | ||||
|         Thread.sleep(100); | ||||
| 
 | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| package org.baeldung.java.streams; | ||||
| package com.baeldung.java.stream; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| @ -6,4 +6,5 @@ This module contains articles about date operations in Java. | ||||
| - [Skipping Weekends While Adding Days to LocalDate in Java 8](https://www.baeldung.com/java-localdate-add-days-skip-weekends) | ||||
| - [Checking If Two Java Dates Are on the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day) | ||||
| - [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime) | ||||
| - [How to Set the JVM Time Zone](https://www.baeldung.com/java-jvm-time-zone) | ||||
| - [[<-- Prev]](/core-java-modules/core-java-date-operations-1) | ||||
|  | ||||
| @ -4,6 +4,7 @@ import org.junit.Test; | ||||
| 
 | ||||
| import java.time.OffsetDateTime; | ||||
| import java.util.Date; | ||||
| import java.util.TimeZone; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| @ -18,12 +19,19 @@ public class ConvertToOffsetDateTimeUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenDate_whenHasOffset_thenConvertWithOffset() { | ||||
|         TimeZone prevTimezone = TimeZone.getDefault(); | ||||
|         TimeZone.setDefault(TimeZone.getTimeZone("UTC")); | ||||
| 
 | ||||
|         Date date = new Date(); | ||||
|         date.setHours(6); | ||||
|         date.setMinutes(30); | ||||
| 
 | ||||
|         OffsetDateTime odt = ConvertToOffsetDateTime.convert(date, 3, 30); | ||||
|         assertEquals(10, odt.getHour()); | ||||
|         assertEquals(0, odt.getMinute()); | ||||
| 
 | ||||
|         // Reset the timezone to its original value to prevent side effects | ||||
|         TimeZone.setDefault(prevTimezone); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
							
								
								
									
										3
									
								
								core-java-modules/core-java-datetime-java8-2/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								core-java-modules/core-java-datetime-java8-2/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| ### Relevant Articles: | ||||
| 
 | ||||
| - [Creating a LocalDate with Values in Java](https://www.baeldung.com/java-creating-localdate-with-values) | ||||
							
								
								
									
										72
									
								
								core-java-modules/core-java-datetime-java8-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								core-java-modules/core-java-datetime-java8-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|     <artifactId>core-java-datetime-java8</artifactId> | ||||
|     <version>${project.parent.version}</version> | ||||
|     <name>core-java-datetime-java8</name> | ||||
|     <packaging>jar</packaging> | ||||
| 
 | ||||
|     <parent> | ||||
|         <groupId>com.baeldung</groupId> | ||||
|         <artifactId>parent-java</artifactId> | ||||
|         <version>0.0.1-SNAPSHOT</version> | ||||
|         <relativePath>../../parent-java</relativePath> | ||||
|     </parent> | ||||
| 
 | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-lang3</artifactId> | ||||
|             <version>${commons-lang3.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>joda-time</groupId> | ||||
|             <artifactId>joda-time</artifactId> | ||||
|             <version>${joda-time.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
|             <version>${assertj.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>log4j</groupId> | ||||
|             <artifactId>log4j</artifactId> | ||||
|             <version>${log4j.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| 
 | ||||
|     <build> | ||||
|         <finalName>core-java-datetime-java8</finalName> | ||||
|         <resources> | ||||
|             <resource> | ||||
|                 <directory>src/main/resources</directory> | ||||
|                 <filtering>true</filtering> | ||||
|             </resource> | ||||
|         </resources> | ||||
| 
 | ||||
|         <plugins> | ||||
|             <plugin> | ||||
|                 <groupId>org.apache.maven.plugins</groupId> | ||||
|                 <artifactId>maven-compiler-plugin</artifactId> | ||||
|                 <version>${maven-compiler-plugin.version}</version> | ||||
|                 <configuration> | ||||
|                     <source>${maven.compiler.source}</source> | ||||
|                     <target>${maven.compiler.target}</target> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
| 
 | ||||
|     <properties> | ||||
|         <maven.compiler.source>1.9</maven.compiler.source> | ||||
|         <maven.compiler.target>1.9</maven.compiler.target> | ||||
|         <joda-time.version>2.10</joda-time.version> | ||||
|         <!-- testing --> | ||||
|         <assertj.version>3.6.1</assertj.version> | ||||
|     </properties> | ||||
| 
 | ||||
| </project> | ||||
| @ -0,0 +1,31 @@ | ||||
| package com.baeldung.localdate; | ||||
| 
 | ||||
| import java.time.LocalDate; | ||||
| import java.time.Month; | ||||
| import java.time.format.DateTimeFormatter; | ||||
| 
 | ||||
| public class LocalDateExample { | ||||
|     public LocalDate getCustomDateOne(int year, int month, int dayOfMonth) { | ||||
|         return LocalDate.of(year, month, dayOfMonth); | ||||
|     } | ||||
| 
 | ||||
|     public LocalDate getCustomDateTwo(int year, Month month, int dayOfMonth) { | ||||
|         return LocalDate.of(year, month, dayOfMonth); | ||||
|     } | ||||
| 
 | ||||
|     public LocalDate getDateFromEpochDay(long epochDay) { | ||||
|         return LocalDate.ofEpochDay(epochDay); | ||||
|     } | ||||
| 
 | ||||
|     public LocalDate getDateFromYearAndDayOfYear(int year, int dayOfYear) { | ||||
|         return LocalDate.ofYearDay(year, dayOfYear); | ||||
|     } | ||||
| 
 | ||||
|     public LocalDate getDateFromString(String date) { | ||||
|         return LocalDate.parse(date); | ||||
|     } | ||||
| 
 | ||||
|     public LocalDate getDateFromStringAndFormatter(String date, String pattern) { | ||||
|         return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern)); | ||||
|     } | ||||
| } | ||||
| @ -1,4 +1,4 @@ | ||||
| package com.baeldung.datebasics; | ||||
| package com.baeldung.localdate; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| @ -6,49 +6,34 @@ import java.time.Month; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class CreateDateUnitTest { | ||||
|     private CreateDate date = new CreateDate(); | ||||
|      | ||||
|     @Test | ||||
|     public void whenUsingNowMethod_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getTodaysDate()); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void whenUsingClock_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getTodaysDateFromClock()); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void givenValues_whenUsingZone_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getTodaysDateFromZone("Asia/Kolkata")); | ||||
|     } | ||||
|      | ||||
| public class LocalDateExampleUnitTest { | ||||
|     private LocalDateExample date = new LocalDateExample(); | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenValues_whenUsingOfMethod_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getCustomDateOne(2020, 1, 8)); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenValuesWithMonthEnum_whenUsingOfMethod_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getCustomDateTwo(2020, Month.JANUARY, 8)); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenValues_whenUsingEpochDay_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getDateFromEpochDay(18269)); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenValues_whenUsingYearDay_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getDateFromYearAndDayOfYear(2020, 8)); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenValues_whenUsingParse_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getDateFromString("2020-01-08")); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenValuesWithFormatter_whenUsingParse_thenLocalDate() { | ||||
|         assertEquals("2020-01-08", date.getDateFromStringAndFormatter("8-Jan-2020", "d-MMM-yyyy")); | ||||
| @ -1,45 +0,0 @@ | ||||
| package com.baeldung.datebasics; | ||||
| 
 | ||||
| import java.time.Clock; | ||||
| import java.time.LocalDate; | ||||
| import java.time.Month; | ||||
| import java.time.ZoneId; | ||||
| import java.time.format.DateTimeFormatter; | ||||
| 
 | ||||
| public class CreateDate { | ||||
| 	public LocalDate getTodaysDate() { | ||||
| 		return LocalDate.now(); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getTodaysDateFromClock() { | ||||
| 		return LocalDate.now(Clock.systemDefaultZone()); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getTodaysDateFromZone(String zone) { | ||||
| 		return LocalDate.now(ZoneId.of(zone)); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getCustomDateOne(int year, int month, int dayOfMonth) { | ||||
| 		return LocalDate.of(year, month, dayOfMonth); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getCustomDateTwo(int year, Month month, int dayOfMonth) { | ||||
| 		return LocalDate.of(year, month, dayOfMonth); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getDateFromEpochDay(long epochDay) { | ||||
| 		return LocalDate.ofEpochDay(epochDay); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getDateFromYearAndDayOfYear(int year, int dayOfYear) { | ||||
| 		return LocalDate.ofYearDay(year, dayOfYear); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getDateFromString(String date) { | ||||
| 		return LocalDate.parse(date); | ||||
| 	} | ||||
| 
 | ||||
| 	public LocalDate getDateFromStringAndFormatter(String date, String pattern) { | ||||
| 		return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern)); | ||||
| 	} | ||||
| } | ||||
| @ -2,4 +2,8 @@ | ||||
| 
 | ||||
| This module contains articles about core java exceptions | ||||
| 
 | ||||
| ### | ||||
| ### Relevant Articles: | ||||
| 
 | ||||
| - [Is It a Bad Practice to Catch Throwable?](https://www.baeldung.com/java-catch-throwable-bad-practice) | ||||
| - [Wrapping vs Rethrowing Exceptions in Java](https://www.baeldung.com/java-wrapping-vs-rethrowing-exceptions) | ||||
| - [java.net.UnknownHostException: Invalid Hostname for Server](https://www.baeldung.com/java-unknownhostexception) | ||||
|  | ||||
| @ -13,12 +13,24 @@ | ||||
| 		<version>0.0.1-SNAPSHOT</version> | ||||
| 		<relativePath>../../parent-java</relativePath> | ||||
| 	</parent> | ||||
| 	 | ||||
| 	<dependencies> | ||||
| 		<!-- test scoped --> | ||||
| 		<dependency> | ||||
|             <groupId>org.assertj</groupId> | ||||
|             <artifactId>assertj-core</artifactId> | ||||
|             <version>${assertj-core.version}</version> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
| 	</dependencies> | ||||
| 
 | ||||
| 	<description> </description> | ||||
| 	<url>http://maven.apache.org</url> | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
| 		<!-- testing --> | ||||
| 		<assertj-core.version>3.10.0</assertj-core.version> | ||||
| 	</properties> | ||||
| 
 | ||||
| </project> | ||||
|  | ||||
| @ -0,0 +1,28 @@ | ||||
| package com.baeldung.exceptions; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.URL; | ||||
| import java.net.UnknownHostException; | ||||
| 
 | ||||
| public class UnknownHostExceptionHandling { | ||||
| 
 | ||||
|     public static int getResponseCode(String hostname) throws IOException { | ||||
|         URL url = new URL(hostname.trim()); | ||||
|         HttpURLConnection con = (HttpURLConnection) url.openConnection(); | ||||
|         int resCode = -1; | ||||
|         try { | ||||
|             resCode = con.getResponseCode(); | ||||
|         } catch (UnknownHostException e){ | ||||
|             con.disconnect(); | ||||
|         } | ||||
|         return resCode; | ||||
|     } | ||||
|      | ||||
|     public static int getResponseCodeUnhandled(String hostname) throws IOException { | ||||
|         URL url = new URL(hostname.trim()); | ||||
|         HttpURLConnection con = (HttpURLConnection) url.openConnection(); | ||||
|         int resCode = con.getResponseCode(); | ||||
|         return resCode; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| package com.baeldung.socketexception; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.PrintWriter; | ||||
| import java.net.Socket; | ||||
| 
 | ||||
| public class SocketClient { | ||||
| 
 | ||||
|     private Socket clientSocket; | ||||
|     private PrintWriter out; | ||||
|     private BufferedReader in; | ||||
| 
 | ||||
|     public void startConnection(String ip, int port) throws IOException { | ||||
|         clientSocket = new Socket(ip, port); | ||||
|         out = new PrintWriter(clientSocket.getOutputStream(), true); | ||||
|         in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); | ||||
|     } | ||||
| 
 | ||||
|     public String sendMessage(String msg) throws IOException { | ||||
|         out.println(msg); | ||||
|         return in.readLine(); | ||||
|     } | ||||
| 
 | ||||
|     public void stopConnection() throws IOException { | ||||
|         in.close(); | ||||
|         out.close(); | ||||
|         clientSocket.close(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,45 @@ | ||||
| package com.baeldung.socketexception; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.io.PrintWriter; | ||||
| import java.net.ServerSocket; | ||||
| import java.net.Socket; | ||||
| 
 | ||||
| public class SocketServer { | ||||
| 
 | ||||
|     private ServerSocket serverSocket; | ||||
|     private Socket clientSocket; | ||||
|     private PrintWriter out; | ||||
|     private BufferedReader in; | ||||
| 
 | ||||
|     public void start(int port) { | ||||
|         try { | ||||
|             serverSocket = new ServerSocket(port); | ||||
|             clientSocket = serverSocket.accept(); | ||||
|             out = new PrintWriter(clientSocket.getOutputStream(), true); | ||||
|             in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); | ||||
|             String msg = in.readLine(); | ||||
|             if (msg.contains("hi")) | ||||
|                 out.println("hi"); | ||||
|             else | ||||
|                 out.println("didn't understand"); | ||||
|             close(); | ||||
|             stop(); | ||||
|         } catch (IOException e) { | ||||
|              | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void close() throws IOException { | ||||
|         in.close(); | ||||
|         out.close(); | ||||
|     } | ||||
| 
 | ||||
|     private void stop() throws IOException { | ||||
|         clientSocket.close(); | ||||
|         serverSocket.close(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,15 @@ | ||||
| package com.baeldung.exceptions; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.net.UnknownHostException; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class UnknownHostExceptionHandlingUnitTest { | ||||
| 
 | ||||
|     @Test(expected = UnknownHostException.class) | ||||
|     public void givenUnknownHost_whenResolve_thenUnknownHostException() throws IOException { | ||||
|         UnknownHostExceptionHandling.getResponseCodeUnhandled("http://locaihost"); | ||||
|     } | ||||
|      | ||||
| } | ||||
| @ -0,0 +1,31 @@ | ||||
| package com.baeldung.socketexception; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.net.SocketException; | ||||
| import java.util.concurrent.Executors; | ||||
| 
 | ||||
| import org.junit.BeforeClass; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class SocketExceptionHandlingUnitTest { | ||||
| 
 | ||||
|     @BeforeClass | ||||
|     public static void runServer() throws IOException, InterruptedException { | ||||
|         Executors.newSingleThreadExecutor() | ||||
|             .submit(() -> new SocketServer().start(6699)); | ||||
|         Thread.sleep(100); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenRunningServer_whenConnectToClosedSocket_thenHandleException() throws IOException { | ||||
|         SocketClient client = new SocketClient(); | ||||
|         client.startConnection("127.0.0.1", 6699); | ||||
|         try { | ||||
|             client.sendMessage("hi"); | ||||
|             client.sendMessage("hi again"); | ||||
|         } catch (SocketException e) { | ||||
|             client.stopConnection(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -11,5 +11,5 @@ This module contains articles about core Java input and output (IO) | ||||
| - [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files) | ||||
| - [Java – Append Data to a File](https://www.baeldung.com/java-append-to-file) | ||||
| - [How to Copy a File with Java](https://www.baeldung.com/java-copy-file) | ||||
| - [Create a Directory in Java](https://www.baeldung.com/java-create-directory) | ||||
| - [Create a Directory in Java](https://www.baeldung.com/java-create-directory)  | ||||
| - [[<-- Prev]](/core-java-modules/core-java-io) | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| package com.baeldung.file; | ||||
| 
 | ||||
| import org.junit.Ignore; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.io.*; | ||||
| @ -73,6 +74,7 @@ public class FileClassUnitTest { | ||||
|         assertFalse(writable); | ||||
|     } | ||||
| 
 | ||||
|     @Ignore | ||||
|     @Test | ||||
|     public void givenWriteOnlyFile_whenCreateNewFile_thenCantReadFile() { | ||||
|         File parentDir = makeDir("writeDir"); | ||||
|  | ||||
| @ -13,4 +13,5 @@ This module contains articles about core Java input and output (IO) | ||||
| - [Getting a File’s Mime Type in Java](https://www.baeldung.com/java-file-mime-type) | ||||
| - [How to Write to a CSV File in Java](https://www.baeldung.com/java-csv) | ||||
| - [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened) | ||||
| - [Create a Directory in Java](https://www.baeldung.com/java-create-directory) | ||||
| - [[More -->]](/core-java-modules/core-java-io-2) | ||||
|  | ||||
| @ -1,134 +0,0 @@ | ||||
| package com.baeldung.readfile; | ||||
| 
 | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.hamcrest.CoreMatchers; | ||||
| import org.hamcrest.Matchers; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| 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 java.net.URISyntaxException; | ||||
| import java.net.URL; | ||||
| import java.net.URLConnection; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| import java.util.stream.Collectors; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertThat; | ||||
| 
 | ||||
| public class FileOperationsManualTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingClassloader_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello World from fileTest.txt!!!"; | ||||
| 
 | ||||
|         ClassLoader classLoader = getClass().getClassLoader(); | ||||
|         File file = new File(classLoader.getResource("fileTest.txt").getFile()); | ||||
|         InputStream inputStream = new FileInputStream(file); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileNameAsAbsolutePath_whenUsingClasspath_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello World from fileTest.txt!!!"; | ||||
| 
 | ||||
|         Class clazz = FileOperationsManualTest.class; | ||||
|         InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt"); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingJarFile_thenFileData() throws IOException { | ||||
|         String expectedData = "MIT License"; | ||||
| 
 | ||||
|         Class clazz = Matchers.class; | ||||
|         InputStream inputStream = clazz.getResourceAsStream("/LICENSE.txt"); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertThat(data.trim(), CoreMatchers.containsString(expectedData)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenURLName_whenUsingURL_thenFileData() throws IOException { | ||||
|         String expectedData = "Example Domain"; | ||||
| 
 | ||||
|         URL urlObject = new URL("http://www.example.com/"); | ||||
| 
 | ||||
|         URLConnection urlConnection = urlObject.openConnection(); | ||||
| 
 | ||||
|         InputStream inputStream = urlConnection.getInputStream(); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertThat(data.trim(), CoreMatchers.containsString(expectedData)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingFileUtils_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello World from fileTest.txt!!!"; | ||||
| 
 | ||||
|         ClassLoader classLoader = getClass().getClassLoader(); | ||||
|         File file = new File(classLoader.getResource("fileTest.txt").getFile()); | ||||
|         String data = FileUtils.readFileToString(file, "UTF-8"); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFilePath_whenUsingFilesReadAllBytes_thenFileData() throws IOException, URISyntaxException { | ||||
|         String expectedData = "Hello World from fileTest.txt!!!"; | ||||
| 
 | ||||
|         Path path = Paths.get(getClass().getClassLoader().getResource("fileTest.txt").toURI()); | ||||
| 
 | ||||
|         byte[] fileBytes = Files.readAllBytes(path); | ||||
|         String data = new String(fileBytes); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFilePath_whenUsingFilesLines_thenFileData() throws IOException, URISyntaxException { | ||||
|         String expectedData = "Hello World from fileTest.txt!!!"; | ||||
| 
 | ||||
|         Path path = Paths.get(getClass().getClassLoader().getResource("fileTest.txt").toURI()); | ||||
| 
 | ||||
|         Stream<String> lines = Files.lines(path); | ||||
|         String data = lines.collect(Collectors.joining("\n")); | ||||
|         lines.close(); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     private String readFromInputStream(InputStream inputStream) throws IOException { | ||||
|         StringBuilder resultStringBuilder = new StringBuilder(); | ||||
|         try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { | ||||
|             String line; | ||||
|             while ((line = bufferedReader.readLine()) != null) { | ||||
|                 resultStringBuilder.append(line).append("\n"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return resultStringBuilder.toString(); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingIOUtils_thenFileData() throws IOException { | ||||
|         String expectedData = "This is a content of the file"; | ||||
| 
 | ||||
|         FileInputStream fis = new FileInputStream("src/test/resources/fileToRead.txt"); | ||||
|         String data = IOUtils.toString(fis, "UTF-8"); | ||||
|          | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| } | ||||
| @ -1,11 +1,15 @@ | ||||
| package com.baeldung.readfile; | ||||
| 
 | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.hamcrest.CoreMatchers; | ||||
| import org.hamcrest.Matchers; | ||||
| import org.junit.Test; | ||||
| import org.junit.Ignore; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.net.URISyntaxException; | ||||
| import java.net.URL; | ||||
| import java.net.URLConnection; | ||||
| import java.nio.ByteBuffer; | ||||
| import java.nio.channels.FileChannel; | ||||
| import java.nio.charset.Charset; | ||||
| @ -13,55 +17,148 @@ import java.nio.file.Files; | ||||
| import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | ||||
| import java.util.Scanner; | ||||
| import java.util.stream.Collectors; | ||||
| import java.util.stream.Stream; | ||||
| 
 | ||||
| import static org.hamcrest.MatcherAssert.assertThat; | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertTrue; | ||||
| 
 | ||||
| public class JavaReadFromFileUnitTest { | ||||
| 
 | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(JavaReadFromFileUnitTest.class); | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadWithBufferedReader_thenCorrect() throws IOException { | ||||
|         final String expected_value = "Hello world"; | ||||
|         final String expected_value = "Hello, world!"; | ||||
| 
 | ||||
|         final BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/test_read.in")); | ||||
|         final BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/fileTest.txt")); | ||||
|         final String currentLine = reader.readLine(); | ||||
|         reader.close(); | ||||
| 
 | ||||
|         assertEquals(expected_value, currentLine); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingClassloader_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello, world!"; | ||||
| 
 | ||||
|         ClassLoader classLoader = getClass().getClassLoader(); | ||||
|         File file = new File(classLoader.getResource("fileTest.txt").getFile()); | ||||
|         InputStream inputStream = new FileInputStream(file); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileNameAsAbsolutePath_whenUsingClasspath_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello, world!"; | ||||
| 
 | ||||
|         Class clazz = JavaReadFromFileUnitTest.class; | ||||
|         InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt"); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingJarFile_thenFileData() throws IOException { | ||||
|         String expectedData = "BSD License"; | ||||
| 
 | ||||
|         Class clazz = Matchers.class; | ||||
|         InputStream inputStream = clazz.getResourceAsStream("/LICENSE.txt"); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertThat(data.trim(), CoreMatchers.containsString(expectedData)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenURLName_whenUsingURL_thenFileData() throws IOException { | ||||
|         String expectedData = "Example Domain"; | ||||
| 
 | ||||
|         URL urlObject = new URL("http://www.example.com/"); | ||||
| 
 | ||||
|         URLConnection urlConnection = urlObject.openConnection(); | ||||
| 
 | ||||
|         InputStream inputStream = urlConnection.getInputStream(); | ||||
|         String data = readFromInputStream(inputStream); | ||||
| 
 | ||||
|         assertThat(data.trim(), CoreMatchers.containsString(expectedData)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingFileUtils_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello, world!"; | ||||
| 
 | ||||
|         ClassLoader classLoader = getClass().getClassLoader(); | ||||
|         File file = new File(classLoader.getResource("fileTest.txt").getFile()); | ||||
|         String data = FileUtils.readFileToString(file, "UTF-8"); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFilePath_whenUsingFilesReadAllBytes_thenFileData() throws IOException, URISyntaxException { | ||||
|         String expectedData = "Hello, world!"; | ||||
| 
 | ||||
|         Path path = Paths.get(getClass().getClassLoader().getResource("fileTest.txt").toURI()); | ||||
| 
 | ||||
|         byte[] fileBytes = Files.readAllBytes(path); | ||||
|         String data = new String(fileBytes); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFilePath_whenUsingFilesLines_thenFileData() throws IOException, URISyntaxException { | ||||
|         String expectedData = "Hello, world!"; | ||||
| 
 | ||||
|         Path path = Paths.get(getClass().getClassLoader().getResource("fileTest.txt").toURI()); | ||||
| 
 | ||||
|         Stream<String> lines = Files.lines(path); | ||||
|         String data = lines.collect(Collectors.joining("\n")); | ||||
|         lines.close(); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void givenFileName_whenUsingIOUtils_thenFileData() throws IOException { | ||||
|         String expectedData = "Hello, world!"; | ||||
| 
 | ||||
|         FileInputStream fis = new FileInputStream("src/test/resources/fileTest.txt"); | ||||
|         String data = IOUtils.toString(fis, "UTF-8"); | ||||
| 
 | ||||
|         assertEquals(expectedData, data.trim()); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadWithScanner_thenCorrect() throws IOException { | ||||
|         final Scanner scanner = new Scanner(new File("src/test/resources/test_read1.in")); | ||||
|         final Scanner scanner = new Scanner(new File("src/test/resources/fileTest.txt")); | ||||
|         scanner.useDelimiter(" "); | ||||
| 
 | ||||
|         assertTrue(scanner.hasNext()); | ||||
|         assertEquals("Hello", scanner.next()); | ||||
|         assertEquals("world", scanner.next()); | ||||
|         assertEquals(1, scanner.nextInt()); | ||||
|         assertEquals("Hello,", scanner.next()); | ||||
|         assertEquals("world!", scanner.next()); | ||||
| 
 | ||||
|         scanner.close(); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadWithScannerTwoDelimiters_thenCorrect() throws IOException { | ||||
|         final Scanner scanner = new Scanner(new File("src/test/resources/test_read2.in")); | ||||
|         scanner.useDelimiter(",| "); | ||||
|         final Scanner scanner = new Scanner(new File("src/test/resources/fileTest.txt")); | ||||
|         scanner.useDelimiter("\\s|,"); | ||||
| 
 | ||||
|         assertTrue(scanner.hasNextInt()); | ||||
|         assertEquals(2, scanner.nextInt()); | ||||
|         assertEquals(3, scanner.nextInt()); | ||||
|         assertEquals(4, scanner.nextInt()); | ||||
|         assertTrue(scanner.hasNext()); | ||||
|         assertEquals("Hello", scanner.next()); | ||||
|         assertEquals("", scanner.next()); | ||||
|         assertEquals("world!", scanner.next()); | ||||
| 
 | ||||
|         scanner.close(); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadWithStreamTokenizer_thenCorrectTokens() throws IOException { | ||||
|         final FileReader reader = new FileReader("src/test/resources/test_read3.in"); | ||||
|         final FileReader reader = new FileReader("src/test/resources/fileTestTokenizer.txt"); | ||||
|         final StreamTokenizer tokenizer = new StreamTokenizer(reader); | ||||
| 
 | ||||
|         tokenizer.nextToken(); | ||||
| @ -78,49 +175,36 @@ public class JavaReadFromFileUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadWithDataInputStream_thenCorrect() throws IOException { | ||||
|         final String expected_value = "Hello"; | ||||
|         String expectedValue = "Hello, world!"; | ||||
|         String file ="src/test/resources/fileTest.txt"; | ||||
| 
 | ||||
|         String result; | ||||
|         final DataInputStream reader = new DataInputStream(new FileInputStream("src/test/resources/test_read4.in")); | ||||
|         result = reader.readUTF(); | ||||
|         reader.close(); | ||||
|         String result = null; | ||||
| 
 | ||||
|         assertEquals(expected_value, result); | ||||
|     } | ||||
|         DataInputStream reader = new DataInputStream(new FileInputStream(file)); | ||||
|         int nBytesToRead = reader.available(); | ||||
|         if(nBytesToRead > 0) { | ||||
|             byte[] bytes = new byte[nBytesToRead]; | ||||
|             reader.read(bytes); | ||||
|             result = new String(bytes); | ||||
|         } | ||||
| 
 | ||||
|     public void whenReadTwoFilesWithSequenceInputStream_thenCorrect() throws IOException { | ||||
|         final int expected_value1 = 2000; | ||||
|         final int expected_value2 = 5000; | ||||
| 
 | ||||
|         final FileInputStream stream1 = new FileInputStream("src/test/resources/test_read5.in"); | ||||
|         final FileInputStream stream2 = new FileInputStream("src/test/resources/test_read6.in"); | ||||
| 
 | ||||
|         final SequenceInputStream sequence = new SequenceInputStream(stream1, stream2); | ||||
|         final DataInputStream reader = new DataInputStream(sequence); | ||||
| 
 | ||||
|         assertEquals(expected_value1, reader.readInt()); | ||||
|         assertEquals(expected_value2, reader.readInt()); | ||||
| 
 | ||||
|         reader.close(); | ||||
|         stream2.close(); | ||||
|         assertEquals(expectedValue, result); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     @Ignore // TODO | ||||
|     public void whenReadUTFEncodedFile_thenCorrect() throws IOException { | ||||
|         final String expected_value = "青空"; | ||||
|         final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/test/resources/test_read7.in"), "UTF-8")); | ||||
|         final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("src/test/resources/fileTestUtf8.txt"), "UTF-8")); | ||||
|         final String currentLine = reader.readLine(); | ||||
|         reader.close(); | ||||
|         LOG.debug(currentLine); | ||||
|          | ||||
| 
 | ||||
|         assertEquals(expected_value, currentLine); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadFileContentsIntoString_thenCorrect() throws IOException { | ||||
|         final String expected_value = "Hello world \n Test line \n"; | ||||
|         final BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/test_read8.in")); | ||||
|         final String expected_value = "Hello, world!\n"; | ||||
|         final BufferedReader reader = new BufferedReader(new FileReader("src/test/resources/fileTest.txt")); | ||||
|         final StringBuilder builder = new StringBuilder(); | ||||
|         String currentLine = reader.readLine(); | ||||
|         while (currentLine != null) { | ||||
| @ -136,8 +220,8 @@ public class JavaReadFromFileUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadWithFileChannel_thenCorrect() throws IOException { | ||||
|         final String expected_value = "Hello world"; | ||||
|         final RandomAccessFile reader = new RandomAccessFile("src/test/resources/test_read.in", "r"); | ||||
|         final String expected_value = "Hello, world!"; | ||||
|         final RandomAccessFile reader = new RandomAccessFile("src/test/resources/fileTest.txt", "r"); | ||||
|         final FileChannel channel = reader.getChannel(); | ||||
| 
 | ||||
|         int bufferSize = 1024; | ||||
| @ -154,8 +238,8 @@ public class JavaReadFromFileUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadSmallFileJava7_thenCorrect() throws IOException { | ||||
|         final String expected_value = "Hello world"; | ||||
|         final Path path = Paths.get("src/test/resources/test_read.in"); | ||||
|         final String expected_value = "Hello, world!"; | ||||
|         final Path path = Paths.get("src/test/resources/fileTest.txt"); | ||||
| 
 | ||||
|         final String read = Files.readAllLines(path, Charset.defaultCharset()).get(0); | ||||
|         assertEquals(expected_value, read); | ||||
| @ -163,12 +247,24 @@ public class JavaReadFromFileUnitTest { | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenReadLargeFileJava7_thenCorrect() throws IOException { | ||||
|         final String expected_value = "Hello world"; | ||||
|         final String expected_value = "Hello, world!"; | ||||
| 
 | ||||
|         final Path path = Paths.get("src/test/resources/test_read.in"); | ||||
|         final Path path = Paths.get("src/test/resources/fileTest.txt"); | ||||
|         final BufferedReader reader = Files.newBufferedReader(path, Charset.defaultCharset()); | ||||
|         final String line = reader.readLine(); | ||||
|         assertEquals(expected_value, line); | ||||
|     } | ||||
| 
 | ||||
|     private String readFromInputStream(InputStream inputStream) throws IOException { | ||||
|         StringBuilder resultStringBuilder = new StringBuilder(); | ||||
|         try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { | ||||
|             String line; | ||||
|             while ((line = bufferedReader.readLine()) != null) { | ||||
|                 resultStringBuilder.append(line).append("\n"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return resultStringBuilder.toString(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| Hello World from fileTest.txt!!! | ||||
| Hello, world! | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user