diff --git a/.gitignore b/.gitignore
index 60c38ed8f5..1890e8bd0e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,11 @@ spring-openid/src/main/resources/application.properties
spring-security-openid/src/main/resources/application.properties
spring-all/*.log
+
+*.jar
+
+SpringDataInjectionDemo/.mvn/wrapper/maven-wrapper.properties
+
+spring-call-getters-using-reflection/.mvn/wrapper/maven-wrapper.properties
+
+spring-check-if-a-property-is-null/.mvn/wrapper/maven-wrapper.properties
diff --git a/SpringDataInjectionDemo/.gitignore b/SpringDataInjectionDemo/.gitignore
new file mode 100644
index 0000000000..2af7cefb0a
--- /dev/null
+++ b/SpringDataInjectionDemo/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/SpringDataInjectionDemo/pom.xml b/SpringDataInjectionDemo/pom.xml
new file mode 100644
index 0000000000..afb5b985ba
--- /dev/null
+++ b/SpringDataInjectionDemo/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ baeldung
+ springdatainjectiondemo
+ 0.0.1-SNAPSHOT
+ jar
+
+ SpringDataInjectionDemo
+ Spring Data Injection Demp
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/SpringDataInjectionDemoApplication.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/SpringDataInjectionDemoApplication.java
new file mode 100644
index 0000000000..5a166bf9f9
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/SpringDataInjectionDemoApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringDataInjectionDemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringDataInjectionDemoApplication.class, args);
+ }
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/controller/OrderController.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/controller/OrderController.java
new file mode 100644
index 0000000000..75a325a6e4
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/controller/OrderController.java
@@ -0,0 +1,46 @@
+package com.baeldung.didemo.controller;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.didemo.model.Order;
+import com.baeldung.didemo.service.CustomerServiceConstructorDI;
+import com.baeldung.didemo.service.CustomerServiceConstructorWithoutSpringDI;
+import com.baeldung.didemo.service.CustomerServiceFieldDI;
+import com.baeldung.didemo.service.CustomerServiceSetterDI;
+import com.baeldung.didemo.service.OrderService;
+
+@RestController
+@RequestMapping(value = "/orders")
+public class OrderController {
+
+ @Autowired
+ CustomerServiceConstructorDI constructorDI;
+
+ @Autowired
+ CustomerServiceFieldDI fieldDI;
+
+ @Autowired
+ CustomerServiceSetterDI setterDI;
+
+ @RequestMapping(method = RequestMethod.GET)
+ public List getOrdersFieldDI(@RequestParam(required = false) String dIMethod) {
+ if ("setter".equals(dIMethod)) {
+ return setterDI.getCustomerOrders(1l);
+ } else if ("constructor".equals(dIMethod)) {
+ return constructorDI.getCustomerOrders(1l);
+ } else if ("field".equals(dIMethod)) {
+ return fieldDI.getCustomerOrders(1l);
+ } else {
+ OrderService orderSvc = new OrderService();
+ CustomerServiceConstructorWithoutSpringDI customerSvc = new CustomerServiceConstructorWithoutSpringDI(orderSvc);
+ return customerSvc.getCustomerOrders(1l);
+ }
+ }
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/model/Order.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/model/Order.java
new file mode 100644
index 0000000000..9fd3710879
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/model/Order.java
@@ -0,0 +1,26 @@
+package com.baeldung.didemo.model;
+
+public class Order {
+
+ private Integer id;
+ private String item;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getItem() {
+ return item;
+ }
+
+ public void setItem(String item) {
+ this.item = item;
+ }
+
+ // other order properties..
+
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceConstructorDI.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceConstructorDI.java
new file mode 100644
index 0000000000..daf551b299
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceConstructorDI.java
@@ -0,0 +1,25 @@
+package com.baeldung.didemo.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.didemo.model.Order;
+
+@Service
+public class CustomerServiceConstructorDI {
+
+ OrderService orderService;
+
+ @Autowired
+ public CustomerServiceConstructorDI(OrderService orderService) {
+ super();
+ this.orderService = orderService;
+ }
+
+ public List getCustomerOrders(Long customerId) {
+ return orderService.getOrdersForCustomer(customerId);
+ }
+
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceConstructorWithoutSpringDI.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceConstructorWithoutSpringDI.java
new file mode 100644
index 0000000000..d61b9f86cc
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceConstructorWithoutSpringDI.java
@@ -0,0 +1,20 @@
+package com.baeldung.didemo.service;
+
+import java.util.List;
+
+import com.baeldung.didemo.model.Order;
+
+public class CustomerServiceConstructorWithoutSpringDI {
+
+ OrderService orderService;
+
+ public CustomerServiceConstructorWithoutSpringDI(OrderService orderService) {
+ super();
+ this.orderService = orderService;
+ }
+
+ public List getCustomerOrders(Long customerId) {
+ return orderService.getOrdersForCustomer(customerId);
+ }
+
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceFieldDI.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceFieldDI.java
new file mode 100644
index 0000000000..acb22ad529
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceFieldDI.java
@@ -0,0 +1,19 @@
+package com.baeldung.didemo.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.didemo.model.Order;
+
+@Service
+public class CustomerServiceFieldDI {
+
+ @Autowired
+ OrderService orderService;
+
+ public List getCustomerOrders(Long customerId) {
+ return orderService.getOrdersForCustomer(customerId);
+ }
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceSetterDI.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceSetterDI.java
new file mode 100644
index 0000000000..736a43aba4
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/CustomerServiceSetterDI.java
@@ -0,0 +1,24 @@
+package com.baeldung.didemo.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.didemo.model.Order;
+
+@Service
+public class CustomerServiceSetterDI {
+
+ OrderService orderService;
+
+ public List getCustomerOrders(Long customerId) {
+ return orderService.getOrdersForCustomer(customerId);
+ }
+
+ @Autowired
+ public void setOrderService(OrderService orderService) {
+ this.orderService = orderService;
+ }
+
+}
diff --git a/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/OrderService.java b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/OrderService.java
new file mode 100644
index 0000000000..4dc8fd6f5d
--- /dev/null
+++ b/SpringDataInjectionDemo/src/main/java/com/baeldung/didemo/service/OrderService.java
@@ -0,0 +1,30 @@
+package com.baeldung.didemo.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import com.baeldung.didemo.model.Order;
+
+@Service
+public class OrderService {
+
+ public List getOrdersForCustomer(Long id) {
+ List orders = new ArrayList();
+
+ Order order1 = new Order();
+ order1.setId(1);
+ order1.setItem("Pizza");
+
+ Order order2 = new Order();
+ order2.setId(1);
+ order2.setItem("Garlic Bread");
+
+ orders.add(order1);
+ orders.add(order2);
+
+ return orders;
+ }
+
+}
diff --git a/SpringDataInjectionDemo/src/main/resources/application.properties b/SpringDataInjectionDemo/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/SpringDataInjectionDemo/src/test/java/com/baeldung/didemo/SpringDataInjectionDemoApplicationTests.java b/SpringDataInjectionDemo/src/test/java/com/baeldung/didemo/SpringDataInjectionDemoApplicationTests.java
new file mode 100644
index 0000000000..c8c0859d25
--- /dev/null
+++ b/SpringDataInjectionDemo/src/test/java/com/baeldung/didemo/SpringDataInjectionDemoApplicationTests.java
@@ -0,0 +1,65 @@
+package com.baeldung.didemo;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.didemo.model.Order;
+import com.baeldung.didemo.service.CustomerServiceConstructorDI;
+import com.baeldung.didemo.service.CustomerServiceFieldDI;
+import com.baeldung.didemo.service.CustomerServiceSetterDI;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SpringDataInjectionDemoApplicationTests {
+
+ @Autowired
+ CustomerServiceConstructorDI constructorDI;
+
+ @Autowired
+ CustomerServiceFieldDI fieldDI;
+
+ @Autowired
+ CustomerServiceSetterDI setterDI;
+
+ @Test
+ public void givenConstructorDI_whenNumberOfOrdersIsTwo_thenCorrect() {
+ List orders = constructorDI.getCustomerOrders(1l);
+ Assert.assertNotNull(orders);
+ Assert.assertTrue(orders.size() == 2);
+ }
+
+ @Test
+ public void givenFieldDI_whenNumberOfOrdersIsTwo_thenCorrect() {
+ List orders = fieldDI.getCustomerOrders(1l);
+ Assert.assertNotNull(orders);
+ Assert.assertTrue(orders.size() == 2);
+ }
+
+ @Test
+ public void givenSetterDI_whenNumberOfOrdersIsTwo_thenCorrect() {
+ List orders = setterDI.getCustomerOrders(1l);
+ Assert.assertNotNull(orders);
+ Assert.assertTrue(orders.size() == 2);
+ }
+
+ @Test
+ public void givenAllThreeTypesOfDI_whenNumberOfOrdersIsEqualInAll_thenCorrect() {
+ List ordersSetter = setterDI.getCustomerOrders(1l);
+ List ordersConstructor = constructorDI.getCustomerOrders(1l);
+ List ordersField = fieldDI.getCustomerOrders(1l);
+
+ Assert.assertNotNull(ordersSetter);
+ Assert.assertNotNull(ordersConstructor);
+ Assert.assertNotNull(ordersField);
+ Assert.assertTrue(ordersSetter.size() == 2 && ordersConstructor.size() == ordersSetter.size() && ordersField.size() == ordersSetter.size());
+ }
+
+
+
+}
diff --git a/call-all-getters/.gitignore b/call-all-getters/.gitignore
new file mode 100644
index 0000000000..2af7cefb0a
--- /dev/null
+++ b/call-all-getters/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/call-all-getters/pom.xml b/call-all-getters/pom.xml
new file mode 100644
index 0000000000..ed4735a861
--- /dev/null
+++ b/call-all-getters/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ baeldung
+ call-all-getters
+ 0.0.1-SNAPSHOT
+ jar
+
+ call-all-getters
+ Calling all getters using Introspector
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/call-all-getters/src/main/java/com/baeldung/CallAllGettersApplication.java b/call-all-getters/src/main/java/com/baeldung/CallAllGettersApplication.java
new file mode 100644
index 0000000000..5c10ed5b55
--- /dev/null
+++ b/call-all-getters/src/main/java/com/baeldung/CallAllGettersApplication.java
@@ -0,0 +1,18 @@
+package com.baeldung;
+
+import java.util.List;
+
+import com.baeldung.reflection.model.Customer;
+import com.baeldung.reflection.util.Utils;
+
+public class CallAllGettersApplication {
+
+ public static void main(String[] args) throws Exception {
+
+ Customer customer = new Customer(1, "Himanshu", null, null);
+ List nullProps = Utils.getNullPropertiesList(customer);
+ System.out.println(nullProps);
+ }
+
+
+}
diff --git a/call-all-getters/src/main/java/com/baeldung/reflection/model/Customer.java b/call-all-getters/src/main/java/com/baeldung/reflection/model/Customer.java
new file mode 100644
index 0000000000..d0c6c31dce
--- /dev/null
+++ b/call-all-getters/src/main/java/com/baeldung/reflection/model/Customer.java
@@ -0,0 +1,63 @@
+package com.baeldung.reflection.model;
+
+/**
+ *
+ * @author himanshumantri
+ *
+ */
+public class Customer {
+
+ private Integer id;
+ private String name;
+ private String emailId;
+ private Long phoneNumber;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmailId() {
+ return emailId;
+ }
+
+ public void setEmailId(String emailId) {
+ this.emailId = emailId;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Customer [id=").append(id).append(", name=").append(name).append(", emailId=").append(emailId).append(", phoneNumber=")
+ .append(phoneNumber).append("]");
+ return builder.toString();
+ }
+
+ public Customer(Integer id, String name, String emailId, Long phoneNumber) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.emailId = emailId;
+ this.phoneNumber = phoneNumber;
+ }
+
+ public Long getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(Long phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+}
diff --git a/call-all-getters/src/main/java/com/baeldung/reflection/util/Utils.java b/call-all-getters/src/main/java/com/baeldung/reflection/util/Utils.java
new file mode 100644
index 0000000000..c9542bbdf2
--- /dev/null
+++ b/call-all-getters/src/main/java/com/baeldung/reflection/util/Utils.java
@@ -0,0 +1,43 @@
+package com.baeldung.reflection.util;
+
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import com.baeldung.reflection.model.Customer;
+
+public class Utils {
+
+ public static List getNullPropertiesList(Customer customer) throws Exception {
+ PropertyDescriptor[] propDescArr = Introspector.getBeanInfo(Customer.class, Object.class).getPropertyDescriptors();
+ List propDescList = Arrays.asList(propDescArr);
+
+ List nullProps = propDescList.stream()
+ .filter(nulls(customer))
+ .map(PropertyDescriptor::getName)
+ .collect(Collectors.toList());
+ return nullProps;
+ }
+
+ private static Predicate nulls(Customer customer) {
+ Predicate isNull = new Predicate() {
+ @Override
+ public boolean test(PropertyDescriptor pd) {
+ Method getterMethod = pd.getReadMethod();
+ boolean result = false;
+ try {
+ result = (getterMethod != null && getterMethod.invoke(customer) == null);
+ } catch (Exception e) {
+ // Handle the exception
+ e.printStackTrace();
+ }
+ return result;
+ }
+ };
+ return isNull;
+ }
+}
diff --git a/call-all-getters/src/main/resources/application.properties b/call-all-getters/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/call-all-getters/src/test/java/com/baeldung/CallAllGettersApplicationTests.java b/call-all-getters/src/test/java/com/baeldung/CallAllGettersApplicationTests.java
new file mode 100644
index 0000000000..cca49b4359
--- /dev/null
+++ b/call-all-getters/src/test/java/com/baeldung/CallAllGettersApplicationTests.java
@@ -0,0 +1,26 @@
+package com.baeldung;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.baeldung.reflection.model.Customer;
+import com.baeldung.reflection.util.Utils;
+
+public class CallAllGettersApplicationTests {
+
+ @Test
+ public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() throws Exception {
+ Customer customer = new Customer(1, "Himanshu", null, null);
+
+ List result = Utils.getNullPropertiesList(customer);
+ List expectedFieldNames = Arrays.asList("emailId","phoneNumber");
+
+ Assert.assertTrue(result.size() == expectedFieldNames.size());
+ Assert.assertTrue(result.containsAll(expectedFieldNames));
+
+ }
+
+}
diff --git a/collectionutils/pom.xml b/collectionutils/pom.xml
new file mode 100644
index 0000000000..810f53847d
--- /dev/null
+++ b/collectionutils/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ baeldung
+ collectionutils
+ 0.0.1-SNAPSHOT
+ collectionutils-guide
+ A guide to Apache Commons CollectionUtils
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ 4.1
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
\ No newline at end of file
diff --git a/collectionutils/src/main/java/com/baeldung/collectionutilsguide/model/Address.java b/collectionutils/src/main/java/com/baeldung/collectionutilsguide/model/Address.java
new file mode 100644
index 0000000000..87c03cde14
--- /dev/null
+++ b/collectionutils/src/main/java/com/baeldung/collectionutilsguide/model/Address.java
@@ -0,0 +1,37 @@
+package com.baeldung.collectionutilsguide.model;
+
+public class Address {
+
+ String locality;
+ String city;
+
+ public String getLocality() {
+ return locality;
+ }
+
+ public void setLocality(String locality) {
+ this.locality = locality;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Address [locality=").append(locality).append(", city=").append(city).append("]");
+ return builder.toString();
+ }
+
+ public Address(String locality, String city) {
+ super();
+ this.locality = locality;
+ this.city = city;
+ }
+
+}
diff --git a/collectionutils/src/main/java/com/baeldung/collectionutilsguide/model/Customer.java b/collectionutils/src/main/java/com/baeldung/collectionutilsguide/model/Customer.java
new file mode 100644
index 0000000000..990ac62857
--- /dev/null
+++ b/collectionutils/src/main/java/com/baeldung/collectionutilsguide/model/Customer.java
@@ -0,0 +1,81 @@
+package com.baeldung.collectionutilsguide.model;
+
+public class Customer implements Comparable {
+
+ Integer id;
+ String name;
+ Address address;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ 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 Customer(Integer id, String name, String locality, String city) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.address = new Address(locality, city);
+ }
+
+ public Customer(String name) {
+ super();
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Customer other = (Customer) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ public int compareTo(Customer o) {
+ return this.name.compareTo(o.getName());
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Customer [id=").append(id).append(", name=").append(name).append("]");
+ return builder.toString();
+ }
+
+}
diff --git a/collectionutils/src/pom.xml b/collectionutils/src/pom.xml
new file mode 100644
index 0000000000..810f53847d
--- /dev/null
+++ b/collectionutils/src/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ baeldung
+ collectionutils
+ 0.0.1-SNAPSHOT
+ collectionutils-guide
+ A guide to Apache Commons CollectionUtils
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ 4.1
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
\ No newline at end of file
diff --git a/collectionutils/src/test/java/collectionutils/CollectionUtilsGuideTest.java b/collectionutils/src/test/java/collectionutils/CollectionUtilsGuideTest.java
new file mode 100644
index 0000000000..a003e38524
--- /dev/null
+++ b/collectionutils/src/test/java/collectionutils/CollectionUtilsGuideTest.java
@@ -0,0 +1,135 @@
+package collectionutils;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.collections4.Closure;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Predicate;
+import org.apache.commons.collections4.Transformer;
+import org.junit.Test;
+
+import com.baeldung.collectionutilsguide.model.Address;
+import com.baeldung.collectionutilsguide.model.Customer;
+
+public class CollectionUtilsGuideTest {
+
+ Customer customer1 = new Customer(1, "Daniel", "locality1", "city1");
+ Customer customer2 = new Customer(2, "Fredrik", "locality2", "city2");
+ Customer customer3 = new Customer(3, "Kyle", "locality3", "city3");
+ Customer customer4 = new Customer(4, "Bob", "locality4", "city4");
+ Customer customer5 = new Customer(5, "Cat", "locality5", "city5");
+ Customer customer6 = new Customer(6, "John", "locality6", "city6");
+
+ List list1 = Arrays.asList(customer1, customer2, customer3);
+ List list2 = Arrays.asList(customer4, customer5, customer6);
+ List list3 = Arrays.asList(customer1, customer2);
+
+ List linkedList1 = new LinkedList(list1);
+
+ @Test
+ public void givenList_WhenAddIgnoreNull_thenNoNullAdded() {
+ CollectionUtils.addIgnoreNull(list1, null);
+ assertFalse(list1.contains(null));
+ }
+
+ @Test
+ public void givenTwoSortedLists_WhenCollated_thenSorted() {
+ List sortedList = CollectionUtils.collate(list1, list2);
+ assertTrue(sortedList.get(0).getName().equals("Bob"));
+ assertTrue(sortedList.get(2).getName().equals("Daniel"));
+ }
+
+ @Test
+ public void givenListOfCustomers_whenTransformed_thenListOfAddress() {
+ Collection addressCol = CollectionUtils.collect(list1, new Transformer() {
+ public Address transform(Customer customer) {
+ return customer.getAddress();
+ }
+ });
+
+ List addressList = new ArrayList(addressCol);
+ assertTrue(addressList.size() == 3);
+ assertTrue(addressList.get(0).getLocality().equals("locality1"));
+ }
+
+ @Test
+ public void givenCustomerList_WhenCountMatches_thenCorrect() {
+ int result = CollectionUtils.countMatches(list1, new Predicate() {
+ public boolean evaluate(Customer customer) {
+ return Arrays.asList("Daniel","Kyle").contains(customer.getName());
+ }
+ });
+ assertTrue(result == 2);
+ }
+
+ @Test
+ public void givenCustomerList_WhenFiltered_thenCorrectSize() {
+
+ boolean isModified = CollectionUtils.filter(linkedList1, new Predicate() {
+ public boolean evaluate(Customer customer) {
+ return Arrays.asList("Daniel","Kyle").contains(customer.getName());
+ }
+ });
+
+ //filterInverse does the opposite. It removes the element from the list if the Predicate returns true
+ //select and selectRejected work the same way except that they do not remove elements from the given collection and return a new collection
+
+ assertTrue(isModified && linkedList1.size() == 2);
+ }
+
+ @Test
+ public void givenCustomerList_WhenForAllDoSetNameNull_thenNameNull() {
+ CollectionUtils.forAllDo(list1, new Closure() {
+ public void execute(Customer customer) {
+ customer.setName(null);
+ }
+ });
+
+ // forAllButLast does the same except for the last element in the collection
+ assertTrue(list1.get(0).getName() == null);
+ }
+
+ @Test
+ public void givenNonEmptyList_WhenCheckedIsNotEmpty_thenTrue() {
+ List emptyList = new ArrayList();
+ List nullList = null;
+
+ //Very handy at times where we want to check if a collection is not null and not empty too.
+ //isNotEmpty does the opposite. Handy because using ! operator on isEmpty makes it missable while reading
+ assertTrue(CollectionUtils.isNotEmpty(list1));
+ assertTrue(CollectionUtils.isEmpty(nullList));
+ assertTrue(CollectionUtils.isEmpty(emptyList));
+ }
+
+ @Test
+ public void givenCustomerListAndASubcollection_WhenChecked_thenTrue() {
+ assertTrue(CollectionUtils.isSubCollection(list3, list1));
+ }
+
+ @Test
+ public void givenTwoLists_WhenIntersected_thenCheckSize() {
+ Collection intersection = CollectionUtils.intersection(list1, list3);
+ assertTrue(intersection.size() == 2);
+ }
+
+ @Test
+ public void givenTwoLists_WhenSubtracted_thenCheckElementNotPresentInA() {
+ Collection result = CollectionUtils.subtract(list1, list3);
+ assertFalse(result.contains(customer1));
+ }
+
+ @Test
+ public void givenTwoLists_WhenUnioned_thenCheckElementPresentInResult() {
+ Collection union = CollectionUtils.union(list1, list2);
+ assertTrue(union.contains(customer1));
+ assertTrue(union.contains(customer4));
+ }
+
+}
diff --git a/spring-check-if-a-property-is-null/.gitignore b/spring-check-if-a-property-is-null/.gitignore
new file mode 100644
index 0000000000..2af7cefb0a
--- /dev/null
+++ b/spring-check-if-a-property-is-null/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/spring-check-if-a-property-is-null/pom.xml b/spring-check-if-a-property-is-null/pom.xml
new file mode 100644
index 0000000000..d92e2a8e9c
--- /dev/null
+++ b/spring-check-if-a-property-is-null/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ baeldung
+ spring-check-null
+ 0.0.1-SNAPSHOT
+ jar
+
+ spring-check-if-a-property-is-null
+ Calling getters using Introspector
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.3.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-check-if-a-property-is-null/src/main/java/com/baeldung/SpringCheckIfAPropertyIsNullApplication.java b/spring-check-if-a-property-is-null/src/main/java/com/baeldung/SpringCheckIfAPropertyIsNullApplication.java
new file mode 100644
index 0000000000..24348a714e
--- /dev/null
+++ b/spring-check-if-a-property-is-null/src/main/java/com/baeldung/SpringCheckIfAPropertyIsNullApplication.java
@@ -0,0 +1,21 @@
+package com.baeldung;
+
+import java.util.List;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import com.baeldung.reflection.model.Customer;
+import com.baeldung.reflection.util.Utils;
+
+@SpringBootApplication
+public class SpringCheckIfAPropertyIsNullApplication {
+
+ public static void main(String[] args) throws Exception {
+
+ Customer customer = new Customer(1, "Himanshu", null, null);
+ List nullProps = Utils.getNullPropertiesList(customer);
+ System.out.println(nullProps);
+ }
+
+
+}
diff --git a/spring-check-if-a-property-is-null/src/main/java/com/baeldung/reflection/model/Customer.java b/spring-check-if-a-property-is-null/src/main/java/com/baeldung/reflection/model/Customer.java
new file mode 100644
index 0000000000..d0c6c31dce
--- /dev/null
+++ b/spring-check-if-a-property-is-null/src/main/java/com/baeldung/reflection/model/Customer.java
@@ -0,0 +1,63 @@
+package com.baeldung.reflection.model;
+
+/**
+ *
+ * @author himanshumantri
+ *
+ */
+public class Customer {
+
+ private Integer id;
+ private String name;
+ private String emailId;
+ private Long phoneNumber;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmailId() {
+ return emailId;
+ }
+
+ public void setEmailId(String emailId) {
+ this.emailId = emailId;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Customer [id=").append(id).append(", name=").append(name).append(", emailId=").append(emailId).append(", phoneNumber=")
+ .append(phoneNumber).append("]");
+ return builder.toString();
+ }
+
+ public Customer(Integer id, String name, String emailId, Long phoneNumber) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.emailId = emailId;
+ this.phoneNumber = phoneNumber;
+ }
+
+ public Long getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(Long phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+}
diff --git a/spring-check-if-a-property-is-null/src/main/java/com/baeldung/reflection/util/Utils.java b/spring-check-if-a-property-is-null/src/main/java/com/baeldung/reflection/util/Utils.java
new file mode 100644
index 0000000000..665717db09
--- /dev/null
+++ b/spring-check-if-a-property-is-null/src/main/java/com/baeldung/reflection/util/Utils.java
@@ -0,0 +1,34 @@
+package com.baeldung.reflection.util;
+
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.baeldung.reflection.model.Customer;
+
+public class Utils {
+
+ public static List getNullPropertiesList(Customer customer) throws Exception {
+ PropertyDescriptor[] propDescArr = Introspector.getBeanInfo(Customer.class, Object.class).getPropertyDescriptors();
+ List propDescList = Arrays.asList(propDescArr);
+
+ List nullProps = new ArrayList();
+
+ propDescList.stream().forEach(p -> {
+ Method getterMethod = p.getReadMethod();
+ try {
+ if (getterMethod != null && getterMethod.invoke(customer) == null) {
+ // If the value if null for that field
+ nullProps.add(p.getName());
+ }
+ } catch (Exception e) {
+ // Handle the exception
+ e.printStackTrace();
+ }
+ });
+ return nullProps;
+ }
+}
diff --git a/spring-check-if-a-property-is-null/src/main/resources/application.properties b/spring-check-if-a-property-is-null/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-check-if-a-property-is-null/src/test/java/com/baeldung/SpringCheckIfAPropertyIsNullApplicationTests.java b/spring-check-if-a-property-is-null/src/test/java/com/baeldung/SpringCheckIfAPropertyIsNullApplicationTests.java
new file mode 100644
index 0000000000..edd009e719
--- /dev/null
+++ b/spring-check-if-a-property-is-null/src/test/java/com/baeldung/SpringCheckIfAPropertyIsNullApplicationTests.java
@@ -0,0 +1,31 @@
+package com.baeldung;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.reflection.model.Customer;
+import com.baeldung.reflection.util.Utils;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SpringCheckIfAPropertyIsNullApplicationTests {
+
+ @Test
+ public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() throws Exception {
+ Customer customer = new Customer(1, "Himanshu", null, null);
+
+ List result = Utils.getNullPropertiesList(customer);
+ List expectedFieldNames = Arrays.asList("emailId","phoneNumber");
+
+ Assert.assertTrue(result.size() == expectedFieldNames.size());
+ Assert.assertTrue(result.containsAll(expectedFieldNames));
+
+ }
+
+}