Merge remote-tracking branch 'central/master'
This commit is contained in:
commit
6c0d731870
@ -34,6 +34,11 @@
|
|||||||
<artifactId>jenetics</artifactId>
|
<artifactId>jenetics</artifactId>
|
||||||
<version>3.7.0</version>
|
<version>3.7.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jgrapht</groupId>
|
||||||
|
<artifactId>jgrapht-core</artifactId>
|
||||||
|
<version>1.0.1</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -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<String, DefaultEdge> completeGraph;
|
||||||
|
static int size = 10;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void createCompleteGraph() {
|
||||||
|
completeGraph = new SimpleWeightedGraph<>(DefaultEdge.class);
|
||||||
|
CompleteGraphGenerator<String, DefaultEdge> completeGenerator = new CompleteGraphGenerator<String, DefaultEdge>(size);
|
||||||
|
VertexFactory<String> vFactory = new VertexFactory<String>() {
|
||||||
|
private int id = 0;
|
||||||
|
public String createVertex() {
|
||||||
|
return "v" + id++;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
completeGenerator.generateGraph(completeGraph, vFactory, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenCompleteGraph_whenGetHamiltonianCyclePath_thenGetVerticeListInSequence() {
|
||||||
|
List<String> verticeList = HamiltonianCycle.getApproximateOptimalForCompleteGraph(completeGraph);
|
||||||
|
assertEquals(verticeList.size(), completeGraph.vertexSet().size());
|
||||||
|
}
|
||||||
|
}
|
@ -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<String, DefaultEdge> directedGraph;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void createDirectedGraph() {
|
||||||
|
directedGraph = new DefaultDirectedGraph<String, DefaultEdge>(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<String, DefaultEdge> scAlg = new KosarajuStrongConnectivityInspector<>(directedGraph);
|
||||||
|
List<DirectedSubgraph<String, DefaultEdge>> stronglyConnectedSubgraphs = scAlg.stronglyConnectedSubgraphs();
|
||||||
|
List<String> stronglyConnectedVertices = new ArrayList<>(stronglyConnectedSubgraphs.get(3).vertexSet());
|
||||||
|
|
||||||
|
String randomVertex1 = stronglyConnectedVertices.get(0);
|
||||||
|
String randomVertex2 = stronglyConnectedVertices.get(3);
|
||||||
|
AllDirectedPaths<String, DefaultEdge> allDirectedPaths = new AllDirectedPaths<>(directedGraph);
|
||||||
|
|
||||||
|
List<GraphPath<String, DefaultEdge>> possiblePathList = allDirectedPaths.getAllPaths(randomVertex1, randomVertex2, false, stronglyConnectedVertices.size());
|
||||||
|
assertTrue(possiblePathList.size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDirectedGraphWithCycle_whenCheckCycles_thenDetectCycles() {
|
||||||
|
CycleDetector<String, DefaultEdge> cycleDetector = new CycleDetector<String, DefaultEdge>(directedGraph);
|
||||||
|
assertTrue(cycleDetector.detectCycles());
|
||||||
|
Set<String> 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<String> shortestPath = dijkstraShortestPath.getPath("v1", "v4").getVertexList();
|
||||||
|
assertNotNull(shortestPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenDirectedGraph_whenGetBellmanFordShortestPath_thenGetNotNullPath() {
|
||||||
|
BellmanFordShortestPath bellmanFordShortestPath = new BellmanFordShortestPath(directedGraph);
|
||||||
|
List<String> shortestPath = bellmanFordShortestPath.getPath("v1", "v4").getVertexList();
|
||||||
|
assertNotNull(shortestPath);
|
||||||
|
}
|
||||||
|
}
|
@ -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<String, DefaultEdge> 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()));
|
||||||
|
}
|
||||||
|
}
|
57
animal-sniffer-mvn-plugin/pom.xml
Normal file
57
animal-sniffer-mvn-plugin/pom.xml
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>animal-sniffer-mvn-plugin</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<name>example-animal-sniffer-mvn-plugin</name>
|
||||||
|
<url>http://maven.apache.org</url>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven-compiler-plugin.version>3.6.0</maven-compiler-plugin.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.7.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.6</source>
|
||||||
|
<target>1.6</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>animal-sniffer-maven-plugin</artifactId>
|
||||||
|
<version>1.16</version>
|
||||||
|
<configuration>
|
||||||
|
<signature>
|
||||||
|
<groupId>org.codehaus.mojo.signature</groupId>
|
||||||
|
<artifactId>java16</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</signature>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>animal-sniffer</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>check</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
|
||||||
|
</build>
|
||||||
|
</project>
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
@ -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 );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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<Author> 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<Author> 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<Author> 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<Author> 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<Author> 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<Author> 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<Author> 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<Author> authors = ObjectSelect.query(Author.class)
|
||||||
|
.where(Author.NAME.contains("Paul"))
|
||||||
|
.select(context);
|
||||||
|
|
||||||
|
assertEquals(authors.size(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAuthors_whenLikeObjS_thenWeGetTwoAuthors() {
|
||||||
|
List<Author> authors = ObjectSelect.query(Author.class)
|
||||||
|
.where(Author.NAME.likeIgnoreCase("Paul%"))
|
||||||
|
.select(context);
|
||||||
|
|
||||||
|
assertEquals(authors.size(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoAuthor_whenEndsWithObjS_thenWeGetOrderedAuthors() {
|
||||||
|
List<Author> 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<String> names = Arrays.asList("Paul Xavier", "pAuL Smith", "Vicky Sarra");
|
||||||
|
List<Author> authors = ObjectSelect.query(Author.class)
|
||||||
|
.where(Author.NAME.in(names))
|
||||||
|
.select(context);
|
||||||
|
|
||||||
|
assertEquals(authors.size(), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoAuthor_whenNinObjS_thenWeGetAuthors() {
|
||||||
|
List<String> names = Arrays.asList("Paul Xavier", "pAuL Smith");
|
||||||
|
List<Author> 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<Author> 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<Author> 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<Author> 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<Author> 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<String> names = Arrays.asList(args);
|
||||||
|
EJBQLQuery query = new EJBQLQuery("select a.name FROM Author a");
|
||||||
|
List<String> 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<Author> 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);
|
||||||
|
}
|
||||||
|
}
|
1
atomix/.gitignore
vendored
Normal file
1
atomix/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
46
atomix/pom.xml
Normal file
46
atomix/pom.xml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.atomix.io</groupId>
|
||||||
|
<artifactId>atomix</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-modules</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.atomix</groupId>
|
||||||
|
<artifactId>atomix-all</artifactId>
|
||||||
|
<version>1.0.0-rc9</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.9</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
<version>1.2.17</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.7.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
@ -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<AtomixReplica> completableFuture = replica.bootstrap();
|
||||||
|
completableFuture.join();
|
||||||
|
}
|
||||||
|
}
|
71
atomix/src/main/java/com/atomix/example/OtherNodes.java
Normal file
71
atomix/src/main/java/com/atomix/example/OtherNodes.java
Normal file
@ -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<Address> 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<Address> cluster;
|
||||||
|
|
||||||
|
WorkerThread(AtomixReplica replica, List<Address> cluster) {
|
||||||
|
this.replica = replica;
|
||||||
|
this.cluster = cluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
replica.join(cluster)
|
||||||
|
.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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<Address> 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);
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ import java.nio.file.WatchKey;
|
|||||||
import java.nio.file.WatchService;
|
import java.nio.file.WatchService;
|
||||||
|
|
||||||
public class DirectoryWatcherExample {
|
public class DirectoryWatcherExample {
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException, InterruptedException {
|
public static void main(String[] args) throws IOException, InterruptedException {
|
||||||
WatchService watchService = FileSystems.getDefault().newWatchService();
|
WatchService watchService = FileSystems.getDefault().newWatchService();
|
||||||
Path path = Paths.get(System.getProperty("user.home"));
|
Path path = Paths.get(System.getProperty("user.home"));
|
||||||
@ -21,5 +22,8 @@ public class DirectoryWatcherExample {
|
|||||||
}
|
}
|
||||||
key.reset();
|
key.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
watchService.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
26
core-java/src/test/java/com/baeldung/string/StringTest.java
Normal file
26
core-java/src/test/java/com/baeldung/string/StringTest.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
5
deeplearning4j/README.md
Normal file
5
deeplearning4j/README.md
Normal file
@ -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/)
|
33
deeplearning4j/pom.xml
Normal file
33
deeplearning4j/pom.xml
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung.deeplearning4j</groupId>
|
||||||
|
<artifactId>deeplearning4j</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<name>deeplearning4j</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
<dl4j.version>0.9.1</dl4j.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.nd4j</groupId>
|
||||||
|
<artifactId>nd4j-native-platform</artifactId>
|
||||||
|
<version>${dl4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.deeplearning4j</groupId>
|
||||||
|
<artifactId>deeplearning4j-core</artifactId>
|
||||||
|
<version>${dl4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
</project>
|
@ -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());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
150
deeplearning4j/src/main/resources/iris.txt
Normal file
150
deeplearning4j/src/main/resources/iris.txt
Normal file
@ -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
|
@ -1,42 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<groupId>com.baeldung.beanvalidation</groupId>
|
|
||||||
<artifactId>beanvalidation</artifactId>
|
|
||||||
<version>1.0</version>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
<name>beanvalidation</name>
|
|
||||||
<url>http://maven.apache.org</url>
|
|
||||||
<properties>
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
</properties>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>4.12</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>javax.validation</groupId>
|
|
||||||
<artifactId>validation-api</artifactId>
|
|
||||||
<version>2.0.0.Final</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.hibernate</groupId>
|
|
||||||
<artifactId>hibernate-validator</artifactId>
|
|
||||||
<version>6.0.2.Final</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>javax.el</groupId>
|
|
||||||
<artifactId>javax.el-api</artifactId>
|
|
||||||
<version>3.0.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.glassfish.web</groupId>
|
|
||||||
<artifactId>javax.el</artifactId>
|
|
||||||
<version>2.2.4</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
</project>
|
|
@ -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()));
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package com.baeldung.beanvalidation.service;
|
|
||||||
|
|
||||||
public interface EntityService {
|
|
||||||
|
|
||||||
public String toString();
|
|
||||||
|
|
||||||
public void processEntity();
|
|
||||||
}
|
|
@ -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 + "]";
|
|
||||||
}
|
|
||||||
}
|
|
@ -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<ConstraintViolation<UserService>> constraintViolations = validator.validate(userService);
|
|
||||||
assertEquals(2, constraintViolations.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenNullElement_whenValidated_thenOneConstraintViolation() {
|
|
||||||
StringContainer container = new StringContainer();
|
|
||||||
container.addElement(null);
|
|
||||||
Set<ConstraintViolation<StringContainer>> constraintViolations = validator.validate(container);
|
|
||||||
assertEquals(1, constraintViolations.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenNegativeInteger_whenValidated_thenOneConstraintViolation() {
|
|
||||||
IntegerContainer container = new IntegerContainer();
|
|
||||||
container.addElement(-1);
|
|
||||||
Set<ConstraintViolation<IntegerContainer>> constraintViolations = validator.validate(container);
|
|
||||||
assertEquals(1, constraintViolations.size());
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,8 +6,8 @@
|
|||||||
<version>0.1-SNAPSHOT</version>
|
<version>0.1-SNAPSHOT</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<validation-api.version>1.1.0.Final</validation-api.version>
|
<validation-api.version>2.0.0.Final</validation-api.version>
|
||||||
<hibernate-validator.version>5.3.4.Final</hibernate-validator.version>
|
<hibernate-validator.version>6.0.2.Final</hibernate-validator.version>
|
||||||
<javax.el-api.version>3.0.0</javax.el-api.version>
|
<javax.el-api.version>3.0.0</javax.el-api.version>
|
||||||
<javax.el.version>2.2.6</javax.el.version>
|
<javax.el.version>2.2.6</javax.el.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
66
javaxval/src/main/java/org/baeldung/Customer.java
Normal file
66
javaxval/src/main/java/org/baeldung/Customer.java
Normal file
@ -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<String> getAddresses() {
|
||||||
|
return addresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddresses(List<String> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
19
javaxval/src/main/java/org/baeldung/CustomerMap.java
Normal file
19
javaxval/src/main/java/org/baeldung/CustomerMap.java
Normal file
@ -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<String, Customer> getCustomers() {
|
||||||
|
return customers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustomers(Map<String, Customer> customers) {
|
||||||
|
this.customers = customers;
|
||||||
|
}
|
||||||
|
}
|
13
javaxval/src/main/java/org/baeldung/Profile.java
Normal file
13
javaxval/src/main/java/org/baeldung/Profile.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -1,56 +1,94 @@
|
|||||||
package org.baeldung;
|
package org.baeldung;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import javax.validation.constraints.AssertTrue;
|
import javax.validation.constraints.AssertTrue;
|
||||||
|
import javax.validation.constraints.Email;
|
||||||
import javax.validation.constraints.Max;
|
import javax.validation.constraints.Max;
|
||||||
import javax.validation.constraints.Min;
|
import javax.validation.constraints.Min;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
import javax.validation.constraints.Past;
|
||||||
import javax.validation.constraints.Size;
|
import javax.validation.constraints.Size;
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
||||||
public class User {
|
public class User {
|
||||||
|
|
||||||
@NotNull(message = "Name cannot be null")
|
@NotNull(message = "Name cannot be null")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@AssertTrue
|
@AssertTrue
|
||||||
private boolean working;
|
private boolean working;
|
||||||
|
|
||||||
@Size(min = 10, max = 200, message = "Number of characters should be in between 10 and 200 inclusive")
|
@Size(min = 10, max = 200, message = "Number of characters should be in between 10 and 200 inclusive")
|
||||||
private String aboutMe;
|
private String aboutMe;
|
||||||
|
|
||||||
@Min(value = 18, message = "Age should not be less than 18")
|
@Min(value = 18, message = "Age should not be less than 18")
|
||||||
@Max(value = 150, message = "Age should not be more than 150")
|
@Max(value = 150, message = "Age should not be more than 150")
|
||||||
private int age;
|
private int age;
|
||||||
|
|
||||||
public int getAge() {
|
@Email(message = "Email should be valid")
|
||||||
return age;
|
private String email;
|
||||||
}
|
|
||||||
|
List<@NotBlank String> preferences;
|
||||||
|
|
||||||
|
private LocalDate dateOfBirth;
|
||||||
|
|
||||||
public void setAge(int age) {
|
public int getAge() {
|
||||||
this.age = age;
|
return age;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWorking() {
|
public void setAge(int age) {
|
||||||
return working;
|
this.age = age;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setWorking(boolean working) {
|
public boolean isWorking() {
|
||||||
this.working = working;
|
return working;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAboutMe() {
|
public void setWorking(boolean working) {
|
||||||
return aboutMe;
|
this.working = working;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setAboutMe(String aboutMe) {
|
public String getAboutMe() {
|
||||||
this.aboutMe = aboutMe;
|
return aboutMe;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public void setAboutMe(String aboutMe) {
|
||||||
return name;
|
this.aboutMe = aboutMe;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public String getName() {
|
||||||
this.name = name;
|
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<String> getPreferences() {
|
||||||
|
return preferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPreferences(List<String> preferences) {
|
||||||
|
this.preferences = preferences;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
org.baeldung.valueextractors.ProfileValueExtractor
|
@ -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<ConstraintViolation<Customer>> 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<ConstraintViolation<CustomerMap>> 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<ConstraintViolation<Customer>> violations = validator.validate(customer);
|
||||||
|
assertEquals(1, violations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenAgeNull_thenValidationSucceeds() {
|
||||||
|
Customer customer = new Customer();
|
||||||
|
customer.setName("John");
|
||||||
|
Set<ConstraintViolation<Customer>> 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<ConstraintViolation<Customer>> 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<ConstraintViolation<Customer>> violations = validator.validate(customer);
|
||||||
|
assertEquals(1, violations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,81 +1,126 @@
|
|||||||
package org.baeldung;
|
package org.baeldung;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import javax.validation.ConstraintViolation;
|
import javax.validation.ConstraintViolation;
|
||||||
import javax.validation.Validation;
|
import javax.validation.Validation;
|
||||||
import javax.validation.Validator;
|
import javax.validation.Validator;
|
||||||
import javax.validation.ValidatorFactory;
|
import javax.validation.ValidatorFactory;
|
||||||
|
|
||||||
import org.junit.Assert;
|
import static org.junit.Assert.*;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.Before;
|
||||||
|
|
||||||
public class ValidationIntegrationTest {
|
public class ValidationIntegrationTest {
|
||||||
|
|
||||||
@Test
|
private Validator validator;
|
||||||
public void ifNameIsNull_nameValidationFails() {
|
|
||||||
User user = new User();
|
|
||||||
user.setWorking(true);
|
|
||||||
user.setAboutMe("Its all about me!!");
|
|
||||||
user.setAge(50);
|
|
||||||
|
|
||||||
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
@Before
|
||||||
Validator validator = factory.getValidator();
|
public void setup() {
|
||||||
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
||||||
Assert.assertEquals(violations.isEmpty(), false);
|
validator = factory.getValidator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private User createUser() {
|
||||||
public void ifSizeNotInRange_aboutMeValidationFails() {
|
User user = new User();
|
||||||
User user = new User();
|
user.setName("John");
|
||||||
user.setName("MyName");
|
user.setWorking(true);
|
||||||
user.setAboutMe("Its all about me!!");
|
user.setAge(18);
|
||||||
user.setAge(50);
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
@Test
|
||||||
Validator validator = factory.getValidator();
|
public void ifNameIsNull_nameValidationFails() {
|
||||||
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
User user = new User();
|
||||||
Assert.assertEquals(violations.isEmpty(), false);
|
user.setWorking(true);
|
||||||
}
|
user.setAboutMe("Its all about me!!");
|
||||||
|
user.setAge(50);
|
||||||
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
|
assertEquals(violations.isEmpty(), false);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ifWorkingIsFalse_workingValidationFails() {
|
public void ifSizeNotInRange_aboutMeValidationFails() {
|
||||||
User user = new User();
|
User user = new User();
|
||||||
user.setName("MyName");
|
user.setName("MyName");
|
||||||
user.setAboutMe("Its all about me!!");
|
user.setAboutMe("Its all about me!!");
|
||||||
user.setAge(50);
|
user.setAge(50);
|
||||||
|
|
||||||
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
Validator validator = factory.getValidator();
|
assertEquals(violations.isEmpty(), false);
|
||||||
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
}
|
||||||
Assert.assertEquals(violations.isEmpty(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ifAgeNotRange_ageValidationFails() {
|
public void ifWorkingIsFalse_workingValidationFails() {
|
||||||
User user = new User();
|
User user = new User();
|
||||||
user.setName("MyName");
|
user.setName("MyName");
|
||||||
user.setAboutMe("Its all about me!!");
|
user.setAboutMe("Its all about me!!");
|
||||||
user.setAge(8);
|
user.setAge(50);
|
||||||
|
|
||||||
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
Validator validator = factory.getValidator();
|
assertEquals(violations.isEmpty(), false);
|
||||||
Set<ConstraintViolation<User>> 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);
|
|
||||||
|
|
||||||
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
|
@Test
|
||||||
Validator validator = factory.getValidator();
|
public void ifAgeNotRange_ageValidationFails() {
|
||||||
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
User user = new User();
|
||||||
Assert.assertEquals(violations.isEmpty(), false);
|
user.setName("MyName");
|
||||||
Assert.assertEquals(violations.size(), 3);
|
user.setAboutMe("Its all about me!!");
|
||||||
}
|
user.setAge(8);
|
||||||
|
|
||||||
|
Set<ConstraintViolation<User>> 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<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
|
assertEquals(violations.isEmpty(), false);
|
||||||
|
assertEquals(violations.size(), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenInvalidEmail_thenValidationFails() {
|
||||||
|
User user = createUser();
|
||||||
|
user.setEmail("john");
|
||||||
|
|
||||||
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
|
assertEquals(1, violations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBlankPreference_thenValidationFails() {
|
||||||
|
User user = createUser();
|
||||||
|
user.setPreferences(Collections.singletonList(" "));
|
||||||
|
|
||||||
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
|
assertEquals(1, violations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEmptyOptional_thenValidationSucceeds() {
|
||||||
|
User user = createUser();
|
||||||
|
|
||||||
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
|
assertEquals(0, violations.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPastDateOfBirth_thenValidationSuccess() {
|
||||||
|
User user = createUser();
|
||||||
|
user.setDateOfBirth(LocalDate.of(1980, 5, 20));
|
||||||
|
|
||||||
|
Set<ConstraintViolation<User>> violations = validator.validate(user);
|
||||||
|
assertEquals(0, violations.size());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,11 @@
|
|||||||
<artifactId>reladomo-test-util</artifactId>
|
<artifactId>reladomo-test-util</artifactId>
|
||||||
<version>${reladomo.version}</version>
|
<version>${reladomo.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.j256.ormlite</groupId>
|
||||||
|
<artifactId>ormlite-jdbc</artifactId>
|
||||||
|
<version>${ormlite.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@ -144,5 +149,6 @@
|
|||||||
<reladomo.version>16.5.1</reladomo.version>
|
<reladomo.version>16.5.1</reladomo.version>
|
||||||
<junit.version>4.12</junit.version>
|
<junit.version>4.12</junit.version>
|
||||||
<maven-compiler-plugin.version>3.6.2</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.6.2</maven-compiler-plugin.version>
|
||||||
|
<ormlite.version>5.0</ormlite.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
49
libraries-data/src/main/java/com/baeldung/ormlite/Book.java
Normal file
49
libraries-data/src/main/java/com/baeldung/ormlite/Book.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<Book> 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<Book> getBooks() {
|
||||||
|
return books;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBooks(ForeignCollection<Book> books) {
|
||||||
|
this.books = books;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<Library, Long> {
|
||||||
|
public List<Library> findByName(String name) throws SQLException;
|
||||||
|
}
|
@ -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<Library, Long> implements LibraryDao {
|
||||||
|
|
||||||
|
public LibraryDaoImpl(ConnectionSource connectionSource) throws SQLException {
|
||||||
|
super(connectionSource, Library.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Library> findByName(String name) throws SQLException {
|
||||||
|
return super.queryForEq("name", name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<Library, Long> libraryDao;
|
||||||
|
private static Dao<Book, Long> 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<Library> 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<Address, Long> 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<Library> 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();
|
||||||
|
}
|
||||||
|
}
|
@ -41,6 +41,7 @@
|
|||||||
- [Introduction to NoException](http://www.baeldung.com/no-exception)
|
- [Introduction to NoException](http://www.baeldung.com/no-exception)
|
||||||
- [Introduction to FunctionalJava](http://www.baeldung.com/functional-java)
|
- [Introduction to FunctionalJava](http://www.baeldung.com/functional-java)
|
||||||
- [Apache Commons IO](http://www.baeldung.com/apache-commons-io)
|
- [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.
|
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.
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
@ -487,7 +487,7 @@
|
|||||||
<artifactId>vavr</artifactId>
|
<artifactId>vavr</artifactId>
|
||||||
<version>${vavr.version}</version>
|
<version>${vavr.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Retrofit -->
|
<!-- Retrofit -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.retrofit2</groupId>
|
<groupId>com.squareup.retrofit2</groupId>
|
||||||
@ -503,7 +503,7 @@
|
|||||||
<groupId>com.squareup.retrofit2</groupId>
|
<groupId>com.squareup.retrofit2</groupId>
|
||||||
<artifactId>adapter-rxjava</artifactId>
|
<artifactId>adapter-rxjava</artifactId>
|
||||||
<version>${retrofit.version}</version>
|
<version>${retrofit.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
<artifactId>logging-interceptor</artifactId>
|
<artifactId>logging-interceptor</artifactId>
|
||||||
@ -583,8 +583,34 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.atlassian.fugue</groupId>
|
<groupId>com.atlassian.fugue</groupId>
|
||||||
<artifactId>fugue</artifactId>
|
<artifactId>fugue</artifactId>
|
||||||
<version>3.0.0-m007</version>
|
<version>2.6.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!-- Uncomment this in order to use the jira-rest-java-client-core API -->
|
||||||
|
<!-- <dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>19.0</version>
|
||||||
|
</dependency> -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jgrapht</groupId>
|
||||||
|
<artifactId>jgrapht-core</artifactId>
|
||||||
|
<version>1.0.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.netopyr.wurmloch</groupId>
|
||||||
|
<artifactId>wurmloch-crdt</artifactId>
|
||||||
|
<version>${crdt.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.docx4j</groupId>
|
||||||
|
<artifactId>docx4j</artifactId>
|
||||||
|
<version>3.3.5</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-api</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
@ -606,6 +632,7 @@
|
|||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
<properties>
|
<properties>
|
||||||
|
<crdt.version>0.1.0</crdt.version>
|
||||||
<multiverse.version>0.7.0</multiverse.version>
|
<multiverse.version>0.7.0</multiverse.version>
|
||||||
<cglib.version>3.2.4</cglib.version>
|
<cglib.version>3.2.4</cglib.version>
|
||||||
<commons-lang.version>3.6</commons-lang.version>
|
<commons-lang.version>3.6</commons-lang.version>
|
||||||
@ -658,6 +685,6 @@
|
|||||||
<protonpack.version>1.14</protonpack.version>
|
<protonpack.version>1.14</protonpack.version>
|
||||||
<unit-ri.version>1.0.3</unit-ri.version>
|
<unit-ri.version>1.0.3</unit-ri.version>
|
||||||
<cache.version>1.0.0</cache.version>
|
<cache.version>1.0.0</cache.version>
|
||||||
<hazelcast.version>3.8.4</hazelcast.version>
|
<hazelcast.version>3.8.4</hazelcast.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
||||||
|
@ -3,6 +3,8 @@ package com.baeldung.commons.lang3;
|
|||||||
import org.apache.commons.lang3.builder.EqualsBuilder;
|
import org.apache.commons.lang3.builder.EqualsBuilder;
|
||||||
import org.apache.commons.lang3.builder.HashCodeBuilder;
|
import org.apache.commons.lang3.builder.HashCodeBuilder;
|
||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
|
import org.apache.commons.lang3.concurrent.ConcurrentException;
|
||||||
|
import org.apache.commons.lang3.concurrent.BackgroundInitializer;
|
||||||
|
|
||||||
public class BuilderMethods {
|
public class BuilderMethods {
|
||||||
|
|
||||||
@ -56,5 +58,36 @@ public class BuilderMethods {
|
|||||||
System.out.println(simple1.getName());
|
System.out.println(simple1.getName());
|
||||||
System.out.println(simple1.hashCode());
|
System.out.println(simple1.hashCode());
|
||||||
System.out.println(simple1.toString());
|
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<String>{
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String initialize() throws Exception {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any complex task that takes some time
|
||||||
|
|
||||||
|
}
|
||||||
|
109
libraries/src/main/java/com/baeldung/docx/Docx4jExample.java
Normal file
109
libraries/src/main/java/com/baeldung/docx/Docx4jExample.java
Normal file
@ -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<Object> rows = tbl.getContent();
|
||||||
|
for (Object row : rows) {
|
||||||
|
Tr tr = (Tr) row;
|
||||||
|
List<Object> 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<Object> 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
105
libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java
Normal file
105
libraries/src/main/java/com/baeldung/jdo/xml/MyApp.java
Normal file
@ -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<Person> query = pm.newQuery(Person.class);
|
||||||
|
List<Person> result = query.executeList();
|
||||||
|
System.out.println("name: "+result.get(0).getFirstName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void queryAnnotatedPersonsInXML(){
|
||||||
|
|
||||||
|
Query<AnnotadedPerson> query = pm.newQuery(AnnotadedPerson.class);
|
||||||
|
List<AnnotadedPerson> result = query.executeList();
|
||||||
|
System.out.println("name: "+result.get(0).getFirstName());
|
||||||
|
}
|
||||||
|
}
|
65
libraries/src/main/java/com/baeldung/jdo/xml/Person.java
Normal file
65
libraries/src/main/java/com/baeldung/jdo/xml/Person.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
58
libraries/src/main/java/com/baeldung/jdo/xml/Product.java
Normal file
58
libraries/src/main/java/com/baeldung/jdo/xml/Product.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
103
libraries/src/main/java/com/baeldung/jira/MyJiraClient.java
Normal file
103
libraries/src/main/java/com/baeldung/jira/MyJiraClient.java
Normal file
@ -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<Comment> 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<Comment> 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);
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
17
libraries/src/main/resources/META-INF/jdoconfig.xml
Normal file
17
libraries/src/main/resources/META-INF/jdoconfig.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<jdoconfig xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdoconfig"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/jdo/jdoconfig
|
||||||
|
http://xmlns.jcp.org/xml/ns/jdo/jdoconfig_3_2.xsd"
|
||||||
|
version="3.2">
|
||||||
|
|
||||||
|
<!-- Datastore Txn PMF -->
|
||||||
|
<persistence-manager-factory name="XmlDatastore">
|
||||||
|
<property name="javax.jdo.PersistenceManagerFactoryClass"
|
||||||
|
value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory" />
|
||||||
|
<property name="javax.jdo.option.ConnectionURL" value="xml:file:namedPMF-ds.xml" />
|
||||||
|
<property name="datanucleus.xml.indentSize" value="6" />
|
||||||
|
<property name="datanucleus.schema.autoCreateAll"
|
||||||
|
value="true" />
|
||||||
|
</persistence-manager-factory>
|
||||||
|
</jdoconfig>
|
21
libraries/src/main/resources/META-INF/package.jdo
Normal file
21
libraries/src/main/resources/META-INF/package.jdo
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<jdo xmlns="http://xmlns.jcp.org/xml/ns/jdo/jdo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/jdo/jdo http://xmlns.jcp.org/xml/ns/jdo/jdo_3_1.xsd"
|
||||||
|
version="3.1">
|
||||||
|
<package name="com.baeldung.jdo.xml">
|
||||||
|
<class name="Person" detachable="true" schema="/myproduct/people"
|
||||||
|
table="person">
|
||||||
|
<field name="personNum">
|
||||||
|
<extension vendor-name="datanucleus" key="XmlAttribute"
|
||||||
|
value="true" />
|
||||||
|
</field>
|
||||||
|
<field name="firstName" primary-key="true" /> <!-- PK since JAXB requires String -->
|
||||||
|
<field name="lastName" />
|
||||||
|
<field name="phoneNumbers">
|
||||||
|
<collection element-type="java.lang.String" />
|
||||||
|
<element column="phoneNumber" />
|
||||||
|
</field>
|
||||||
|
</class>
|
||||||
|
</package>
|
||||||
|
|
||||||
|
|
||||||
|
</jdo>
|
BIN
libraries/src/main/resources/image.jpg
Normal file
BIN
libraries/src/main/resources/image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 69 KiB |
@ -1,85 +1,111 @@
|
|||||||
package com.baeldung.commons.collections4;
|
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;
|
||||||
import org.apache.commons.collections4.bag.CollectionBag;
|
import org.apache.commons.collections4.SortedBag;
|
||||||
import org.apache.commons.collections4.bag.HashBag;
|
import org.apache.commons.collections4.bag.*;
|
||||||
import org.apache.commons.collections4.bag.TreeBag;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
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 {
|
public class BagTests {
|
||||||
|
|
||||||
Bag<String> baseBag;
|
@Test
|
||||||
TreeBag<String> treeBag;
|
public void givenMultipleCopies_whenAdded_theCountIsKept() {
|
||||||
|
Bag<Integer> bag = new HashBag<>(
|
||||||
@Before
|
Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 }));
|
||||||
public void before() {
|
|
||||||
baseBag = new HashBag<String>();
|
assertThat(bag.getCount(1), equalTo(2));
|
||||||
treeBag = new TreeBag<String>();
|
}
|
||||||
treeBag = new TreeBag<String>();
|
|
||||||
}
|
@Test
|
||||||
|
public void givenBag_whenBagAddAPILikeCollectionAPI_thenFalse() {
|
||||||
@Test
|
Collection<Integer> collection = new ArrayList<>();
|
||||||
public void whenAdd_thenRemoveFromBaseBag_thenContainsCorrect() {
|
|
||||||
baseBag.add("apple", 2);
|
// Collection contract defines that add() should return true
|
||||||
baseBag.add("lemon", 6);
|
assertThat(collection.add(9), is(true));
|
||||||
baseBag.add("lime");
|
|
||||||
|
// Even when element is already in the collection
|
||||||
baseBag.remove("lemon");
|
collection.add(1);
|
||||||
Assert.assertEquals(3, baseBag.size());
|
assertThat(collection.add(1), is(true));
|
||||||
Assert.assertFalse(baseBag.contains("lemon"));
|
|
||||||
|
Bag<Integer> bag = new HashBag<>();
|
||||||
Assert.assertTrue(baseBag.uniqueSet().contains("apple"));
|
|
||||||
|
// Bag returns true on adding a new element
|
||||||
List<String> containList = new ArrayList<String>();
|
assertThat(bag.add(9), is(true));
|
||||||
containList.add("apple");
|
|
||||||
containList.add("lemon");
|
bag.add(1);
|
||||||
containList.add("lime");
|
// But breaks the contract with false when it has to increment the count
|
||||||
Assert.assertFalse(baseBag.containsAll(containList));
|
assertThat(bag.add(1), is(not(true)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenAdd_thenRemoveFromBaseCollectionBag_thenContainsCorrect() {
|
public void givenDecoratedBag_whenBagAddAPILikeCollectionAPI_thenTrue() {
|
||||||
baseBag.add("apple", 2);
|
Bag<Integer> bag = CollectionBag.collectionBag(new HashBag<>());
|
||||||
baseBag.add("lemon", 6);
|
|
||||||
baseBag.add("lime");
|
bag.add(1);
|
||||||
|
// This time the behavior is compliant to the Java Collection
|
||||||
CollectionBag<String> baseCollectionBag = new CollectionBag<String>(
|
assertThat(bag.add(1), is((true)));
|
||||||
baseBag);
|
}
|
||||||
|
|
||||||
baseCollectionBag.remove("lemon");
|
@Test
|
||||||
Assert.assertEquals(8, baseCollectionBag.size());
|
public void givenAdd_whenCountOfElementsDefined_thenCountAreAdded() {
|
||||||
Assert.assertTrue(baseCollectionBag.contains("lemon"));
|
Bag<Integer> bag = new HashBag<>();
|
||||||
|
|
||||||
baseCollectionBag.remove("lemon",1);
|
// Adding 1 for 5 times
|
||||||
Assert.assertEquals(7, baseCollectionBag.size());
|
bag.add(1, 5);
|
||||||
|
assertThat(bag.getCount(1), equalTo(5));
|
||||||
Assert.assertTrue(baseBag.uniqueSet().contains("apple"));
|
}
|
||||||
|
|
||||||
List<String> containList = new ArrayList<String>();
|
@Test
|
||||||
containList.add("apple");
|
public void givenMultipleCopies_whenRemove_allAreRemoved() {
|
||||||
containList.add("lemon");
|
Bag<Integer> bag = new HashBag<>(
|
||||||
containList.add("lime");
|
Arrays.asList(new Integer[] { 1, 2, 3, 3, 3, 1, 4 }));
|
||||||
Assert.assertTrue(baseBag.containsAll(containList));
|
|
||||||
}
|
// From 3 we delete 1, 2 remain
|
||||||
|
bag.remove(3, 1);
|
||||||
@Test
|
assertThat(bag.getCount(3), equalTo(2));
|
||||||
public void whenAddtoTreeBag_thenRemove_thenContainsCorrect() {
|
|
||||||
treeBag.add("banana", 8);
|
// From 2 we delete all
|
||||||
treeBag.add("apple", 2);
|
bag.remove(1);
|
||||||
treeBag.add("lime");
|
assertThat(bag.getCount(1), equalTo(0));
|
||||||
|
}
|
||||||
Assert.assertEquals(11, treeBag.size());
|
|
||||||
Assert.assertEquals("apple", treeBag.first());
|
@Test
|
||||||
Assert.assertEquals("lime", treeBag.last());
|
public void givenTree_whenDuplicateElementsAdded_thenSort() {
|
||||||
|
TreeBag<Integer> bag = new TreeBag<>(
|
||||||
treeBag.remove("apple");
|
Arrays.asList(new Integer[] { 7, 5, 1, 7, 2, 3, 3, 3, 1, 4, 7 }));
|
||||||
Assert.assertEquals(9, treeBag.size());
|
|
||||||
Assert.assertEquals("banana", treeBag.first());
|
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<Integer> bag = CollectionSortedBag
|
||||||
|
.collectionSortedBag(new TreeBag<>());
|
||||||
|
|
||||||
|
bag.add(1);
|
||||||
|
assertThat(bag.add(1), is((true)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSortedBag_whenDuplicateElementsAdded_thenSort() {
|
||||||
|
SynchronizedSortedBag<Integer> 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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,9 @@ package com.baeldung.commons.lang3;
|
|||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNotSame;
|
import static org.junit.Assert.assertNotSame;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertSame;
|
import static org.junit.Assert.assertSame;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
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.BooleanUtils;
|
||||||
import org.apache.commons.lang3.SystemUtils;
|
import org.apache.commons.lang3.SystemUtils;
|
||||||
import org.apache.commons.lang3.arch.Processor;
|
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.ConcurrentException;
|
||||||
import org.apache.commons.lang3.concurrent.ConcurrentRuntimeException;
|
import org.apache.commons.lang3.concurrent.ConcurrentRuntimeException;
|
||||||
import org.apache.commons.lang3.concurrent.ConcurrentUtils;
|
import org.apache.commons.lang3.concurrent.ConcurrentUtils;
|
||||||
@ -133,4 +136,14 @@ public class Lang3UtilsTest {
|
|||||||
assertEquals(sampleObjectOne, sampleObjectTwo);
|
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());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
153
libraries/src/test/java/com/baeldung/crdt/CRDTTest.java
Normal file
153
libraries/src/test/java/com/baeldung/crdt/CRDTTest.java
Normal file
@ -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<String> replica1 = crdtStore1.createGSet("ID_1");
|
||||||
|
final GSet<String> replica2 = crdtStore2.<String>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<String> replica1 = crdtStore1.createLWWRegister("ID_1");
|
||||||
|
final LWWRegister<String> replica2 = crdtStore2.<String>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");
|
||||||
|
}
|
||||||
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,9 @@ import org.apache.http.client.HttpClient;
|
|||||||
import org.apache.http.client.methods.HttpGet;
|
import org.apache.http.client.methods.HttpGet;
|
||||||
import org.apache.http.impl.client.HttpClientBuilder;
|
import org.apache.http.impl.client.HttpClientBuilder;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@ -15,17 +17,16 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
||||||
|
|
||||||
public class JettyIntegrationTest {
|
public class JettyIntegrationTest {
|
||||||
private JettyServer jettyServer;
|
private static JettyServer jettyServer;
|
||||||
|
|
||||||
@Before
|
@BeforeClass
|
||||||
public void setup() throws Exception {
|
public static void setup() throws Exception {
|
||||||
jettyServer = new JettyServer();
|
jettyServer = new JettyServer();
|
||||||
jettyServer.start();
|
jettyServer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@AfterClass
|
||||||
public void cleanup() throws Exception {
|
public static void cleanup() throws Exception {
|
||||||
Thread.sleep(2000);
|
|
||||||
jettyServer.stop();
|
jettyServer.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,3 +10,4 @@
|
|||||||
- [Mockito – @Mock, @Spy, @Captor and @InjectMocks](http://www.baeldung.com/mockito-annotations)
|
- [Mockito – @Mock, @Spy, @Captor and @InjectMocks](http://www.baeldung.com/mockito-annotations)
|
||||||
- [Mockito’s Mock Methods](http://www.baeldung.com/mockito-mock-methods)
|
- [Mockito’s Mock Methods](http://www.baeldung.com/mockito-mock-methods)
|
||||||
- [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock)
|
- [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock)
|
||||||
|
- [Mocking Exception Throwing using Mockito](http://www.baeldung.com/mockito-exceptions)
|
||||||
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
2
pom.xml
2
pom.xml
@ -28,6 +28,7 @@
|
|||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
|
<module>atomix</module>
|
||||||
<module>apache-cayenne</module>
|
<module>apache-cayenne</module>
|
||||||
<module>aws</module>
|
<module>aws</module>
|
||||||
<module>akka-streams</module>
|
<module>akka-streams</module>
|
||||||
@ -247,6 +248,7 @@
|
|||||||
<module>mockserver</module>
|
<module>mockserver</module>
|
||||||
<module>undertow</module>
|
<module>undertow</module>
|
||||||
<module>vertx-and-rxjava</module>
|
<module>vertx-and-rxjava</module>
|
||||||
|
<module>deeplearning4j</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>com.baeldung</groupId>
|
|
||||||
<artifactId>rxjava</artifactId>
|
<artifactId>rxjava</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ import static junit.framework.Assert.assertTrue;
|
|||||||
|
|
||||||
public class ObservableTest {
|
public class ObservableTest {
|
||||||
|
|
||||||
String result = "";
|
private String result = "";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenString_whenJustAndSubscribe_thenEmitsSingleItem() {
|
public void givenString_whenJustAndSubscribe_thenEmitsSingleItem() {
|
||||||
@ -85,7 +85,7 @@ public class ObservableTest {
|
|||||||
.groupBy(i -> 0 == (i % 2) ? "EVEN" : "ODD")
|
.groupBy(i -> 0 == (i % 2) ? "EVEN" : "ODD")
|
||||||
.subscribe(group ->
|
.subscribe(group ->
|
||||||
group.subscribe((number) -> {
|
group.subscribe((number) -> {
|
||||||
if (group.getKey().toString().equals("EVEN")) {
|
if (group.getKey().equals("EVEN")) {
|
||||||
EVEN[0] += number;
|
EVEN[0] += number;
|
||||||
} else {
|
} else {
|
||||||
ODD[0] += number;
|
ODD[0] += number;
|
||||||
@ -141,5 +141,4 @@ public class ObservableTest {
|
|||||||
|
|
||||||
assertTrue(sum[0] == 10);
|
assertTrue(sum[0] == 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,16 +12,12 @@ public class ResourceManagementTest {
|
|||||||
|
|
||||||
String[] result = {""};
|
String[] result = {""};
|
||||||
Observable<Character> values = Observable.using(
|
Observable<Character> values = Observable.using(
|
||||||
() -> {
|
() -> "MyResource",
|
||||||
return "MyResource";
|
r -> Observable.create(o -> {
|
||||||
},
|
for (Character c : r.toCharArray())
|
||||||
r -> {
|
o.onNext(c);
|
||||||
return Observable.create(o -> {
|
o.onCompleted();
|
||||||
for (Character c : r.toCharArray())
|
}),
|
||||||
o.onNext(c);
|
|
||||||
o.onCompleted();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
r -> System.out.println("Disposed: " + r)
|
r -> System.out.println("Disposed: " + r)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ public class RxJavaBackpressureLongRunningUnitTest {
|
|||||||
// then
|
// then
|
||||||
testSubscriber.awaitTerminalEvent();
|
testSubscriber.awaitTerminalEvent();
|
||||||
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -60,7 +59,6 @@ public class RxJavaBackpressureLongRunningUnitTest {
|
|||||||
// then
|
// then
|
||||||
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
||||||
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -77,7 +75,6 @@ public class RxJavaBackpressureLongRunningUnitTest {
|
|||||||
// then
|
// then
|
||||||
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
||||||
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -88,15 +85,14 @@ public class RxJavaBackpressureLongRunningUnitTest {
|
|||||||
|
|
||||||
// when
|
// when
|
||||||
source.sample(100, TimeUnit.MILLISECONDS)
|
source.sample(100, TimeUnit.MILLISECONDS)
|
||||||
// .throttleFirst(100, TimeUnit.MILLISECONDS)
|
// .throttleFirst(100, TimeUnit.MILLISECONDS)
|
||||||
.observeOn(Schedulers.computation()).subscribe(testSubscriber);
|
.observeOn(Schedulers.computation()).subscribe(testSubscriber);
|
||||||
|
|
||||||
IntStream.range(0, 1_000).forEach(source::onNext);
|
IntStream.range(0, 1_000).forEach(source::onNext);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
||||||
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -111,7 +107,6 @@ public class RxJavaBackpressureLongRunningUnitTest {
|
|||||||
// then
|
// then
|
||||||
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
||||||
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -120,11 +115,11 @@ public class RxJavaBackpressureLongRunningUnitTest {
|
|||||||
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
|
TestSubscriber<Integer> testSubscriber = new TestSubscriber<>();
|
||||||
|
|
||||||
// when
|
// 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
|
// then
|
||||||
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
testSubscriber.awaitTerminalEvent(2, TimeUnit.SECONDS);
|
||||||
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
assertTrue(testSubscriber.getOnErrorEvents().size() == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
package com.baeldung.rxjava;
|
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.ToCleanString.toCleanString;
|
||||||
import static com.baelding.rxjava.operator.ToLength.toLength;
|
import static com.baelding.rxjava.operator.ToLength.toLength;
|
||||||
import static org.hamcrest.Matchers.hasItems;
|
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.hamcrest.Matchers.notNullValue;
|
||||||
import static org.junit.Assert.assertThat;
|
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 {
|
public class RxJavaCustomOperatorUnitTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -29,7 +25,7 @@ public class RxJavaCustomOperatorUnitTest {
|
|||||||
final List<String> results = new ArrayList<>();
|
final List<String> results = new ArrayList<>();
|
||||||
|
|
||||||
final Observable<String> observable = Observable.from(list)
|
final Observable<String> observable = Observable.from(list)
|
||||||
.lift(toCleanString());
|
.lift(toCleanString());
|
||||||
|
|
||||||
// when
|
// when
|
||||||
observable.subscribe(results::add);
|
observable.subscribe(results::add);
|
||||||
@ -46,7 +42,7 @@ public class RxJavaCustomOperatorUnitTest {
|
|||||||
final List<Integer> results = new ArrayList<>();
|
final List<Integer> results = new ArrayList<>();
|
||||||
|
|
||||||
final Observable<Integer> observable = Observable.from(list)
|
final Observable<Integer> observable = Observable.from(list)
|
||||||
.compose(toLength());
|
.compose(toLength());
|
||||||
|
|
||||||
// when
|
// when
|
||||||
observable.subscribe(results::add);
|
observable.subscribe(results::add);
|
||||||
@ -85,8 +81,8 @@ public class RxJavaCustomOperatorUnitTest {
|
|||||||
|
|
||||||
final List<String> results = new ArrayList<>();
|
final List<String> results = new ArrayList<>();
|
||||||
Observable.from(Arrays.asList("ap_p-l@e", "or-an?ge"))
|
Observable.from(Arrays.asList("ap_p-l@e", "or-an?ge"))
|
||||||
.lift(cleanStringFn)
|
.lift(cleanStringFn)
|
||||||
.subscribe(results::add);
|
.subscribe(results::add);
|
||||||
|
|
||||||
assertThat(results, notNullValue());
|
assertThat(results, notNullValue());
|
||||||
assertThat(results, hasSize(2));
|
assertThat(results, hasSize(2));
|
||||||
@ -99,8 +95,8 @@ public class RxJavaCustomOperatorUnitTest {
|
|||||||
|
|
||||||
final List<Integer> results = new ArrayList<>();
|
final List<Integer> results = new ArrayList<>();
|
||||||
Observable.from(Arrays.asList("apple", "orange"))
|
Observable.from(Arrays.asList("apple", "orange"))
|
||||||
.compose(toLengthFn)
|
.compose(toLengthFn)
|
||||||
.subscribe(results::add);
|
.subscribe(results::add);
|
||||||
|
|
||||||
assertThat(results, notNullValue());
|
assertThat(results, notNullValue());
|
||||||
assertThat(results, hasSize(2));
|
assertThat(results, hasSize(2));
|
||||||
|
@ -10,7 +10,9 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
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;
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
public class RxJavaUnitTest {
|
public class RxJavaUnitTest {
|
||||||
@ -19,7 +21,8 @@ public class RxJavaUnitTest {
|
|||||||
// given
|
// given
|
||||||
List<String> letters = Arrays.asList("A", "B", "C", "D", "E");
|
List<String> letters = Arrays.asList("A", "B", "C", "D", "E");
|
||||||
List<String> results = new ArrayList<>();
|
List<String> results = new ArrayList<>();
|
||||||
Observable<String> observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), (string, index) -> index + "-" + string);
|
Observable<String> observable = Observable.from(letters)
|
||||||
|
.zipWith(Observable.range(1, Integer.MAX_VALUE), (string, index) -> index + "-" + string);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
observable.subscribe(results::add);
|
observable.subscribe(results::add);
|
||||||
@ -36,7 +39,8 @@ public class RxJavaUnitTest {
|
|||||||
List<String> letters = Arrays.asList("A", "B", "C", "D", "E");
|
List<String> letters = Arrays.asList("A", "B", "C", "D", "E");
|
||||||
TestSubscriber<String> subscriber = new TestSubscriber<>();
|
TestSubscriber<String> subscriber = new TestSubscriber<>();
|
||||||
|
|
||||||
Observable<String> observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string));
|
Observable<String> observable = Observable.from(letters)
|
||||||
|
.zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
observable.subscribe(subscriber);
|
observable.subscribe(subscriber);
|
||||||
@ -54,7 +58,9 @@ public class RxJavaUnitTest {
|
|||||||
List<String> letters = Arrays.asList("A", "B", "C", "D", "E");
|
List<String> letters = Arrays.asList("A", "B", "C", "D", "E");
|
||||||
TestSubscriber<String> subscriber = new TestSubscriber<>();
|
TestSubscriber<String> subscriber = new TestSubscriber<>();
|
||||||
|
|
||||||
Observable<String> observable = Observable.from(letters).zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string)).concatWith(Observable.error(new RuntimeException("error in Observable")));
|
Observable<String> observable = Observable.from(letters)
|
||||||
|
.zipWith(Observable.range(1, Integer.MAX_VALUE), ((string, index) -> index + "-" + string))
|
||||||
|
.concatWith(Observable.error(new RuntimeException("error in Observable")));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
observable.subscribe(subscriber);
|
observable.subscribe(subscriber);
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package com.baeldung.rxjava;
|
package com.baeldung.rxjava;
|
||||||
|
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
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.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
@ -18,14 +15,16 @@ import java.util.concurrent.ExecutorService;
|
|||||||
import java.util.concurrent.ThreadFactory;
|
import java.util.concurrent.ThreadFactory;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static com.jayway.awaitility.Awaitility.await;
|
||||||
import static java.util.concurrent.Executors.newFixedThreadPool;
|
import static java.util.concurrent.Executors.newFixedThreadPool;
|
||||||
import static org.hamcrest.Matchers.hasItems;
|
import static org.hamcrest.Matchers.hasItems;
|
||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class SchedulersTest {
|
public class SchedulersTest {
|
||||||
String result = "";
|
private String result = "";
|
||||||
String result1 = "";
|
private String result1 = "";
|
||||||
String result2 = "";
|
private String result2 = "";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenScheduledWorker_whenScheduleAnAction_thenResultAction() throws InterruptedException {
|
public void givenScheduledWorker_whenScheduleAnAction_thenResultAction() throws InterruptedException {
|
||||||
@ -33,7 +32,8 @@ public class SchedulersTest {
|
|||||||
Scheduler scheduler = Schedulers.immediate();
|
Scheduler scheduler = Schedulers.immediate();
|
||||||
Scheduler.Worker worker = scheduler.createWorker();
|
Scheduler.Worker worker = scheduler.createWorker();
|
||||||
worker.schedule(() -> result += "action");
|
worker.schedule(() -> result += "action");
|
||||||
Assert.assertTrue(result.equals("action"));
|
|
||||||
|
assertTrue(result.equals("action"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -46,8 +46,9 @@ public class SchedulersTest {
|
|||||||
worker.unsubscribe();
|
worker.unsubscribe();
|
||||||
});
|
});
|
||||||
worker.schedule(() -> result += "Second_Action");
|
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
|
@Ignore //it's not safe, not every time is running correctly
|
||||||
@ -61,8 +62,9 @@ public class SchedulersTest {
|
|||||||
worker.schedule(() -> result += "_worker_");
|
worker.schedule(() -> result += "_worker_");
|
||||||
result += "_End";
|
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
|
@Test
|
||||||
@ -77,9 +79,11 @@ public class SchedulersTest {
|
|||||||
.subscribe(s ->
|
.subscribe(s ->
|
||||||
result1 += Thread.currentThread().getName()
|
result1 += Thread.currentThread().getName()
|
||||||
);
|
);
|
||||||
Thread.sleep(500);
|
await()
|
||||||
Assert.assertTrue(result1.equals("RxNewThreadScheduler-1"));
|
.until(() -> {
|
||||||
Assert.assertTrue(result2.equals("RxNewThreadScheduler-2"));
|
assertTrue(result1.equals("RxNewThreadScheduler-1"));
|
||||||
|
assertTrue(result2.equals("RxNewThreadScheduler-2"));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -92,8 +96,9 @@ public class SchedulersTest {
|
|||||||
worker.schedule(() -> result += "_worker_");
|
worker.schedule(() -> result += "_worker_");
|
||||||
result += "_End";
|
result += "_End";
|
||||||
});
|
});
|
||||||
Thread.sleep(500);
|
|
||||||
Assert.assertTrue(result.equals("main_Start_worker__End"));
|
await()
|
||||||
|
.until(() -> assertTrue(result.equals("main_Start_worker__End")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -104,10 +109,10 @@ public class SchedulersTest {
|
|||||||
.subscribe(s ->
|
.subscribe(s ->
|
||||||
result += Thread.currentThread().getName()
|
result += Thread.currentThread().getName()
|
||||||
);
|
);
|
||||||
Thread.sleep(500);
|
|
||||||
Assert.assertTrue(result.equals("main"));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
await()
|
||||||
|
.until(() -> assertTrue(result.equals("main")));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenObservable_whenTrampolineScheduled_thenExecuteOnMainThread() throws InterruptedException {
|
public void givenObservable_whenTrampolineScheduled_thenExecuteOnMainThread() throws InterruptedException {
|
||||||
@ -118,8 +123,9 @@ public class SchedulersTest {
|
|||||||
Observable.just(1, 3, 5, 7, 9)
|
Observable.just(1, 3, 5, 7, 9)
|
||||||
.subscribeOn(Schedulers.trampoline())
|
.subscribeOn(Schedulers.trampoline())
|
||||||
.subscribe(i -> result += "" + i);
|
.subscribe(i -> result += "" + i);
|
||||||
Thread.sleep(500);
|
|
||||||
Assert.assertTrue(result.equals("246813579"));
|
await()
|
||||||
|
.until(() -> assertTrue(result.equals("246813579")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -138,9 +144,9 @@ public class SchedulersTest {
|
|||||||
});
|
});
|
||||||
result += "_mainEnd";
|
result += "_mainEnd";
|
||||||
});
|
});
|
||||||
Thread.sleep(500);
|
|
||||||
Assert.assertTrue(result
|
await()
|
||||||
.equals("mainStart_mainEnd_middleStart_middleEnd_worker_"));
|
.until(() -> assertTrue(result.equals("mainStart_mainEnd_middleStart_middleEnd_worker_")));
|
||||||
}
|
}
|
||||||
|
|
||||||
private ThreadFactory threadFactory(String pattern) {
|
private ThreadFactory threadFactory(String pattern) {
|
||||||
@ -161,7 +167,7 @@ public class SchedulersTest {
|
|||||||
subscriber.onNext("Alfa");
|
subscriber.onNext("Alfa");
|
||||||
subscriber.onNext("Beta");
|
subscriber.onNext("Beta");
|
||||||
subscriber.onCompleted();
|
subscriber.onCompleted();
|
||||||
});;
|
});
|
||||||
|
|
||||||
observable
|
observable
|
||||||
.subscribeOn(schedulerA)
|
.subscribeOn(schedulerA)
|
||||||
@ -171,8 +177,9 @@ public class SchedulersTest {
|
|||||||
Throwable::printStackTrace,
|
Throwable::printStackTrace,
|
||||||
() -> result += "_Completed"
|
() -> 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
|
@Test
|
||||||
@ -181,8 +188,9 @@ public class SchedulersTest {
|
|||||||
Observable.just("io")
|
Observable.just("io")
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.subscribe(i -> result += Thread.currentThread().getName());
|
.subscribe(i -> result += Thread.currentThread().getName());
|
||||||
Thread.sleep(500);
|
|
||||||
Assert.assertTrue(result.equals("RxIoScheduler-2"));
|
await()
|
||||||
|
.until(() -> assertTrue(result.equals("RxIoScheduler-2")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -191,8 +199,9 @@ public class SchedulersTest {
|
|||||||
Observable.just("computation")
|
Observable.just("computation")
|
||||||
.subscribeOn(Schedulers.computation())
|
.subscribeOn(Schedulers.computation())
|
||||||
.subscribe(i -> result += Thread.currentThread().getName());
|
.subscribe(i -> result += Thread.currentThread().getName());
|
||||||
Thread.sleep(500);
|
|
||||||
Assert.assertTrue(result.equals("RxComputationScheduler-1"));
|
await()
|
||||||
|
.until(() -> assertTrue(result.equals("RxComputationScheduler-1")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -203,10 +212,10 @@ public class SchedulersTest {
|
|||||||
|
|
||||||
Observable<Long> tick = Observable.interval(1, TimeUnit.SECONDS, scheduler);
|
Observable<Long> tick = Observable.interval(1, TimeUnit.SECONDS, scheduler);
|
||||||
|
|
||||||
Observable.from(letters)
|
Observable.from(letters)
|
||||||
.zipWith(tick, (string, index) -> index + "-" + string)
|
.zipWith(tick, (string, index) -> index + "-" + string)
|
||||||
.subscribeOn(scheduler)
|
.subscribeOn(scheduler)
|
||||||
.subscribe(subscriber);
|
.subscribe(subscriber);
|
||||||
|
|
||||||
subscriber.assertNoValues();
|
subscriber.assertNoValues();
|
||||||
subscriber.assertNotCompleted();
|
subscriber.assertNotCompleted();
|
||||||
@ -229,10 +238,9 @@ public class SchedulersTest {
|
|||||||
Scheduler schedulerA = Schedulers.from(poolA);
|
Scheduler schedulerA = Schedulers.from(poolA);
|
||||||
Observable.just('A', 'B')
|
Observable.just('A', 'B')
|
||||||
.delay(1, TimeUnit.SECONDS, schedulerA)
|
.delay(1, TimeUnit.SECONDS, schedulerA)
|
||||||
.subscribe(i -> result+= Thread.currentThread().getName() + i + " ");
|
.subscribe(i -> result += Thread.currentThread().getName() + i + " ");
|
||||||
|
|
||||||
Thread.sleep(2000);
|
await()
|
||||||
Assert.assertTrue(result.equals("Sched1-A Sched1-B "));
|
.until(() -> assertTrue(result.equals("Sched1-A Sched1-B ")));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,5 +20,4 @@ public class SingleTest {
|
|||||||
single.subscribe();
|
single.subscribe();
|
||||||
assertTrue(result[0].equals("Hello"));
|
assertTrue(result[0].equals("Hello"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ import static junit.framework.Assert.assertTrue;
|
|||||||
public class SubjectTest {
|
public class SubjectTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubjectAndTwoSubscribers_whenSubscribeOnSubject_thenSubscriberBeginsToAdd(){
|
public void givenSubjectAndTwoSubscribers_whenSubscribeOnSubject_thenSubscriberBeginsToAdd() {
|
||||||
PublishSubject<Integer> subject = PublishSubject.create();
|
PublishSubject<Integer> subject = PublishSubject.create();
|
||||||
|
|
||||||
subject.subscribe(SubjectImpl.getFirstObserver());
|
subject.subscribe(SubjectImpl.getFirstObserver());
|
||||||
|
@ -7,16 +7,18 @@ import rx.Observable;
|
|||||||
import rx.Observer;
|
import rx.Observer;
|
||||||
import rx.exceptions.OnErrorNotImplementedException;
|
import rx.exceptions.OnErrorNotImplementedException;
|
||||||
import rx.schedulers.Schedulers;
|
import rx.schedulers.Schedulers;
|
||||||
|
import rx.schedulers.Timestamped;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static com.jayway.awaitility.Awaitility.await;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class UtilityOperatorsTest {
|
public class UtilityOperatorsTest {
|
||||||
|
|
||||||
int emittedTotal = 0;
|
private int emittedTotal = 0;
|
||||||
int receivedTotal = 0;
|
private int receivedTotal = 0;
|
||||||
String result = "";
|
private String result = "";
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public ExpectedException thrown = ExpectedException.none();
|
public ExpectedException thrown = ExpectedException.none();
|
||||||
@ -39,12 +41,13 @@ public class UtilityOperatorsTest {
|
|||||||
+ Thread.currentThread().getName());
|
+ Thread.currentThread().getName());
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread.sleep(2000);
|
await().until(() -> {
|
||||||
assertTrue(emittedTotal == 1500);
|
assertTrue(emittedTotal == 1500);
|
||||||
assertTrue(receivedTotal == 15000);
|
assertTrue(receivedTotal == 15000);
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenObservable_whenObserveOnBeforeOnNext_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
|
public void givenObservable_whenObserveOnBeforeOnNext_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
|
||||||
|
|
||||||
@ -63,12 +66,12 @@ public class UtilityOperatorsTest {
|
|||||||
+ Thread.currentThread().getName());
|
+ Thread.currentThread().getName());
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread.sleep(2000);
|
await().until(() -> {
|
||||||
assertTrue(emittedTotal == 1500);
|
assertTrue(emittedTotal == 1500);
|
||||||
assertTrue(receivedTotal == 15000);
|
assertTrue(receivedTotal == 15000);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenObservable_whenSubscribeOn_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
|
public void givenObservable_whenSubscribeOn_thenEmitsEventsOnComputeScheduler() throws InterruptedException {
|
||||||
|
|
||||||
@ -87,12 +90,12 @@ public class UtilityOperatorsTest {
|
|||||||
+ Thread.currentThread().getName());
|
+ Thread.currentThread().getName());
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread.sleep(2000);
|
await().until(() -> {
|
||||||
assertTrue(emittedTotal == 1500);
|
assertTrue(emittedTotal == 1500);
|
||||||
assertTrue(receivedTotal == 15000);
|
assertTrue(receivedTotal == 15000);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenObservableWithOneEvent_whenSingle_thenEmitEvent() {
|
public void givenObservableWithOneEvent_whenSingle_thenEmitEvent() {
|
||||||
|
|
||||||
@ -197,15 +200,13 @@ public class UtilityOperatorsTest {
|
|||||||
@Test
|
@Test
|
||||||
public void givenObservables_whenDelay_thenEventsStartAppearAfterATime() throws InterruptedException {
|
public void givenObservables_whenDelay_thenEventsStartAppearAfterATime() throws InterruptedException {
|
||||||
|
|
||||||
Observable source
|
Observable<Timestamped<Long>> source = Observable.interval(1, TimeUnit.SECONDS)
|
||||||
= Observable.interval(1, TimeUnit.SECONDS)
|
|
||||||
.take(5)
|
.take(5)
|
||||||
.timestamp();
|
.timestamp();
|
||||||
|
|
||||||
Observable delay
|
Observable<Timestamped<Long>> delay = source.delaySubscription(2, TimeUnit.SECONDS);
|
||||||
= source.delaySubscription(2, TimeUnit.SECONDS);
|
|
||||||
|
|
||||||
source.subscribe(
|
source.<Long>subscribe(
|
||||||
value -> System.out.println("source :" + value),
|
value -> System.out.println("source :" + value),
|
||||||
t -> System.out.println("source error"),
|
t -> System.out.println("source error"),
|
||||||
() -> System.out.println("source completed"));
|
() -> System.out.println("source completed"));
|
||||||
@ -214,7 +215,7 @@ public class UtilityOperatorsTest {
|
|||||||
value -> System.out.println("delay : " + value),
|
value -> System.out.println("delay : " + value),
|
||||||
t -> System.out.println("delay error"),
|
t -> System.out.println("delay error"),
|
||||||
() -> System.out.println("delay completed"));
|
() -> System.out.println("delay completed"));
|
||||||
Thread.sleep(8000);
|
//Thread.sleep(8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -231,14 +232,12 @@ public class UtilityOperatorsTest {
|
|||||||
|
|
||||||
Observable<Character> values = Observable.using(
|
Observable<Character> values = Observable.using(
|
||||||
() -> "resource",
|
() -> "resource",
|
||||||
r -> {
|
r -> Observable.create(o -> {
|
||||||
return Observable.create(o -> {
|
for (Character c : r.toCharArray()) {
|
||||||
for (Character c : r.toCharArray()) {
|
o.onNext(c);
|
||||||
o.onNext(c);
|
}
|
||||||
}
|
o.onCompleted();
|
||||||
o.onCompleted();
|
}),
|
||||||
});
|
|
||||||
},
|
|
||||||
r -> System.out.println("Disposed: " + r)
|
r -> System.out.println("Disposed: " + r)
|
||||||
);
|
);
|
||||||
values.subscribe(
|
values.subscribe(
|
||||||
@ -248,7 +247,6 @@ public class UtilityOperatorsTest {
|
|||||||
assertTrue(result.equals("resource"));
|
assertTrue(result.equals("resource"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenObservableCached_whenSubscribesWith2Actions_thenEmitsCachedValues() {
|
public void givenObservableCached_whenSubscribesWith2Actions_thenEmitsCachedValues() {
|
||||||
|
|
||||||
@ -269,5 +267,4 @@ public class UtilityOperatorsTest {
|
|||||||
});
|
});
|
||||||
assertTrue(receivedTotal == 8);
|
assertTrue(receivedTotal == 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,13 +13,13 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class AutomapClassTest {
|
public class AutomapClassIntegrationTest {
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
Observable<Integer> create = null;
|
private Observable<Integer> create = null;
|
||||||
Observable<Integer> insert1, insert2 = null;
|
private Observable<Integer> insert1, insert2 = null;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
@ -13,13 +13,13 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class AutomapInterfaceTest {
|
public class AutomapInterfaceIntegrationTest {
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
Observable<Integer> create = null;
|
private Observable<Integer> create = null;
|
||||||
Observable<Integer> insert1, insert2 = null;
|
private Observable<Integer> insert1, insert2 = null;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
@ -57,8 +57,7 @@ public class AutomapInterfaceTest {
|
|||||||
@After
|
@After
|
||||||
public void close() {
|
public void close() {
|
||||||
db.update("DROP TABLE EMPLOYEE")
|
db.update("DROP TABLE EMPLOYEE")
|
||||||
.dependsOn(create);
|
.dependsOn(create);
|
||||||
connectionProvider.close();
|
connectionProvider.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -13,12 +13,12 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class BasicQueryTypesTest {
|
public class BasicQueryTypesIntegrationTest {
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
Observable<Integer> create, insert1, insert2, insert3, update, delete = null;
|
private Observable<Integer> create, insert1, insert2, insert3, update, delete = null;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenCreateTableAndInsertRecords_thenCorrect() {
|
public void whenCreateTableAndInsertRecords_thenCorrect() {
|
@ -16,15 +16,15 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class InsertBlobTest {
|
public class InsertBlobIntegrationTest {
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
String expectedDocument = null;
|
private String expectedDocument = null;
|
||||||
String actualDocument = null;
|
private String actualDocument = null;
|
||||||
|
|
||||||
Observable<Integer> create, insert = null;
|
private Observable<Integer> create, insert = null;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws IOException {
|
public void setup() throws IOException {
|
||||||
@ -62,4 +62,4 @@ public class InsertBlobTest {
|
|||||||
.dependsOn(create);
|
.dependsOn(create);
|
||||||
connectionProvider.close();
|
connectionProvider.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -15,15 +15,15 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class InsertClobTest {
|
public class InsertClobIntegrationTest {
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
String expectedDocument = null;
|
private String expectedDocument = null;
|
||||||
String actualDocument = null;
|
private String actualDocument = null;
|
||||||
|
|
||||||
Observable<Integer> create, insert = null;
|
private Observable<Integer> create, insert = null;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws IOException {
|
public void setup() throws IOException {
|
@ -11,13 +11,13 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class ReturnKeysTest {
|
public class ReturnKeysIntegrationTest {
|
||||||
|
|
||||||
Observable<Boolean> begin, commit = null;
|
private Observable<Boolean> begin = null;
|
||||||
Observable<Integer> createStatement, insertStatement, updateStatement = null;
|
private Observable<Integer> createStatement = null;
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
@ -10,13 +10,12 @@ import com.github.davidmoten.rx.jdbc.Database;
|
|||||||
|
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
public class TransactionTest {
|
public class TransactionIntegrationTest {
|
||||||
|
|
||||||
Observable<Boolean> begin, commit = null;
|
private Observable<Integer> createStatement = null;
|
||||||
Observable<Integer> createStatement, insertStatement, updateStatement = null;
|
|
||||||
|
|
||||||
ConnectionProvider connectionProvider = Connector.connectionProvider;
|
private ConnectionProvider connectionProvider = Connector.connectionProvider;
|
||||||
Database db = Database.from(connectionProvider);
|
private Database db = Database.from(connectionProvider);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void whenCommitTransaction_thenRecordUpdated() {
|
public void whenCommitTransaction_thenRecordUpdated() {
|
@ -9,9 +9,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author aiet
|
|
||||||
*/
|
|
||||||
public class ExceptionHandlingTest {
|
public class ExceptionHandlingTest {
|
||||||
|
|
||||||
private Error UNKNOWN_ERROR = new Error("unknown error");
|
private Error UNKNOWN_ERROR = new Error("unknown error");
|
||||||
@ -19,10 +16,10 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenHandleOnErrorReturn_thenResumed() {
|
public void givenSubscriberAndError_whenHandleOnErrorReturn_thenResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.onErrorReturn(Throwable::getMessage)
|
.onErrorReturn(Throwable::getMessage)
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
@ -34,10 +31,10 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenHandleOnErrorResume_thenResumed() {
|
public void givenSubscriberAndError_whenHandleOnErrorResume_thenResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.onErrorResumeNext(Observable.just("one", "two"))
|
.onErrorResumeNext(Observable.just("one", "two"))
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
@ -49,10 +46,10 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenHandleOnErrorResumeItem_thenResumed() {
|
public void givenSubscriberAndError_whenHandleOnErrorResumeItem_thenResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.onErrorReturnItem("singleValue")
|
.onErrorReturnItem("singleValue")
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
@ -64,10 +61,10 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenHandleOnErrorResumeFunc_thenResumed() {
|
public void givenSubscriberAndError_whenHandleOnErrorResumeFunc_thenResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.onErrorResumeNext(throwable -> {
|
.onErrorResumeNext(throwable -> {
|
||||||
return Observable.just(throwable.getMessage(), "nextValue");
|
return Observable.just(throwable.getMessage(), "nextValue");
|
||||||
})
|
})
|
||||||
@ -81,11 +78,11 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenChangeStateOnError_thenErrorThrown() {
|
public void givenSubscriberAndError_whenChangeStateOnError_thenErrorThrown() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
final AtomicBoolean state = new AtomicBoolean(false);
|
final AtomicBoolean state = new AtomicBoolean(false);
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.doOnError(throwable -> state.set(true))
|
.doOnError(throwable -> state.set(true))
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
@ -97,10 +94,10 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenExceptionOccurOnError_thenCompositeExceptionThrown() {
|
public void givenSubscriberAndError_whenExceptionOccurOnError_thenCompositeExceptionThrown() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.doOnError(throwable -> {
|
.doOnError(throwable -> {
|
||||||
throw new RuntimeException("unexcepted");
|
throw new RuntimeException("unexcepted");
|
||||||
})
|
})
|
||||||
@ -113,10 +110,10 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndException_whenHandleOnException_thenResumed() {
|
public void givenSubscriberAndException_whenHandleOnException_thenResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_EXCEPTION)
|
.<String>error(UNKNOWN_EXCEPTION)
|
||||||
.onExceptionResumeNext(Observable.just("exceptionResumed"))
|
.onExceptionResumeNext(Observable.just("exceptionResumed"))
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
@ -128,14 +125,14 @@ public class ExceptionHandlingTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenHandleOnException_thenNotResumed() {
|
public void givenSubscriberAndError_whenHandleOnException_thenNotResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.onExceptionResumeNext(Observable.just("exceptionResumed"))
|
.onExceptionResumeNext(Observable.just("exceptionResumed"))
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
testObserver.assertError(UNKNOWN_ERROR);
|
testObserver.assertError(UNKNOWN_ERROR);
|
||||||
testObserver.assertNotComplete();
|
testObserver.assertNotComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,20 +9,17 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
|
||||||
* @author aiet
|
|
||||||
*/
|
|
||||||
public class OnErrorRetryTest {
|
public class OnErrorRetryTest {
|
||||||
|
|
||||||
private Error UNKNOWN_ERROR = new Error("unknown error");
|
private Error UNKNOWN_ERROR = new Error("unknown error");
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryOnError_thenRetryConfirmed() {
|
public void givenSubscriberAndError_whenRetryOnError_thenRetryConfirmed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
AtomicInteger atomicCounter = new AtomicInteger(0);
|
AtomicInteger atomicCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(() -> {
|
.<String>error(() -> {
|
||||||
atomicCounter.incrementAndGet();
|
atomicCounter.incrementAndGet();
|
||||||
return UNKNOWN_ERROR;
|
return UNKNOWN_ERROR;
|
||||||
})
|
})
|
||||||
@ -37,12 +34,12 @@ public class OnErrorRetryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryConditionallyOnError_thenRetryConfirmed() {
|
public void givenSubscriberAndError_whenRetryConditionallyOnError_thenRetryConfirmed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
|
|
||||||
AtomicInteger atomicCounter = new AtomicInteger(0);
|
AtomicInteger atomicCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(() -> {
|
.<String>error(() -> {
|
||||||
atomicCounter.incrementAndGet();
|
atomicCounter.incrementAndGet();
|
||||||
return UNKNOWN_ERROR;
|
return UNKNOWN_ERROR;
|
||||||
})
|
})
|
||||||
@ -57,11 +54,11 @@ public class OnErrorRetryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryUntilOnError_thenRetryConfirmed() {
|
public void givenSubscriberAndError_whenRetryUntilOnError_thenRetryConfirmed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
AtomicInteger atomicCounter = new AtomicInteger(0);
|
AtomicInteger atomicCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.retryUntil(() -> atomicCounter.incrementAndGet() > 3)
|
.retryUntil(() -> atomicCounter.incrementAndGet() > 3)
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
@ -73,12 +70,12 @@ public class OnErrorRetryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryWhenOnError_thenRetryConfirmed() {
|
public void givenSubscriberAndError_whenRetryWhenOnError_thenRetryConfirmed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
Exception noretryException = new Exception("don't retry");
|
Exception noretryException = new Exception("don't retry");
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.retryWhen(throwableObservable -> Observable.error(noretryException))
|
.retryWhen(throwableObservable -> Observable.<String>error(noretryException))
|
||||||
.subscribe(testObserver);
|
.subscribe(testObserver);
|
||||||
|
|
||||||
testObserver.assertError(noretryException);
|
testObserver.assertError(noretryException);
|
||||||
@ -88,11 +85,11 @@ public class OnErrorRetryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryWhenOnError_thenCompleted() {
|
public void givenSubscriberAndError_whenRetryWhenOnError_thenCompleted() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
AtomicInteger atomicCounter = new AtomicInteger(0);
|
AtomicInteger atomicCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(() -> {
|
.<String>error(() -> {
|
||||||
atomicCounter.incrementAndGet();
|
atomicCounter.incrementAndGet();
|
||||||
return UNKNOWN_ERROR;
|
return UNKNOWN_ERROR;
|
||||||
})
|
})
|
||||||
@ -107,11 +104,11 @@ public class OnErrorRetryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryWhenOnError_thenResubscribed() {
|
public void givenSubscriberAndError_whenRetryWhenOnError_thenResubscribed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
AtomicInteger atomicCounter = new AtomicInteger(0);
|
AtomicInteger atomicCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(() -> {
|
.<String>error(() -> {
|
||||||
atomicCounter.incrementAndGet();
|
atomicCounter.incrementAndGet();
|
||||||
return UNKNOWN_ERROR;
|
return UNKNOWN_ERROR;
|
||||||
})
|
})
|
||||||
@ -126,11 +123,11 @@ public class OnErrorRetryTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenSubscriberAndError_whenRetryWhenForMultipleTimesOnError_thenResumed() {
|
public void givenSubscriberAndError_whenRetryWhenForMultipleTimesOnError_thenResumed() {
|
||||||
TestObserver testObserver = new TestObserver();
|
TestObserver<String> testObserver = new TestObserver<>();
|
||||||
long before = System.currentTimeMillis();
|
long before = System.currentTimeMillis();
|
||||||
|
|
||||||
Observable
|
Observable
|
||||||
.error(UNKNOWN_ERROR)
|
.<String>error(UNKNOWN_ERROR)
|
||||||
.retryWhen(throwableObservable -> throwableObservable
|
.retryWhen(throwableObservable -> throwableObservable
|
||||||
.zipWith(Observable.range(1, 3), (throwable, integer) -> integer)
|
.zipWith(Observable.range(1, 3), (throwable, integer) -> integer)
|
||||||
.flatMap(integer -> {
|
.flatMap(integer -> {
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>2.0.0.M1</version>
|
<version>2.0.0.M3</version>
|
||||||
<relativePath/>
|
<relativePath/>
|
||||||
<!-- lookup parent from repository -->
|
<!-- lookup parent from repository -->
|
||||||
</parent>
|
</parent>
|
||||||
@ -165,14 +165,6 @@
|
|||||||
</build>
|
</build>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<id>spring-snapshots</id>
|
|
||||||
<name>Spring Snapshots</name>
|
|
||||||
<url>https://repo.spring.io/snapshot</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>spring-milestones</id>
|
<id>spring-milestones</id>
|
||||||
<name>Spring Milestones</name>
|
<name>Spring Milestones</name>
|
||||||
@ -183,14 +175,6 @@
|
|||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
<pluginRepositories>
|
<pluginRepositories>
|
||||||
<pluginRepository>
|
|
||||||
<id>spring-snapshots</id>
|
|
||||||
<name>Spring Snapshots</name>
|
|
||||||
<url>https://repo.spring.io/snapshot</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</pluginRepository>
|
|
||||||
<pluginRepository>
|
<pluginRepository>
|
||||||
<id>spring-milestones</id>
|
<id>spring-milestones</id>
|
||||||
<name>Spring Milestones</name>
|
<name>Spring Milestones</name>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>2.0.0.M1</version>
|
<version>2.0.0.M3</version>
|
||||||
<relativePath /> <!-- lookup parent from repository -->
|
<relativePath /> <!-- lookup parent from repository -->
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@ -143,14 +143,6 @@
|
|||||||
</build>
|
</build>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<id>spring-snapshots</id>
|
|
||||||
<name>Spring Snapshots</name>
|
|
||||||
<url>https://repo.spring.io/snapshot</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>spring-milestones</id>
|
<id>spring-milestones</id>
|
||||||
<name>Spring Milestones</name>
|
<name>Spring Milestones</name>
|
||||||
@ -161,14 +153,6 @@
|
|||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
<pluginRepositories>
|
<pluginRepositories>
|
||||||
<pluginRepository>
|
|
||||||
<id>spring-snapshots</id>
|
|
||||||
<name>Spring Snapshots</name>
|
|
||||||
<url>https://repo.spring.io/snapshot</url>
|
|
||||||
<snapshots>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
</snapshots>
|
|
||||||
</pluginRepository>
|
|
||||||
<pluginRepository>
|
<pluginRepository>
|
||||||
<id>spring-milestones</id>
|
<id>spring-milestones</id>
|
||||||
<name>Spring Milestones</name>
|
<name>Spring Milestones</name>
|
||||||
@ -183,10 +167,10 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<junit.platform.version>1.0.0-M4</junit.platform.version>
|
<junit.platform.version>1.0.0</junit.platform.version>
|
||||||
<junit.jupiter.version>5.0.0-M4</junit.jupiter.version>
|
<junit.jupiter.version>5.0.0</junit.jupiter.version>
|
||||||
<maven-surefire-plugin.version>2.20</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>2.20</maven-surefire-plugin.version>
|
||||||
<spring.version>5.0.0.RC2</spring.version>
|
<spring.version>5.0.0.RELEASE</spring.version>
|
||||||
<reactor-spring.version>1.0.1.RELEASE</reactor-spring.version>
|
<reactor-spring.version>1.0.1.RELEASE</reactor-spring.version>
|
||||||
<johnzon.version>1.1.3</johnzon.version>
|
<johnzon.version>1.1.3</johnzon.version>
|
||||||
<jsonb-api.version>1.0</jsonb-api.version>
|
<jsonb-api.version>1.0</jsonb-api.version>
|
||||||
|
@ -33,7 +33,7 @@ public class ExploreSpring5URLPatternUsingRouterFunctions {
|
|||||||
WebServer start() throws Exception {
|
WebServer start() throws Exception {
|
||||||
WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction());
|
WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction());
|
||||||
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler)
|
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler)
|
||||||
.prependFilter(new IndexRewriteFilter())
|
.filter(new IndexRewriteFilter())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Tomcat tomcat = new Tomcat();
|
Tomcat tomcat = new Tomcat();
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
package com.baeldung.functional;
|
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.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
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.reactive.function.server.ServerResponse;
|
||||||
import org.springframework.web.server.WebHandler;
|
import org.springframework.web.server.WebHandler;
|
||||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
||||||
|
|
||||||
import reactor.core.publisher.Flux;
|
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
|
@SpringBootApplication
|
||||||
@ComponentScan(basePackages = { "com.baeldung.functional" })
|
@ComponentScan(basePackages = { "com.baeldung.functional" })
|
||||||
public class FunctionalSpringBootApplication {
|
public class FunctionalSpringBootApplication {
|
||||||
@ -57,7 +60,7 @@ public class FunctionalSpringBootApplication {
|
|||||||
@Bean
|
@Bean
|
||||||
public ServletRegistrationBean servletRegistrationBean() throws Exception {
|
public ServletRegistrationBean servletRegistrationBean() throws Exception {
|
||||||
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction()))
|
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction()))
|
||||||
.prependFilter(new IndexRewriteFilter())
|
.filter(new IndexRewriteFilter())
|
||||||
.build();
|
.build();
|
||||||
ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new RootServlet(httpHandler), "/");
|
ServletRegistrationBean registrationBean = new ServletRegistrationBean<>(new RootServlet(httpHandler), "/");
|
||||||
registrationBean.setLoadOnStartup(1);
|
registrationBean.setLoadOnStartup(1);
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
package com.baeldung.functional;
|
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.Context;
|
||||||
import org.apache.catalina.startup.Tomcat;
|
import org.apache.catalina.startup.Tomcat;
|
||||||
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
|
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.reactive.function.server.ServerResponse;
|
||||||
import org.springframework.web.server.WebHandler;
|
import org.springframework.web.server.WebHandler;
|
||||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
||||||
|
|
||||||
import reactor.core.publisher.Flux;
|
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 {
|
public class FunctionalWebApplication {
|
||||||
|
|
||||||
private static final Actor BRAD_PITT = new Actor("Brad", "Pitt");
|
private static final Actor BRAD_PITT = new Actor("Brad", "Pitt");
|
||||||
@ -50,7 +53,7 @@ public class FunctionalWebApplication {
|
|||||||
WebServer start() throws Exception {
|
WebServer start() throws Exception {
|
||||||
WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction());
|
WebHandler webHandler = (WebHandler) toHttpHandler(routingFunction());
|
||||||
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler)
|
HttpHandler httpHandler = WebHttpHandlerBuilder.webHandler(webHandler)
|
||||||
.prependFilter(new IndexRewriteFilter())
|
.filter(new IndexRewriteFilter())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Tomcat tomcat = new Tomcat();
|
Tomcat tomcat = new Tomcat();
|
||||||
|
@ -1,5 +1,20 @@
|
|||||||
package com.baeldung.functional;
|
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.core.io.ClassPathResource;
|
||||||
import org.springframework.http.server.reactive.HttpHandler;
|
import org.springframework.http.server.reactive.HttpHandler;
|
||||||
import org.springframework.http.server.reactive.ServletHttpHandlerAdapter;
|
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.RouterFunction;
|
||||||
import org.springframework.web.reactive.function.server.RouterFunctions;
|
import org.springframework.web.reactive.function.server.RouterFunctions;
|
||||||
import org.springframework.web.reactive.function.server.ServerResponse;
|
import org.springframework.web.reactive.function.server.ServerResponse;
|
||||||
|
import org.springframework.web.server.WebHandler;
|
||||||
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
import org.springframework.web.server.adapter.WebHttpHandlerBuilder;
|
||||||
|
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
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 class RootServlet extends ServletHttpHandlerAdapter {
|
||||||
|
|
||||||
public RootServlet() {
|
public RootServlet() {
|
||||||
this(WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction()))
|
this(WebHttpHandlerBuilder.webHandler((WebHandler) toHttpHandler(routingFunction()))
|
||||||
.prependFilter(new IndexRewriteFilter())
|
.filter(new IndexRewriteFilter())
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import javax.json.bind.annotation.JsonbTransient;
|
|||||||
|
|
||||||
public class Person {
|
public class Person {
|
||||||
|
|
||||||
|
private int id;
|
||||||
@JsonbProperty("person-name")
|
@JsonbProperty("person-name")
|
||||||
private String name;
|
private String name;
|
||||||
@JsonbProperty(nillable = true)
|
@JsonbProperty(nillable = true)
|
||||||
@ -23,8 +24,9 @@ public class Person {
|
|||||||
public 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();
|
super();
|
||||||
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.email = email;
|
this.email = email;
|
||||||
this.age = age;
|
this.age = age;
|
||||||
@ -32,6 +34,14 @@ public class Person {
|
|||||||
this.salary = salary;
|
this.salary = salary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
public int getAge() {
|
public int getAge() {
|
||||||
return age;
|
return age;
|
||||||
}
|
}
|
||||||
@ -76,7 +86,9 @@ public class Person {
|
|||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
builder.append("Person [name=");
|
builder.append("Person [id=");
|
||||||
|
builder.append(id);
|
||||||
|
builder.append(", name=");
|
||||||
builder.append(name);
|
builder.append(name);
|
||||||
builder.append(", email=");
|
builder.append(", email=");
|
||||||
builder.append(email);
|
builder.append(email);
|
||||||
@ -94,11 +106,7 @@ public class Person {
|
|||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + age;
|
result = prime * result + id;
|
||||||
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());
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,27 +119,7 @@ public class Person {
|
|||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
Person other = (Person) obj;
|
Person other = (Person) obj;
|
||||||
if (age != other.age)
|
if (id != other.id)
|
||||||
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))
|
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -26,12 +26,12 @@ public class PersonController {
|
|||||||
public void init() {
|
public void init() {
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
personRepository = new ArrayList<>(Arrays.asList(
|
personRepository = new ArrayList<>(Arrays.asList(
|
||||||
new Person("Jhon", "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("Jhon", "jhon1@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1500)),
|
new Person(2, "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(3, "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(4, "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(5, "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(6, "Julia", "jhon@test.com", 20, LocalDate.of(2019, 9, 9), BigDecimal.valueOf(1000))));
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,28 +1,36 @@
|
|||||||
package com.baeldung.jupiter;
|
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.Constructor;
|
||||||
import java.lang.reflect.Executable;
|
import java.lang.reflect.Executable;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Parameter;
|
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 {
|
public class SpringExtension implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, ParameterResolver {
|
||||||
|
|
||||||
private static final ExtensionContext.Namespace namespace = ExtensionContext.Namespace.create(SpringExtension.class);
|
private static final ExtensionContext.Namespace namespace = ExtensionContext.Namespace.create(SpringExtension.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeAll(ContainerExtensionContext context) throws Exception {
|
public void beforeAll(ExtensionContext context) throws Exception {
|
||||||
getTestContextManager(context).beforeTestClass();
|
getTestContextManager(context).beforeTestClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterAll(ContainerExtensionContext context) throws Exception {
|
public void afterAll(ExtensionContext context) throws Exception {
|
||||||
try {
|
try {
|
||||||
getTestContextManager(context).afterTestClass();
|
getTestContextManager(context).afterTestClass();
|
||||||
} finally {
|
} finally {
|
||||||
@ -38,7 +46,7 @@ public class SpringExtension implements BeforeAllCallback, AfterAllCallback, Tes
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeEach(TestExtensionContext context) throws Exception {
|
public void beforeEach(ExtensionContext context) throws Exception {
|
||||||
Object testInstance = context.getTestInstance();
|
Object testInstance = context.getTestInstance();
|
||||||
Method testMethod = context.getTestMethod()
|
Method testMethod = context.getTestMethod()
|
||||||
.get();
|
.get();
|
||||||
@ -46,24 +54,24 @@ public class SpringExtension implements BeforeAllCallback, AfterAllCallback, Tes
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterEach(TestExtensionContext context) throws Exception {
|
public void afterEach(ExtensionContext context) throws Exception {
|
||||||
Object testInstance = context.getTestInstance();
|
Object testInstance = context.getTestInstance();
|
||||||
Method testMethod = context.getTestMethod()
|
Method testMethod = context.getTestMethod()
|
||||||
.get();
|
.get();
|
||||||
Throwable testException = context.getTestException()
|
Throwable testException = context.getExecutionException()
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
getTestContextManager(context).afterTestMethod(testInstance, testMethod, testException);
|
getTestContextManager(context).afterTestMethod(testInstance, testMethod, testException);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supports(ParameterContext parameterContext, ExtensionContext extensionContext) {
|
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
|
||||||
Parameter parameter = parameterContext.getParameter();
|
Parameter parameter = parameterContext.getParameter();
|
||||||
Executable executable = parameter.getDeclaringExecutable();
|
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
|
@Override
|
||||||
public Object resolve(ParameterContext parameterContext, ExtensionContext extensionContext) {
|
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
|
||||||
Parameter parameter = parameterContext.getParameter();
|
Parameter parameter = parameterContext.getParameter();
|
||||||
Class<?> testClass = extensionContext.getTestClass()
|
Class<?> testClass = extensionContext.getTestClass()
|
||||||
.get();
|
.get();
|
||||||
|
@ -30,15 +30,14 @@ public class JsonbIntegrationTest {
|
|||||||
ResponseEntity<Person> response = template.withBasicAuth(username, password)
|
ResponseEntity<Person> response = template.withBasicAuth(username, password)
|
||||||
.getForEntity("/person/1", Person.class);
|
.getForEntity("/person/1", Person.class);
|
||||||
Person person = response.getBody();
|
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
|
@Test
|
||||||
public void whenSendPostAPerson_thenGetOkStatus() {
|
public void whenSendPostAPerson_thenGetOkStatus() {
|
||||||
ResponseEntity<Boolean> response = template.withBasicAuth(username, password)
|
ResponseEntity<Boolean> response = template.withBasicAuth(username, password)
|
||||||
.postForEntity("/person", "{\"birthDate\":\"07-09-2017\",\"email\":\"jhon1@test.com\",\"person-name\":\"Jhon\"}", Boolean.class);
|
.postForEntity("/person", "{\"birthDate\":\"07-09-2017\",\"email\":\"jhon1@test.com\",\"person-name\":\"Jhon\",\"id\":10}", Boolean.class);
|
||||||
boolean value = response.getBody();
|
assertTrue(response.getBody());
|
||||||
assertTrue(true == value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,15 +22,15 @@ public class JsonbTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenPersonObject_whenSerializeWithJsonb_thenGetPersonJson() {
|
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);
|
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
|
@Test
|
||||||
public void givenPersonJson_whenDeserializeWithJsonb_thenGetPersonObject() {
|
public void givenPersonJson_whenDeserializeWithJsonb_thenGetPersonObject() {
|
||||||
Person person = new Person("Jhon", "jhon@test.com", 0, LocalDate.of(2019, 9, 7), BigDecimal.valueOf(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\",\"person-name\":\"Jhon\",\"registeredDate\":\"07-09-2019\",\"salary\":\"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)
|
assertTrue(jsonb.fromJson(jsonPerson, Person.class)
|
||||||
.equals(person));
|
.equals(person));
|
||||||
}
|
}
|
||||||
|
@ -8,4 +8,3 @@
|
|||||||
- [Spring YAML Configuration](http://www.baeldung.com/spring-yaml)
|
- [Spring YAML Configuration](http://www.baeldung.com/spring-yaml)
|
||||||
- [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils)
|
- [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils)
|
||||||
- [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults)
|
- [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults)
|
||||||
|
|
||||||
|
@ -2,15 +2,9 @@ package com.baeldung.hibernate.immutable.entities;
|
|||||||
|
|
||||||
import org.hibernate.annotations.Cascade;
|
import org.hibernate.annotations.Cascade;
|
||||||
import org.hibernate.annotations.CascadeType;
|
import org.hibernate.annotations.CascadeType;
|
||||||
import org.hibernate.annotations.GenericGenerator;
|
|
||||||
import org.hibernate.annotations.Immutable;
|
import org.hibernate.annotations.Immutable;
|
||||||
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.*;
|
||||||
import javax.persistence.ElementCollection;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@ -20,8 +14,6 @@ public class Event {
|
|||||||
|
|
||||||
@Id
|
@Id
|
||||||
@Column(name = "event_id")
|
@Column(name = "event_id")
|
||||||
@GeneratedValue(generator = "increment")
|
|
||||||
@GenericGenerator(name = "increment", strategy = "increment")
|
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Column(name = "title")
|
@Column(name = "title")
|
||||||
@ -31,6 +23,14 @@ public class Event {
|
|||||||
@Immutable
|
@Immutable
|
||||||
private Set<String> guestList;
|
private Set<String> guestList;
|
||||||
|
|
||||||
|
public Event() {}
|
||||||
|
|
||||||
|
public Event(Long id, String title, Set<String> guestList) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.guestList = guestList;
|
||||||
|
}
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package com.baeldung.hibernate.immutable.util;
|
package com.baeldung.hibernate.immutable.util;
|
||||||
|
|
||||||
import com.baeldung.hibernate.immutable.entities.Event;
|
import com.baeldung.hibernate.immutable.entities.Event;
|
||||||
|
import com.baeldung.hibernate.immutable.entities.EventGeneratedId;
|
||||||
import org.hibernate.SessionFactory;
|
import org.hibernate.SessionFactory;
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.Configuration;
|
import org.hibernate.cfg.Configuration;
|
||||||
@ -14,6 +15,7 @@ public class HibernateUtil {
|
|||||||
// Create a session factory from immutable.cfg.xml
|
// Create a session factory from immutable.cfg.xml
|
||||||
Configuration configuration = new Configuration();
|
Configuration configuration = new Configuration();
|
||||||
configuration.addAnnotatedClass(Event.class);
|
configuration.addAnnotatedClass(Event.class);
|
||||||
|
configuration.addAnnotatedClass(EventGeneratedId.class);
|
||||||
configuration.configure("immutable.cfg.xml");
|
configuration.configure("immutable.cfg.xml");
|
||||||
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
|
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
|
||||||
return configuration.buildSessionFactory(serviceRegistry);
|
return configuration.buildSessionFactory(serviceRegistry);
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
|
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
|
||||||
<property name="driverClassName" value="${jdbc.driverClassName}"/>
|
<property name="driverClassName" value="${jdbc.driverClassName}"/>
|
||||||
<property name="url" value="${jdbc.url}"/>
|
<property name="url" value="${jdbc.url}"/>
|
||||||
<property name="username" value="${jdbc.user}"/>
|
<property name="username" value="${jdbc.eventGeneratedId}"/>
|
||||||
<property name="password" value="${jdbc.pass}"/>
|
<property name="password" value="${jdbc.pass}"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user