diff --git a/algorithms/pom.xml b/algorithms/pom.xml index 967bcbc706..e972f39494 100644 --- a/algorithms/pom.xml +++ b/algorithms/pom.xml @@ -34,6 +34,11 @@ jenetics 3.7.0 + + org.jgrapht + jgrapht-core + 1.0.1 + diff --git a/algorithms/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java b/algorithms/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java new file mode 100644 index 0000000000..c085d54689 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/jgrapht/CompleteGraphTest.java @@ -0,0 +1,38 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertEquals; + +import java.util.List; + +import org.jgrapht.VertexFactory; +import org.jgrapht.alg.HamiltonianCycle; +import org.jgrapht.generate.CompleteGraphGenerator; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.SimpleWeightedGraph; +import org.junit.Before; +import org.junit.Test; + +public class CompleteGraphTest { + + static SimpleWeightedGraph completeGraph; + static int size = 10; + + @Before + public void createCompleteGraph() { + completeGraph = new SimpleWeightedGraph<>(DefaultEdge.class); + CompleteGraphGenerator completeGenerator = new CompleteGraphGenerator(size); + VertexFactory vFactory = new VertexFactory() { + private int id = 0; + public String createVertex() { + return "v" + id++; + } + }; + completeGenerator.generateGraph(completeGraph, vFactory, null); + } + + @Test + public void givenCompleteGraph_whenGetHamiltonianCyclePath_thenGetVerticeListInSequence() { + List verticeList = HamiltonianCycle.getApproximateOptimalForCompleteGraph(completeGraph); + assertEquals(verticeList.size(), completeGraph.vertexSet().size()); + } +} diff --git a/algorithms/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java b/algorithms/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java new file mode 100644 index 0000000000..7f4cc99715 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/jgrapht/DirectedGraphTests.java @@ -0,0 +1,95 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.IntStream; + +import org.jgrapht.DirectedGraph; +import org.jgrapht.GraphPath; +import org.jgrapht.alg.CycleDetector; +import org.jgrapht.alg.KosarajuStrongConnectivityInspector; +import org.jgrapht.alg.interfaces.StrongConnectivityAlgorithm; +import org.jgrapht.alg.shortestpath.AllDirectedPaths; +import org.jgrapht.alg.shortestpath.BellmanFordShortestPath; +import org.jgrapht.alg.shortestpath.DijkstraShortestPath; +import org.jgrapht.graph.DefaultDirectedGraph; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.DirectedSubgraph; +import org.jgrapht.traverse.BreadthFirstIterator; +import org.jgrapht.traverse.DepthFirstIterator; +import org.junit.Before; +import org.junit.Test; + +public class DirectedGraphTests { + DirectedGraph directedGraph; + + @Before + public void createDirectedGraph() { + directedGraph = new DefaultDirectedGraph(DefaultEdge.class); + IntStream.range(1, 10).forEach(i -> { + directedGraph.addVertex("v" + i); + }); + directedGraph.addEdge("v1", "v2"); + directedGraph.addEdge("v2", "v4"); + directedGraph.addEdge("v4", "v3"); + directedGraph.addEdge("v3", "v1"); + directedGraph.addEdge("v5", "v4"); + directedGraph.addEdge("v5", "v6"); + directedGraph.addEdge("v6", "v7"); + directedGraph.addEdge("v7", "v5"); + directedGraph.addEdge("v8", "v5"); + directedGraph.addEdge("v9", "v8"); + } + + @Test + public void givenDirectedGraph_whenGetStronglyConnectedSubgraphs_thenPathExistsBetweenStronglyconnectedVertices() { + StrongConnectivityAlgorithm scAlg = new KosarajuStrongConnectivityInspector<>(directedGraph); + List> stronglyConnectedSubgraphs = scAlg.stronglyConnectedSubgraphs(); + List stronglyConnectedVertices = new ArrayList<>(stronglyConnectedSubgraphs.get(3).vertexSet()); + + String randomVertex1 = stronglyConnectedVertices.get(0); + String randomVertex2 = stronglyConnectedVertices.get(3); + AllDirectedPaths allDirectedPaths = new AllDirectedPaths<>(directedGraph); + + List> possiblePathList = allDirectedPaths.getAllPaths(randomVertex1, randomVertex2, false, stronglyConnectedVertices.size()); + assertTrue(possiblePathList.size() > 0); + } + + @Test + public void givenDirectedGraphWithCycle_whenCheckCycles_thenDetectCycles() { + CycleDetector cycleDetector = new CycleDetector(directedGraph); + assertTrue(cycleDetector.detectCycles()); + Set cycleVertices = cycleDetector.findCycles(); + assertTrue(cycleVertices.size() > 0); + } + + @Test + public void givenDirectedGraph_whenCreateInstanceDepthFirstIterator_thenGetIterator() { + DepthFirstIterator depthFirstIterator = new DepthFirstIterator<>(directedGraph); + assertNotNull(depthFirstIterator); + } + + @Test + public void givenDirectedGraph_whenCreateInstanceBreadthFirstIterator_thenGetIterator() { + BreadthFirstIterator breadthFirstIterator = new BreadthFirstIterator<>(directedGraph); + assertNotNull(breadthFirstIterator); + } + + @Test + public void givenDirectedGraph_whenGetDijkstraShortestPath_thenGetNotNullPath() { + DijkstraShortestPath dijkstraShortestPath = new DijkstraShortestPath(directedGraph); + List shortestPath = dijkstraShortestPath.getPath("v1", "v4").getVertexList(); + assertNotNull(shortestPath); + } + + @Test + public void givenDirectedGraph_whenGetBellmanFordShortestPath_thenGetNotNullPath() { + BellmanFordShortestPath bellmanFordShortestPath = new BellmanFordShortestPath(directedGraph); + List shortestPath = bellmanFordShortestPath.getPath("v1", "v4").getVertexList(); + assertNotNull(shortestPath); + } +} diff --git a/algorithms/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java b/algorithms/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java new file mode 100644 index 0000000000..6f0fb92ab7 --- /dev/null +++ b/algorithms/src/test/java/com/baeldung/jgrapht/EulerianCircuitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.stream.IntStream; + +import org.jgrapht.GraphPath; +import org.jgrapht.alg.cycle.HierholzerEulerianCycle; +import org.jgrapht.graph.DefaultEdge; +import org.jgrapht.graph.SimpleWeightedGraph; +import org.junit.Before; +import org.junit.Test; + +public class EulerianCircuitTest { + SimpleWeightedGraph simpleGraph; + + @Before + public void createGraphWithEulerianCircuit() { + simpleGraph = new SimpleWeightedGraph<>(DefaultEdge.class); + IntStream.range(1, 6).forEach(i -> { + simpleGraph.addVertex("v" + i); + }); + IntStream.range(1, 6).forEach(i -> { + int endVertexNo = (i + 1) > 5 ? 1 : i + 1; + simpleGraph.addEdge("v" + i, "v" + endVertexNo); + }); + } + + @Test + public void givenGraph_whenCheckEluerianCycle_thenGetResult() { + HierholzerEulerianCycle eulerianCycle = new HierholzerEulerianCycle<>(); + assertTrue(eulerianCycle.isEulerian(simpleGraph)); + } + + @Test + public void givenGraphWithEulerianCircuit_whenGetEulerianCycle_thenGetGraphPath() { + HierholzerEulerianCycle eulerianCycle = new HierholzerEulerianCycle<>(); + GraphPath path = eulerianCycle.getEulerianCycle(simpleGraph); + assertTrue(path.getEdgeList().containsAll(simpleGraph.edgeSet())); + } +} diff --git a/animal-sniffer-mvn-plugin/pom.xml b/animal-sniffer-mvn-plugin/pom.xml new file mode 100644 index 0000000000..3190950d9b --- /dev/null +++ b/animal-sniffer-mvn-plugin/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + com.baeldung + animal-sniffer-mvn-plugin + jar + 1.0-SNAPSHOT + example-animal-sniffer-mvn-plugin + http://maven.apache.org + + + 3.6.0 + + + + + junit + junit + 3.8.1 + test + + + + + + maven-compiler-plugin + 3.7.0 + + 1.6 + 1.6 + + + + org.codehaus.mojo + animal-sniffer-maven-plugin + 1.16 + + + org.codehaus.mojo.signature + java16 + 1.0 + + + + + animal-sniffer + verify + + check + + + + + + + + \ No newline at end of file diff --git a/animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java b/animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java new file mode 100644 index 0000000000..6deaf70cde --- /dev/null +++ b/animal-sniffer-mvn-plugin/src/main/java/com/baeldung/App.java @@ -0,0 +1,16 @@ +package com.baeldung; + +//import java.nio.charset.StandardCharsets; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + //System.out.println(StandardCharsets.UTF_8.name()); + } +} diff --git a/animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppTest.java b/animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppTest.java new file mode 100644 index 0000000000..8ecb1bc629 --- /dev/null +++ b/animal-sniffer-mvn-plugin/src/test/java/com/baeldung/AppTest.java @@ -0,0 +1,40 @@ +package com.baeldung; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +/** + * Unit test for simple App. + */ +public class AppTest + extends TestCase +{ + /** + * Create the test case + * + * @param testName name of the test case + */ + public AppTest( String testName ) + { + super( testName ); + } + + /** + * @return the suite of tests being tested + */ + public static Test suite() + { + return new TestSuite( AppTest.class ); + } + + /** + * Rigourous Test :-) + */ + public void testApp() + { + + assertTrue( true ); + + } +} diff --git a/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java new file mode 100644 index 0000000000..cd563b6270 --- /dev/null +++ b/apache-cayenne/src/test/java/com/baeldung/apachecayenne/CayenneAdvancedOperationTests.java @@ -0,0 +1,256 @@ +package com.baeldung.apachecayenne; + +import com.baeldung.apachecayenne.persistent.Author; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.QueryResponse; +import org.apache.cayenne.configuration.server.ServerRuntime; +import org.apache.cayenne.exp.Expression; +import org.apache.cayenne.exp.ExpressionFactory; +import org.apache.cayenne.query.*; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class CayenneAdvancedOperationTests { + private static ObjectContext context = null; + + @BeforeClass + public static void setupTheCayenneContext() { + ServerRuntime cayenneRuntime = ServerRuntime.builder() + .addConfig("cayenne-project.xml") + .build(); + context = cayenneRuntime.newContext(); + } + + @Before + public void saveThreeAuthors() { + Author authorOne = context.newObject(Author.class); + authorOne.setName("Paul Xavier"); + Author authorTwo = context.newObject(Author.class); + authorTwo.setName("pAuL Smith"); + Author authorThree = context.newObject(Author.class); + authorThree.setName("Vicky Sarra"); + context.commitChanges(); + } + + @After + public void deleteAllAuthors() { + SQLTemplate deleteAuthors = new SQLTemplate(Author.class, "delete from author"); + context.performGenericQuery(deleteAuthors); + } + + @Test + public void givenAuthors_whenFindAllSQLTmplt_thenWeGetThreeAuthors() { + SQLTemplate select = new SQLTemplate(Author.class, "select * from Author"); + List authors = context.performQuery(select); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenAuthors_whenFindByNameSQLTmplt_thenWeGetOneAuthor() { + SQLTemplate select = new SQLTemplate(Author.class, "select * from Author where name = 'Vicky Sarra'"); + List authors = context.performQuery(select); + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "Vicky Sarra"); + } + + @Test + public void givenAuthors_whenLikeSltQry_thenWeGetOneAuthor() { + Expression qualifier = ExpressionFactory.likeExp(Author.NAME.getName(), "Paul%"); + SelectQuery query = new SelectQuery(Author.class, qualifier); + List authorsTwo = context.performQuery(query); + + assertEquals(authorsTwo.size(), 1); + } + + @Test + public void givenAuthors_whenCtnsIgnorCaseSltQry_thenWeGetTwoAuthors() { + Expression qualifier = ExpressionFactory.containsIgnoreCaseExp(Author.NAME.getName(), "Paul"); + SelectQuery query = new SelectQuery(Author.class, qualifier); + List authors = context.performQuery(query); + + assertEquals(authors.size(), 2); + } + + @Test + public void givenAuthors_whenCtnsIgnorCaseEndsWSltQry_thenWeGetTwoAuthors() { + Expression qualifier = ExpressionFactory.containsIgnoreCaseExp(Author.NAME.getName(), "Paul") + .andExp(ExpressionFactory.endsWithExp(Author.NAME.getName(), "h")); + SelectQuery query = new SelectQuery(Author.class, qualifier); + List authors = context.performQuery(query); + + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "pAuL Smith"); + } + + @Test + public void givenAuthors_whenAscOrderingSltQry_thenWeGetOrderedAuthors() { + SelectQuery query = new SelectQuery(Author.class); + query.addOrdering(Author.NAME.asc()); + + List authors = query.select(context); + Author firstAuthor = authors.get(0); + + assertEquals(authors.size(), 3); + assertEquals(firstAuthor.getName(), "Paul Xavier"); + } + + @Test + public void givenAuthors_whenDescOrderingSltQry_thenWeGetOrderedAuthors() { + SelectQuery query = new SelectQuery(Author.class); + query.addOrdering(Author.NAME.desc()); + + List authors = query.select(context); + Author firstAuthor = authors.get(0); + + assertEquals(authors.size(), 3); + assertEquals(firstAuthor.getName(), "pAuL Smith"); + } + + @Test + public void givenAuthors_onContainsObjS_thenWeGetOneRecord() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.contains("Paul")) + .select(context); + + assertEquals(authors.size(), 1); + } + + @Test + public void givenAuthors_whenLikeObjS_thenWeGetTwoAuthors() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.likeIgnoreCase("Paul%")) + .select(context); + + assertEquals(authors.size(), 2); + } + + @Test + public void givenTwoAuthor_whenEndsWithObjS_thenWeGetOrderedAuthors() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.endsWith("Sarra")) + .select(context); + Author firstAuthor = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(firstAuthor.getName(), "Vicky Sarra"); + } + + @Test + public void givenTwoAuthor_whenInObjS_thenWeGetAuthors() { + List names = Arrays.asList("Paul Xavier", "pAuL Smith", "Vicky Sarra"); + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.in(names)) + .select(context); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenTwoAuthor_whenNinObjS_thenWeGetAuthors() { + List names = Arrays.asList("Paul Xavier", "pAuL Smith"); + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.nin(names)) + .select(context); + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "Vicky Sarra"); + } + + @Test + public void givenTwoAuthor_whenIsNotNullObjS_thenWeGetAuthors() { + List authors = ObjectSelect.query(Author.class) + .where(Author.NAME.isNotNull()) + .select(context); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenAuthors_whenFindAllEJBQL_thenWeGetThreeAuthors() { + EJBQLQuery query = new EJBQLQuery("select a FROM Author a"); + List authors = context.performQuery(query); + + assertEquals(authors.size(), 3); + } + + @Test + public void givenAuthors_whenFindByNameEJBQL_thenWeGetOneAuthor() { + EJBQLQuery query = new EJBQLQuery("select a FROM Author a WHERE a.name = 'Vicky Sarra'"); + List authors = context.performQuery(query); + Author author = authors.get(0); + + assertEquals(authors.size(), 1); + assertEquals(author.getName(), "Vicky Sarra"); + } + + @Test + public void givenAuthors_whenUpdadingByNameEJBQL_thenWeGetTheUpdatedAuthor() { + EJBQLQuery query = new EJBQLQuery("UPDATE Author AS a SET a.name = 'Vicky Edison' WHERE a.name = 'Vicky Sarra'"); + QueryResponse queryResponse = context.performGenericQuery(query); + + EJBQLQuery queryUpdatedAuthor = new EJBQLQuery("select a FROM Author a WHERE a.name = 'Vicky Edison'"); + List authors = context.performQuery(queryUpdatedAuthor); + Author author = authors.get(0); + + assertNotNull(author); + } + + @Test + public void givenAuthors_whenSeletingNamesEJBQL_thenWeGetListWithSizeThree() { + String [] args = {"Paul Xavier", "pAuL Smith", "Vicky Sarra"}; + List names = Arrays.asList(args); + EJBQLQuery query = new EJBQLQuery("select a.name FROM Author a"); + List nameList = context.performQuery(query); + + Collections.sort(names); + Collections.sort(nameList); + + assertEquals(names.size(), 3); + assertEquals(nameList.size(), 3); + assertEquals(names, nameList); + } + + @Test + public void givenAuthors_whenDeletingAllWithEJB_thenWeGetNoAuthor() { + EJBQLQuery deleteQuery = new EJBQLQuery("delete FROM Author"); + EJBQLQuery findAllQuery = new EJBQLQuery("select a FROM Author a"); + + context.performQuery(deleteQuery); + List objects = context.performQuery(findAllQuery); + + assertEquals(objects.size(), 0); + } + + @Test + public void givenAuthors_whenInsertingSQLExec_thenWeGetNewAuthor() { + int inserted = SQLExec + .query("INSERT INTO Author (name) VALUES ('Baeldung')") + .update(context); + + assertEquals(inserted, 1); + } + + @Test + public void givenAuthors_whenUpdatingSQLExec_thenItsUpdated() { + int updated = SQLExec + .query("UPDATE Author SET name = 'Baeldung' WHERE name = 'Vicky Sarra'") + .update(context); + + assertEquals(updated, 1); + } +} diff --git a/atomix/.gitignore b/atomix/.gitignore new file mode 100644 index 0000000000..ea8c4bf7f3 --- /dev/null +++ b/atomix/.gitignore @@ -0,0 +1 @@ +/target diff --git a/atomix/pom.xml b/atomix/pom.xml new file mode 100644 index 0000000000..80c573dd86 --- /dev/null +++ b/atomix/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + com.atomix.io + atomix + 0.0.1-SNAPSHOT + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + io.atomix + atomix-all + 1.0.0-rc9 + + + junit + junit + 4.9 + test + + + log4j + log4j + 1.2.17 + + + + + + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + + + diff --git a/atomix/src/main/java/com/atomix/example/BootstrapingCluster.java b/atomix/src/main/java/com/atomix/example/BootstrapingCluster.java new file mode 100644 index 0000000000..6c5c94d307 --- /dev/null +++ b/atomix/src/main/java/com/atomix/example/BootstrapingCluster.java @@ -0,0 +1,27 @@ +package com.atomix.example; + +import io.atomix.AtomixReplica; +import io.atomix.catalyst.transport.Address; +import io.atomix.catalyst.transport.netty.NettyTransport; +import io.atomix.copycat.server.storage.Storage; +import io.atomix.copycat.server.storage.StorageLevel; + +import java.io.File; +import java.util.concurrent.CompletableFuture; + +public class BootstrapingCluster { + + public static void main(String[] args) { + Storage storage = Storage.builder() + .withDirectory(new File("log")) + .withStorageLevel(StorageLevel.DISK) + .build(); + AtomixReplica replica = AtomixReplica.builder(new Address("localhost", 8700)) + .withStorage(storage) + .withTransport(new NettyTransport()) + .build(); + + CompletableFuture completableFuture = replica.bootstrap(); + completableFuture.join(); + } +} diff --git a/atomix/src/main/java/com/atomix/example/OtherNodes.java b/atomix/src/main/java/com/atomix/example/OtherNodes.java new file mode 100644 index 0000000000..e5688b062f --- /dev/null +++ b/atomix/src/main/java/com/atomix/example/OtherNodes.java @@ -0,0 +1,71 @@ +package com.atomix.example; + +import io.atomix.AtomixReplica; +import io.atomix.catalyst.transport.Address; +import io.atomix.catalyst.transport.netty.NettyTransport; +import io.atomix.concurrent.DistributedLock; +import io.atomix.copycat.server.storage.Storage; +import io.atomix.copycat.server.storage.StorageLevel; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +public class OtherNodes { + + public static void main(String[] args) throws InterruptedException { + List
cluster = Arrays + .asList( + new Address("localhost", 8700), + new Address("localhost", 8701), + new Address("localhost", 8702)); + + Storage storage = Storage.builder() + .withDirectory(new File("log")) + .withStorageLevel(StorageLevel.DISK) + .build(); + + AtomixReplica replica2 = AtomixReplica.builder(new Address("localhost", 8701)) + .withStorage(storage) + .withTransport(new NettyTransport()) + .build(); + + WorkerThread WT1 = new WorkerThread(replica2, cluster); + WT1.run(); + + AtomixReplica replica3 = AtomixReplica.builder(new Address("localhost", 8702)) + .withStorage(storage) + .withTransport(new NettyTransport()) + .build(); + + WorkerThread WT2 = new WorkerThread(replica3, cluster); + WT2.run(); + + Thread.sleep(6000); + + DistributedLock lock = replica2.getLock("my-lock") + .join(); + lock.lock() + .thenRun(() -> System.out.println("Acquired a lock")); + + replica2.getMap("map") + .thenCompose(m -> m.put("bar", "Hello world!")) + .thenRun(() -> System.out.println("Value is set in Distributed Map")) + .join(); + } + + private static class WorkerThread extends Thread { + private AtomixReplica replica; + private List
cluster; + + WorkerThread(AtomixReplica replica, List
cluster) { + this.replica = replica; + this.cluster = cluster; + } + + public void run() { + replica.join(cluster) + .join(); + } + } +} \ No newline at end of file diff --git a/atomix/src/test/java/com/atomix/exampletest/AtomixClientLiveTest.java b/atomix/src/test/java/com/atomix/exampletest/AtomixClientLiveTest.java new file mode 100644 index 0000000000..9268a4a69b --- /dev/null +++ b/atomix/src/test/java/com/atomix/exampletest/AtomixClientLiveTest.java @@ -0,0 +1,35 @@ +package com.atomix.exampletest; + +import io.atomix.AtomixClient; +import io.atomix.catalyst.transport.Address; +import io.atomix.catalyst.transport.netty.NettyTransport; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import static org.junit.Assert.assertEquals; + +public class AtomixClientLiveTest { + + private final AtomixClient client = AtomixClient.builder() + .withTransport(new NettyTransport()) + .build(); + + @Test + public void whenBootstrap_thenShouldGet() throws InterruptedException, ExecutionException { + List
cluster = Arrays.asList( + new Address("localhost", 8700), + new Address("localhsot", 8701)); + + String value = client.connect(cluster) + .thenRun(() -> System.out.println("Client Connected")) + .thenCompose(c -> client.getMap("map")) + .thenCompose(m -> m.get("bar")) + .thenApply(a -> (String) a) + .get(); + + assertEquals("Hello world!", value); + } +} diff --git a/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java b/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java index ffc58a1c50..35955032dc 100644 --- a/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java +++ b/core-java/src/main/java/com/baeldung/java/nio2/watcher/DirectoryWatcherExample.java @@ -10,6 +10,7 @@ import java.nio.file.WatchKey; import java.nio.file.WatchService; public class DirectoryWatcherExample { + public static void main(String[] args) throws IOException, InterruptedException { WatchService watchService = FileSystems.getDefault().newWatchService(); Path path = Paths.get(System.getProperty("user.home")); @@ -21,5 +22,8 @@ public class DirectoryWatcherExample { } key.reset(); } + + watchService.close(); } + } diff --git a/core-java/src/test/java/com/baeldung/string/StringTest.java b/core-java/src/test/java/com/baeldung/string/StringTest.java new file mode 100644 index 0000000000..fd83c903a3 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/string/StringTest.java @@ -0,0 +1,26 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StringTest { + + @Test + public void whenCallCodePointAt_thenDecimalUnicodeReturned() { + assertEquals(97, "abcd".codePointAt(0)); + } + + @Test + public void whenCallConcat_thenCorrect() { + assertEquals("elephant", "elep".concat("hant")); + } + + @Test + public void whenGetBytes_thenCorrect() { + byte[] byteArray = "abcd".getBytes(); + byte[] expected = new byte[] { 97, 98, 99, 100 }; + assertArrayEquals(expected, byteArray); + } +} diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md new file mode 100644 index 0000000000..729ab101fd --- /dev/null +++ b/deeplearning4j/README.md @@ -0,0 +1,5 @@ +### Sample deeplearning4j Project +This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. + +### Relevant Articles: +- [A Guide to deeplearning4j](http://www.baeldung.com/a-guide-to-deeplearning4j/) diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml new file mode 100644 index 0000000000..a39fabc3d6 --- /dev/null +++ b/deeplearning4j/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + com.baeldung.deeplearning4j + deeplearning4j + jar + 1.0-SNAPSHOT + deeplearning4j + + + UTF-8 + 1.8 + 1.8 + 0.9.1 + + + + + + org.nd4j + nd4j-native-platform + ${dl4j.version} + + + + org.deeplearning4j + deeplearning4j-core + ${dl4j.version} + + + + + \ No newline at end of file diff --git a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java new file mode 100644 index 0000000000..bf341209e1 --- /dev/null +++ b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java @@ -0,0 +1,80 @@ +package com.baeldung.deeplearning4j; + +import org.datavec.api.records.reader.RecordReader; +import org.datavec.api.records.reader.impl.csv.CSVRecordReader; +import org.datavec.api.split.FileSplit; +import org.datavec.api.util.ClassPathResource; +import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; +import org.deeplearning4j.eval.Evaluation; +import org.deeplearning4j.nn.conf.MultiLayerConfiguration; +import org.deeplearning4j.nn.conf.NeuralNetConfiguration; +import org.deeplearning4j.nn.conf.layers.DenseLayer; +import org.deeplearning4j.nn.conf.layers.OutputLayer; +import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; +import org.deeplearning4j.nn.weights.WeightInit; +import org.nd4j.linalg.activations.Activation; +import org.nd4j.linalg.api.ndarray.INDArray; +import org.nd4j.linalg.dataset.DataSet; +import org.nd4j.linalg.dataset.SplitTestAndTrain; +import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; +import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization; +import org.nd4j.linalg.dataset.api.preprocessor.NormalizerStandardize; +import org.nd4j.linalg.lossfunctions.LossFunctions; + +import java.io.IOException; + +public class IrisClassifier { + + private static final int CLASSES_COUNT = 3; + private static final int FEATURES_COUNT = 4; + + public static void main(String[] args) throws IOException, InterruptedException { + + DataSet allData; + try (RecordReader recordReader = new CSVRecordReader(0, ',')) { + recordReader.initialize(new FileSplit(new ClassPathResource("iris.txt").getFile())); + + DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader, 150, FEATURES_COUNT, CLASSES_COUNT); + allData = iterator.next(); + } + + allData.shuffle(42); + + DataNormalization normalizer = new NormalizerStandardize(); + normalizer.fit(allData); + normalizer.transform(allData); + + SplitTestAndTrain testAndTrain = allData.splitTestAndTrain(0.65); + DataSet trainingData = testAndTrain.getTrain(); + DataSet testData = testAndTrain.getTest(); + + MultiLayerConfiguration configuration = new NeuralNetConfiguration.Builder() + .iterations(1000) + .activation(Activation.TANH) + .weightInit(WeightInit.XAVIER) + .learningRate(0.1) + .regularization(true).l2(0.0001) + .list() + .layer(0, new DenseLayer.Builder().nIn(FEATURES_COUNT).nOut(3) + .build()) + .layer(1, new DenseLayer.Builder().nIn(3).nOut(3) + .build()) + .layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) + .activation(Activation.SOFTMAX) + .nIn(3).nOut(CLASSES_COUNT).build()) + .backprop(true).pretrain(false) + .build(); + + MultiLayerNetwork model = new MultiLayerNetwork(configuration); + model.init(); + model.fit(trainingData); + + INDArray output = model.output(testData.getFeatureMatrix()); + + Evaluation eval = new Evaluation(CLASSES_COUNT); + eval.eval(testData.getLabels(), output); + System.out.println(eval.stats()); + + } + +} diff --git a/deeplearning4j/src/main/resources/iris.txt b/deeplearning4j/src/main/resources/iris.txt new file mode 100644 index 0000000000..8b4511f8be --- /dev/null +++ b/deeplearning4j/src/main/resources/iris.txt @@ -0,0 +1,150 @@ +5.1,3.5,1.4,0.2,0 +4.9,3.0,1.4,0.2,0 +4.7,3.2,1.3,0.2,0 +4.6,3.1,1.5,0.2,0 +5.0,3.6,1.4,0.2,0 +5.4,3.9,1.7,0.4,0 +4.6,3.4,1.4,0.3,0 +5.0,3.4,1.5,0.2,0 +4.4,2.9,1.4,0.2,0 +4.9,3.1,1.5,0.1,0 +5.4,3.7,1.5,0.2,0 +4.8,3.4,1.6,0.2,0 +4.8,3.0,1.4,0.1,0 +4.3,3.0,1.1,0.1,0 +5.8,4.0,1.2,0.2,0 +5.7,4.4,1.5,0.4,0 +5.4,3.9,1.3,0.4,0 +5.1,3.5,1.4,0.3,0 +5.7,3.8,1.7,0.3,0 +5.1,3.8,1.5,0.3,0 +5.4,3.4,1.7,0.2,0 +5.1,3.7,1.5,0.4,0 +4.6,3.6,1.0,0.2,0 +5.1,3.3,1.7,0.5,0 +4.8,3.4,1.9,0.2,0 +5.0,3.0,1.6,0.2,0 +5.0,3.4,1.6,0.4,0 +5.2,3.5,1.5,0.2,0 +5.2,3.4,1.4,0.2,0 +4.7,3.2,1.6,0.2,0 +4.8,3.1,1.6,0.2,0 +5.4,3.4,1.5,0.4,0 +5.2,4.1,1.5,0.1,0 +5.5,4.2,1.4,0.2,0 +4.9,3.1,1.5,0.1,0 +5.0,3.2,1.2,0.2,0 +5.5,3.5,1.3,0.2,0 +4.9,3.1,1.5,0.1,0 +4.4,3.0,1.3,0.2,0 +5.1,3.4,1.5,0.2,0 +5.0,3.5,1.3,0.3,0 +4.5,2.3,1.3,0.3,0 +4.4,3.2,1.3,0.2,0 +5.0,3.5,1.6,0.6,0 +5.1,3.8,1.9,0.4,0 +4.8,3.0,1.4,0.3,0 +5.1,3.8,1.6,0.2,0 +4.6,3.2,1.4,0.2,0 +5.3,3.7,1.5,0.2,0 +5.0,3.3,1.4,0.2,0 +7.0,3.2,4.7,1.4,1 +6.4,3.2,4.5,1.5,1 +6.9,3.1,4.9,1.5,1 +5.5,2.3,4.0,1.3,1 +6.5,2.8,4.6,1.5,1 +5.7,2.8,4.5,1.3,1 +6.3,3.3,4.7,1.6,1 +4.9,2.4,3.3,1.0,1 +6.6,2.9,4.6,1.3,1 +5.2,2.7,3.9,1.4,1 +5.0,2.0,3.5,1.0,1 +5.9,3.0,4.2,1.5,1 +6.0,2.2,4.0,1.0,1 +6.1,2.9,4.7,1.4,1 +5.6,2.9,3.6,1.3,1 +6.7,3.1,4.4,1.4,1 +5.6,3.0,4.5,1.5,1 +5.8,2.7,4.1,1.0,1 +6.2,2.2,4.5,1.5,1 +5.6,2.5,3.9,1.1,1 +5.9,3.2,4.8,1.8,1 +6.1,2.8,4.0,1.3,1 +6.3,2.5,4.9,1.5,1 +6.1,2.8,4.7,1.2,1 +6.4,2.9,4.3,1.3,1 +6.6,3.0,4.4,1.4,1 +6.8,2.8,4.8,1.4,1 +6.7,3.0,5.0,1.7,1 +6.0,2.9,4.5,1.5,1 +5.7,2.6,3.5,1.0,1 +5.5,2.4,3.8,1.1,1 +5.5,2.4,3.7,1.0,1 +5.8,2.7,3.9,1.2,1 +6.0,2.7,5.1,1.6,1 +5.4,3.0,4.5,1.5,1 +6.0,3.4,4.5,1.6,1 +6.7,3.1,4.7,1.5,1 +6.3,2.3,4.4,1.3,1 +5.6,3.0,4.1,1.3,1 +5.5,2.5,4.0,1.3,1 +5.5,2.6,4.4,1.2,1 +6.1,3.0,4.6,1.4,1 +5.8,2.6,4.0,1.2,1 +5.0,2.3,3.3,1.0,1 +5.6,2.7,4.2,1.3,1 +5.7,3.0,4.2,1.2,1 +5.7,2.9,4.2,1.3,1 +6.2,2.9,4.3,1.3,1 +5.1,2.5,3.0,1.1,1 +5.7,2.8,4.1,1.3,1 +6.3,3.3,6.0,2.5,2 +5.8,2.7,5.1,1.9,2 +7.1,3.0,5.9,2.1,2 +6.3,2.9,5.6,1.8,2 +6.5,3.0,5.8,2.2,2 +7.6,3.0,6.6,2.1,2 +4.9,2.5,4.5,1.7,2 +7.3,2.9,6.3,1.8,2 +6.7,2.5,5.8,1.8,2 +7.2,3.6,6.1,2.5,2 +6.5,3.2,5.1,2.0,2 +6.4,2.7,5.3,1.9,2 +6.8,3.0,5.5,2.1,2 +5.7,2.5,5.0,2.0,2 +5.8,2.8,5.1,2.4,2 +6.4,3.2,5.3,2.3,2 +6.5,3.0,5.5,1.8,2 +7.7,3.8,6.7,2.2,2 +7.7,2.6,6.9,2.3,2 +6.0,2.2,5.0,1.5,2 +6.9,3.2,5.7,2.3,2 +5.6,2.8,4.9,2.0,2 +7.7,2.8,6.7,2.0,2 +6.3,2.7,4.9,1.8,2 +6.7,3.3,5.7,2.1,2 +7.2,3.2,6.0,1.8,2 +6.2,2.8,4.8,1.8,2 +6.1,3.0,4.9,1.8,2 +6.4,2.8,5.6,2.1,2 +7.2,3.0,5.8,1.6,2 +7.4,2.8,6.1,1.9,2 +7.9,3.8,6.4,2.0,2 +6.4,2.8,5.6,2.2,2 +6.3,2.8,5.1,1.5,2 +6.1,2.6,5.6,1.4,2 +7.7,3.0,6.1,2.3,2 +6.3,3.4,5.6,2.4,2 +6.4,3.1,5.5,1.8,2 +6.0,3.0,4.8,1.8,2 +6.9,3.1,5.4,2.1,2 +6.7,3.1,5.6,2.4,2 +6.9,3.1,5.1,2.3,2 +5.8,2.7,5.1,1.9,2 +6.8,3.2,5.9,2.3,2 +6.7,3.3,5.7,2.5,2 +6.7,3.0,5.2,2.3,2 +6.3,2.5,5.0,1.9,2 +6.5,3.0,5.2,2.0,2 +6.2,3.4,5.4,2.3,2 +5.9,3.0,5.1,1.8,2 diff --git a/javaxval/bean-validation/pom.xml b/javaxval/bean-validation/pom.xml deleted file mode 100644 index cdb5a814e2..0000000000 --- a/javaxval/bean-validation/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ - - 4.0.0 - - com.baeldung.beanvalidation - beanvalidation - 1.0 - jar - beanvalidation - http://maven.apache.org - - UTF-8 - - - - junit - junit - 4.12 - test - - - javax.validation - validation-api - 2.0.0.Final - - - org.hibernate - hibernate-validator - 6.0.2.Final - - - javax.el - javax.el-api - 3.0.0 - - - org.glassfish.web - javax.el - 2.2.4 - - - diff --git a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/application/Application.java b/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/application/Application.java deleted file mode 100644 index 7966b1046c..0000000000 --- a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/application/Application.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.beanvalidation.application; - -import javax.validation.Validation; -import javax.validation.Validator; -import com.baeldung.beanvalidation.model.User; - -public class Application { - - public static void main( String[] args ) { - Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); - User user = new User(); - user.setName("Mary"); - user.setEmail("no-email"); - user.setAge(36); - validator.validate(user).stream().forEach(violation -> System.out.println(violation.getMessage())); - } -} diff --git a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/container/IntegerContainer.java b/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/container/IntegerContainer.java deleted file mode 100644 index a6006067cc..0000000000 --- a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/container/IntegerContainer.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.beanvalidation.container; - -import java.util.Optional; -import javax.validation.constraints.Positive; - -public class IntegerContainer { - - private Optional<@Positive(message = "Value must be a positive integer") Integer> container = Optional.empty(); - - public void addElement(int element) { - container = Optional.of(element); - } -} diff --git a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/container/StringContainer.java b/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/container/StringContainer.java deleted file mode 100644 index eced996263..0000000000 --- a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/container/StringContainer.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.beanvalidation.container; - -import java.util.ArrayList; -import java.util.List; -import javax.validation.constraints.NotNull; - -public class StringContainer { - - private List<@NotNull String> container = new ArrayList<>(); - - public void addElement(String element) { - container.add(element); - } -} diff --git a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/model/User.java b/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/model/User.java deleted file mode 100644 index 2a019c37b3..0000000000 --- a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/model/User.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.beanvalidation.model; - -import java.io.Serializable; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import org.hibernate.validator.constraints.Email; - -public class User implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull(message = "Name cannot be null") - @Size(min = 2, max = 32, message = "Name must be between 2 and 32 characters") - private String name; - - @Email(message = "Email must be a well-formed email address") - private String email; - - @Min(value = 1, message = "Age must not be lesser than 1") - @Max(value = 99, message = "Age must not be greater than 99") - private int age; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/service/EntityService.java b/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/service/EntityService.java deleted file mode 100644 index 5362e7fbda..0000000000 --- a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/service/EntityService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.beanvalidation.service; - -public interface EntityService { - - public String toString(); - - public void processEntity(); -} diff --git a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/service/UserService.java b/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/service/UserService.java deleted file mode 100644 index 7aae5b3077..0000000000 --- a/javaxval/bean-validation/src/main/java/com/baeldung/beanvalidation/service/UserService.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.beanvalidation.service; - -import java.io.Serializable; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import com.baeldung.beanvalidation.model.User; - -public class UserService implements EntityService, Serializable { - - private static final long serialVersionUID = 1L; - - @Valid - private User user; - - @NotNull(message = "FileName cannot be null") - @Size(min = 5, max = 10, message = "FileName must be between 5 and 10 characters") - private String fileName; - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - public String getFileName() { - return fileName; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - @Override - public void processEntity() { - // process the user here - } - - @Override - public String toString() { - return "UserService [user=" + user + ", fileName=" + fileName + "]"; - } -} diff --git a/javaxval/bean-validation/src/test/java/com/baeldung/beanvalidation/ValidationTest.java b/javaxval/bean-validation/src/test/java/com/baeldung/beanvalidation/ValidationTest.java deleted file mode 100644 index 1d36cf21f0..0000000000 --- a/javaxval/bean-validation/src/test/java/com/baeldung/beanvalidation/ValidationTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.baeldung.beanvalidation; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; -import com.baeldung.beanvalidation.container.IntegerContainer; -import com.baeldung.beanvalidation.container.StringContainer; -import com.baeldung.beanvalidation.model.User; -import com.baeldung.beanvalidation.service.UserService; -import java.util.Set; -import java.util.stream.Collectors; -import static org.junit.Assert.*; - -public class ValidationTest { - - private static Validator validator; - private static User user; - - @BeforeClass - public static void setUpHibernateValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory().getValidator(); - } - - @BeforeClass - public static void setUpUserInstance() { - user = new User(); - } - - @AfterClass - public static void tearDownHibernateValidatorInstance() { - validator = null; - } - - @AfterClass - public static void tearDownUserInstance() { - user = null; - } - - @Test - public void givenNullName_whenValidated_thenMessageDescriptorForName() { - user.setName(null); - user.setEmail("mary@domain.com"); - user.setAge(36); - assertEquals("Name cannot be null", validator.validate(user).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenInvalidEmail_whenValidated_thenMessageDescriptorforEmail() { - user.setName("Mary"); - user.setEmail("no-email"); - user.setAge(36); - assertEquals("Email must be a well-formed email address", validator.validate(user).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenAgeLesserThanLowerBound_whenValidated_thenMessageDescriptorforAge() { - user.setName("Mary"); - user.setEmail("mary@domain.com"); - user.setAge(0); - assertEquals("Age must not be lesser than 1", validator.validate(user).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenAgeGreaterThanUpperBound_whenValidated_thenMessageDescriptorforAge() { - user.setName("Mary"); - user.setEmail("mary@domain.com"); - user.setAge(100); - assertEquals("Age must not be greater than 99", validator.validate(user).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenNullFileName_whenValidated_thenMessageDescriptorforFileName() { - user.setName("Mary"); - user.setEmail("mary@domain.com"); - user.setAge(36); - UserService userService = new UserService(); - userService.setFileName(null); - userService.setUser(user); - assertEquals("FileName cannot be null", validator.validate(userService).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenFileNameShortherThanLowerBound_whenValidated_thenMessageDescriptorforFileName() { - user.setName("Mary"); - user.setEmail("mary@domain.com"); - user.setAge(36); - UserService userService = new UserService(); - userService.setFileName(""); - userService.setUser(user); - assertEquals("FileName must be between 5 and 10 characters", validator.validate(userService).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenFileNameLongerThanUpperBound_whenValidated_thenMessageDescriptorforFileName() { - user.setName("Mary"); - user.setEmail("mary@domain.com"); - user.setAge(36); - UserService userService = new UserService(); - userService.setFileName("waytoolongfilename"); - userService.setUser(user); - assertEquals("FileName must be between 5 and 10 characters", validator.validate(userService).stream().map(violation -> violation.getMessage()).collect(Collectors.joining())); - } - - @Test - public void givenNullUserAndNullFileName_whenValidated_thenTwoConstraintViolations() { - user.setName(null); - user.setEmail("mary@domain.com"); - user.setAge(36); - UserService userService = new UserService(); - userService.setFileName(null); - userService.setUser(user); - Set> constraintViolations = validator.validate(userService); - assertEquals(2, constraintViolations.size()); - } - - @Test - public void givenNullElement_whenValidated_thenOneConstraintViolation() { - StringContainer container = new StringContainer(); - container.addElement(null); - Set> constraintViolations = validator.validate(container); - assertEquals(1, constraintViolations.size()); - } - - @Test - public void givenNegativeInteger_whenValidated_thenOneConstraintViolation() { - IntegerContainer container = new IntegerContainer(); - container.addElement(-1); - Set> constraintViolations = validator.validate(container); - assertEquals(1, constraintViolations.size()); - } -} diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 4d27b3e0c9..6a83a25f01 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -6,8 +6,8 @@ 0.1-SNAPSHOT - 1.1.0.Final - 5.3.4.Final + 2.0.0.Final + 6.0.2.Final 3.0.0 2.2.6 diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/Customer.java new file mode 100644 index 0000000000..a90fb419de --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/Customer.java @@ -0,0 +1,66 @@ +package org.baeldung; + +import java.util.List; +import java.util.Optional; +import java.util.OptionalInt; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.PositiveOrZero; + +public class Customer { + + @NotBlank(message="Name cannot be empty") + private String name; + + private List<@NotBlank(message="Address must not be blank") String> addresses; + + private Integer age; + + @PositiveOrZero + private OptionalInt numberOfOrders; + + //@NotBlank + private Profile profile; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getAddresses() { + return addresses; + } + + public void setAddresses(List addresses) { + this.addresses = addresses; + } + + public Optional<@Min(18) Integer> getAge() { + return Optional.ofNullable(age); + } + + public void setAge(Integer age) { + this.age = age; + } + + public OptionalInt getNumberOfOrders() { + return numberOfOrders; + } + + public void setNumberOfOrders(OptionalInt numberOfOrders) { + this.numberOfOrders = numberOfOrders; + } + + public Profile getProfile() { + return profile; + } + + public void setProfile(Profile profile) { + this.profile = profile; + } + +} diff --git a/javaxval/src/main/java/org/baeldung/CustomerMap.java b/javaxval/src/main/java/org/baeldung/CustomerMap.java new file mode 100644 index 0000000000..37446cf86e --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/CustomerMap.java @@ -0,0 +1,19 @@ +package org.baeldung; + +import java.util.Map; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; + +public class CustomerMap { + + private Map<@Email(message="Must be a valid email") String, @NotNull Customer> customers; + + public Map getCustomers() { + return customers; + } + + public void setCustomers(Map customers) { + this.customers = customers; + } +} diff --git a/javaxval/src/main/java/org/baeldung/Profile.java b/javaxval/src/main/java/org/baeldung/Profile.java new file mode 100644 index 0000000000..ec73a5c62f --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/Profile.java @@ -0,0 +1,13 @@ +package org.baeldung; + +public class Profile { + private String companyName; + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } +} diff --git a/javaxval/src/main/java/org/baeldung/User.java b/javaxval/src/main/java/org/baeldung/User.java index 2d86a4ec2f..e2f2732399 100644 --- a/javaxval/src/main/java/org/baeldung/User.java +++ b/javaxval/src/main/java/org/baeldung/User.java @@ -1,56 +1,94 @@ package org.baeldung; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + import javax.validation.constraints.AssertTrue; +import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Past; import javax.validation.constraints.Size; +import javax.validation.constraints.NotBlank; public class User { - @NotNull(message = "Name cannot be null") - private String name; + @NotNull(message = "Name cannot be null") + private String name; - @AssertTrue - private boolean working; + @AssertTrue + private boolean working; - @Size(min = 10, max = 200, message = "Number of characters should be in between 10 and 200 inclusive") - private String aboutMe; + @Size(min = 10, max = 200, message = "Number of characters should be in between 10 and 200 inclusive") + private String aboutMe; - @Min(value = 18, message = "Age should not be less than 18") - @Max(value = 150, message = "Age should not be more than 150") - private int age; + @Min(value = 18, message = "Age should not be less than 18") + @Max(value = 150, message = "Age should not be more than 150") + private int age; - public int getAge() { - return age; - } + @Email(message = "Email should be valid") + private String email; + + List<@NotBlank String> preferences; + + private LocalDate dateOfBirth; - public void setAge(int age) { - this.age = age; - } + public int getAge() { + return age; + } - public boolean isWorking() { - return working; - } + public void setAge(int age) { + this.age = age; + } - public void setWorking(boolean working) { - this.working = working; - } + public boolean isWorking() { + return working; + } - public String getAboutMe() { - return aboutMe; - } + public void setWorking(boolean working) { + this.working = working; + } - public void setAboutMe(String aboutMe) { - this.aboutMe = aboutMe; - } + public String getAboutMe() { + return aboutMe; + } - public String getName() { - return name; - } + public void setAboutMe(String aboutMe) { + this.aboutMe = aboutMe; + } - public void setName(String name) { - this.name = name; - } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public Optional<@Past LocalDate> getDateOfBirth() { + return Optional.ofNullable(dateOfBirth); + } + + public void setDateOfBirth(LocalDate dateOfBirth) { + this.dateOfBirth = dateOfBirth; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public List getPreferences() { + return preferences; + } + + public void setPreferences(List preferences) { + this.preferences = preferences; + } + } diff --git a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java b/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java new file mode 100644 index 0000000000..f192034261 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java @@ -0,0 +1,17 @@ +package org.baeldung.valueextractors; + +import javax.validation.valueextraction.ExtractedValue; +import javax.validation.valueextraction.UnwrapByDefault; +import javax.validation.valueextraction.ValueExtractor; + +import org.baeldung.Profile; + +@UnwrapByDefault +public class ProfileValueExtractor implements ValueExtractor<@ExtractedValue(type = String.class) Profile> { + + @Override + public void extractValues(Profile originalValue, ValueExtractor.ValueReceiver receiver) { + receiver.value(null, originalValue.getCompanyName()); + } + +} diff --git a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor new file mode 100644 index 0000000000..e77a30cfe4 --- /dev/null +++ b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor @@ -0,0 +1 @@ +org.baeldung.valueextractors.ProfileValueExtractor \ No newline at end of file diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java new file mode 100644 index 0000000000..dff02ff13d --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java @@ -0,0 +1,88 @@ +package org.baeldung; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.OptionalInt; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +import org.baeldung.valueextractors.ProfileValueExtractor; + +import org.junit.Before; +import org.junit.Test; + +public class ContainerValidationIntegrationTest { + private Validator validator; + + @Before + public void setup() { + ValidatorFactory factory = Validation.byDefaultProvider().configure() + .addValueExtractor(new ProfileValueExtractor()).buildValidatorFactory(); + validator = factory.getValidator(); + } + + @Test + public void whenEmptyAddress_thenValidationFails() { + Customer customer = new Customer(); + customer.setName("John"); + customer.setAddresses(Collections.singletonList(" ")); + Set> violations = validator.validate(customer); + assertEquals(1, violations.size()); + assertEquals("Address must not be blank", violations.iterator() + .next() + .getMessage()); + } + + @Test + public void whenInvalidEmail_thenValidationFails() { + CustomerMap map = new CustomerMap(); + map.setCustomers(Collections.singletonMap("john", new Customer())); + Set> violations = validator.validate(map); + assertEquals(1, violations.size()); + assertEquals("Must be a valid email", violations.iterator() + .next() + .getMessage()); + } + + @Test + public void whenAgeTooLow_thenValidationFails() { + Customer customer = new Customer(); + customer.setName("John"); + customer.setAge(15); + Set> violations = validator.validate(customer); + assertEquals(1, violations.size()); + } + + @Test + public void whenAgeNull_thenValidationSucceeds() { + Customer customer = new Customer(); + customer.setName("John"); + Set> violations = validator.validate(customer); + assertEquals(0, violations.size()); + } + + @Test + public void whenNumberOrdersValid_thenValidationSucceeds() { + Customer customer = new Customer(); + customer.setName("John"); + customer.setNumberOfOrders(OptionalInt.of(1)); + Set> violations = validator.validate(customer); + assertEquals(0, violations.size()); + } + + //@Test + public void whenProfileCompanyNameBlank_thenValidationFails() { + Customer customer = new Customer(); + customer.setName("John"); + Profile profile = new Profile(); + profile.setCompanyName(" "); + customer.setProfile(profile); + Set> violations = validator.validate(customer); + assertEquals(1, violations.size()); + } + +} diff --git a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java index 63c08f64d8..78745a1af2 100644 --- a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java @@ -1,81 +1,126 @@ package org.baeldung; +import java.time.LocalDate; +import java.util.Collections; import java.util.Iterator; import java.util.Set; +import java.util.Optional; + import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import org.junit.Assert; +import static org.junit.Assert.*; import org.junit.Test; +import org.junit.Before; public class ValidationIntegrationTest { - @Test - public void ifNameIsNull_nameValidationFails() { - User user = new User(); - user.setWorking(true); - user.setAboutMe("Its all about me!!"); - user.setAge(50); + private Validator validator; - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> violations = validator.validate(user); - Assert.assertEquals(violations.isEmpty(), false); - } + @Before + public void setup() { + ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } - @Test - public void ifSizeNotInRange_aboutMeValidationFails() { - User user = new User(); - user.setName("MyName"); - user.setAboutMe("Its all about me!!"); - user.setAge(50); + private User createUser() { + User user = new User(); + user.setName("John"); + user.setWorking(true); + user.setAge(18); + return user; + } - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> violations = validator.validate(user); - Assert.assertEquals(violations.isEmpty(), false); - } + @Test + public void ifNameIsNull_nameValidationFails() { + User user = new User(); + user.setWorking(true); + user.setAboutMe("Its all about me!!"); + user.setAge(50); + Set> violations = validator.validate(user); + assertEquals(violations.isEmpty(), false); + } - @Test - public void ifWorkingIsFalse_workingValidationFails() { - User user = new User(); - user.setName("MyName"); - user.setAboutMe("Its all about me!!"); - user.setAge(50); + @Test + public void ifSizeNotInRange_aboutMeValidationFails() { + User user = new User(); + user.setName("MyName"); + user.setAboutMe("Its all about me!!"); + user.setAge(50); - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> violations = validator.validate(user); - Assert.assertEquals(violations.isEmpty(), false); - } + Set> violations = validator.validate(user); + assertEquals(violations.isEmpty(), false); + } - @Test - public void ifAgeNotRange_ageValidationFails() { - User user = new User(); - user.setName("MyName"); - user.setAboutMe("Its all about me!!"); - user.setAge(8); + @Test + public void ifWorkingIsFalse_workingValidationFails() { + User user = new User(); + user.setName("MyName"); + user.setAboutMe("Its all about me!!"); + user.setAge(50); - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> violations = validator.validate(user); - Assert.assertEquals(violations.isEmpty(), false); - } - - - @Test - public void ifFnameNullAgeNotRangeAndWorkingIsFalse_validationFailsWithThreeErrors() { - User user = new User(); - user.setAboutMe("Its all about me!!"); - user.setAge(300); + Set> violations = validator.validate(user); + assertEquals(violations.isEmpty(), false); + } - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - Validator validator = factory.getValidator(); - Set> violations = validator.validate(user); - Assert.assertEquals(violations.isEmpty(), false); - Assert.assertEquals(violations.size(), 3); - } + @Test + public void ifAgeNotRange_ageValidationFails() { + User user = new User(); + user.setName("MyName"); + user.setAboutMe("Its all about me!!"); + user.setAge(8); + + Set> violations = validator.validate(user); + assertEquals(violations.isEmpty(), false); + } + + @Test + public void ifFnameNullAgeNotRangeAndWorkingIsFalse_validationFailsWithThreeErrors() { + User user = new User(); + user.setAboutMe("Its all about me!!"); + user.setAge(300); + + Set> violations = validator.validate(user); + assertEquals(violations.isEmpty(), false); + assertEquals(violations.size(), 3); + } + + @Test + public void givenInvalidEmail_thenValidationFails() { + User user = createUser(); + user.setEmail("john"); + + Set> violations = validator.validate(user); + assertEquals(1, violations.size()); + } + + @Test + public void givenBlankPreference_thenValidationFails() { + User user = createUser(); + user.setPreferences(Collections.singletonList(" ")); + + Set> violations = validator.validate(user); + assertEquals(1, violations.size()); + } + + @Test + public void givenEmptyOptional_thenValidationSucceeds() { + User user = createUser(); + + Set> violations = validator.validate(user); + assertEquals(0, violations.size()); + } + + @Test + public void givenPastDateOfBirth_thenValidationSuccess() { + User user = createUser(); + user.setDateOfBirth(LocalDate.of(1980, 5, 20)); + + Set> violations = validator.validate(user); + assertEquals(0, violations.size()); + + } } diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index cae8a725a6..90b1f6bb1d 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -36,6 +36,11 @@ reladomo-test-util ${reladomo.version} + + com.j256.ormlite + ormlite-jdbc + ${ormlite.version} + @@ -144,5 +149,6 @@ 16.5.1 4.12 3.6.2 + 5.0 \ No newline at end of file diff --git a/libraries-data/src/main/java/com/baeldung/ormlite/Address.java b/libraries-data/src/main/java/com/baeldung/ormlite/Address.java new file mode 100644 index 0000000000..747b0b0b12 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/ormlite/Address.java @@ -0,0 +1,37 @@ +package com.baeldung.ormlite; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "addresses") +public class Address { + @DatabaseField(generatedId = true) + private long addressId; + + @DatabaseField(canBeNull = false) + private String addressLine; + + public Address() { + } + + public Address(String addressLine) { + this.addressLine = addressLine; + } + + public long getAddressId() { + return addressId; + } + + public void setAddressId(long addressId) { + this.addressId = addressId; + } + + public String getAddressLine() { + return addressLine; + } + + public void setAddressLine(String addressLine) { + this.addressLine = addressLine; + } + +} diff --git a/libraries-data/src/main/java/com/baeldung/ormlite/Book.java b/libraries-data/src/main/java/com/baeldung/ormlite/Book.java new file mode 100644 index 0000000000..ed7b813b8d --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/ormlite/Book.java @@ -0,0 +1,49 @@ +package com.baeldung.ormlite; + +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable +public class Book { + + @DatabaseField(generatedId = true) + private long bookId; + + @DatabaseField + private String title; + + @DatabaseField(foreign = true, foreignAutoRefresh = true, foreignAutoCreate = true) + private Library library; + + public Book() { + } + + public Book(String title) { + this.title = title; + } + + public long getBookId() { + return bookId; + } + + public void setBookId(long bookId) { + this.bookId = bookId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Library getLibrary() { + return library; + } + + public void setLibrary(Library library) { + this.library = library; + } + +} diff --git a/libraries-data/src/main/java/com/baeldung/ormlite/Library.java b/libraries-data/src/main/java/com/baeldung/ormlite/Library.java new file mode 100644 index 0000000000..994b4c6575 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/ormlite/Library.java @@ -0,0 +1,58 @@ +package com.baeldung.ormlite; + +import com.j256.ormlite.dao.ForeignCollection; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.field.ForeignCollectionField; +import com.j256.ormlite.table.DatabaseTable; + +@DatabaseTable(tableName = "libraries", daoClass = LibraryDaoImpl.class) +public class Library { + + @DatabaseField(generatedId = true) + private long libraryId; + + @DatabaseField(canBeNull = false) + private String name; + + @DatabaseField(foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true) + private Address address; + + @ForeignCollectionField(eager = false) + private ForeignCollection books; + + public Library() { + } + + public long getLibraryId() { + return libraryId; + } + + public void setLibraryId(long libraryId) { + this.libraryId = libraryId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public ForeignCollection getBooks() { + return books; + } + + public void setBooks(ForeignCollection books) { + this.books = books; + } + +} diff --git a/libraries-data/src/main/java/com/baeldung/ormlite/LibraryDao.java b/libraries-data/src/main/java/com/baeldung/ormlite/LibraryDao.java new file mode 100644 index 0000000000..fd8f5f40d6 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/ormlite/LibraryDao.java @@ -0,0 +1,10 @@ +package com.baeldung.ormlite; + +import java.sql.SQLException; +import java.util.List; + +import com.j256.ormlite.dao.Dao; + +public interface LibraryDao extends Dao { + public List findByName(String name) throws SQLException; +} diff --git a/libraries-data/src/main/java/com/baeldung/ormlite/LibraryDaoImpl.java b/libraries-data/src/main/java/com/baeldung/ormlite/LibraryDaoImpl.java new file mode 100644 index 0000000000..af313101e2 --- /dev/null +++ b/libraries-data/src/main/java/com/baeldung/ormlite/LibraryDaoImpl.java @@ -0,0 +1,21 @@ +package com.baeldung.ormlite; + +import java.sql.SQLException; +import java.util.List; + +import com.j256.ormlite.dao.BaseDaoImpl; +import com.j256.ormlite.support.ConnectionSource; + +public class LibraryDaoImpl extends BaseDaoImpl implements LibraryDao { + + public LibraryDaoImpl(ConnectionSource connectionSource) throws SQLException { + super(connectionSource, Library.class); + } + + @Override + public List findByName(String name) throws SQLException { + return super.queryForEq("name", name); + + } + +} diff --git a/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteTest.java b/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteTest.java new file mode 100644 index 0000000000..eaa21b6eaf --- /dev/null +++ b/libraries-data/src/test/java/com/baeldung/ormlite/ORMLiteTest.java @@ -0,0 +1,171 @@ +package com.baeldung.ormlite; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.List; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import com.j256.ormlite.dao.CloseableWrappedIterable; +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.jdbc.JdbcPooledConnectionSource; +import com.j256.ormlite.table.TableUtils; + +public class ORMLiteTest { + private static JdbcPooledConnectionSource connectionSource; + + private static Dao libraryDao; + private static Dao bookDao; + + @BeforeClass + public static void setup() throws SQLException { + connectionSource = new JdbcPooledConnectionSource("jdbc:h2:mem:myDb"); + TableUtils.createTableIfNotExists(connectionSource, Library.class); + TableUtils.createTableIfNotExists(connectionSource, Address.class); + TableUtils.createTableIfNotExists(connectionSource, Book.class); + + libraryDao = DaoManager.createDao(connectionSource, Library.class); + + bookDao = DaoManager.createDao(connectionSource, Book.class); + } + + @Test + public void givenDAO_whenCRUD_thenOk() throws SQLException { + Library library = new Library(); + library.setName("My Library"); + libraryDao.create(library); + + Library result = libraryDao.queryForId(library.getLibraryId()); + assertEquals("My Library", result.getName()); + + library.setName("My Other Library"); + libraryDao.update(library); + + libraryDao.delete(library); + + } + + @Test + public void whenLoopDao_thenOk() throws SQLException { + Library library1 = new Library(); + library1.setName("My Library"); + libraryDao.create(library1); + + Library library2 = new Library(); + library2.setName("My Other Library"); + libraryDao.create(library2); + + libraryDao.forEach(lib -> { + System.out.println(lib.getName()); + }); + + } + + @Test + public void givenIterator_whenLoop_thenOk() throws SQLException, IOException { + Library library1 = new Library(); + library1.setName("My Library"); + libraryDao.create(library1); + + Library library2 = new Library(); + library2.setName("My Other Library"); + libraryDao.create(library2); + + CloseableWrappedIterable wrappedIterable = libraryDao.getWrappedIterable(); + try { + wrappedIterable.forEach(lib -> { + System.out.println(lib.getName()); + }); + } finally { + wrappedIterable.close(); + } + + } + + @Test + public void givenCustomDao_whenSave_thenOk() throws SQLException, IOException { + Library library = new Library(); + library.setName("My Library"); + + LibraryDao customLibraryDao = DaoManager.createDao(connectionSource, Library.class); + customLibraryDao.create(library); + assertEquals(1, customLibraryDao.findByName("My Library") + .size()); + } + + @Test + public void whenSaveForeignField_thenOk() throws SQLException, IOException { + Library library = new Library(); + library.setName("My Library"); + library.setAddress(new Address("Main Street nr 20")); + libraryDao.create(library); + + Dao addressDao = DaoManager.createDao(connectionSource, Address.class); + assertEquals(1, addressDao.queryForEq("addressLine", "Main Street nr 20") + .size()); + } + + @Test + public void whenSaveForeignCollection_thenOk() throws SQLException, IOException { + Library library = new Library(); + library.setName("My Library"); + libraryDao.create(library); + libraryDao.refresh(library); + library.getBooks() + .add(new Book("1984")); + + Book book = new Book("It"); + book.setLibrary(library); + bookDao.create(book); + + assertEquals(2, bookDao.queryForEq("library_id", library) + .size()); + } + + @Test + public void whenGetLibrariesWithMoreThanOneBook_thenOk() throws SQLException, IOException { + Library library = new Library(); + library.setName("My Library"); + libraryDao.create(library); + Library library2 = new Library(); + library2.setName("My Other Library"); + libraryDao.create(library2); + + libraryDao.refresh(library); + libraryDao.refresh(library2); + + library.getBooks() + .add(new Book("Book1")); + library2.getBooks() + .add(new Book("Book2")); + library2.getBooks() + .add(new Book("Book3")); + + List libraries = libraryDao.queryBuilder() + .where() + .in("libraryId", bookDao.queryBuilder() + .selectColumns("library_id") + .groupBy("library_id") + .having("count(*) > 1")) + .query(); + assertEquals(1, libraries.size()); + + } + + @After + public void clear() throws SQLException { + TableUtils.clearTable(connectionSource, Library.class); + TableUtils.clearTable(connectionSource, Book.class); + TableUtils.clearTable(connectionSource, Address.class); + } + + @AfterClass + public static void tearDown() throws SQLException, IOException { + connectionSource.close(); + } +} diff --git a/libraries/README.md b/libraries/README.md index 74766fb828..7214cd278c 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -41,6 +41,7 @@ - [Introduction to NoException](http://www.baeldung.com/no-exception) - [Introduction to FunctionalJava](http://www.baeldung.com/functional-java) - [Apache Commons IO](http://www.baeldung.com/apache-commons-io) +- [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types) The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. diff --git a/libraries/pom.xml b/libraries/pom.xml index 01a3e7bd73..c7c5da95a6 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> parent-modules com.baeldung @@ -487,7 +487,7 @@ vavr ${vavr.version} - + com.squareup.retrofit2 @@ -503,7 +503,7 @@ com.squareup.retrofit2 adapter-rxjava ${retrofit.version} - + com.squareup.okhttp3 logging-interceptor @@ -583,8 +583,34 @@ com.atlassian.fugue fugue - 3.0.0-m007 + 2.6.1 + + + + org.jgrapht + jgrapht-core + 1.0.1 + + + com.netopyr.wurmloch + wurmloch-crdt + ${crdt.version} + + + org.docx4j + docx4j + 3.3.5 + + + javax.xml.bind + jaxb-api + 2.1 + @@ -606,6 +632,7 @@ + 0.1.0 0.7.0 3.2.4 3.6 @@ -658,6 +685,6 @@ 1.14 1.0.3 1.0.0 - 3.8.4 + 3.8.4 - \ No newline at end of file + diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java b/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java index c64f7e7511..35cae7426d 100644 --- a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java +++ b/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java @@ -3,6 +3,8 @@ package com.baeldung.commons.lang3; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.concurrent.ConcurrentException; +import org.apache.commons.lang3.concurrent.BackgroundInitializer; public class BuilderMethods { @@ -56,5 +58,36 @@ public class BuilderMethods { System.out.println(simple1.getName()); System.out.println(simple1.hashCode()); System.out.println(simple1.toString()); + + SampleLazyInitializer sampleLazyInitializer = new SampleLazyInitializer(); + + try { + sampleLazyInitializer.get(); + } catch (ConcurrentException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + SampleBackgroundInitializer sampleBackgroundInitializer = new SampleBackgroundInitializer(); + sampleBackgroundInitializer.start(); + + // Proceed with other tasks instead of waiting for the SampleBackgroundInitializer task to finish. + + try { + Object result = sampleBackgroundInitializer.get(); + } catch (ConcurrentException e) { + e.printStackTrace(); + } } } + +class SampleBackgroundInitializer extends BackgroundInitializer{ + + @Override + protected String initialize() throws Exception { + return null; + } + + // Any complex task that takes some time + +} diff --git a/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java b/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java new file mode 100644 index 0000000000..d9c87b3889 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/docx/Docx4jExample.java @@ -0,0 +1,109 @@ +package com.baeldung.docx; + +import org.docx4j.dml.wordprocessingDrawing.Inline; +import org.docx4j.jaxb.Context; +import org.docx4j.model.table.TblFactory; +import org.docx4j.openpackaging.exceptions.Docx4JException; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; +import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage; +import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; +import org.docx4j.wml.BooleanDefaultTrue; +import org.docx4j.wml.Color; +import org.docx4j.wml.Drawing; +import org.docx4j.wml.ObjectFactory; +import org.docx4j.wml.P; +import org.docx4j.wml.R; +import org.docx4j.wml.RPr; +import org.docx4j.wml.Tbl; +import org.docx4j.wml.Tc; +import org.docx4j.wml.Text; +import org.docx4j.wml.Tr; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import java.io.File; +import java.nio.file.Files; +import java.util.List; + +class Docx4jExample { + + void createDocumentPackage(String outputPath, String imagePath) throws Exception { + WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); + MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart(); + mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!"); + mainDocumentPart.addParagraphOfText("Welcome To Baeldung!"); + + ObjectFactory factory = Context.getWmlObjectFactory(); + P p = factory.createP(); + R r = factory.createR(); + Text t = factory.createText(); + t.setValue("Welcome To Baeldung"); + r.getContent().add(t); + p.getContent().add(r); + RPr rpr = factory.createRPr(); + BooleanDefaultTrue b = new BooleanDefaultTrue(); + rpr.setB(b); + rpr.setI(b); + rpr.setCaps(b); + Color red = factory.createColor(); + red.setVal("green"); + rpr.setColor(red); + r.setRPr(rpr); + mainDocumentPart.getContent().add(p); + + File image = new File(imagePath); + byte[] fileContent = Files.readAllBytes(image.toPath()); + BinaryPartAbstractImage imagePart = BinaryPartAbstractImage + .createImagePart(wordPackage, fileContent); + Inline inline = imagePart.createImageInline( + "Baeldung Image", "Alt Text", 1, 2, false); + P Imageparagraph = addImageToParagraph(inline); + mainDocumentPart.getContent().add(Imageparagraph); + + int writableWidthTwips = wordPackage.getDocumentModel() + .getSections().get(0).getPageDimensions() + .getWritableWidthTwips(); + int columnNumber = 3; + Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips / columnNumber); + List rows = tbl.getContent(); + for (Object row : rows) { + Tr tr = (Tr) row; + List cells = tr.getContent(); + for (Object cell : cells) { + Tc td = (Tc) cell; + td.getContent().add(p); + } + } + + mainDocumentPart.getContent().add(tbl); + File exportFile = new File(outputPath); + wordPackage.save(exportFile); + } + + boolean isTextExist(String testText) throws Docx4JException, JAXBException { + File doc = new File("helloWorld.docx"); + WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(doc); + MainDocumentPart mainDocumentPart = wordMLPackage.getMainDocumentPart(); + String textNodesXPath = "//w:t"; + List paragraphs = mainDocumentPart.getJAXBNodesViaXPath(textNodesXPath, true); + for (Object obj : paragraphs) { + Text text = (Text) ((JAXBElement) obj).getValue(); + String textValue = text.getValue(); + if (textValue != null && textValue.contains(testText)) { + return true; + } + } + return false; + } + + private static P addImageToParagraph(Inline inline) { + ObjectFactory factory = new ObjectFactory(); + P p = factory.createP(); + R r = factory.createR(); + p.getContent().add(r); + Drawing drawing = factory.createDrawing(); + r.getContent().add(drawing); + drawing.getAnchorOrInline().add(inline); + return p; + } +} diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java b/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java new file mode 100644 index 0000000000..53e86524a5 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jdo/xml/AnnotadedPerson.java @@ -0,0 +1,72 @@ +package com.baeldung.jdo.xml; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.jdo.annotations.Element; +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.PrimaryKey; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; + +@PersistenceCapable( + schema="/myproduct/people", + table="person" + ) +public class AnnotadedPerson { + @XmlAttribute + private long personNum; + + @PrimaryKey + private String firstName; + private String lastName; + + @XmlElementWrapper(name="phone-numbers") + @XmlElement(name="phone-number") + @Element(types=String.class) + private List phoneNumbers = new ArrayList(); + + + public AnnotadedPerson(long personNum, String firstName, String lastName) { + super(); + this.personNum = personNum; + this.firstName = firstName; + this.lastName = lastName; + } + + public long getPersonNum() { + return personNum; + } + + public void setPersonNum(long personNum) { + this.personNum = personNum; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(List phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java b/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java new file mode 100644 index 0000000000..97ec49eec1 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java @@ -0,0 +1,105 @@ +package com.baeldung.jdo.xml; + +import java.util.List; + +import javax.jdo.JDOHelper; +import javax.jdo.PersistenceManager; +import javax.jdo.PersistenceManagerFactory; +import javax.jdo.Query; +import javax.jdo.Transaction; + +import org.datanucleus.api.jdo.JDOPersistenceManagerFactory; +import org.datanucleus.metadata.PersistenceUnitMetaData; + +public class MyApp { + + private static PersistenceUnitMetaData pumd; + private static PersistenceManagerFactory pmf; + private static PersistenceManager pm; + + public static void main( String[] args ) { + + //persist product object using dynamic persistence unit + defineDynamicPersistentUnit(); + Product product = new Product("id1","Sony Discman", "A standard discman from Sony", 49.99); + persistObject(product); + closePersistenceManager(); + + //persist AnnotatedPerson object using named pmf + defineNamedPersistenceManagerFactory("XmlDatastore"); + AnnotadedPerson annotatedPerson = new AnnotadedPerson(654320,"annotated","person"); + annotatedPerson.getPhoneNumbers().add("999999999"); + annotatedPerson.getPhoneNumbers().add("000000000"); + persistObject(annotatedPerson); + queryAnnotatedPersonsInXML(); + closePersistenceManager(); + + //persist Person object using PMF created by properties file + definePersistenceManagerFactoryUsingPropertiesFile("META-INF\\datanucleus.properties"); + Person person = new Person(654321,"bealdung","author"); + person.getPhoneNumbers().add("123456789"); + person.getPhoneNumbers().add("987654321"); + persistObject(person); + queryPersonsInXML(); + closePersistenceManager(); + } + + public static void defineDynamicPersistentUnit(){ + + PersistenceUnitMetaData pumd = new PersistenceUnitMetaData("dynamic-unit", "RESOURCE_LOCAL", null); + pumd.addProperty("javax.jdo.option.ConnectionURL", "xml:file:myfile_dynamicPMF.xml"); + pumd.addProperty("datanucleus.schema.autoCreateAll", "true"); + pumd.addProperty("datanucleus.xml.indentSize", "4"); + + pmf = new JDOPersistenceManagerFactory(pumd, null); + pm = pmf.getPersistenceManager(); + } + + public static void defineNamedPersistenceManagerFactory(String pmfName){ + + pmf = JDOHelper.getPersistenceManagerFactory("XmlDatastore"); + pm = pmf.getPersistenceManager(); + } + + public static void definePersistenceManagerFactoryUsingPropertiesFile(String filePath){ + + pmf = JDOHelper.getPersistenceManagerFactory(filePath); + pm = pmf.getPersistenceManager(); + } + + public static void closePersistenceManager(){ + + if(pm!=null && !pm.isClosed()){ + pm.close(); + } + } + + public static void persistObject(Object obj){ + + Transaction tx = pm.currentTransaction(); + + try { + tx.begin(); + pm.makePersistent(obj); + tx.commit(); + } finally { + if (tx.isActive()) { + tx.rollback(); + } + } + } + + public static void queryPersonsInXML(){ + + Query query = pm.newQuery(Person.class); + List result = query.executeList(); + System.out.println("name: "+result.get(0).getFirstName()); + } + + public static void queryAnnotatedPersonsInXML(){ + + Query query = pm.newQuery(AnnotadedPerson.class); + List result = query.executeList(); + System.out.println("name: "+result.get(0).getFirstName()); + } +} diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/Person.java b/libraries/src/main/java/com/baeldung/jdo/xml/Person.java new file mode 100644 index 0000000000..e3ec5c6bab --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jdo/xml/Person.java @@ -0,0 +1,65 @@ +package com.baeldung.jdo.xml; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.jdo.annotations.Element; +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.PrimaryKey; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; + + +@PersistenceCapable +public class Person { + private long personNum; + + @PrimaryKey + private String firstName; + private String lastName; + + private List phoneNumbers = new ArrayList(); + + public Person(long personNum, String firstName, String lastName) { + super(); + this.personNum = personNum; + this.firstName = firstName; + this.lastName = lastName; + } + + public long getPersonNum() { + return personNum; + } + + public void setPersonNum(long personNum) { + this.personNum = personNum; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public List getPhoneNumbers() { + return phoneNumbers; + } + + public void setPhoneNumbers(List phoneNumbers) { + this.phoneNumbers = phoneNumbers; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jdo/xml/Product.java b/libraries/src/main/java/com/baeldung/jdo/xml/Product.java new file mode 100644 index 0000000000..d8d3bb17b2 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jdo/xml/Product.java @@ -0,0 +1,58 @@ +package com.baeldung.jdo.xml; + +import javax.jdo.annotations.IdGeneratorStrategy; +import javax.jdo.annotations.PersistenceAware; +import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.Persistent; +import javax.jdo.annotations.PrimaryKey; + +@PersistenceCapable +public class Product { + + @PrimaryKey + String id; + String name; + String description; + double price; + + public Product(){ + + } + + public Product(String id,String name,String description,double price){ + this.id = id; + this.name=name; + this.description = description; + this.price = price; + } + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public double getPrice() { + return price; + } + public void setPrice(double price) { + this.price = price; + } + + +} diff --git a/libraries/src/main/java/com/baeldung/jira/JiraClient.java b/libraries/src/main/java/com/baeldung/jira/JiraClient.java deleted file mode 100644 index 26df21c8a9..0000000000 --- a/libraries/src/main/java/com/baeldung/jira/JiraClient.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.jira; - -import com.atlassian.jira.rest.client.api.JiraRestClient; -import com.atlassian.jira.rest.client.api.JiraRestClientFactory; -import com.atlassian.jira.rest.client.api.domain.Issue; -import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; - -public class JiraClient { - - private static final String USERNAME = "jira.user"; - private static final String PASSWORD = "secret"; - private static final String JIRA_URL = "http://jira.company.com"; - - public static void main(String[] args) { - - final Issue issue = new JiraClient().getIssue("MYKEY-1234"); - System.out.println(issue.getDescription()); - } - - private Issue getIssue(String issueKey) { - JiraRestClient restClient = getJiraRestClient(); - Issue issue = restClient.getIssueClient().getIssue(issueKey).claim(); - - closeRestClient(restClient); - return issue; - } - - private JiraRestClient getJiraRestClient() { - JiraRestClientFactory factory = new AsynchronousJiraRestClientFactory(); - - URI jiraServerUri = getJiraUri(); - return factory - .createWithBasicHttpAuthentication(jiraServerUri, USERNAME, PASSWORD); - } - - private URI getJiraUri() { - URI jiraServerUri = null; - try { - jiraServerUri = new URI(JIRA_URL); - } catch (URISyntaxException e) { - e.printStackTrace(); - } - return jiraServerUri; - } - - private void closeRestClient(JiraRestClient restClient) { - try { - restClient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/libraries/src/main/java/com/baeldung/jira/MyJiraClient.java b/libraries/src/main/java/com/baeldung/jira/MyJiraClient.java new file mode 100644 index 0000000000..ea1d73f52a --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jira/MyJiraClient.java @@ -0,0 +1,103 @@ +package com.baeldung.jira; + +import com.atlassian.jira.rest.client.api.IssueRestClient; +import com.atlassian.jira.rest.client.api.JiraRestClient; +import com.atlassian.jira.rest.client.api.domain.BasicVotes; +import com.atlassian.jira.rest.client.api.domain.Comment; +import com.atlassian.jira.rest.client.api.domain.Issue; +import com.atlassian.jira.rest.client.api.domain.input.IssueInput; +import com.atlassian.jira.rest.client.api.domain.input.IssueInputBuilder; +import com.atlassian.jira.rest.client.internal.async.AsynchronousJiraRestClientFactory; + +import java.io.IOException; +import java.net.URI; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class MyJiraClient { + + private String username; + private String password; + private String jiraUrl; + private JiraRestClient restClient; + + private MyJiraClient(String username, String password, String jiraUrl) { + this.username = username; + this.password = password; + this.jiraUrl = jiraUrl; + this.restClient = getJiraRestClient(); + } + + public static void main(String[] args) throws IOException { + + MyJiraClient myJiraClient = new MyJiraClient("user.name", "pass", "http://jira.company.com"); + + final String issueKey = myJiraClient.createIssue("ABCD", 1L, "Issue created from JRJC"); + myJiraClient.updateIssueDescription(issueKey, "This is description from my Jira Client"); + Issue issue = myJiraClient.getIssue(issueKey); + System.out.println(issue.getDescription()); + + myJiraClient.voteForAnIssue(issue); + + System.out.println(myJiraClient.getTotalVotesCount(issueKey)); + + myJiraClient.addComment(issue, "This is comment from my Jira Client"); + + List comments = myJiraClient.getAllComments(issueKey); + comments.forEach(c -> System.out.println(c.getBody())); + + myJiraClient.deleteIssue(issueKey, true); + + myJiraClient.restClient.close(); + } + + private String createIssue(String projectKey, Long issueType, String issueSummary) { + + IssueRestClient issueClient = restClient.getIssueClient(); + + IssueInput newIssue = new IssueInputBuilder(projectKey, issueType, issueSummary).build(); + + return issueClient.createIssue(newIssue).claim().getKey(); + } + + private Issue getIssue(String issueKey) { + return restClient.getIssueClient().getIssue(issueKey).claim(); + } + + private void voteForAnIssue(Issue issue) { + restClient.getIssueClient().vote(issue.getVotesUri()).claim(); + } + + private int getTotalVotesCount(String issueKey) { + BasicVotes votes = getIssue(issueKey).getVotes(); + return votes == null ? 0 : votes.getVotes(); + } + + private void addComment(Issue issue, String commentBody) { + restClient.getIssueClient().addComment(issue.getCommentsUri(), Comment.valueOf(commentBody)); + } + + private List getAllComments(String issueKey) { + return StreamSupport.stream(getIssue(issueKey).getComments().spliterator(), false) + .collect(Collectors.toList()); + } + + private void updateIssueDescription(String issueKey, String newDescription) { + IssueInput input = new IssueInputBuilder().setDescription(newDescription).build(); + restClient.getIssueClient().updateIssue(issueKey, input).claim(); + } + + private void deleteIssue(String issueKey, boolean deleteSubtasks) { + restClient.getIssueClient().deleteIssue(issueKey, deleteSubtasks).claim(); + } + + private JiraRestClient getJiraRestClient() { + return new AsynchronousJiraRestClientFactory() + .createWithBasicHttpAuthentication(getJiraUri(), this.username, this.password); + } + + private URI getJiraUri() { + return URI.create(this.jiraUrl); + } +} diff --git a/libraries/src/main/resources/META-INF/datanucleus.properties b/libraries/src/main/resources/META-INF/datanucleus.properties new file mode 100644 index 0000000000..a3cd4a450a --- /dev/null +++ b/libraries/src/main/resources/META-INF/datanucleus.properties @@ -0,0 +1,4 @@ +javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.api.jdo.JDOPersistenceManagerFactory +javax.jdo.option.ConnectionURL= xml:file:myfile-ds.xml +datanucleus.xml.indentSize=6 +datanucleus.schema.autoCreateAll=true \ No newline at end of file diff --git a/libraries/src/main/resources/META-INF/jdoconfig.xml b/libraries/src/main/resources/META-INF/jdoconfig.xml new file mode 100644 index 0000000000..77da460686 --- /dev/null +++ b/libraries/src/main/resources/META-INF/jdoconfig.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/src/main/resources/META-INF/package.jdo b/libraries/src/main/resources/META-INF/package.jdo new file mode 100644 index 0000000000..d30207e2e0 --- /dev/null +++ b/libraries/src/main/resources/META-INF/package.jdo @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/src/main/resources/image.jpg b/libraries/src/main/resources/image.jpg new file mode 100644 index 0000000000..e2554a0d9c Binary files /dev/null and b/libraries/src/main/resources/image.jpg differ diff --git a/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java b/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java index 4ce250d979..55fadcbf85 100644 --- a/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java +++ b/libraries/src/test/java/com/baeldung/commons/collections4/BagTests.java @@ -1,85 +1,111 @@ package com.baeldung.commons.collections4; -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.collections4.Bag; -import org.apache.commons.collections4.bag.CollectionBag; -import org.apache.commons.collections4.bag.HashBag; -import org.apache.commons.collections4.bag.TreeBag; -import org.junit.Assert; -import org.junit.Before; +import org.apache.commons.collections4.SortedBag; +import org.apache.commons.collections4.bag.*; import org.junit.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; + public class BagTests { - - Bag baseBag; - TreeBag treeBag; - - @Before - public void before() { - baseBag = new HashBag(); - treeBag = new TreeBag(); - treeBag = new TreeBag(); - } - - @Test - public void whenAdd_thenRemoveFromBaseBag_thenContainsCorrect() { - baseBag.add("apple", 2); - baseBag.add("lemon", 6); - baseBag.add("lime"); - - baseBag.remove("lemon"); - Assert.assertEquals(3, baseBag.size()); - Assert.assertFalse(baseBag.contains("lemon")); - - Assert.assertTrue(baseBag.uniqueSet().contains("apple")); - - List containList = new ArrayList(); - containList.add("apple"); - containList.add("lemon"); - containList.add("lime"); - Assert.assertFalse(baseBag.containsAll(containList)); - } - - @Test - public void whenAdd_thenRemoveFromBaseCollectionBag_thenContainsCorrect() { - baseBag.add("apple", 2); - baseBag.add("lemon", 6); - baseBag.add("lime"); - - CollectionBag baseCollectionBag = new CollectionBag( - baseBag); - - baseCollectionBag.remove("lemon"); - Assert.assertEquals(8, baseCollectionBag.size()); - Assert.assertTrue(baseCollectionBag.contains("lemon")); - - baseCollectionBag.remove("lemon",1); - Assert.assertEquals(7, baseCollectionBag.size()); - - Assert.assertTrue(baseBag.uniqueSet().contains("apple")); - - List containList = new ArrayList(); - containList.add("apple"); - containList.add("lemon"); - containList.add("lime"); - Assert.assertTrue(baseBag.containsAll(containList)); - } - - @Test - public void whenAddtoTreeBag_thenRemove_thenContainsCorrect() { - treeBag.add("banana", 8); - treeBag.add("apple", 2); - treeBag.add("lime"); - - Assert.assertEquals(11, treeBag.size()); - Assert.assertEquals("apple", treeBag.first()); - Assert.assertEquals("lime", treeBag.last()); - - treeBag.remove("apple"); - Assert.assertEquals(9, treeBag.size()); - Assert.assertEquals("banana", treeBag.first()); - - } + + @Test + public void givenMultipleCopies_whenAdded_theCountIsKept() { + Bag bag = new HashBag<>( + Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 })); + + assertThat(bag.getCount(1), equalTo(2)); + } + + @Test + public void givenBag_whenBagAddAPILikeCollectionAPI_thenFalse() { + Collection collection = new ArrayList<>(); + + // Collection contract defines that add() should return true + assertThat(collection.add(9), is(true)); + + // Even when element is already in the collection + collection.add(1); + assertThat(collection.add(1), is(true)); + + Bag bag = new HashBag<>(); + + // Bag returns true on adding a new element + assertThat(bag.add(9), is(true)); + + bag.add(1); + // But breaks the contract with false when it has to increment the count + assertThat(bag.add(1), is(not(true))); + } + + @Test + public void givenDecoratedBag_whenBagAddAPILikeCollectionAPI_thenTrue() { + Bag bag = CollectionBag.collectionBag(new HashBag<>()); + + bag.add(1); + // This time the behavior is compliant to the Java Collection + assertThat(bag.add(1), is((true))); + } + + @Test + public void givenAdd_whenCountOfElementsDefined_thenCountAreAdded() { + Bag bag = new HashBag<>(); + + // Adding 1 for 5 times + bag.add(1, 5); + assertThat(bag.getCount(1), equalTo(5)); + } + + @Test + public void givenMultipleCopies_whenRemove_allAreRemoved() { + Bag bag = new HashBag<>( + Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 })); + + // From 3 we delete 1, 2 remain + bag.remove(3, 1); + assertThat(bag.getCount(3), equalTo(2)); + + // From 2 we delete all + bag.remove(1); + assertThat(bag.getCount(1), equalTo(0)); + } + + @Test + public void givenTree_whenDuplicateElementsAdded_thenSort() { + TreeBag bag = new TreeBag<>( + Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 })); + + assertThat(bag.first(), equalTo(1)); + assertThat(bag.getCount(bag.first()), equalTo(2)); + assertThat(bag.last(), equalTo(7)); + assertThat(bag.getCount(bag.last()), equalTo(3)); + } + + @Test + public void givenDecoratedTree_whenTreeAddAPILikeCollectionAPI_thenTrue() { + SortedBag bag = CollectionSortedBag + .collectionSortedBag(new TreeBag<>()); + + bag.add(1); + assertThat(bag.add(1), is((true))); + } + + @Test + public void givenSortedBag_whenDuplicateElementsAdded_thenSort() { + SynchronizedSortedBag bag = SynchronizedSortedBag + .synchronizedSortedBag(new TreeBag<>( + Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 }))); + + assertThat(bag.first(), equalTo(1)); + assertThat(bag.getCount(bag.first()), equalTo(2)); + assertThat(bag.last(), equalTo(7)); + assertThat(bag.getCount(bag.last()), equalTo(3)); + } } diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java index af70ccecc7..29bcebeb2b 100644 --- a/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java +++ b/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsTest.java @@ -3,7 +3,9 @@ package com.baeldung.commons.lang3; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -20,6 +22,7 @@ import org.apache.commons.lang3.ArchUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.arch.Processor; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.apache.commons.lang3.concurrent.ConcurrentException; import org.apache.commons.lang3.concurrent.ConcurrentRuntimeException; import org.apache.commons.lang3.concurrent.ConcurrentUtils; @@ -133,4 +136,14 @@ public class Lang3UtilsTest { assertEquals(sampleObjectOne, sampleObjectTwo); } + @Test + public void testBuildDefaults() { + BasicThreadFactory.Builder builder = new BasicThreadFactory.Builder(); + BasicThreadFactory factory = builder.build(); + assertNull("No naming pattern set Yet", factory.getNamingPattern()); + BasicThreadFactory factory2 = builder.namingPattern("sampleNamingPattern").daemon(true).priority(Thread.MIN_PRIORITY).build(); + assertNotNull("Got a naming pattern", factory2.getNamingPattern()); + assertEquals("sampleNamingPattern", factory2.getNamingPattern()); + + } } diff --git a/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java b/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java new file mode 100644 index 0000000000..8309e755ce --- /dev/null +++ b/libraries/src/test/java/com/baeldung/crdt/CRDTTest.java @@ -0,0 +1,153 @@ +package com.baeldung.crdt; + +import com.netopyr.wurmloch.crdt.GCounter; +import com.netopyr.wurmloch.crdt.GSet; +import com.netopyr.wurmloch.crdt.LWWRegister; +import com.netopyr.wurmloch.crdt.PNCounter; +import com.netopyr.wurmloch.store.LocalCrdtStore; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CRDTTest { + + @Test + public void givenGrowOnlySet_whenTwoReplicasDiverge_thenShouldMergeItWithoutAConflict() { + //given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); + crdtStore1.connect(crdtStore2); + + final GSet replica1 = crdtStore1.createGSet("ID_1"); + final GSet replica2 = crdtStore2.findGSet("ID_1").get(); + + //when + replica1.add("apple"); + replica2.add("banana"); + + //then + assertThat(replica1).contains("apple", "banana"); + assertThat(replica2).contains("apple", "banana"); + + //when + crdtStore1.disconnect(crdtStore2); + + replica1.add("strawberry"); + replica2.add("pear"); + + + assertThat(replica1).contains("apple", "banana", "strawberry"); + assertThat(replica2).contains("apple", "banana", "pear"); + + crdtStore1.connect(crdtStore2); + + //then + assertThat(replica1).contains("apple", "banana", "strawberry", "pear"); + assertThat(replica2).contains("apple", "banana", "strawberry", "pear"); + } + + @Test + public void givenIncrementOnlyCounter_whenTwoReplicasDiverge_thenShouldMergeIt() { + //given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); + crdtStore1.connect(crdtStore2); + + final GCounter replica1 = crdtStore1.createGCounter("ID_1"); + final GCounter replica2 = crdtStore2.findGCounter("ID_1").get(); + + //when + replica1.increment(); + replica2.increment(2L); + + //then + assertThat(replica1.get()).isEqualTo(3L); + assertThat(replica2.get()).isEqualTo(3L); + + //when + crdtStore1.disconnect(crdtStore2); + + replica1.increment(3L); + replica2.increment(5L); + + + assertThat(replica1.get()).isEqualTo(6L); + assertThat(replica2.get()).isEqualTo(8L); + + crdtStore1.connect(crdtStore2); + + // then + assertThat(replica1.get()).isEqualTo(11L); + assertThat(replica2.get()).isEqualTo(11L); + } + + @Test + public void givenPNCounter_whenReplicasDiverge_thenShouldMergeWithoutAConflict() { + // given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore(); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore(); + crdtStore1.connect(crdtStore2); + + final PNCounter replica1 = crdtStore1.createPNCounter("ID_1"); + final PNCounter replica2 = crdtStore2.findPNCounter("ID_1").get(); + + //when + replica1.increment(); + replica2.decrement(2L); + + //then + assertThat(replica1.get()).isEqualTo(-1L); + assertThat(replica2.get()).isEqualTo(-1L); + + //when + crdtStore1.disconnect(crdtStore2); + + replica1.decrement(3L); + replica2.increment(5L); + + assertThat(replica1.get()).isEqualTo(-4L); + assertThat(replica2.get()).isEqualTo(4L); + + crdtStore1.connect(crdtStore2); + + //then + assertThat(replica1.get()).isEqualTo(1L); + assertThat(replica2.get()).isEqualTo(1L); + } + + @Test + public void givenLastWriteWinsStrategy_whenReplicasDiverge_thenAfterMergeShouldKeepOnlyLastValue() { + //given + final LocalCrdtStore crdtStore1 = new LocalCrdtStore("N_1"); + final LocalCrdtStore crdtStore2 = new LocalCrdtStore("N_2"); + crdtStore1.connect(crdtStore2); + + final LWWRegister replica1 = crdtStore1.createLWWRegister("ID_1"); + final LWWRegister replica2 = crdtStore2.findLWWRegister("ID_1").get(); + + //when + replica1.set("apple"); + replica2.set("banana"); + + // then + assertThat(replica1.get()).isEqualTo("banana"); + assertThat(replica2.get()).isEqualTo("banana"); + + + // when + crdtStore1.disconnect(crdtStore2); + + replica1.set("strawberry"); + replica2.set("pear"); + + + assertThat(replica1.get()).isEqualTo("strawberry"); + assertThat(replica2.get()).isEqualTo("pear"); + + crdtStore1.connect(crdtStore2); + + //then + assertThat(replica1.get()).isEqualTo("pear"); + assertThat(replica2.get()).isEqualTo("pear"); + } +} diff --git a/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteTest.java b/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteTest.java new file mode 100644 index 0000000000..7c3f779931 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/docx/Docx4jReadAndWriteTest.java @@ -0,0 +1,19 @@ +package com.baeldung.docx; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class Docx4jReadAndWriteTest { + + private static final String imagePath = "src/main/resources/image.jpg"; + private static final String outputPath = "helloWorld.docx"; + + @Test + public void givenWordPackage_whenTextExist_thenReturnTrue() throws Exception { + Docx4jExample docx4j = new Docx4jExample(); + docx4j.createDocumentPackage(outputPath, imagePath); + assertTrue(docx4j.isTextExist("Hello World!")); + assertTrue(!docx4j.isTextExist("InexistantText")); + } +} diff --git a/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java b/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java index 151bcc78a2..28d4f57e77 100644 --- a/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java +++ b/libraries/src/test/java/com/baeldung/jetty/JettyIntegrationTest.java @@ -7,7 +7,9 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import java.nio.charset.StandardCharsets; @@ -15,17 +17,16 @@ import java.nio.charset.StandardCharsets; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; public class JettyIntegrationTest { - private JettyServer jettyServer; + private static JettyServer jettyServer; - @Before - public void setup() throws Exception { + @BeforeClass + public static void setup() throws Exception { jettyServer = new JettyServer(); jettyServer.start(); } - @After - public void cleanup() throws Exception { - Thread.sleep(2000); + @AfterClass + public static void cleanup() throws Exception { jettyServer.stop(); } diff --git a/mockito/README.md b/mockito/README.md index 6de2fb0c7a..2407a5c3c5 100644 --- a/mockito/README.md +++ b/mockito/README.md @@ -10,3 +10,4 @@ - [Mockito – @Mock, @Spy, @Captor and @InjectMocks](http://www.baeldung.com/mockito-annotations) - [Mockito’s Mock Methods](http://www.baeldung.com/mockito-mock-methods) - [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock) +- [Mocking Exception Throwing using Mockito](http://www.baeldung.com/mockito-exceptions) diff --git a/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java b/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java new file mode 100644 index 0000000000..9a25ccb28c --- /dev/null +++ b/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java @@ -0,0 +1,57 @@ +package org.baeldung.mockito; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.mockito.Mockito; + +public class MockitoExceptionIntegrationTest { + + @Test(expected = NullPointerException.class) + public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class); + + dictMock.getMeaning("word"); + } + + @Test(expected = IllegalStateException.class) + public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + doThrow(IllegalStateException.class).when(dictMock) + .add(anyString(), anyString()); + + dictMock.add("word", "meaning"); + } + + @Test(expected = NullPointerException.class) + public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred")); + + dictMock.getMeaning("word"); + } + + @Test(expected = IllegalStateException.class) + public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + doThrow(new IllegalStateException("Error occurred")).when(dictMock) + .add(anyString(), anyString()); + + dictMock.add("word", "meaning"); + } + + // ===== + + @Test(expected = NullPointerException.class) + public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dict = new MyDictionary(); + MyDictionary spy = Mockito.spy(dict); + + when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class); + spy.getMeaning("word"); + } +} diff --git a/pom.xml b/pom.xml index dd0871ae79..c3915e4fce 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ + atomix apache-cayenne aws akka-streams @@ -247,6 +248,7 @@ mockserver undertow vertx-and-rxjava + deeplearning4j diff --git a/rxjava/pom.xml b/rxjava/pom.xml index 96d49e0d3c..783833243b 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -3,7 +3,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung rxjava 1.0-SNAPSHOT diff --git a/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java b/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java index 08fccfb238..3d3bb021d2 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/ObservableTest.java @@ -8,7 +8,7 @@ import static junit.framework.Assert.assertTrue; public class ObservableTest { - String result = ""; + private String result = ""; @Test public void givenString_whenJustAndSubscribe_thenEmitsSingleItem() { @@ -85,7 +85,7 @@ public class ObservableTest { .groupBy(i -> 0 == (i % 2) ? "EVEN" : "ODD") .subscribe(group -> group.subscribe((number) -> { - if (group.getKey().toString().equals("EVEN")) { + if (group.getKey().equals("EVEN")) { EVEN[0] += number; } else { ODD[0] += number; @@ -141,5 +141,4 @@ public class ObservableTest { assertTrue(sum[0] == 10); } - } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/ResourceManagementTest.java b/rxjava/src/test/java/com/baeldung/rxjava/ResourceManagementTest.java index 9c52af61d0..81be84fd0d 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/ResourceManagementTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/ResourceManagementTest.java @@ -12,16 +12,12 @@ public class ResourceManagementTest { String[] result = {""}; Observable values = Observable.using( - () -> { - return "MyResource"; - }, - r -> { - return Observable.create(o -> { - for (Character c : r.toCharArray()) - o.onNext(c); - o.onCompleted(); - }); - }, + () -> "MyResource", + r -> Observable.create(o -> { + for (Character c : r.toCharArray()) + o.onNext(c); + o.onCompleted(); + }), r -> System.out.println("Disposed: " + r) ); diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureLongRunningUnitTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureLongRunningUnitTest.java index 458091fd1c..e9dbb48b92 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureLongRunningUnitTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaBackpressureLongRunningUnitTest.java @@ -27,7 +27,6 @@ public class RxJavaBackpressureLongRunningUnitTest { // then testSubscriber.awaitTerminalEvent(); assertTrue(testSubscriber.getOnErrorEvents().size() == 0); - } @Test @@ -60,7 +59,6 @@ public class RxJavaBackpressureLongRunningUnitTest { // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); assertTrue(testSubscriber.getOnErrorEvents().size() == 0); - } @Test @@ -77,7 +75,6 @@ public class RxJavaBackpressureLongRunningUnitTest { // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); assertTrue(testSubscriber.getOnErrorEvents().size() == 0); - } @Test @@ -88,15 +85,14 @@ public class RxJavaBackpressureLongRunningUnitTest { // when source.sample(100, TimeUnit.MILLISECONDS) - // .throttleFirst(100, TimeUnit.MILLISECONDS) - .observeOn(Schedulers.computation()).subscribe(testSubscriber); + // .throttleFirst(100, TimeUnit.MILLISECONDS) + .observeOn(Schedulers.computation()).subscribe(testSubscriber); IntStream.range(0, 1_000).forEach(source::onNext); // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); assertTrue(testSubscriber.getOnErrorEvents().size() == 0); - } @Test @@ -111,7 +107,6 @@ public class RxJavaBackpressureLongRunningUnitTest { // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); assertTrue(testSubscriber.getOnErrorEvents().size() == 0); - } @Test @@ -120,11 +115,11 @@ public class RxJavaBackpressureLongRunningUnitTest { TestSubscriber testSubscriber = new TestSubscriber<>(); // when - Observable.range(1, 1_000_000).onBackpressureDrop().observeOn(Schedulers.computation()).subscribe(testSubscriber); + Observable.range(1, 1_000_000).onBackpressureDrop().observeOn(Schedulers.computation()) + .subscribe(testSubscriber); // then testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS); assertTrue(testSubscriber.getOnErrorEvents().size() == 0); - } } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java index a49103196c..bba891da88 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaCustomOperatorUnitTest.java @@ -1,5 +1,15 @@ package com.baeldung.rxjava; +import org.junit.Test; +import rx.Observable; +import rx.Observable.Operator; +import rx.Observable.Transformer; +import rx.Subscriber; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import static com.baelding.rxjava.operator.ToCleanString.toCleanString; import static com.baelding.rxjava.operator.ToLength.toLength; import static org.hamcrest.Matchers.hasItems; @@ -7,20 +17,6 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.junit.Test; - -import rx.Observable; -import rx.Observable.Operator; -import rx.Observable.Transformer; -import rx.Subscriber; - -import com.baelding.rxjava.operator.ToCleanString; -import com.baelding.rxjava.operator.ToLength; - public class RxJavaCustomOperatorUnitTest { @Test @@ -29,7 +25,7 @@ public class RxJavaCustomOperatorUnitTest { final List results = new ArrayList<>(); final Observable observable = Observable.from(list) - .lift(toCleanString()); + .lift(toCleanString()); // when observable.subscribe(results::add); @@ -46,7 +42,7 @@ public class RxJavaCustomOperatorUnitTest { final List results = new ArrayList<>(); final Observable observable = Observable.from(list) - .compose(toLength()); + .compose(toLength()); // when observable.subscribe(results::add); @@ -85,8 +81,8 @@ public class RxJavaCustomOperatorUnitTest { final List results = new ArrayList<>(); Observable.from(Arrays.asList("ap_p-l@e", "or-an?ge")) - .lift(cleanStringFn) - .subscribe(results::add); + .lift(cleanStringFn) + .subscribe(results::add); assertThat(results, notNullValue()); assertThat(results, hasSize(2)); @@ -99,8 +95,8 @@ public class RxJavaCustomOperatorUnitTest { final List results = new ArrayList<>(); Observable.from(Arrays.asList("apple", "orange")) - .compose(toLengthFn) - .subscribe(results::add); + .compose(toLengthFn) + .subscribe(results::add); assertThat(results, notNullValue()); assertThat(results, hasSize(2)); diff --git a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaUnitTest.java b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaUnitTest.java index 1e59b8c2d9..31ec473dc6 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/RxJavaUnitTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/RxJavaUnitTest.java @@ -10,7 +10,9 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; public class RxJavaUnitTest { @@ -19,7 +21,8 @@ public class RxJavaUnitTest { // given List letters = Arrays.asList("A", "B", "C", "D", "E"); List results = new ArrayList<>(); - Observable observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), (string, index) -> index + "-" + string); + Observable observable = Observable.from(letters) + .zipWith(Observable.range(1, Integer.MAX_VALUE), (string, index) -> index + "-" + string); // when observable.subscribe(results::add); @@ -36,7 +39,8 @@ public class RxJavaUnitTest { List letters = Arrays.asList("A", "B", "C", "D", "E"); TestSubscriber subscriber = new TestSubscriber<>(); - Observable observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)); + Observable observable = Observable.from(letters) + .zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)); // when observable.subscribe(subscriber); @@ -54,7 +58,9 @@ public class RxJavaUnitTest { List letters = Arrays.asList("A", "B", "C", "D", "E"); TestSubscriber subscriber = new TestSubscriber<>(); - Observable observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)).concatWith(Observable.error(new RuntimeException("error in Observable"))); + Observable observable = Observable.from(letters) + .zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)) + .concatWith(Observable.error(new RuntimeException("error in Observable"))); // when observable.subscribe(subscriber); diff --git a/rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java b/rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java index 1d36501fed..05b86e52b9 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/SchedulersTest.java @@ -1,9 +1,6 @@ package com.baeldung.rxjava; - import com.google.common.util.concurrent.ThreadFactoryBuilder; -import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; -import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; import rx.Observable; @@ -18,14 +15,16 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import static com.jayway.awaitility.Awaitility.await; import static java.util.concurrent.Executors.newFixedThreadPool; import static org.hamcrest.Matchers.hasItems; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; public class SchedulersTest { - String result = ""; - String result1 = ""; - String result2 = ""; + private String result = ""; + private String result1 = ""; + private String result2 = ""; @Test public void givenScheduledWorker_whenScheduleAnAction_thenResultAction() throws InterruptedException { @@ -33,7 +32,8 @@ public class SchedulersTest { Scheduler scheduler = Schedulers.immediate(); Scheduler.Worker worker = scheduler.createWorker(); worker.schedule(() -> result += "action"); - Assert.assertTrue(result.equals("action")); + + assertTrue(result.equals("action")); } @Test @@ -46,8 +46,9 @@ public class SchedulersTest { worker.unsubscribe(); }); worker.schedule(() -> result += "Second_Action"); - Thread.sleep(500); - Assert.assertTrue(result.equals("First_Action")); + + await() + .until(() -> assertTrue(result.equals("First_Action"))); } @Ignore //it's not safe, not every time is running correctly @@ -61,8 +62,9 @@ public class SchedulersTest { worker.schedule(() -> result += "_worker_"); result += "_End"; }); - Thread.sleep(2000); - Assert.assertTrue(result.equals("RxNewThreadScheduler-1_Start_End_worker_")); + + await() + .until(() -> assertTrue(result.equals("RxNewThreadScheduler-1_Start_End_worker_"))); } @Test @@ -77,9 +79,11 @@ public class SchedulersTest { .subscribe(s -> result1 += Thread.currentThread().getName() ); - Thread.sleep(500); - Assert.assertTrue(result1.equals("RxNewThreadScheduler-1")); - Assert.assertTrue(result2.equals("RxNewThreadScheduler-2")); + await() + .until(() -> { + assertTrue(result1.equals("RxNewThreadScheduler-1")); + assertTrue(result2.equals("RxNewThreadScheduler-2")); + }); } @Test @@ -92,8 +96,9 @@ public class SchedulersTest { worker.schedule(() -> result += "_worker_"); result += "_End"; }); - Thread.sleep(500); - Assert.assertTrue(result.equals("main_Start_worker__End")); + + await() + .until(() -> assertTrue(result.equals("main_Start_worker__End"))); } @Test @@ -104,10 +109,10 @@ public class SchedulersTest { .subscribe(s -> result += Thread.currentThread().getName() ); - Thread.sleep(500); - Assert.assertTrue(result.equals("main")); - } + await() + .until(() -> assertTrue(result.equals("main"))); + } @Test public void givenObservable_whenTrampolineScheduled_thenExecuteOnMainThread() throws InterruptedException { @@ -118,8 +123,9 @@ public class SchedulersTest { Observable.just(1, 3, 5, 7, 9) .subscribeOn(Schedulers.trampoline()) .subscribe(i -> result += "" + i); - Thread.sleep(500); - Assert.assertTrue(result.equals("246813579")); + + await() + .until(() -> assertTrue(result.equals("246813579"))); } @Test @@ -138,9 +144,9 @@ public class SchedulersTest { }); result += "_mainEnd"; }); - Thread.sleep(500); - Assert.assertTrue(result - .equals("mainStart_mainEnd_middleStart_middleEnd_worker_")); + + await() + .until(() -> assertTrue(result.equals("mainStart_mainEnd_middleStart_middleEnd_worker_"))); } private ThreadFactory threadFactory(String pattern) { @@ -161,7 +167,7 @@ public class SchedulersTest { subscriber.onNext("Alfa"); subscriber.onNext("Beta"); subscriber.onCompleted(); - });; + }); observable .subscribeOn(schedulerA) @@ -171,8 +177,9 @@ public class SchedulersTest { Throwable::printStackTrace, () -> result += "_Completed" ); - Thread.sleep(2000); - Assert.assertTrue(result.equals("Sched-A-0Alfa_Sched-A-0Beta__Completed")); + + await() + .until(() -> assertTrue(result.equals("Sched-A-0Alfa_Sched-A-0Beta__Completed"))); } @Test @@ -181,8 +188,9 @@ public class SchedulersTest { Observable.just("io") .subscribeOn(Schedulers.io()) .subscribe(i -> result += Thread.currentThread().getName()); - Thread.sleep(500); - Assert.assertTrue(result.equals("RxIoScheduler-2")); + + await() + .until(() -> assertTrue(result.equals("RxIoScheduler-2"))); } @Test @@ -191,8 +199,9 @@ public class SchedulersTest { Observable.just("computation") .subscribeOn(Schedulers.computation()) .subscribe(i -> result += Thread.currentThread().getName()); - Thread.sleep(500); - Assert.assertTrue(result.equals("RxComputationScheduler-1")); + + await() + .until(() -> assertTrue(result.equals("RxComputationScheduler-1"))); } @Test @@ -203,10 +212,10 @@ public class SchedulersTest { Observable tick = Observable.interval(1, TimeUnit.SECONDS, scheduler); - Observable.from(letters) - .zipWith(tick, (string, index) -> index + "-" + string) - .subscribeOn(scheduler) - .subscribe(subscriber); + Observable.from(letters) + .zipWith(tick, (string, index) -> index + "-" + string) + .subscribeOn(scheduler) + .subscribe(subscriber); subscriber.assertNoValues(); subscriber.assertNotCompleted(); @@ -229,10 +238,9 @@ public class SchedulersTest { Scheduler schedulerA = Schedulers.from(poolA); Observable.just('A', 'B') .delay(1, TimeUnit.SECONDS, schedulerA) - .subscribe(i -> result+= Thread.currentThread().getName() + i + " "); + .subscribe(i -> result += Thread.currentThread().getName() + i + " "); - Thread.sleep(2000); - Assert.assertTrue(result.equals("Sched1-A Sched1-B ")); + await() + .until(() -> assertTrue(result.equals("Sched1-A Sched1-B "))); } - } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/SingleTest.java b/rxjava/src/test/java/com/baeldung/rxjava/SingleTest.java index 6d428d856b..1352841ed9 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/SingleTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/SingleTest.java @@ -20,5 +20,4 @@ public class SingleTest { single.subscribe(); assertTrue(result[0].equals("Hello")); } - } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java b/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java index 429a7fe231..210ceaa636 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/SubjectTest.java @@ -9,7 +9,7 @@ import static junit.framework.Assert.assertTrue; public class SubjectTest { @Test - public void givenSubjectAndTwoSubscribers_whenSubscribeOnSubject_thenSubscriberBeginsToAdd(){ + public void givenSubjectAndTwoSubscribers_whenSubscribeOnSubject_thenSubscriberBeginsToAdd() { PublishSubject subject = PublishSubject.create(); subject.subscribe(SubjectImpl.getFirstObserver()); diff --git a/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java b/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java index 8ce370e356..0b38f0387b 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/UtilityOperatorsTest.java @@ -7,16 +7,18 @@ import rx.Observable; import rx.Observer; import rx.exceptions.OnErrorNotImplementedException; import rx.schedulers.Schedulers; +import rx.schedulers.Timestamped; import java.util.concurrent.TimeUnit; +import static com.jayway.awaitility.Awaitility.await; import static org.junit.Assert.assertTrue; public class UtilityOperatorsTest { - int emittedTotal = 0; - int receivedTotal = 0; - String result = ""; + private int emittedTotal = 0; + private int receivedTotal = 0; + private String result = ""; @Rule public ExpectedException thrown = ExpectedException.none(); @@ -39,12 +41,13 @@ public class UtilityOperatorsTest { + Thread.currentThread().getName()); }); - Thread.sleep(2000); - assertTrue(emittedTotal == 1500); - assertTrue(receivedTotal == 15000); + await().until(() -> { + assertTrue(emittedTotal == 1500); + assertTrue(receivedTotal == 15000); + } + ); } - @Test public void givenObservable_whenObserveOnBeforeOnNext_thenEmitsEventsOnComputeScheduler() throws InterruptedException { @@ -63,12 +66,12 @@ public class UtilityOperatorsTest { + Thread.currentThread().getName()); }); - Thread.sleep(2000); - assertTrue(emittedTotal == 1500); - assertTrue(receivedTotal == 15000); + await().until(() -> { + assertTrue(emittedTotal == 1500); + assertTrue(receivedTotal == 15000); + }); } - @Test public void givenObservable_whenSubscribeOn_thenEmitsEventsOnComputeScheduler() throws InterruptedException { @@ -87,12 +90,12 @@ public class UtilityOperatorsTest { + Thread.currentThread().getName()); }); - Thread.sleep(2000); - assertTrue(emittedTotal == 1500); - assertTrue(receivedTotal == 15000); + await().until(() -> { + assertTrue(emittedTotal == 1500); + assertTrue(receivedTotal == 15000); + }); } - @Test public void givenObservableWithOneEvent_whenSingle_thenEmitEvent() { @@ -197,15 +200,13 @@ public class UtilityOperatorsTest { @Test public void givenObservables_whenDelay_thenEventsStartAppearAfterATime() throws InterruptedException { - Observable source - = Observable.interval(1, TimeUnit.SECONDS) + Observable> source = Observable.interval(1, TimeUnit.SECONDS) .take(5) .timestamp(); - Observable delay - = source.delaySubscription(2, TimeUnit.SECONDS); + Observable> delay = source.delaySubscription(2, TimeUnit.SECONDS); - source.subscribe( + source.subscribe( value -> System.out.println("source :" + value), t -> System.out.println("source error"), () -> System.out.println("source completed")); @@ -214,7 +215,7 @@ public class UtilityOperatorsTest { value -> System.out.println("delay : " + value), t -> System.out.println("delay error"), () -> System.out.println("delay completed")); - Thread.sleep(8000); + //Thread.sleep(8000); } @Test @@ -231,14 +232,12 @@ public class UtilityOperatorsTest { Observable values = Observable.using( () -> "resource", - r -> { - return Observable.create(o -> { - for (Character c : r.toCharArray()) { - o.onNext(c); - } - o.onCompleted(); - }); - }, + r -> Observable.create(o -> { + for (Character c : r.toCharArray()) { + o.onNext(c); + } + o.onCompleted(); + }), r -> System.out.println("Disposed: " + r) ); values.subscribe( @@ -248,7 +247,6 @@ public class UtilityOperatorsTest { assertTrue(result.equals("resource")); } - @Test public void givenObservableCached_whenSubscribesWith2Actions_thenEmitsCachedValues() { @@ -269,5 +267,4 @@ public class UtilityOperatorsTest { }); assertTrue(receivedTotal == 8); } - } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassIntegrationTest.java similarity index 84% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassIntegrationTest.java index f44d4ac6b8..957b6a4543 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapClassIntegrationTest.java @@ -13,13 +13,13 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class AutomapClassTest { +public class AutomapClassIntegrationTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - Observable create = null; - Observable insert1, insert2 = null; + private Observable create = null; + private Observable insert1, insert2 = null; @Before public void setup() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceIntegrationTest.java similarity index 82% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceIntegrationTest.java index 79bae281eb..477a2a1cb8 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/AutomapInterfaceIntegrationTest.java @@ -13,13 +13,13 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class AutomapInterfaceTest { +public class AutomapInterfaceIntegrationTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - Observable create = null; - Observable insert1, insert2 = null; + private Observable create = null; + private Observable insert1, insert2 = null; @Before public void setup() { @@ -57,8 +57,7 @@ public class AutomapInterfaceTest { @After public void close() { db.update("DROP TABLE EMPLOYEE") - .dependsOn(create); + .dependsOn(create); connectionProvider.close(); } - } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java similarity index 86% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java index 7677b2375d..c2fb2c32e3 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/BasicQueryTypesIntegrationTest.java @@ -13,12 +13,12 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class BasicQueryTypesTest { +public class BasicQueryTypesIntegrationTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - Observable create, insert1, insert2, insert3, update, delete = null; + private Observable create, insert1, insert2, insert3, update, delete = null; @Test public void whenCreateTableAndInsertRecords_thenCorrect() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobIntegrationTest.java similarity index 84% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobIntegrationTest.java index fb3018ede4..71eeded21c 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertBlobIntegrationTest.java @@ -16,15 +16,15 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class InsertBlobTest { +public class InsertBlobIntegrationTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - String expectedDocument = null; - String actualDocument = null; + private String expectedDocument = null; + private String actualDocument = null; - Observable create, insert = null; + private Observable create, insert = null; @Before public void setup() throws IOException { @@ -62,4 +62,4 @@ public class InsertBlobTest { .dependsOn(create); connectionProvider.close(); } -} +} \ No newline at end of file diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobIntegrationTest.java similarity index 83% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobIntegrationTest.java index d29c2e3de2..189bca4adb 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/InsertClobIntegrationTest.java @@ -15,15 +15,15 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class InsertClobTest { +public class InsertClobIntegrationTest { - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); - String expectedDocument = null; - String actualDocument = null; + private String expectedDocument = null; + private String actualDocument = null; - Observable create, insert = null; + private Observable create, insert = null; @Before public void setup() throws IOException { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysIntegrationTest.java similarity index 79% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysIntegrationTest.java index 87604b6c5f..2018a9427c 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/ReturnKeysIntegrationTest.java @@ -11,13 +11,13 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class ReturnKeysTest { +public class ReturnKeysIntegrationTest { - Observable begin, commit = null; - Observable createStatement, insertStatement, updateStatement = null; + private Observable begin = null; + private Observable createStatement = null; - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); @Before public void setup() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionIntegrationTest.java similarity index 82% rename from rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java rename to rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionIntegrationTest.java index 9603a11c46..4e24d7f10e 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/jdbc/TransactionIntegrationTest.java @@ -10,13 +10,12 @@ import com.github.davidmoten.rx.jdbc.Database; import rx.Observable; -public class TransactionTest { +public class TransactionIntegrationTest { - Observable begin, commit = null; - Observable createStatement, insertStatement, updateStatement = null; + private Observable createStatement = null; - ConnectionProvider connectionProvider = Connector.connectionProvider; - Database db = Database.from(connectionProvider); + private ConnectionProvider connectionProvider = Connector.connectionProvider; + private Database db = Database.from(connectionProvider); @Test public void whenCommitTransaction_thenRecordUpdated() { diff --git a/rxjava/src/test/java/com/baeldung/rxjava/onerror/ExceptionHandlingTest.java b/rxjava/src/test/java/com/baeldung/rxjava/onerror/ExceptionHandlingTest.java index 297cfa980b..b1d711ab39 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/onerror/ExceptionHandlingTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/onerror/ExceptionHandlingTest.java @@ -9,9 +9,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertTrue; -/** - * @author aiet - */ public class ExceptionHandlingTest { private Error UNKNOWN_ERROR = new Error("unknown error"); @@ -19,10 +16,10 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenHandleOnErrorReturn_thenResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .onErrorReturn(Throwable::getMessage) .subscribe(testObserver); @@ -34,10 +31,10 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenHandleOnErrorResume_thenResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .onErrorResumeNext(Observable.just("one", "two")) .subscribe(testObserver); @@ -49,10 +46,10 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenHandleOnErrorResumeItem_thenResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .onErrorReturnItem("singleValue") .subscribe(testObserver); @@ -64,10 +61,10 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenHandleOnErrorResumeFunc_thenResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .onErrorResumeNext(throwable -> { return Observable.just(throwable.getMessage(), "nextValue"); }) @@ -81,11 +78,11 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenChangeStateOnError_thenErrorThrown() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); final AtomicBoolean state = new AtomicBoolean(false); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .doOnError(throwable -> state.set(true)) .subscribe(testObserver); @@ -97,10 +94,10 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenExceptionOccurOnError_thenCompositeExceptionThrown() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .doOnError(throwable -> { throw new RuntimeException("unexcepted"); }) @@ -113,10 +110,10 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndException_whenHandleOnException_thenResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Observable - .error(UNKNOWN_EXCEPTION) + .error(UNKNOWN_EXCEPTION) .onExceptionResumeNext(Observable.just("exceptionResumed")) .subscribe(testObserver); @@ -128,14 +125,14 @@ public class ExceptionHandlingTest { @Test public void givenSubscriberAndError_whenHandleOnException_thenNotResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); + Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .onExceptionResumeNext(Observable.just("exceptionResumed")) .subscribe(testObserver); testObserver.assertError(UNKNOWN_ERROR); testObserver.assertNotComplete(); } - } diff --git a/rxjava/src/test/java/com/baeldung/rxjava/onerror/OnErrorRetryTest.java b/rxjava/src/test/java/com/baeldung/rxjava/onerror/OnErrorRetryTest.java index 0f9c39ad1b..3cc72056ba 100644 --- a/rxjava/src/test/java/com/baeldung/rxjava/onerror/OnErrorRetryTest.java +++ b/rxjava/src/test/java/com/baeldung/rxjava/onerror/OnErrorRetryTest.java @@ -9,20 +9,17 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.junit.Assert.assertTrue; -/** - * @author aiet - */ public class OnErrorRetryTest { private Error UNKNOWN_ERROR = new Error("unknown error"); @Test public void givenSubscriberAndError_whenRetryOnError_thenRetryConfirmed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); AtomicInteger atomicCounter = new AtomicInteger(0); Observable - .error(() -> { + .error(() -> { atomicCounter.incrementAndGet(); return UNKNOWN_ERROR; }) @@ -37,12 +34,12 @@ public class OnErrorRetryTest { @Test public void givenSubscriberAndError_whenRetryConditionallyOnError_thenRetryConfirmed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); AtomicInteger atomicCounter = new AtomicInteger(0); Observable - .error(() -> { + .error(() -> { atomicCounter.incrementAndGet(); return UNKNOWN_ERROR; }) @@ -57,11 +54,11 @@ public class OnErrorRetryTest { @Test public void givenSubscriberAndError_whenRetryUntilOnError_thenRetryConfirmed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); AtomicInteger atomicCounter = new AtomicInteger(0); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .retryUntil(() -> atomicCounter.incrementAndGet() > 3) .subscribe(testObserver); @@ -73,12 +70,12 @@ public class OnErrorRetryTest { @Test public void givenSubscriberAndError_whenRetryWhenOnError_thenRetryConfirmed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); Exception noretryException = new Exception("don't retry"); Observable - .error(UNKNOWN_ERROR) - .retryWhen(throwableObservable -> Observable.error(noretryException)) + .error(UNKNOWN_ERROR) + .retryWhen(throwableObservable -> Observable.error(noretryException)) .subscribe(testObserver); testObserver.assertError(noretryException); @@ -88,11 +85,11 @@ public class OnErrorRetryTest { @Test public void givenSubscriberAndError_whenRetryWhenOnError_thenCompleted() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); AtomicInteger atomicCounter = new AtomicInteger(0); Observable - .error(() -> { + .error(() -> { atomicCounter.incrementAndGet(); return UNKNOWN_ERROR; }) @@ -107,11 +104,11 @@ public class OnErrorRetryTest { @Test public void givenSubscriberAndError_whenRetryWhenOnError_thenResubscribed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); AtomicInteger atomicCounter = new AtomicInteger(0); Observable - .error(() -> { + .error(() -> { atomicCounter.incrementAndGet(); return UNKNOWN_ERROR; }) @@ -126,11 +123,11 @@ public class OnErrorRetryTest { @Test public void givenSubscriberAndError_whenRetryWhenForMultipleTimesOnError_thenResumed() { - TestObserver testObserver = new TestObserver(); + TestObserver testObserver = new TestObserver<>(); long before = System.currentTimeMillis(); Observable - .error(UNKNOWN_ERROR) + .error(UNKNOWN_ERROR) .retryWhen(throwableObservable -> throwableObservable .zipWith(Observable.range(1, 3), (throwable, integer) -> integer) .flatMap(integer -> { diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 27dfec6939..7b7ddcba88 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.M1 + 2.0.0.M3 @@ -165,14 +165,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones @@ -183,14 +175,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones diff --git a/spring-5/pom.xml b/spring-5/pom.xml index b77d89b532..4dfede4dab 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 2.0.0.M1 + 2.0.0.M3 @@ -143,14 +143,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones @@ -161,14 +153,6 @@ - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - spring-milestones Spring Milestones @@ -183,10 +167,10 @@ UTF-8 UTF-8 1.8 - 1.0.0-M4 - 5.0.0-M4 + 1.0.0 + 5.0.0 2.20 - 5.0.0.RC2 + 5.0.0.RELEASE 1.0.1.RELEASE 1.1.3 1.0 diff --git a/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java b/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java index b7436c5ba7..2a6d04538c 100644 --- a/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java +++ b/spring-5/src/main/java/com/baeldung/functional/ExploreSpring5URLPatternUsingRouterFunctions.java @@ -33,7 +33,7 @@ public class ExploreSpring5URLPatternUsingRouterFunctions { WebServer start() throws Exception { WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) - .prependFilter(new IndexRewriteFilter()) + .filter(new IndexRewriteFilter()) .build(); Tomcat tomcat = new Tomcat(); diff --git a/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java b/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java index f181dcb8e8..402b607b19 100644 --- a/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java +++ b/spring-5/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java @@ -1,5 +1,17 @@ package com.baeldung.functional; +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletRegistrationBean; @@ -17,18 +29,9 @@ import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + import reactor.core.publisher.Flux; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.*; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - @SpringBootApplication @ComponentScan(basePackages = { "com.baeldung.functional" }) public class FunctionalSpringBootApplication { @@ -57,7 +60,7 @@ public class FunctionalSpringBootApplication { @Bean public ServletRegistrationBean servletRegistrationBean() throws Exception { HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction())) - .prependFilter(new IndexRewriteFilter()) + .filter(new IndexRewriteFilter()) .build(); ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new RootServlet(httpHandler), "/"); registrationBean.setLoadOnStartup(1); diff --git a/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java b/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java index 2a4642c484..5a7d70d3db 100644 --- a/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java +++ b/spring-5/src/main/java/com/baeldung/functional/FunctionalWebApplication.java @@ -1,5 +1,17 @@ package com.baeldung.functional; +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + import org.apache.catalina.Context; import org.apache.catalina.startup.Tomcat; import org.springframework.boot.web.embedded.tomcat.TomcatWebServer; @@ -12,18 +24,9 @@ import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + import reactor.core.publisher.Flux; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.*; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; - public class FunctionalWebApplication { private static final Actor BRAD_PITT = new Actor("Brad", "Pitt"); @@ -50,7 +53,7 @@ public class FunctionalWebApplication { WebServer start() throws Exception { WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction()); HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler) - .prependFilter(new IndexRewriteFilter()) + .filter(new IndexRewriteFilter()) .build(); Tomcat tomcat = new Tomcat(); diff --git a/spring-5/src/main/java/com/baeldung/functional/RootServlet.java b/spring-5/src/main/java/com/baeldung/functional/RootServlet.java index c0dd54cb4a..8fe24821de 100644 --- a/spring-5/src/main/java/com/baeldung/functional/RootServlet.java +++ b/spring-5/src/main/java/com/baeldung/functional/RootServlet.java @@ -1,5 +1,20 @@ package com.baeldung.functional; +import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; +import static org.springframework.web.reactive.function.BodyExtractors.toFormData; +import static org.springframework.web.reactive.function.BodyInserters.fromObject; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import static org.springframework.web.reactive.function.server.RequestPredicates.path; +import static org.springframework.web.reactive.function.server.RouterFunctions.route; +import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; +import static org.springframework.web.reactive.function.server.ServerResponse.ok; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicLong; + import org.springframework.core.io.ClassPathResource; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ServletHttpHandlerAdapter; @@ -7,29 +22,17 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; +import org.springframework.web.server.WebHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicLong; - -import static org.springframework.web.reactive.function.BodyExtractors.toDataBuffers; -import static org.springframework.web.reactive.function.BodyExtractors.toFormData; -import static org.springframework.web.reactive.function.BodyInserters.fromObject; -import static org.springframework.web.reactive.function.server.RequestPredicates.*; -import static org.springframework.web.reactive.function.server.RouterFunctions.route; -import static org.springframework.web.reactive.function.server.RouterFunctions.toHttpHandler; -import static org.springframework.web.reactive.function.server.ServerResponse.ok; -import org.springframework.web.server.WebHandler; - public class RootServlet extends ServletHttpHandlerAdapter { public RootServlet() { this(WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction())) - .prependFilter(new IndexRewriteFilter()) + .filter(new IndexRewriteFilter()) .build()); } diff --git a/spring-5/src/main/java/com/baeldung/jsonb/Person.java b/spring-5/src/main/java/com/baeldung/jsonb/Person.java index 99ebd54f0b..7a54b37574 100644 --- a/spring-5/src/main/java/com/baeldung/jsonb/Person.java +++ b/spring-5/src/main/java/com/baeldung/jsonb/Person.java @@ -10,6 +10,7 @@ import javax.json.bind.annotation.JsonbTransient; public class Person { + private int id; @JsonbProperty("person-name") private String name; @JsonbProperty(nillable = true) @@ -23,8 +24,9 @@ public class Person { public Person() { } - public Person(String name, String email, int age, LocalDate registeredDate, BigDecimal salary) { + public Person(int id, String name, String email, int age, LocalDate registeredDate, BigDecimal salary) { super(); + this.id = id; this.name = name; this.email = email; this.age = age; @@ -32,6 +34,14 @@ public class Person { this.salary = salary; } + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + public int getAge() { return age; } @@ -76,7 +86,9 @@ public class Person { @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("Person [name="); + builder.append("Person [id="); + builder.append(id); + builder.append(", name="); builder.append(name); builder.append(", email="); builder.append(email); @@ -94,11 +106,7 @@ public class Person { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + age; - result = prime * result + ((email == null) ? 0 : email.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((registeredDate == null) ? 0 : registeredDate.hashCode()); - result = prime * result + ((salary == null) ? 0 : salary.hashCode()); + result = prime * result + id; return result; } @@ -111,27 +119,7 @@ public class Person { if (getClass() != obj.getClass()) return false; Person other = (Person) obj; - if (age != other.age) - return false; - if (email == null) { - if (other.email != null) - return false; - } else if (!email.equals(other.email)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (registeredDate == null) { - if (other.registeredDate != null) - return false; - } else if (!registeredDate.equals(other.registeredDate)) - return false; - if (salary == null) { - if (other.salary != null) - return false; - } else if (!salary.equals(other.salary)) + if (id != other.id) return false; return true; } diff --git a/spring-5/src/main/java/com/baeldung/jsonb/PersonController.java b/spring-5/src/main/java/com/baeldung/jsonb/PersonController.java index 75fcd1e2cc..e216a282eb 100644 --- a/spring-5/src/main/java/com/baeldung/jsonb/PersonController.java +++ b/spring-5/src/main/java/com/baeldung/jsonb/PersonController.java @@ -26,12 +26,12 @@ public class PersonController { public void init() { // @formatter:off personRepository = new ArrayList<>(Arrays.asList( - new Person("Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), - new Person("Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), - new Person("Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), - new Person("Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), - new Person("Mark", "mark@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1200)), - new Person("Julia", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)))); + new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(2, "Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), + new Person(3, "Jhon", null, 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)), + new Person(4, "Tom", "tom@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)), + new Person(5, "Mark", "mark@test.com", 21, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1200)), + new Person(6, "Julia", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000)))); // @formatter:on } diff --git a/spring-5/src/main/java/com/baeldung/jupiter/SpringExtension.java b/spring-5/src/main/java/com/baeldung/jupiter/SpringExtension.java index 0eb7c861f1..7218d984ef 100644 --- a/spring-5/src/main/java/com/baeldung/jupiter/SpringExtension.java +++ b/spring-5/src/main/java/com/baeldung/jupiter/SpringExtension.java @@ -1,28 +1,36 @@ package com.baeldung.jupiter; -import org.junit.jupiter.api.extension.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.core.annotation.AnnotatedElementUtils; -import org.springframework.test.context.TestContextManager; -import org.springframework.util.Assert; - import java.lang.reflect.Constructor; import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.test.context.TestContextManager; +import org.springframework.util.Assert; + public class SpringExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, ParameterResolver { private static final ExtensionContext.Namespace namespace = ExtensionContext.Namespace.create(SpringExtension.class); @Override - public void beforeAll(ContainerExtensionContext context) throws Exception { + public void beforeAll(ExtensionContext context) throws Exception { getTestContextManager(context).beforeTestClass(); } @Override - public void afterAll(ContainerExtensionContext context) throws Exception { + public void afterAll(ExtensionContext context) throws Exception { try { getTestContextManager(context).afterTestClass(); } finally { @@ -38,7 +46,7 @@ public class SpringExtension implements BeforeAllCallback, AfterAllCallback, Tes } @Override - public void beforeEach(TestExtensionContext context) throws Exception { + public void beforeEach(ExtensionContext context) throws Exception { Object testInstance = context.getTestInstance(); Method testMethod = context.getTestMethod() .get(); @@ -46,24 +54,24 @@ public class SpringExtension implements BeforeAllCallback, AfterAllCallback, Tes } @Override - public void afterEach(TestExtensionContext context) throws Exception { + public void afterEach(ExtensionContext context) throws Exception { Object testInstance = context.getTestInstance(); Method testMethod = context.getTestMethod() .get(); - Throwable testException = context.getTestException() + Throwable testException = context.getExecutionException() .orElse(null); getTestContextManager(context).afterTestMethod(testInstance, testMethod, testException); } @Override - public boolean supports(ParameterContext parameterContext, ExtensionContext extensionContext) { + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { Parameter parameter = parameterContext.getParameter(); Executable executable = parameter.getDeclaringExecutable(); - return (executable instanceof Constructor && AnnotatedElementUtils.hasAnnotation(executable, Autowired.class)) || ParameterAutowireUtils.isAutowirable(parameter); + return ((executable instanceof Constructor) && AnnotatedElementUtils.hasAnnotation(executable, Autowired.class)) || ParameterAutowireUtils.isAutowirable(parameter); } @Override - public Object resolve(ParameterContext parameterContext, ExtensionContext extensionContext) { + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { Parameter parameter = parameterContext.getParameter(); Class testClass = extensionContext.getTestClass() .get(); diff --git a/spring-5/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java b/spring-5/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java index a31a16d610..756b303f3b 100644 --- a/spring-5/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/jsonb/JsonbIntegrationTest.java @@ -30,15 +30,14 @@ public class JsonbIntegrationTest { ResponseEntity response = template.withBasicAuth(username, password) .getForEntity("/person/1", Person.class); Person person = response.getBody(); - assertTrue(person.equals(new Person("Jhon", "jhon1@test.com", 0, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500.0)))); + assertTrue(person.equals(new Person(2, "Jhon", "jhon1@test.com", 0, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500.0)))); } @Test public void whenSendPostAPerson_thenGetOkStatus() { ResponseEntity response = template.withBasicAuth(username, password) - .postForEntity("/person", "{\"birthDate\":\"07-09-2017\",\"email\":\"jhon1@test.com\",\"person-name\":\"Jhon\"}", Boolean.class); - boolean value = response.getBody(); - assertTrue(true == value); + .postForEntity("/person", "{\"birthDate\":\"07-09-2017\",\"email\":\"jhon1@test.com\",\"person-name\":\"Jhon\",\"id\":10}", Boolean.class); + assertTrue(response.getBody()); } } diff --git a/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java b/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java index 7133999551..4caab86f7d 100644 --- a/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java +++ b/spring-5/src/test/java/com/baeldung/jsonb/JsonbTest.java @@ -22,15 +22,15 @@ public class JsonbTest { @Test public void givenPersonObject_whenSerializeWithJsonb_thenGetPersonJson() { - Person person = new Person("Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000)); + Person person = new Person(1, "Jhon", "jhon@test.com", 20, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000)); String jsonPerson = jsonb.toJson(person); - assertTrue("{\"email\":\"jhon@test.com\",\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"1000.0\"}".equals(jsonPerson)); + assertTrue("{\"email\":\"jhon@test.com\",\"id\":1,\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"1000.0\"}".equals(jsonPerson)); } @Test public void givenPersonJson_whenDeserializeWithJsonb_thenGetPersonObject() { - Person person = new Person("Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0)); - String jsonPerson = "{\"email\":\"jhon@test.com\",\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"1000.0\"}"; + Person person = new Person(1, "Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(1000.0)); + String jsonPerson = "{\"email\":\"jhon@test.com\",\"id\":1,\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"1000.0\"}"; assertTrue(jsonb.fromJson(jsonPerson, Person.class) .equals(person)); } diff --git a/spring-core/README.md b/spring-core/README.md index 237f8cd4e9..81a7aaa952 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -8,4 +8,3 @@ - [Spring YAML Configuration](http://www.baeldung.com/spring-yaml) - [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils) - [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults) - diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java index 2928ffe981..ec88d629a6 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/Event.java @@ -2,15 +2,9 @@ package com.baeldung.hibernate.immutable.entities; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; -import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Immutable; -import javax.persistence.Column; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; import java.util.Set; @Entity @@ -20,8 +14,6 @@ public class Event { @Id @Column(name = "event_id") - @GeneratedValue(generator = "increment") - @GenericGenerator(name = "increment", strategy = "increment") private Long id; @Column(name = "title") @@ -31,6 +23,14 @@ public class Event { @Immutable private Set guestList; + public Event() {} + + public Event(Long id, String title, Set guestList) { + this.id = id; + this.title = title; + this.guestList = guestList; + } + public Long getId() { return id; } diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java new file mode 100644 index 0000000000..33af9313ae --- /dev/null +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/entities/EventGeneratedId.java @@ -0,0 +1,55 @@ +package com.baeldung.hibernate.immutable.entities; + +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Immutable; + +import javax.persistence.*; + +@Entity +@Immutable +@Table(name = "events_generated") +public class EventGeneratedId { + + @Id + @Column(name = "event_generated_id") + @GeneratedValue(generator = "increment") + @GenericGenerator(name = "increment", strategy = "increment") + private Long id; + + @Column(name = "name") + private String name; + @Column(name = "description") + private String description; + + public EventGeneratedId() { + } + + public EventGeneratedId(String name, String description) { + this.name = name; + this.description = description; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} \ No newline at end of file diff --git a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java index e4a2319c37..722f0251d1 100644 --- a/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java +++ b/spring-hibernate5/src/main/java/com/baeldung/hibernate/immutable/util/HibernateUtil.java @@ -1,6 +1,7 @@ package com.baeldung.hibernate.immutable.util; import com.baeldung.hibernate.immutable.entities.Event; +import com.baeldung.hibernate.immutable.entities.EventGeneratedId; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; @@ -14,6 +15,7 @@ public class HibernateUtil { // Create a session factory from immutable.cfg.xml Configuration configuration = new Configuration(); configuration.addAnnotatedClass(Event.class); + configuration.addAnnotatedClass(EventGeneratedId.class); configuration.configure("immutable.cfg.xml"); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); return configuration.buildSessionFactory(serviceRegistry); diff --git a/spring-hibernate5/src/main/resources/hibernate5Config.xml b/spring-hibernate5/src/main/resources/hibernate5Config.xml index 55546a862a..bbb61cb3e0 100644 --- a/spring-hibernate5/src/main/resources/hibernate5Config.xml +++ b/spring-hibernate5/src/main/resources/hibernate5Config.xml @@ -21,7 +21,7 @@ - + diff --git a/spring-hibernate5/src/main/resources/persistence-h2.properties b/spring-hibernate5/src/main/resources/persistence-h2.properties index 537626bc2a..696e805cff 100644 --- a/spring-hibernate5/src/main/resources/persistence-h2.properties +++ b/spring-hibernate5/src/main/resources/persistence-h2.properties @@ -1,7 +1,7 @@ # jdbc.X jdbc.driverClassName=org.h2.Driver jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 -jdbc.user=sa +jdbc.eventGeneratedId=sa jdbc.pass=sa # hibernate.X diff --git a/spring-hibernate5/src/main/resources/persistence-mysql.properties b/spring-hibernate5/src/main/resources/persistence-mysql.properties index 1180929b30..b3cfd31f46 100644 --- a/spring-hibernate5/src/main/resources/persistence-mysql.properties +++ b/spring-hibernate5/src/main/resources/persistence-mysql.properties @@ -1,7 +1,7 @@ # jdbc.X jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate5_01?createDatabaseIfNotExist=true -jdbc.user=tutorialuser +jdbc.eventGeneratedId=tutorialuser jdbc.pass=tutorialmy5ql # hibernate.X diff --git a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java index 801ddcdb45..b8cc3dc1a6 100644 --- a/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java +++ b/spring-hibernate5/src/test/java/com/baeldung/hibernate/immutable/HibernateImmutableIntegrationTest.java @@ -1,6 +1,7 @@ package com.baeldung.hibernate.immutable; import com.baeldung.hibernate.immutable.entities.Event; +import com.baeldung.hibernate.immutable.entities.EventGeneratedId; import com.baeldung.hibernate.immutable.util.HibernateUtil; import com.google.common.collect.Sets; import org.hibernate.CacheMode; @@ -10,6 +11,9 @@ import org.junit.rules.ExpectedException; import javax.persistence.PersistenceException; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; + public class HibernateImmutableIntegrationTest { private static Session session; @@ -22,6 +26,7 @@ public class HibernateImmutableIntegrationTest { session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); createEvent(); + createEventGenerated(); session.setCacheMode(CacheMode.REFRESH); } @@ -35,9 +40,12 @@ public class HibernateImmutableIntegrationTest { HibernateUtil.getSessionFactory().close(); } + // + @Test public void addEvent() { Event event = new Event(); + event.setId(2L); event.setTitle("Public Event"); session.save(event); session.getTransaction().commit(); @@ -47,8 +55,12 @@ public class HibernateImmutableIntegrationTest { public void updateEvent() { Event event = (Event) session.createQuery("FROM Event WHERE title='New Event'").list().get(0); event.setTitle("Private Event"); - session.saveOrUpdate(event); - session.getTransaction().commit(); + session.update(event); + session.flush(); + session.refresh(event); + + assertThat(event.getTitle(), equalTo("New Event")); + assertThat(event.getId(), equalTo(5L)); } @Test @@ -80,10 +92,29 @@ public class HibernateImmutableIntegrationTest { session.getTransaction().commit(); } - public static void createEvent() { - Event event = new Event(); - event.setTitle("New Event"); - event.setGuestList(Sets.newHashSet("guest")); + @Test + public void updateEventGenerated() { + EventGeneratedId eventGeneratedId = (EventGeneratedId) session.createQuery("FROM EventGeneratedId WHERE name LIKE '%John%'").list().get(0); + eventGeneratedId.setName("Mike"); + session.update(eventGeneratedId); + session.flush(); + session.refresh(eventGeneratedId); + + assertThat(eventGeneratedId.getName(), equalTo("John")); + assertThat(eventGeneratedId.getId(), equalTo(1L)); + } + + // + + private static void createEvent() { + Event event = new Event(5L, "New Event", Sets.newHashSet("guest")); session.save(event); } + + private static void createEventGenerated() { + EventGeneratedId eventGeneratedId = new EventGeneratedId("John", "Doe"); + eventGeneratedId.setId(4L); + session.save(eventGeneratedId); + } + } diff --git a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestUnitTest.java b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java similarity index 97% rename from spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestUnitTest.java rename to spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java index c20f968704..33926d6200 100644 --- a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestUnitTest.java +++ b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java @@ -21,7 +21,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @RunWith(SpringRunner.class) @SpringBootTest(classes = MainApplication.class) -public class ExamplePostControllerRequestUnitTest { +public class ExamplePostControllerRequestIntegrationTest { MockMvc mockMvc; @Mock private ExampleService exampleService; diff --git a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseUnitTest.java b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java similarity index 97% rename from spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseUnitTest.java rename to spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java index 3d09622c47..5c5e5c0a64 100644 --- a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseUnitTest.java +++ b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java @@ -23,7 +23,7 @@ import org.baeldung.config.MainApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = MainApplication.class) -public class ExamplePostControllerResponseUnitTest { +public class ExamplePostControllerResponseIntegrationTest { MockMvc mockMvc; @Mock private ExampleService exampleService; diff --git a/spring-rest/src/test/java/com/baeldung/web/log/test/TestTaxiFareController.java b/spring-rest/src/test/java/com/baeldung/web/log/test/TestTaxiFareController.java deleted file mode 100644 index 398e3c04e9..0000000000 --- a/spring-rest/src/test/java/com/baeldung/web/log/test/TestTaxiFareController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.web.log.test; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; - -import org.junit.Test; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import com.baeldung.web.log.data.TaxiRide; - -public class TestTaxiFareController { - - private static final String URL = "http://localhost:" + 8082 + "/spring-rest/taxifare/"; - - @Test - public void givenRequest_whenFetchTaxiFareRateCard_thanOK() { - TestRestTemplate testRestTemplate = new TestRestTemplate(); - ResponseEntity response = testRestTemplate.getForEntity(URL + "get/", String.class); - - assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); - } - - @Test - public void givenTaxiRide_whenCalculatedFare_thanStatus200() { - TestRestTemplate testRestTemplate = new TestRestTemplate(); - TaxiRide taxiRide = new TaxiRide(true, 10l); - String fare = testRestTemplate.postForObject(URL + "calculate/", taxiRide, String.class); - - assertThat(fare, equalTo("200")); - } -} diff --git a/testing/src/main/java/com/baeldung/junit/Calculator.java b/testing/src/main/java/com/baeldung/junit/Calculator.java new file mode 100644 index 0000000000..8ea7b3ed1f --- /dev/null +++ b/testing/src/main/java/com/baeldung/junit/Calculator.java @@ -0,0 +1,11 @@ +package com.baeldung.junit; + +public class Calculator { + public int add(int a, int b) { + return a + b; + } + + public int sub(int a, int b) { + return a - b; + } +} diff --git a/testing/src/test/java/com/baeldung/junit/AdditionTest.java b/testing/src/test/java/com/baeldung/junit/AdditionTest.java new file mode 100644 index 0000000000..0d492f8058 --- /dev/null +++ b/testing/src/test/java/com/baeldung/junit/AdditionTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class AdditionTest { + Calculator calculator = new Calculator(); + + @Test + public void testAddition() { + assertEquals("addition", 8, calculator.add(5, 3)); + } +} diff --git a/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java new file mode 100644 index 0000000000..432d5cda83 --- /dev/null +++ b/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java @@ -0,0 +1,18 @@ +package com.baeldung.junit; + +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InitializationError; +import org.junit.runners.model.Statement; + +public class BlockingTestRunner extends BlockJUnit4ClassRunner { + public BlockingTestRunner(Class klass) throws InitializationError { + super(klass); + } + + @Override + protected Statement methodInvoker(FrameworkMethod method, Object test) { + System.out.println("invoking: " + method.getName()); + return super.methodInvoker(method, test); + } +} diff --git a/testing/src/test/java/com/baeldung/junit/CalculatorTest.java b/testing/src/test/java/com/baeldung/junit/CalculatorTest.java new file mode 100644 index 0000000000..d1b35d1442 --- /dev/null +++ b/testing/src/test/java/com/baeldung/junit/CalculatorTest.java @@ -0,0 +1,17 @@ +package com.baeldung.junit; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import static org.junit.Assert.assertEquals; + +@RunWith(JUnit4.class) +public class CalculatorTest { + Calculator calculator = new Calculator(); + + @Test + public void testAddition() { + assertEquals("addition", 8, calculator.add(5, 3)); + } +} diff --git a/testing/src/test/java/com/baeldung/junit/SubstractionTest.java b/testing/src/test/java/com/baeldung/junit/SubstractionTest.java new file mode 100644 index 0000000000..9650d83afe --- /dev/null +++ b/testing/src/test/java/com/baeldung/junit/SubstractionTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SubstractionTest { + Calculator calculator = new Calculator(); + + @Test + public void substraction() { + assertEquals("substraction", 2, calculator.sub(5, 3)); + } +} diff --git a/testing/src/test/java/com/baeldung/junit/SuiteTest.java b/testing/src/test/java/com/baeldung/junit/SuiteTest.java new file mode 100644 index 0000000000..428319e72e --- /dev/null +++ b/testing/src/test/java/com/baeldung/junit/SuiteTest.java @@ -0,0 +1,12 @@ +package com.baeldung.junit; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + AdditionTest.class, + SubstractionTest.class}) +public class SuiteTest { +} diff --git a/testing/src/test/java/com/baeldung/junit/TestRunner.java b/testing/src/test/java/com/baeldung/junit/TestRunner.java new file mode 100644 index 0000000000..9eb4b3141b --- /dev/null +++ b/testing/src/test/java/com/baeldung/junit/TestRunner.java @@ -0,0 +1,41 @@ +package com.baeldung.junit; + +import org.junit.Test; +import org.junit.runner.Description; +import org.junit.runner.Runner; +import org.junit.runner.notification.RunNotifier; + +import java.lang.reflect.Method; + +public class TestRunner extends Runner { + + private Class testClass; + public TestRunner(Class testClass) { + super(); + this.testClass = testClass; + } + + @Override + public Description getDescription() { + return Description.createTestDescription(testClass, "My runner description"); + } + + @Override + public void run(RunNotifier notifier) { + System.out.println("running the tests from MyRunner: " + testClass); + try { + Object testObject = testClass.newInstance(); + for (Method method : testClass.getMethods()) { + if (method.isAnnotationPresent(Test.class)) { + notifier.fireTestStarted(Description + .createTestDescription(testClass, method.getName())); + method.invoke(testObject); + notifier.fireTestFinished(Description + .createTestDescription(testClass, method.getName())); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/vavr/pom.xml b/vavr/pom.xml index 2efaf7fd8c..878430611b 100644 --- a/vavr/pom.xml +++ b/vavr/pom.xml @@ -5,12 +5,13 @@ vavr 1.0 vavr - + org.springframework.boot spring-boot-starter-parent - 2.0.0.BUILD-SNAPSHOT - + 1.5.6.RELEASE + + @@ -35,10 +36,11 @@ com.h2database h2 - + org.springframework.boot spring-boot-starter-test + test diff --git a/vavr/src/test/java/com/baeldung/vavr/repositories/VavrRepositoryIntegrationTest.java b/vavr/src/test/java/com/baeldung/vavr/repositories/VavrRepositoryIntegrationTest.java index 63338afc24..7c00d46aa8 100644 --- a/vavr/src/test/java/com/baeldung/vavr/repositories/VavrRepositoryIntegrationTest.java +++ b/vavr/src/test/java/com/baeldung/vavr/repositories/VavrRepositoryIntegrationTest.java @@ -43,5 +43,4 @@ public class VavrRepositoryIntegrationTest { Seq users = userRepository.findByName("John"); assertEquals(2, users.size()); } - }