From 2cd2f9c7a3eee55d7c6d09fa100e02341ae27070 Mon Sep 17 00:00:00 2001
From: Antoine Rey <antoine.rey@gmail.com>
Date: Fri, 21 Dec 2018 08:29:48 +0100
Subject: [PATCH] Upgrade to Spring Boot 2.1.5

---
 pom.xml                                       | 94 +++++++++----------
 readme.md                                     |  6 +-
 .../petclinic/PetClinicApplication.java       |  8 +-
 .../samples/petclinic/model/NamedEntity.java  |  2 +-
 .../samples/petclinic/model/Owner.java        |  2 +-
 .../samples/petclinic/model/Person.java       |  2 +-
 .../samples/petclinic/model/Visit.java        |  2 +-
 .../jpa/JpaOwnerRepositoryImpl.java           |  4 +-
 .../jpa/JpaPetTypeRepositoryImpl.java         | 12 +--
 .../jpa/JpaSpecialtyRepositoryImpl.java       |  2 +-
 .../jpa/JpaVisitRepositoryImpl.java           |  6 +-
 .../springdatajpa/PetRepositoryOverride.java  |  2 +-
 .../PetTypeRepositoryOverride.java            |  2 +-
 .../SpecialtyRepositoryOverride.java          |  2 +-
 .../SpringDataOwnerRepository.java            |  4 +-
 .../SpringDataPetRepositoryImpl.java          |  3 +
 .../SpringDataPetTypeRepositoryImpl.java      | 13 ++-
 .../SpringDataSpecialtyRepositoryImpl.java    |  3 +-
 .../SpringDataVisitRepositoryImpl.java        |  3 +
 .../VisitRepositoryOverride.java              |  2 +-
 ...er.java => BasicAuthenticationConfig.java} | 29 ++++--
 .../security/DisableSecurityConfig.java       | 27 ++++++
 src/main/resources/application.properties     |  5 +-
 src/main/resources/db/hsqldb/populateDB.sql   |  2 +-
 src/main/resources/db/mysql/populateDB.sql    |  2 +-
 .../resources/db/postgresql/populateDB.sql    |  2 +-
 .../petclinic/model/ValidatorTests.java       |  2 +-
 .../AbstractClinicServiceTests.java           | 20 ++--
 28 files changed, 145 insertions(+), 118 deletions(-)
 rename src/main/java/org/springframework/samples/petclinic/security/{BasicAuthenticationAdapter.java => BasicAuthenticationConfig.java} (62%)
 create mode 100644 src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java

diff --git a/pom.xml b/pom.xml
index 0fc0b3f9..d286a90b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,30 +4,23 @@
 	<modelVersion>4.0.0</modelVersion>
 
 	<groupId>org.springframework.samples</groupId>
-	<artifactId>spring-petclinic</artifactId>
-	<version>1.5.2</version>
-	<packaging>war</packaging>
+	<artifactId>spring-petclinic-rest</artifactId>
+	<version>2.1.5</version>
 
-	<name>petclinic</name>
-	<description>Spring petclinic project</description>
+	<description>REST version of the Spring Petclinic sample application</description>
+    <url>https://spring-petclinic.github.io/</url>
 
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>1.5.2.RELEASE</version>
-		<relativePath/> <!-- lookup parent from repository -->
+		<version>2.1.5.RELEASE</version>
+		<relativePath/> <!-- lookup parent from Maven repository -->
 	</parent>
 
 	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-		<java.version>1.8</java.version>
-
         <spring-data-jdbc.version>1.2.1.RELEASE</spring-data-jdbc.version>
-		<cobertura.version>2.7</cobertura.version>
-
-        <start-class>org.springframework.samples.petclinic.PetClinicApplication</start-class>
-
+        <springfox-swagger.version>2.6.1</springfox-swagger.version>
+        <jacoco.version>0.8.2</jacoco.version>
 	</properties>
 
 	<!-- repository for springfox plugin -->
@@ -96,11 +89,6 @@
             </exclusions>
         </dependency>
 
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-tomcat</artifactId>
-			<scope>provided</scope>
-		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>
@@ -129,12 +117,12 @@
 		<dependency>
 			<groupId>io.springfox</groupId>
 			<artifactId>springfox-swagger2</artifactId>
-			<version>2.6.1</version>
+			<version>${springfox-swagger.version}</version>
 		</dependency>
 	    <dependency>
         	<groupId>io.springfox</groupId>
         	<artifactId>springfox-swagger-ui</artifactId>
