diff --git a/pom.xml b/pom.xml index 0fc0b3f978b42663ab71b3fd65892b665df6c170..d286a90bcac4521abb2c4a4918fc3065deffc152 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 98e7babf1d28f0aae65cdb1bfb90b4a27ff61df3..907390a979ed857c6dcf7ede6fd481a5c9a893b1 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 a9b889779bf9e94bf29a25436cba16116a8b2700..e218be11b928b63686ab245b4f5ddff1c6ae4bc4 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 e96be5b1189daaa188d4eb55868dd60f36b1c3ce..f97dd52b102349b83e9c23181c60683fe4de2f62 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 eb68ced10d7d942c6c17a862f550f1e2109b22f5..e957e86aefd0762a13e521317892856d87c9aecd 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 d3e03c0ddf61a9c3bf2209a13b88cc11f1a5c897..a0da6f697bbc839c22fd9fe944cf305722b254d1 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 bdf24b140aedf5032ff586b1af2229cb5803ef15..05a39cdc1681d13479461e6c1c28640ed6d94164 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 98e3dcf0816c3d56475af2e4f4a72b6f48e86604..e4620c77d6cc68f08f2e9b5272a4fb3ae3c999b6 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 dc0b0d4865073621fda49b3ba9f5ad59a01d31c4..2bfd1c78c9d3ca467dab2ed320f4225dd624acb9 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 54248caf30856417ccd7697727d8a3aab5670cf7..e6ae41bb2d980d273cbf46c43f7973cd7c88db3d 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 e5f911c7b501fd2564854c0dec4abd21bb2769f4..f6779341adf53bd2dcbd32ac2a410eee5161ddb1 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 b269da83e4110eea3e77e969c6ccff8fccc0ce51..78c02b008d698d2ed06b2fa97b01fb22efba2311 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 6414b77598e1ad46900b9abf35cbd60a841bcae2..a3b19e90d20b86aebc4c4d2f1e4e93f102e45629 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 39b195506c796f95b9fd13c16e1706e223d1d211..656d8efeaae7c991ae5141ea509381768842163c 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 09a69889527523dbd459d592874acc1db4e4c6e2..78c0093b7f6c40a92c3f03fb28eeda1c1f832bce 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 753f9c95ed16eb53e45a6e99e3425740dfd3f1f7..23b7a68b200a33993513db2678fde558fc1c1fd1 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 a9f86296ae61901eacb1596dab17126431bb2a1e..a02f9a447b496b3eef478e481515c573069cf191 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 f0eb20e26c05a2c88a7eedc73a026ba14c36378b..012eb0ef4dd109399461675208184b0b24e85075 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 a62ddb77c8688c120476c488609e0b0f4fdfdb68..52b08968a4ce467fb0567751291d9a4eacaeed4c 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 e4b9aa441bdebb379f44e283d7a074365fb8c642..7a622f3edd7876859bb0b477068eb59837d59b98 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 b9c9dfb09fbd3acea2c91dc91ba263f071dd0572..8e18b4f127f2fcef355c77be56bf60386c6335b9 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 0000000000000000000000000000000000000000..8504a5c02a2ecf786cc340a133363af273a5834f --- /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 77f1022a6db6dfcb1f3f690d8e2bbeaf881b1211..46c07b0c73c888922037af875c8e5b960d32f9d7 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 01a0f404cda03db7f52149519c2e110658f80346..e5ee7b90fb55ab921afaf0f4cc4145fea196a0bf 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 48a354697ceee8f0489d0a2c291632fd01b4e9a3..0bbcf4a87d377cfb7e99167102ed193b222a4d4a 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 2c429485a28796d49457020f7d4298b7ee7be4a2..b1dfda8b4e46dea932aae30fe6ce8af694da3035 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 b836d0cc2bda6fad7a2dded46f69accf794b0ff2..75c3f32eb964f6e9b540aed0e6cc7469b5fac8ae 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 50655895842775ddecc1877a3c36d30ca354fba3..a312decedceeeb6976a90bbb259528080cd8fb3e 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 { } - }