Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.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/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.spockframework</groupId>
|
||||
<artifactId>groovy-spock</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>Spock Framework - Example Project</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.gmavenplus</groupId>
|
||||
<artifactId>gmavenplus-plugin</artifactId>
|
||||
<version>1.5</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>compile</goal>
|
||||
<goal>testCompile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spockframework</groupId>
|
||||
<artifactId>spock-core</artifactId>
|
||||
<version>1.0-groovy-2.4</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.groovy</groupId>
|
||||
<artifactId>groovy-all</artifactId>
|
||||
<version>2.4.7</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,89 @@
|
||||
import spock.lang.Specification
|
||||
|
||||
class FirstSpecification extends Specification {
|
||||
|
||||
def "one plus one should equal two"() {
|
||||
expect:
|
||||
1 + 1 == 2
|
||||
}
|
||||
|
||||
def "two plus two should equal four"() {
|
||||
given:
|
||||
int left = 2
|
||||
int right = 2
|
||||
|
||||
when:
|
||||
int result = left + right
|
||||
|
||||
then:
|
||||
result == 4
|
||||
}
|
||||
|
||||
def "Should be able to remove from list"() {
|
||||
given:
|
||||
def list = [1, 2, 3, 4]
|
||||
|
||||
when:
|
||||
list.remove(0)
|
||||
|
||||
then:
|
||||
list == [2, 3, 4]
|
||||
}
|
||||
|
||||
def "Should get an index out of bounds when removing a non-existent item"() {
|
||||
given:
|
||||
def list = [1, 2, 3, 4]
|
||||
|
||||
when:
|
||||
list.remove(20)
|
||||
|
||||
then:
|
||||
thrown(IndexOutOfBoundsException)
|
||||
list.size() == 4
|
||||
}
|
||||
|
||||
def "numbers to the power of two"(int a, int b, int c) {
|
||||
expect:
|
||||
Math.pow(a, b) == c
|
||||
|
||||
where:
|
||||
a | b | c
|
||||
1 | 2 | 1
|
||||
2 | 2 | 4
|
||||
3 | 2 | 9
|
||||
}
|
||||
|
||||
def "Should return default value for mock"() {
|
||||
given:
|
||||
def paymentGateway = Mock(PaymentGateway)
|
||||
|
||||
when:
|
||||
def result = paymentGateway.makePayment(12.99)
|
||||
|
||||
then:
|
||||
!result
|
||||
}
|
||||
|
||||
def "Should return true value for mock"() {
|
||||
given:
|
||||
def paymentGateway = Mock(PaymentGateway)
|
||||
paymentGateway.makePayment(20) >> true
|
||||
|
||||
when:
|
||||
def result = paymentGateway.makePayment(20)
|
||||
|
||||
then:
|
||||
result
|
||||
}
|
||||
|
||||
def "Should verify notify was called"() {
|
||||
given:
|
||||
def notifier = Mock(Notifier)
|
||||
|
||||
when:
|
||||
notifier.notify('foo')
|
||||
|
||||
then:
|
||||
1 * notifier.notify('foo')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
interface Notifier {
|
||||
void notify(String message)
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
interface PaymentGateway {
|
||||
boolean makePayment(BigDecimal amount)
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
package org.baeldung.guava;
|
||||
|
||||
import com.google.common.math.DoubleMath;
|
||||
import com.google.common.math.IntMath;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.math.RoundingMode;
|
||||
|
||||
import static org.hamcrest.core.IsEqual.equalTo;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
public class GuavaMathTest {
|
||||
@Test
|
||||
public void testIntMathAdd() {
|
||||
try {
|
||||
IntMath.checkedAdd(Integer.MAX_VALUE, 1);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
try {
|
||||
IntMath.checkedAdd(Integer.MIN_VALUE, -1);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
int result1 = IntMath.checkedAdd(2, 1);
|
||||
assertThat(result1, equalTo(3));
|
||||
|
||||
int result2 = IntMath.saturatedAdd(Integer.MAX_VALUE, 100);
|
||||
assertThat(result2, equalTo(Integer.MAX_VALUE));
|
||||
|
||||
int result3 = IntMath.saturatedAdd(Integer.MIN_VALUE, -100);
|
||||
assertThat(result3, equalTo(Integer.MIN_VALUE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIntMathSubtract() {
|
||||
try {
|
||||
IntMath.checkedSubtract(Integer.MIN_VALUE, 1);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
try {
|
||||
IntMath.checkedSubtract(Integer.MAX_VALUE, -1);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
};
|
||||
|
||||
int result1 = IntMath.checkedSubtract(200, 100);
|
||||
assertThat(result1, equalTo(100));
|
||||
|
||||
int result2 = IntMath.saturatedSubtract(Integer.MIN_VALUE, 1);
|
||||
assertThat(result2, equalTo(Integer.MIN_VALUE));
|
||||
|
||||
int result3 = IntMath.saturatedSubtract(Integer.MAX_VALUE, -1);
|
||||
assertThat(result3, equalTo(Integer.MAX_VALUE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIntMathMultiply() {
|
||||
try {
|
||||
IntMath.checkedMultiply(Integer.MAX_VALUE, 2);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
try {
|
||||
IntMath.checkedMultiply(Integer.MIN_VALUE, 2);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
int result1 = IntMath.checkedMultiply(21, 3);
|
||||
assertThat(result1, equalTo(63));
|
||||
|
||||
int result2 = IntMath.saturatedMultiply(Integer.MAX_VALUE, 2);
|
||||
assertThat(result2, equalTo(Integer.MAX_VALUE));
|
||||
|
||||
int result3 = IntMath.saturatedMultiply(Integer.MIN_VALUE, 2);
|
||||
assertThat(result3, equalTo(Integer.MIN_VALUE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIntMathPow() {
|
||||
try {
|
||||
IntMath.checkedPow(Integer.MAX_VALUE, 2);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
try {
|
||||
IntMath.checkedPow(Integer.MIN_VALUE, 3);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
|
||||
int result1 = IntMath.saturatedPow(3, 3);
|
||||
assertThat(result1, equalTo(27));
|
||||
|
||||
int result2 = IntMath.saturatedPow(Integer.MAX_VALUE, 2);
|
||||
assertThat(result2, equalTo(Integer.MAX_VALUE));
|
||||
|
||||
int result3 = IntMath.saturatedPow(Integer.MIN_VALUE, 3);
|
||||
assertThat(result3, equalTo(Integer.MIN_VALUE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIntMathRound() {
|
||||
int result1 = IntMath.divide(3, 2, RoundingMode.DOWN);
|
||||
assertThat(result1, equalTo(1));
|
||||
int result2 = IntMath.divide(3, 2, RoundingMode.UP);
|
||||
assertThat(result2, equalTo(2));
|
||||
|
||||
int result3 = IntMath.log2(5, RoundingMode.FLOOR);
|
||||
assertThat(result3, equalTo(2));
|
||||
int result4 = IntMath.log2(5, RoundingMode.CEILING);
|
||||
assertThat(result4, equalTo(3));
|
||||
|
||||
int result5 = IntMath.log10(11, RoundingMode.HALF_UP);
|
||||
assertThat(result5, equalTo(1));
|
||||
|
||||
int result6 = IntMath.sqrt(4, RoundingMode.UNNECESSARY);
|
||||
assertThat(result6, equalTo(2));
|
||||
try {
|
||||
IntMath.sqrt(5, RoundingMode.UNNECESSARY);
|
||||
assertTrue(false);
|
||||
} catch (ArithmeticException e) {
|
||||
assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIntMathAdditionalFunctions() {
|
||||
int result1 = IntMath.gcd(15, 20);
|
||||
assertThat(result1, equalTo(5));
|
||||
|
||||
int result2 = IntMath.mod(8, 3);
|
||||
assertThat(result2, equalTo(2));
|
||||
|
||||
boolean result3 = IntMath.isPowerOfTwo(8);
|
||||
assertTrue(result3);
|
||||
boolean result4 = IntMath.isPowerOfTwo(9);
|
||||
assertFalse(result4);
|
||||
|
||||
int result5 = IntMath.factorial(4);
|
||||
assertThat(result5, equalTo(24));
|
||||
|
||||
int result6 = IntMath.binomial(7, 3);
|
||||
assertThat(result6, equalTo(35));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_detect_integer() {
|
||||
boolean result1 = DoubleMath.isMathematicalInteger(2.0);
|
||||
assertThat(result1, equalTo(true));
|
||||
boolean result2 = DoubleMath.isMathematicalInteger(2.1);
|
||||
assertThat(result2, equalTo(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_round_to_integer_types() {
|
||||
int result3 = DoubleMath.roundToInt(2.5, RoundingMode.DOWN);
|
||||
assertThat(result3, equalTo(2));
|
||||
|
||||
long result4 = DoubleMath.roundToLong(2.5, RoundingMode.HALF_UP);
|
||||
assertThat(result4, equalTo(3L));
|
||||
|
||||
BigInteger result5 = DoubleMath.roundToBigInteger(2.5, RoundingMode.UP);
|
||||
assertThat(result5, equalTo(new BigInteger("3")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_calculate_log_2() {
|
||||
int result6 = DoubleMath.log2(10, RoundingMode.UP);
|
||||
assertThat(result6, equalTo(4));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
About the application
|
||||
---------------------
|
||||
This application demonstrates the usage of JavaEE Web Annotations.
|
||||
|
||||
|
||||
Contents of the application
|
||||
---------------------------
|
||||
1. AccountServlet.java - Demonstrates the @WebServlet and @ServletSecurity annotation.
|
||||
|
||||
NOTES: @WebServlet annotation designates the AccountServlet class as a Servlet component.
|
||||
The usage of its parameters 'urlPatterns' & 'initParams' can be observed.
|
||||
An initialization parameter 'type' is being set to denote the type of the bank account.
|
||||
|
||||
@ServletSecurity annotation imposes security constraints on the AccountServlet based on
|
||||
the tomcat-users.xml (this code assumes there is a role 'admin' in your tomcat-users.xml)
|
||||
|
||||
N.B : To see @ServletSecurity annotation in action, please uncomment the annotation code
|
||||
for @ServletSecurity.
|
||||
|
||||
|
||||
2. BankAppServletContextListener.java - Demonstrates the @WebListener annotation for denoting a class as a ServletContextListener.
|
||||
|
||||
NOTES: Sets a Servlet context attribute ATTR_DEFAULT_LANGUAGE to 'english' on web application start up,
|
||||
which can then be used throughout the application.
|
||||
|
||||
|
||||
3. LogInFilter.java - Demonstrates the @WebFilter annotation.
|
||||
|
||||
NOTES: @WebFilter annotation designates the LogInFilter class as a Filter component.
|
||||
It filters all requests to the bank account servlet and redirects them to
|
||||
the login page.
|
||||
|
||||
N.B : To see @WebFilter annotation in action, please uncomment the annotation code for @WebFilter.
|
||||
|
||||
|
||||
4. UploadCustomerDocumentsServlet.java - Demonstrates the @MultipartConfig annotation.
|
||||
|
||||
NOTES: @MultipartConfig anotation designates the UploadCustomerDocumentsServlet Servlet component,
|
||||
to handle multipart/form-data requests.
|
||||
To see it in action, deploy the web application an access the url: http://<your host>:<your port>/JavaEEAnnotationsSample/upload.jsp
|
||||
Once you upload a file from here, it will get uploaded to D:/custDocs (assuming such a folder exists).
|
||||
|
||||
|
||||
5. index.jsp - This is the welcome page.
|
||||
|
||||
NOTES: You can enter a deposit amount here and click on the 'Deposit' button to see the AccountServlet in action.
|
||||
|
||||
6. login.jsp - All requests to the AccountServlet are redirected to this page, if the LogInFilter is imposed.
|
||||
|
||||
7. upload.jsp - Demonstrates the usage of handling multipart/form-data requests by the UploadCustomerDocumentsServlet.
|
||||
|
||||
|
||||
Building and Running the application
|
||||
------------------------------------
|
||||
To build the application:
|
||||
|
||||
1. Open the project in eclipse
|
||||
2. Right click on it in eclispe and choose Run As > Maven build
|
||||
3. Give 'clean install' under Goals
|
||||
4. This should build the WAR file of the application
|
||||
|
||||
To run the application:
|
||||
|
||||
1. Right click on the project
|
||||
2. Run as > Run on Server
|
||||
3. This will start you Tomcat server and deploy the application (Provided that you have configured Tomcat in your eclipse)
|
||||
4. You should now be able to access the url : http://<your host>:<your port>/JavaEEAnnotationsSample
|
||||
+3
-7
@@ -36,19 +36,15 @@ public class AccountServlet extends javax.servlet.http.HttpServlet {
|
||||
}
|
||||
|
||||
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||
|
||||
double accountBalance = 1000d;
|
||||
double interestRate = Double.parseDouble(request.getAttribute("interest").toString());
|
||||
|
||||
String paramDepositAmt = request.getParameter("dep");
|
||||
double depositAmt = Double.parseDouble(paramDepositAmt);
|
||||
|
||||
accountBalance = accountBalance + depositAmt;
|
||||
|
||||
|
||||
PrintWriter writer = response.getWriter();
|
||||
writer.println("<html> Balance of " + accountType + " account is: " +
|
||||
accountBalance + "<br> This account bares an interest rate of " + interestRate +
|
||||
" % </html>");
|
||||
writer.println("<html> Balance of " + accountType + " account is: " + accountBalance + "</html>");
|
||||
writer.flush();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
package com.baeldung.javaeeannotations;
|
||||
|
||||
import javax.servlet.ServletRequestEvent;
|
||||
import javax.servlet.ServletRequestListener;
|
||||
import javax.servlet.annotation.WebListener;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
@WebListener
|
||||
public class DepositRequestListener implements ServletRequestListener {
|
||||
|
||||
public void requestDestroyed(ServletRequestEvent event) {
|
||||
|
||||
}
|
||||
|
||||
public void requestInitialized(ServletRequestEvent evet) {
|
||||
HttpServletRequest req = (HttpServletRequest)evet.getServletRequest();
|
||||
req.setAttribute("interest", new Double(10));
|
||||
}
|
||||
|
||||
}
|
||||
+5
@@ -1,6 +1,7 @@
|
||||
package com.baeldung.javaeeannotations;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.annotation.MultipartConfig;
|
||||
@@ -24,6 +25,10 @@ public class UploadCustomerDocumentsServlet extends HttpServlet {
|
||||
for (Part part : request.getParts()) {
|
||||
part.write("myFile");
|
||||
}
|
||||
|
||||
PrintWriter writer = response.getWriter();
|
||||
writer.println("<html>File uploaded successfully!</html>");
|
||||
writer.flush();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
organization in ThisBuild := "org.baeldung"
|
||||
|
||||
// the Scala version that will be used for cross-compiled libraries
|
||||
scalaVersion in ThisBuild := "2.11.7"
|
||||
scalaVersion in ThisBuild := "2.11.8"
|
||||
|
||||
lagomKafkaEnabled in ThisBuild := false
|
||||
|
||||
@@ -38,4 +38,4 @@ lazy val weatherImpl = project("weather-impl")
|
||||
)
|
||||
.dependsOn(weatherApi)
|
||||
|
||||
def project(id: String) = Project(id, base = file(id))
|
||||
def project(id: String) = Project(id, base = file(id))
|
||||
|
||||
@@ -67,6 +67,11 @@
|
||||
<artifactId>jsonassert</artifactId>
|
||||
<version>${jsonassert.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.javers</groupId>
|
||||
<artifactId>javers-core</artifactId>
|
||||
<version>${javers.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
@@ -78,6 +83,7 @@
|
||||
<javaassist.version>3.21.0-GA</javaassist.version>
|
||||
<assertj.version>3.6.2</assertj.version>
|
||||
<jsonassert.version>1.5.0</jsonassert.version>
|
||||
<javers.version>3.1.0</javers.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.baeldung.javers;
|
||||
|
||||
|
||||
public class Address {
|
||||
private String country;
|
||||
|
||||
public Address(String country) {
|
||||
this.country = country;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.baeldung.javers;
|
||||
|
||||
public class Person {
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
public Person(Integer id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.baeldung.javers;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PersonWithAddress {
|
||||
private Integer id;
|
||||
private String name;
|
||||
private List<Address> address;
|
||||
|
||||
public PersonWithAddress(Integer id, String name, List<Address> address) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public List<Address> getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(List<Address> address) {
|
||||
this.address = address;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
package com.baeldung.javers;
|
||||
|
||||
|
||||
import org.javers.common.collections.Lists;
|
||||
import org.javers.core.Javers;
|
||||
import org.javers.core.JaversBuilder;
|
||||
import org.javers.core.diff.Diff;
|
||||
import org.javers.core.diff.changetype.NewObject;
|
||||
import org.javers.core.diff.changetype.ObjectRemoved;
|
||||
import org.javers.core.diff.changetype.ValueChange;
|
||||
import org.javers.core.diff.changetype.container.ListChange;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class JaversTest {
|
||||
|
||||
@Test
|
||||
public void givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange() {
|
||||
//given
|
||||
Javers javers = JaversBuilder.javers().build();
|
||||
|
||||
Person person = new Person(1, "Michael Program");
|
||||
Person personAfterModification = new Person(1, "Michael Java");
|
||||
|
||||
//when
|
||||
Diff diff = javers.compare(person, personAfterModification);
|
||||
|
||||
//then
|
||||
ValueChange change = diff.getChangesByType(ValueChange.class).get(0);
|
||||
|
||||
assertThat(diff.getChanges()).hasSize(1);
|
||||
assertThat(change.getPropertyName()).isEqualTo("name");
|
||||
assertThat(change.getLeft()).isEqualTo("Michael Program");
|
||||
assertThat(change.getRight()).isEqualTo("Michael Java");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void givenListOfPersons_whenCompare_ThenShouldDetectChanges() {
|
||||
//given
|
||||
Javers javers = JaversBuilder.javers().build();
|
||||
Person personThatWillBeRemoved = new Person(2, "Thomas Link");
|
||||
List<Person> oldList = Lists.asList(new Person(1, "Michael Program"), personThatWillBeRemoved);
|
||||
List<Person> newList = Lists.asList(new Person(1, "Michael Not Program"));
|
||||
|
||||
//when
|
||||
Diff diff = javers.compareCollections(oldList, newList, Person.class);
|
||||
|
||||
//then
|
||||
assertThat(diff.getChanges()).hasSize(3);
|
||||
|
||||
|
||||
ValueChange valueChange = diff.getChangesByType(ValueChange.class).get(0);
|
||||
assertThat(valueChange.getPropertyName()).isEqualTo("name");
|
||||
assertThat(valueChange.getLeft()).isEqualTo("Michael Program");
|
||||
assertThat(valueChange.getRight()).isEqualTo("Michael Not Program");
|
||||
|
||||
ObjectRemoved objectRemoved = diff.getChangesByType(ObjectRemoved.class).get(0);
|
||||
assertThat(objectRemoved.getAffectedObject().get().equals(personThatWillBeRemoved)).isTrue();
|
||||
|
||||
ListChange listChange = diff.getChangesByType(ListChange.class).get(0);
|
||||
assertThat(listChange.getValueRemovedChanges().size()).isEqualTo(1);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange() {
|
||||
//given
|
||||
Javers javers = JaversBuilder.javers().build();
|
||||
|
||||
PersonWithAddress person =
|
||||
new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));
|
||||
|
||||
PersonWithAddress personWithNewAddress =
|
||||
new PersonWithAddress(1, "Tom",
|
||||
Arrays.asList(new Address("England"), new Address("USA")));
|
||||
|
||||
|
||||
//when
|
||||
Diff diff = javers.compare(person, personWithNewAddress);
|
||||
List objectsByChangeType = diff.getObjectsByChangeType(NewObject.class);
|
||||
|
||||
//then
|
||||
assertThat(objectsByChangeType).hasSize(1);
|
||||
assertThat(objectsByChangeType.get(0).equals(new Address("USA")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange() {
|
||||
//given
|
||||
Javers javers = JaversBuilder.javers().build();
|
||||
|
||||
PersonWithAddress person =
|
||||
new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));
|
||||
|
||||
PersonWithAddress personWithNewAddress =
|
||||
new PersonWithAddress(1, "Tom", Collections.emptyList());
|
||||
|
||||
|
||||
//when
|
||||
Diff diff = javers.compare(person, personWithNewAddress);
|
||||
List objectsByChangeType = diff.getObjectsByChangeType(ObjectRemoved.class);
|
||||
|
||||
//then
|
||||
assertThat(objectsByChangeType).hasSize(1);
|
||||
assertThat(objectsByChangeType.get(0).equals(new Address("England")));
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,7 @@
|
||||
<!-- <module>gatling</module> --> <!-- not meant to run as part of the standard build -->
|
||||
|
||||
|
||||
<module>groovy-spock</module>
|
||||
<module>gson</module>
|
||||
<module>guava</module>
|
||||
<module>guava18</module>
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package com.baeldung.failureanalyzer;
|
||||
|
||||
import javax.annotation.security.RolesAllowed;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class FailureAnalyzerApplication {
|
||||
@RolesAllowed("*")
|
||||
public static void main(String[] args) {
|
||||
System.setProperty("security.basic.enabled", "false");
|
||||
SpringApplication.run(FailureAnalyzerApplication.class, args);
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package com.baeldung.failureanalyzer;
|
||||
|
||||
import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
|
||||
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
|
||||
import org.springframework.boot.diagnostics.FailureAnalysis;
|
||||
|
||||
public class MyBeanNotOfRequiredTypeFailureAnalyzer extends AbstractFailureAnalyzer<BeanNotOfRequiredTypeException> {
|
||||
|
||||
@Override
|
||||
protected FailureAnalysis analyze(Throwable rootFailure, BeanNotOfRequiredTypeException cause) {
|
||||
return new FailureAnalysis(getDescription(cause), getAction(cause), cause);
|
||||
}
|
||||
|
||||
private String getDescription(BeanNotOfRequiredTypeException ex) {
|
||||
return "The bean " + ex.getBeanName() //
|
||||
+ " could not be injected as " + ex.getRequiredType().getName() //
|
||||
+ " because it is of type " + ex.getActualType().getName();
|
||||
}
|
||||
|
||||
private String getAction(BeanNotOfRequiredTypeException ex) {
|
||||
return "Consider creating a bean with name "+ ex.getBeanName() //
|
||||
+ " of type " + ex.getRequiredType().getName();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package com.baeldung.failureanalyzer;
|
||||
|
||||
public class MyDAO {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.baeldung.failureanalyzer;
|
||||
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository("myDAO")
|
||||
public class MySecondDAO {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.baeldung.failureanalyzer;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class MyService {
|
||||
|
||||
@Resource(name = "myDAO")
|
||||
private MyDAO myDAO;
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
|
||||
@@ -0,0 +1,4 @@
|
||||
/target/
|
||||
.settings/
|
||||
.classpath
|
||||
.project
|
||||
@@ -0,0 +1,13 @@
|
||||
###The Course
|
||||
The "REST With Spring" Classes: http://bit.ly/restwithspring
|
||||
|
||||
###Relevant Articles:
|
||||
- [Quick Guide to @RestClientTest in Spring Boot](http://www.baeldung.com/restclienttest-in-spring-boot)
|
||||
- [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters)
|
||||
- [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring)
|
||||
- [Introduction to WebJars](http://www.baeldung.com/maven-webjars)
|
||||
- [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot)
|
||||
- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan)
|
||||
- [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder)
|
||||
- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot)
|
||||
- [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet)
|
||||
@@ -0,0 +1,224 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>spring-boot</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>war</packaging>
|
||||
<name>spring-boot</name>
|
||||
<description>This is simple boot application for Spring boot actuator test</description>
|
||||
|
||||
<!-- Inherit defaults from Spring Boot -->
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>1.5.2.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
<version>${tomcat.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-jasper</artifactId>
|
||||
<version>${tomcat.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.dropwizard.metrics</groupId>
|
||||
<artifactId>metrics-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jayway.jsonpath</groupId>
|
||||
<artifactId>json-path</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-mail</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.subethamail</groupId>
|
||||
<artifactId>subethasmtp</artifactId>
|
||||
<version>${subethasmtp.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.webjars</groupId>
|
||||
<artifactId>bootstrap</artifactId>
|
||||
<version>${bootstrap.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.webjars</groupId>
|
||||
<artifactId>jquery</artifactId>
|
||||
<version>${jquery.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>18.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat</groupId>
|
||||
<artifactId>tomcat-servlet-api</artifactId>
|
||||
<version>${tomee-servlet-api.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>spring-boot</finalName>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
<plugins>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-war-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>pl.project13.maven</groupId>
|
||||
<artifactId>git-commit-id-plugin</artifactId>
|
||||
<version>${git-commit-id-plugin.version}</version>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>**/*IntegrationTest.java</exclude>
|
||||
<exclude>**/*LiveTest.java</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>integration</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>integration-test</phase>
|
||||
<goals>
|
||||
<goal>test</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>**/*LiveTest.java</exclude>
|
||||
</excludes>
|
||||
<includes>
|
||||
<include>**/*IntegrationTest.java</include>
|
||||
</includes>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<test.mime>json</test.mime>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
|
||||
<properties>
|
||||
<!-- The main class to start by executing java -jar -->
|
||||
<start-class>org.baeldung.boot.DemoApplication</start-class>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<spring.version>4.3.4.RELEASE</spring.version>
|
||||
<git-commit-id-plugin.version>2.2.1</git-commit-id-plugin.version>
|
||||
<jquery.version>3.1.1</jquery.version>
|
||||
<bootstrap.version>3.3.7-1</bootstrap.version>
|
||||
<subethasmtp.version>3.1.7</subethasmtp.version>
|
||||
<tomee-servlet-api.version>8.5.11</tomee-servlet-api.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package com.baeldung.annotation.servletcomponentscan;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.servlet.ServletComponentScan;
|
||||
|
||||
/**
|
||||
* using the following annotations are equivalent:
|
||||
* <ul><li>
|
||||
* <code>@ServletComponentScan</code>
|
||||
* </li><li>
|
||||
* <code>@ServletComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components")</code>
|
||||
* </li><li>
|
||||
* <code>@ServletComponentScan(basePackageClasses = {AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class})</code>
|
||||
* </li></ul>
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@ServletComponentScan("com.baeldung.annotation.servletcomponentscan.components")
|
||||
public class SpringBootAnnotatedApp {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringBootAnnotatedApp.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
package com.baeldung.annotation.servletcomponentscan;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
||||
@SpringBootApplication
|
||||
@ComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components")
|
||||
public class SpringBootPlainApp {
|
||||
|
||||
public static void main(String[] args) {
|
||||
}
|
||||
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package com.baeldung.annotation.servletcomponentscan.components;
|
||||
|
||||
import javax.servlet.ServletContextEvent;
|
||||
import javax.servlet.ServletContextListener;
|
||||
import javax.servlet.annotation.WebListener;
|
||||
|
||||
@WebListener
|
||||
public class AttrListener implements ServletContextListener {
|
||||
|
||||
@Override
|
||||
public void contextInitialized(ServletContextEvent servletContextEvent) {
|
||||
servletContextEvent
|
||||
.getServletContext()
|
||||
.setAttribute("servlet-context-attr", "test");
|
||||
System.out.println("context init");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void contextDestroyed(ServletContextEvent servletContextEvent) {
|
||||
System.out.println("context destroy");
|
||||
}
|
||||
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package com.baeldung.annotation.servletcomponentscan.components;
|
||||
|
||||
import javax.servlet.annotation.WebServlet;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
|
||||
@WebServlet(name = "echo servlet", urlPatterns = "/echo")
|
||||
public class EchoServlet extends HttpServlet {
|
||||
|
||||
@Override
|
||||
public void doPost(HttpServletRequest request, HttpServletResponse response) {
|
||||
try {
|
||||
Path path = File
|
||||
.createTempFile("echo", "tmp")
|
||||
.toPath();
|
||||
Files.copy(request.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.copy(path, response.getOutputStream());
|
||||
Files.delete(path);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package com.baeldung.annotation.servletcomponentscan.components;
|
||||
|
||||
import javax.servlet.*;
|
||||
import javax.servlet.annotation.WebFilter;
|
||||
import javax.servlet.annotation.WebInitParam;
|
||||
import java.io.IOException;
|
||||
|
||||
@WebFilter(urlPatterns = "/hello", description = "a filter for hello servlet", initParams = { @WebInitParam(name = "msg", value = "filtering ") }, filterName = "hello filter", servletNames = { "echo servlet" })
|
||||
public class HelloFilter implements Filter {
|
||||
|
||||
private FilterConfig filterConfig;
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
System.out.println("filter init");
|
||||
this.filterConfig = filterConfig;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||
servletResponse
|
||||
.getOutputStream()
|
||||
.print(filterConfig.getInitParameter("msg"));
|
||||
filterChain.doFilter(servletRequest, servletResponse);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
System.out.println("filter destroy");
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user