-        	<version>2.6.1</version>
+        	<version>${springfox-swagger.version}</version>
         </dependency>
 
         <dependency>
@@ -143,13 +131,6 @@
             <scope>test</scope>
         </dependency>
 
-        <dependency>
-        	<groupId>org.hamcrest</groupId>
-        	<artifactId>hamcrest-all</artifactId>
-        	<version>1.3</version>
-        	<scope>test</scope>
-        </dependency>
-
         <dependency>
             <groupId>javax.xml.bind</groupId>
             <artifactId>jaxb-api</artifactId>
@@ -162,25 +143,44 @@
 			<plugin>
 				<groupId>org.springframework.boot</groupId>
 				<artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <!-- Spring Boot Actuator displays build-related information
+                          if a META-INF/build-info.properties file is present -->
+                        <goals>
+                            <goal>build-info</goal>
+                        </goals>
+                        <configuration>
+                            <additionalProperties>
+                                <encoding.source>${project.build.sourceEncoding}</encoding.source>
+                                <encoding.reporting>${project.reporting.outputEncoding}</encoding.reporting>
+                                <java.source>${maven.compiler.source}</java.source>
+                                <java.target>${maven.compiler.target}</java.target>
+                            </additionalProperties>
+                        </configuration>
+                    </execution>
+                </executions>
 			</plugin>
-		</plugins>
-	</build>
-    <reporting>
-        <plugins>
-            <!-- integrate maven-cobertura-plugin to project site -->
+
             <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-                <version>${cobertura.version}</version>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>cobertura</report>
-                        </reports>
-                    </reportSet>
-                </reportSets>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>${jacoco.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>report</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                    </execution>
+                </executions>
             </plugin>
-        </plugins>
-    </reporting>
-    <url>demopetclinic</url>
+		</plugins>
+	</build>
 </project>
diff --git a/readme.md b/readme.md
index 98e7babf..907390a9 100644
--- a/readme.md
+++ b/readme.md
@@ -86,7 +86,7 @@ In its default configuration, Petclinic doesn't have authentication and authoriz
 ### Basic Authentication
 In order to use the basic authentication functionality, turn in on from the application.properties file
 ```
-basic.authentication.enabled=true
+petclinic.security.enable=true
 ```
 This will secure all APIs and in order to access them, basic authentication is required.
 Apart from authentication, APIs also require authorization. This is done via roles that a user can have.
@@ -95,7 +95,7 @@ The existing roles are listed below with the corresponding permissions
 * VET_ADMIN   -> PetTypeController, SpecialityController, VetController
 * ADMIN       -> UserController
 
-There is an existing user with the username admin and password admin that has access to all APIs.
+There is an existing user with the username `admin` and password `admin` that has access to all APIs.
  In order to add a new user, please use the following API:
 ```
 POST /api/users
@@ -139,7 +139,7 @@ File -> Import -> Maven -> Existing Maven project
 |--|--|
 | REST API controllers | [REST folder](src/main/java/org/springframework/samples/petclinic/rest) |
 | Service | [ClinicServiceImpl.java](src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java) |
-|JDBC | [jdbc folder](src/main/java/org/springframework/samples/petclinic/repository/jdb) |
+| JDBC | [jdbc folder](src/main/java/org/springframework/samples/petclinic/repository/jdbc) |
 | JPA | [jpa folder](src/main/java/org/springframework/samples/petclinic/repository/jpa) |
 | Spring Data JPA | [springdatajpa folder](src/main/java/org/springframework/samples/petclinic/repository/springdatajpa) |
 | Tests | [AbstractClinicServiceTests.java](src/test/java/org/springframework/samples/petclinic/service/AbstractClinicServiceTests.java) |
diff --git a/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java b/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
index a9b88977..e218be11 100644
--- a/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
+++ b/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
@@ -2,16 +2,10 @@ package org.springframework.samples.petclinic;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 
 @SpringBootApplication
 public class PetClinicApplication extends SpringBootServletInitializer {
-	
-	@Override
-	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
-		return application.sources(PetClinicApplication.class);
-	}
 
 	public static void main(String[] args) {
 		SpringApplication.run(PetClinicApplication.class, args);
diff --git a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
index e96be5b1..f97dd52b 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
@@ -18,7 +18,7 @@ package org.springframework.samples.petclinic.model;
 import javax.persistence.Column;
 import javax.persistence.MappedSuperclass;
 
-import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
 
 
 /**
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Owner.java b/src/main/java/org/springframework/samples/petclinic/model/Owner.java
index eb68ced1..e957e86a 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Owner.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Owner.java
@@ -28,8 +28,8 @@ import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.Digits;
+import javax.validation.constraints.NotEmpty;
 
-import org.hibernate.validator.constraints.NotEmpty;
 import org.springframework.beans.support.MutableSortDefinition;
 import org.springframework.beans.support.PropertyComparator;
 import org.springframework.core.style.ToStringCreator;
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Person.java b/src/main/java/org/springframework/samples/petclinic/model/Person.java
index d3e03c0d..a0da6f69 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Person.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Person.java
@@ -18,7 +18,7 @@ package org.springframework.samples.petclinic.model;
 import javax.persistence.Column;
 import javax.persistence.MappedSuperclass;
 
-import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
 
 /**
  * Simple JavaBean domain object representing an person.
diff --git a/src/main/java/org/springframework/samples/petclinic/model/Visit.java b/src/main/java/org/springframework/samples/petclinic/model/Visit.java
index bdf24b14..05a39cdc 100644
--- a/src/main/java/org/springframework/samples/petclinic/model/Visit.java
+++ b/src/main/java/org/springframework/samples/petclinic/model/Visit.java
@@ -25,7 +25,7 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
-import org.hibernate.validator.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.samples.petclinic.rest.JacksonCustomVisitDeserializer;
 import org.springframework.samples.petclinic.rest.JacksonCustomVisitSerializer;
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java
index 98e3dcf0..e4620c77 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImpl.java
@@ -23,7 +23,7 @@ import javax.persistence.Query;
 
 import org.springframework.context.annotation.Profile;
 import org.springframework.dao.DataAccessException;
-import org.springframework.orm.hibernate3.support.OpenSessionInViewFilter;
+import org.springframework.orm.hibernate5.support.OpenSessionInViewFilter;
 import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.repository.OwnerRepository;
 import org.springframework.stereotype.Repository;
@@ -80,7 +80,7 @@ public class JpaOwnerRepositoryImpl implements OwnerRepository {
         }
 
     }
-    
+
 	@SuppressWarnings("unchecked")
 	@Override
 	public Collection<Owner> findAll() throws DataAccessException {
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java
index dc0b0d48..2bfd1c78 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetTypeRepositoryImpl.java
@@ -68,17 +68,15 @@ public class JpaPetTypeRepositoryImpl implements PetTypeRepository {
 	@Override
 	public void delete(PetType petType) throws DataAccessException {
 		this.em.remove(this.em.contains(petType) ? petType : this.em.merge(petType));
-		String petTypeId = petType.getId().toString();
+		Integer petTypeId = petType.getId();
 		
-		List<Pet> pets = new ArrayList<Pet>();
-		pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
+		List<Pet> pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
 		for (Pet pet : pets){
-			List<Visit> visits = new ArrayList<Visit>();
-			visits = pet.getVisits();
+			List<Visit> visits = pet.getVisits();
 			for (Visit visit : visits){
-				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId().toString()).executeUpdate();
+				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId()).executeUpdate();
 			}
-			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId().toString()).executeUpdate();
+			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId()).executeUpdate();
 		}
 		this.em.createQuery("DELETE FROM PetType pettype WHERE id=" + petTypeId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java
index 54248caf..e6ae41bb 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaSpecialtyRepositoryImpl.java
@@ -62,7 +62,7 @@ public class JpaSpecialtyRepositoryImpl implements SpecialtyRepository {
 	@Override
 	public void delete(Specialty specialty) throws DataAccessException {
 		this.em.remove(this.em.contains(specialty) ? specialty : this.em.merge(specialty));
-		String specId = specialty.getId().toString();
+		Integer specId = specialty.getId();
 		this.em.createNativeQuery("DELETE FROM vet_specialties WHERE specialty_id=" + specId).executeUpdate();
 		this.em.createQuery("DELETE FROM Specialty specialty WHERE id=" + specId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java
index e5f911c7..f6779341 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImpl.java
@@ -78,11 +78,7 @@ public class JpaVisitRepositoryImpl implements VisitRepository {
 
 	@Override
 	public void delete(Visit visit) throws DataAccessException {
-		String visitId = visit.getId().toString();
-		this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visitId).executeUpdate();
-		if (em.contains(visit)) {
-			em.remove(visit);
-		}
+        this.em.remove(this.em.contains(visit) ? visit : this.em.merge(visit));
 	}
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java
index b269da83..78c02b00 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.Pet;
 @Profile("spring-data-jpa")
 public interface PetRepositoryOverride {
 	
-	public void delete(Pet pet);
+	void delete(Pet pet);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java
index 6414b775..a3b19e90 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/PetTypeRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.PetType;
 @Profile("spring-data-jpa")
 public interface PetTypeRepositoryOverride {
 	
-	public void delete(PetType petType);
+	void delete(PetType petType);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java
index 39b19550..656d8efe 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpecialtyRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.Specialty;
 @Profile("spring-data-jpa")
 public interface SpecialtyRepositoryOverride {
 	
-	public void delete(Specialty specialty);
+	void delete(Specialty specialty);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java
index 09a69889..78c0093b 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepository.java
@@ -36,9 +36,9 @@ public interface SpringDataOwnerRepository extends OwnerRepository, Repository<O
 
     @Override
     @Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName%")
-    public Collection<Owner> findByLastName(@Param("lastName") String lastName);
+    Collection<Owner> findByLastName(@Param("lastName") String lastName);
 
     @Override
     @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id")
-    public Owner findById(@Param("id") int id);
+    Owner findById(@Param("id") int id);
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java
index 753f9c95..23b7a68b 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepositoryImpl.java
@@ -38,6 +38,9 @@ public class SpringDataPetRepositoryImpl implements PetRepositoryOverride {
 		String petId = pet.getId().toString();
 		this.em.createQuery("DELETE FROM Visit visit WHERE pet_id=" + petId).executeUpdate();
 		this.em.createQuery("DELETE FROM Pet pet WHERE id=" + petId).executeUpdate();
+        if (em.contains(pet)) {
+            em.remove(pet);
+        }
 	}
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java
index a9f86296..a02f9a44 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetTypeRepositoryImpl.java
@@ -41,17 +41,16 @@ public class SpringDataPetTypeRepositoryImpl implements PetTypeRepositoryOverrid
 	@SuppressWarnings("unchecked")
 	@Override
 	public void delete(PetType petType) {
-		String petTypeId = petType.getId().toString();
+        this.em.remove(this.em.contains(petType) ? petType : this.em.merge(petType));
+		Integer petTypeId = petType.getId();
 		
-		List<Pet> pets = new ArrayList<Pet>();
-		pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
+		List<Pet> pets = this.em.createQuery("SELECT pet FROM Pet pet WHERE type_id=" + petTypeId).getResultList();
 		for (Pet pet : pets){
-			List<Visit> visits = new ArrayList<Visit>();
-			visits = pet.getVisits();
+			List<Visit> visits = pet.getVisits();
 			for (Visit visit : visits){
-				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId().toString()).executeUpdate();
+				this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visit.getId()).executeUpdate();
 			}
-			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId().toString()).executeUpdate();
+			this.em.createQuery("DELETE FROM Pet pet WHERE id=" + pet.getId()).executeUpdate();
 		}
 		this.em.createQuery("DELETE FROM PetType pettype WHERE id=" + petTypeId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java
index f0eb20e2..012eb0ef 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataSpecialtyRepositoryImpl.java
@@ -35,7 +35,8 @@ public class SpringDataSpecialtyRepositoryImpl implements SpecialtyRepositoryOve
 
 	@Override
 	public void delete(Specialty specialty) {
-		String specId = specialty.getId().toString();
+        this.em.remove(this.em.contains(specialty) ? specialty : this.em.merge(specialty));
+		Integer specId = specialty.getId();
 		this.em.createNativeQuery("DELETE FROM vet_specialties WHERE specialty_id=" + specId).executeUpdate();
 		this.em.createQuery("DELETE FROM Specialty specialty WHERE id=" + specId).executeUpdate();
 	}
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java
index a62ddb77..52b08968 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepositoryImpl.java
@@ -38,6 +38,9 @@ public class SpringDataVisitRepositoryImpl implements VisitRepositoryOverride {
 	public void delete(Visit visit) throws DataAccessException {
 		String visitId = visit.getId().toString();
 		this.em.createQuery("DELETE FROM Visit visit WHERE id=" + visitId).executeUpdate();
+        if (em.contains(visit)) {
+            em.remove(visit);
+        }
 	}
 
 
diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java
index e4b9aa44..7a622f3e 100644
--- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java
+++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/VisitRepositoryOverride.java
@@ -27,6 +27,6 @@ import org.springframework.samples.petclinic.model.Visit;
 @Profile("spring-data-jpa")
 public interface VisitRepositoryOverride {
 	
-	public void delete(Visit visit);
+	void delete(Visit visit);
 
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationAdapter.java b/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationConfig.java
similarity index 62%
rename from src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationAdapter.java
rename to src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationConfig.java
index b9c9dfb0..8e18b4f1 100644
--- a/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationAdapter.java
+++ b/src/main/java/org/springframework/samples/petclinic/security/BasicAuthenticationConfig.java
@@ -4,38 +4,47 @@ import javax.sql.DataSource;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
+import org.springframework.security.crypto.password.PasswordEncoder;
 
 @Configuration
-@EnableWebSecurity
-@EnableGlobalMethodSecurity(prePostEnabled = true)
-@ConditionalOnProperty( "basic.authentication.enabled" )
-public class BasicAuthenticationAdapter extends WebSecurityConfigurerAdapter {
+@EnableGlobalMethodSecurity(prePostEnabled = true) // Enable @PreAuthorize method-level security
+@ConditionalOnProperty(name = "petclinic.security.enable", havingValue = "true")
+public class BasicAuthenticationConfig extends WebSecurityConfigurerAdapter {
 
     @Autowired
     private DataSource dataSource;
 
     @Override
     protected void configure(HttpSecurity http) throws Exception {
-        http.authorizeRequests()
-                .antMatchers("/securityNone").permitAll()
-                .anyRequest().authenticated()
-                .and()
-            .httpBasic().and()
-            .csrf().disable();
+        // @formatter:off
+        http
+            .authorizeRequests()
+                .anyRequest()
+                    .authenticated()
+                    .and()
+                .httpBasic()
+                    .and()
+                .csrf()
+                    .disable();
+        // @formatter:on
     }
 
     @Autowired
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
+        // @formatter:off
         auth
             .jdbcAuthentication()
                 .dataSource(dataSource)
                 .usersByUsernameQuery("select username,password,enabled from users where username=?")
                 .authoritiesByUsernameQuery("select username,role from roles where username=?");
+        // @formatter:on
     }
 }
diff --git a/src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java b/src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java
new file mode 100644
index 00000000..8504a5c0
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/security/DisableSecurityConfig.java
@@ -0,0 +1,27 @@
+package org.springframework.samples.petclinic.security;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+/**
+ * Starting from Spring Boot 2, if Spring Security is present, endpoints are secured by default
+ * using Spring Security’s content-negotiation strategy.
+ */
+@Configuration
+@ConditionalOnProperty(name = "petclinic.security.enable", havingValue = "false")
+public class DisableSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        // @formatter:off
+        http
+            .authorizeRequests()
+                .anyRequest().permitAll()
+                .and()
+            .csrf()
+                .disable();
+        // @formatter:on
+    }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 77f1022a..46c07b0c 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -21,7 +21,7 @@ spring.profiles.active=hsqldb,spring-data-jpa
 # ------------------------------------------------
 
 server.port=9966
-server.context-path=/petclinic/
+server.servlet.context-path=/petclinic/
 
 spring.messages.basename=messages/messages
 
@@ -33,5 +33,4 @@ logging.level.org.springframework=INFO
 
 # enable the desired authentication type
 # by default the authentication is disabled
-security.ignored=/**
-basic.authentication.enabled=false
+petclinic.security.enable=false
diff --git a/src/main/resources/db/hsqldb/populateDB.sql b/src/main/resources/db/hsqldb/populateDB.sql
index 01a0f404..e5ee7b90 100644
--- a/src/main/resources/db/hsqldb/populateDB.sql
+++ b/src/main/resources/db/hsqldb/populateDB.sql
@@ -52,7 +52,7 @@ INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot');
 INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered');
 INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed');
 
-INSERT INTO users(username,password,enabled) VALUES ('admin','admin', true);
+INSERT INTO users(username,password,enabled) VALUES ('admin','{noop}admin', true);
 
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_OWNER_ADMIN');
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_VET_ADMIN');
diff --git a/src/main/resources/db/mysql/populateDB.sql b/src/main/resources/db/mysql/populateDB.sql
index 48a35469..0bbcf4a8 100644
--- a/src/main/resources/db/mysql/populateDB.sql
+++ b/src/main/resources/db/mysql/populateDB.sql
@@ -52,7 +52,7 @@ INSERT IGNORE INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot');
 INSERT IGNORE INTO visits VALUES (3, 8, '2009-06-04', 'neutered');
 INSERT IGNORE INTO visits VALUES (4, 7, '2008-09-04', 'spayed');
 
-INSERT IGNORE INTO users(username,password,enabled) VALUES ('admin','admin', true);
+INSERT IGNORE INTO users(username,password,enabled) VALUES ('admin','{noop}admin', true);
 
 INSERT IGNORE INTO roles (username, role) VALUES ('admin', 'ROLE_OWNER_ADMIN');
 INSERT IGNORE INTO roles (username, role) VALUES ('admin', 'ROLE_VET_ADMIN');
diff --git a/src/main/resources/db/postgresql/populateDB.sql b/src/main/resources/db/postgresql/populateDB.sql
index 2c429485..b1dfda8b 100644
--- a/src/main/resources/db/postgresql/populateDB.sql
+++ b/src/main/resources/db/postgresql/populateDB.sql
@@ -52,7 +52,7 @@ INSERT INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot') ON CONFLICT DO NOT
 INSERT INTO visits VALUES (3, 8, '2009-06-04', 'neutered') ON CONFLICT DO NOTHING;
 INSERT INTO visits VALUES (4, 7, '2008-09-04', 'spayed') ON CONFLICT DO NOTHING;
 
-INSERT INTO users(username,password,enabled) VALUES ('admin','admin', true) ON CONFLICT DO NOTHING;
+INSERT INTO users(username,password,enabled) VALUES ('admin','{noop}admin', true) ON CONFLICT DO NOTHING;
 
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_OWNER_ADMIN') ON CONFLICT DO NOTHING;
 INSERT INTO roles (username, role) VALUES ('admin', 'ROLE_VET_ADMIN') ON CONFLICT DO NOTHING;
diff --git a/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java b/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java
index b836d0cc..75c3f32e 100644
--- a/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java
@@ -39,7 +39,7 @@ public class ValidatorTests {
         assertThat(constraintViolations.size()).isEqualTo(1);
         ConstraintViolation<Person> violation = constraintViolations.iterator().next();
         assertThat(violation.getPropertyPath().toString()).isEqualTo("firstName");
-        assertThat(violation.getMessage()).isEqualTo("may not be empty");
+        assertThat(violation.getMessage()).isEqualTo("must not be empty");
     }
 
 }
diff --git a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
index 50655895..a312dece 100644
--- a/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/service/clinicService/AbstractClinicServiceTests.java
@@ -20,9 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Collection;
 import java.util.Date;
 
-import org.junit.Before;
 import org.junit.Test;
-import org.mockito.MockitoAnnotations;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.samples.petclinic.model.Owner;
 import org.springframework.samples.petclinic.model.Pet;
@@ -60,11 +58,6 @@ public abstract class AbstractClinicServiceTests {
     @Autowired
     protected ClinicService clinicService;
 
-    @Before
-    public void init() {
-        MockitoAnnotations.initMocks(this);
-    }
-
     @Test
     public void shouldFindOwnersByLastName() {
         Collection<Owner> owners = this.clinicService.findOwnerByLastName("Davis");
@@ -224,7 +217,7 @@ public abstract class AbstractClinicServiceTests {
         Pet pet = this.clinicService.findPetById(1);
         this.clinicService.deletePet(pet);
         try {
-        pet = this.clinicService.findPetById(1);
+            pet = this.clinicService.findPetById(1);
 		} catch (Exception e) {
 			pet = null;
 		}
@@ -466,10 +459,16 @@ public abstract class AbstractClinicServiceTests {
     @Test
     @Transactional
     public void shouldDeleteSpecialty(){
-    	Specialty specialty = this.clinicService.findSpecialtyById(1);
+        Specialty specialty = new Specialty();
+        specialty.setName("test");
+        this.clinicService.saveSpecialty(specialty);
+        Integer specialtyId = specialty.getId();
+        assertThat(specialtyId).isNotNull();
+    	specialty = this.clinicService.findSpecialtyById(specialtyId);
+        assertThat(specialty).isNotNull();
         this.clinicService.deleteSpecialty(specialty);
         try {
-        	specialty = this.clinicService.findSpecialtyById(1);
+        	specialty = this.clinicService.findSpecialtyById(specialtyId);
 		} catch (Exception e) {
 			specialty = null;
 		}
@@ -477,5 +476,4 @@ public abstract class AbstractClinicServiceTests {
     }
 
 
-
 }
-- 
GitLab