From db3fc815be1b7da89ff69c0b181d37a8a37a507b Mon Sep 17 00:00:00 2001 From: Dapeng <verydapeng@gmail.com> Date: Mon, 19 Sep 2016 16:48:58 +0800 Subject: [PATCH] restructure ui layout --- pom.xml | 434 ++---------------- .../petclinic/PetClinicApplication.java | 12 + .../petclinic/web/CrashController.java | 40 -- .../samples/petclinic/web/OwnerResource.java | 4 +- .../samples/petclinic/web/PetResource.java | 47 +- .../petclinic/web/PetTypeFormatter.java | 66 --- .../samples/petclinic/web/PetValidator.java | 6 +- .../samples/petclinic/web/VetResource.java | 7 +- .../petclinic/web/VisitController.java | 8 +- .../samples/petclinic/web/package-info.java | 8 - src/main/resources/application.properties | 22 + src/main/resources/cache/ehcache.xml | 17 - src/main/resources/cache/ehcache.xsd | 419 ----------------- .../datatables/datatables.properties | 6 - src/main/resources/logback.xml | 25 - src/main/resources/spring/business-config.xml | 96 ---- .../resources/spring/data-access.properties | 41 -- .../resources/spring/datasource-config.xml | 43 -- src/main/resources/spring/mvc-core-config.xml | 75 --- src/main/resources/spring/mvc-view-config.xml | 15 - src/main/resources/spring/tools-config.xml | 49 -- src/main/webapp/WEB-INF/web.xml | 95 ---- src/main/webapp/index.html | 7 +- src/main/webapp/resources/css/petclinic.css | 20 - .../scripts/app/fragments/bodyHeader.html | 41 +- .../webapp/scripts/app/fragments/footer.html | 13 +- .../webapp/scripts/app/pet/PetController.js | 6 +- src/main/webapp/scripts/app/pet/petForm.html | 60 ++- 28 files changed, 173 insertions(+), 1509 deletions(-) create mode 100644 src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java delete mode 100644 src/main/java/org/springframework/samples/petclinic/web/CrashController.java delete mode 100644 src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java delete mode 100644 src/main/java/org/springframework/samples/petclinic/web/package-info.java create mode 100644 src/main/resources/application.properties delete mode 100644 src/main/resources/cache/ehcache.xml delete mode 100644 src/main/resources/cache/ehcache.xsd delete mode 100644 src/main/resources/dandelion/datatables/datatables.properties delete mode 100644 src/main/resources/logback.xml delete mode 100644 src/main/resources/spring/business-config.xml delete mode 100644 src/main/resources/spring/data-access.properties delete mode 100644 src/main/resources/spring/datasource-config.xml delete mode 100644 src/main/resources/spring/mvc-core-config.xml delete mode 100644 src/main/resources/spring/mvc-view-config.xml delete mode 100644 src/main/resources/spring/tools-config.xml delete mode 100644 src/main/webapp/WEB-INF/web.xml diff --git a/pom.xml b/pom.xml index fefabaee..adb51971 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>1.4.0.RELEASE</version> + </parent> + <groupId>org.springframework.samples</groupId> <artifactId>spring-petclinic</artifactId> <version>1.0.0-SNAPSHOT</version> @@ -8,441 +15,72 @@ <name>petclinic</name> <packaging>war</packaging> - <properties> - - <!-- Generic properties --> - <java.version>1.8</java.version> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - - <!-- Spring --> - <spring-framework.version>4.1.6.RELEASE</spring-framework.version> - <spring-data-jpa.version>1.8.0.RELEASE</spring-data-jpa.version> - - - <!-- Java EE / Java SE dependencies --> - <jsp.version>2.2</jsp.version> - <jstl.version>1.2</jstl.version> - <tomcat.servlet.version>7.0.47</tomcat.servlet.version> - <jaxb-impl.version>2.2.7</jaxb-impl.version> - - <!-- Hibernate / JPA --> - <hibernate.version>4.3.8.Final</hibernate.version> - - <!-- Bean validation --> - <hibernate-validator.version>4.3.1.Final</hibernate-validator.version> - - <!-- Database access --> - <tomcat-jdbc.version>7.0.42</tomcat-jdbc.version> - <ehcache.version>2.6.10</ehcache.version> - <hsqldb.version>2.3.2</hsqldb.version> - - <!-- AOP --> - <aspectj.version>1.8.5</aspectj.version> - - <!-- Logging --> - <logback.version>1.1.3</logback.version> - <slf4j.version>1.7.12</slf4j.version> - - <!-- JSon--> - <json-path.version>2.0.0</json-path.version> - - <!-- Test --> - <junit.version>4.12</junit.version> - <assertj.version>3.0.0</assertj.version> - - <!-- Dates --> - <jodatime-hibernate.version>1.3</jodatime-hibernate.version> - <jodatime-jsptags.version>1.1.1</jodatime-jsptags.version> - <jodatime.version>2.7</jodatime.version> - <jadira-usertype-core.version>3.2.0.GA</jadira-usertype-core.version> - <jackson.datatype.joda.version>2.4.5</jackson.datatype.joda.version> - - - <!-- Web dependencies --> - <webjars-bootstrap.version>2.3.0</webjars-bootstrap.version> - <webjars-jquery-ui.version>1.10.3</webjars-jquery-ui.version> - <webjars-jquery.version>2.0.3-1</webjars-jquery.version> - <dandelion.version>0.10.1</dandelion.version> - - <mysql.version>5.1.22</mysql.version> - - <cobertura.version>2.7</cobertura.version> - - </properties> - <dependencies> <dependency> - <groupId>org.jadira.usertype</groupId> - <artifactId>usertype.core</artifactId> - <version>${jadira-usertype-core.version}</version> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> </dependency> - <dependency> - <groupId>org.apache.tomcat</groupId> - <artifactId>tomcat-servlet-api</artifactId> - <version>${tomcat.servlet.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>javax.servlet.jsp</groupId> - <artifactId>jsp-api</artifactId> - <version>2.1</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.glassfish.web</groupId> - <artifactId>jstl-impl</artifactId> - <version>1.2</version> - <exclusions> - <exclusion> - <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.sun.xml.bind</groupId> - <artifactId>jaxb-impl</artifactId> - <version>${jaxb-impl.version}</version> - <scope>provided</scope> - </dependency> - <!-- JSon --> - <dependency> - <groupId>com.jayway.jsonpath</groupId> - <artifactId>json-path</artifactId> - <version>${json-path.version}</version> - <scope>test</scope> - </dependency> - <!-- SPRING, SPRING, SPRINGITY SPRING --> <dependency> - <groupId>org.springframework.data</groupId> - <artifactId>spring-data-jpa</artifactId> - <version>${spring-data-jpa.version}</version> - <exclusions> - <exclusion> - <groupId>org.springframework</groupId> - <artifactId>*</artifactId> - </exclusion> - <!-- because Spring Data usually comes with a slightly older version of Spring --> - </exclusions> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-jdbc</artifactId> - <version>${spring-framework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-aop</artifactId> - <version>${spring-framework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-webmvc</artifactId> - <version>${spring-framework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-tx</artifactId> - <version>${spring-framework.version}</version> - </dependency> - <!-- used for EhCacheCacheManager --> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context-support</artifactId> - <version>${spring-framework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-orm</artifactId> - <version>${spring-framework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-oxm</artifactId> - <version>${spring-framework.version}</version> - <exclusions> - <exclusion> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - </exclusion> - </exclusions> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjrt</artifactId> - <version>${aspectj.version}</version> - </dependency> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjweaver</artifactId> - <version>${aspectj.version}</version> - <scope>runtime</scope> - </dependency> - - <!-- Database connection pool - See here for more details on commons-dbcp versus tomcat-jdbc: - http://blog.ippon.fr/2013/03/13/improving-the-performance-of-the-spring-petclinic-sample-application-part-3-of-5/ - --> - <dependency> - <groupId>org.apache.tomcat</groupId> - <artifactId>tomcat-jdbc</artifactId> - <version>${tomcat-jdbc.version}</version> - <scope>runtime</scope> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - <!-- Logging with SLF4J & LogBack --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>${slf4j.version}</version> - <scope>compile</scope> - </dependency> <dependency> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-classic</artifactId> - <version>${logback.version}</version> - <scope>runtime</scope> - </dependency> - - <!-- Date and Time --> - <dependency> - <groupId>joda-time</groupId> - <artifactId>joda-time</artifactId> - <version>${jodatime.version}</version> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> </dependency> + <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-joda</artifactId> - <version>${jackson.datatype.joda.version}</version> - </dependency> - - <dependency> - <groupId>joda-time</groupId> - <artifactId>joda-time-hibernate</artifactId> - <version>${jodatime-hibernate.version}</version> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-jasper</artifactId> + <scope>provided</scope> </dependency> + <dependency> - <groupId>joda-time</groupId> - <artifactId>joda-time-jsptags</artifactId> - <version>${jodatime-jsptags.version}</version> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> </dependency> - <!-- Databases - Uses HSQL by default --> - <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> --> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> - <version>${hsqldb.version}</version> <scope>runtime</scope> </dependency> - <!-- For MySql only --> - <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> --> - <!-- HIBERNATE --> - <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-entitymanager</artifactId> - <version>${hibernate.version}</version> - </dependency> - <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-validator</artifactId> - <version>${hibernate-validator.version}</version> - </dependency> - - <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-ehcache</artifactId> - <version>${hibernate.version}</version> - </dependency> - <dependency> - <groupId>net.sf.ehcache</groupId> - <artifactId>ehcache-core</artifactId> - <version>${ehcache.version}</version> - <exclusions> - <exclusion> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - </exclusion> - </exclusions> - </dependency> - <!-- Webjars (static dependencies distributed as JAR files) --> - <dependency> - <groupId>org.webjars</groupId> - <artifactId>bootstrap</artifactId> - <version>${webjars-bootstrap.version}</version> - </dependency> - <dependency> - <groupId>org.webjars</groupId> - <artifactId>jquery-ui</artifactId> - <version>${webjars-jquery-ui.version}</version> - </dependency> - <dependency> - <groupId>org.webjars</groupId> - <artifactId>jquery</artifactId> - <version>${webjars-jquery.version}</version> - </dependency> - - <!-- Test Artifacts --> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - <version>${spring-framework.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>${junit.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - <version>${assertj.version}</version> - </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>1.16.10</version> + <scope>provided</scope> + </dependency> - <!-- Dandelion --> <dependency> - <groupId>com.github.dandelion</groupId> - <artifactId>datatables-jsp</artifactId> - <version>${dandelion.version}</version> - </dependency> - <dependency> - <groupId>com.github.dandelion</groupId> - <artifactId>datatables-export-itext</artifactId> - <version>${dandelion.version}</version> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> </dependency> </dependencies> - <!-- Maven plugin versions are mentioned in order to guarantee the build reproducibility in the long term --> <build> - <defaultGoal>install</defaultGoal> - <testResources> - <testResource> - <!-- declared explicitly so Spring config files can be placed next to their corresponding JUnit test class --> - <directory>${project.basedir}/src/test/java</directory> - </testResource> - <testResource> - <directory>${project.basedir}/src/test/resources</directory> - </testResource> - </testResources> <plugins> <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>3.0</version> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> <configuration> - <compilerArguments> - <Xlint /> - </compilerArguments> - <verbose>true</verbose> - <source>${java.version}</source> - <target>${java.version}</target> - <showWarnings>true</showWarnings> + <fork>true</fork> </configuration> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.13</version> - <configuration> - <includes> - <include>**/*Tests.java</include> - </includes> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <version>2.3</version> - <configuration> - <warName>petclinic</warName> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-eclipse-plugin</artifactId> - <version>2.9</version> - <configuration> - <downloadSources>true</downloadSources> - <downloadJavadocs>true</downloadJavadocs> - <wtpversion>2.0</wtpversion> - <sourceIncludes> - <sourceInclude>**/*.*</sourceInclude> - </sourceIncludes> - <additionalBuildcommands> - <buildCommand> - <name>org.springframework.ide.eclipse.core.springbuilder</name> - </buildCommand> - <buildCommand> - <name>org.eclipse.m2e.core.maven2Builder</name> - </buildCommand> - </additionalBuildcommands> - <additionalProjectnatures> - <projectnature>org.eclipse.jdt.core.javanature</projectnature> - <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> - <projectnature>org.eclipse.m2e.core.maven2Nature</projectnature> - </additionalProjectnatures> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-assembly-plugin</artifactId> - <version>2.4</version> - <configuration> - <descriptorRefs> - <descriptorRef>jar-with-dependencies</descriptorRef> - </descriptorRefs> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> - <version>2.2</version> - <configuration> - <server>tomcat-development-server</server> - <port>9966</port> - <path>/petclinic</path> - </configuration> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>cobertura-maven-plugin</artifactId> - <version>${cobertura.version}</version> - <configuration> - </configuration> - <executions> - <execution> - <goals> - <goal>clean</goal> - <goal>check</goal> - </goals> - </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> - <configuration> - <formats> - <format>html</format> - </formats> - </configuration> - </plugin> - </plugins> - </reporting> - - <url>demopetclinic</url> </project> diff --git a/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java b/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java new file mode 100644 index 00000000..72dc6087 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java @@ -0,0 +1,12 @@ +package org.springframework.samples.petclinic; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PetClinicApplication { + + public static void main(String[] args) { + SpringApplication.run(PetClinicApplication.class, args); + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/web/CrashController.java b/src/main/java/org/springframework/samples/petclinic/web/CrashController.java deleted file mode 100644 index e413f3f3..00000000 --- a/src/main/java/org/springframework/samples/petclinic/web/CrashController.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2002-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.samples.petclinic.web; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - * Controller used to showcase what happens when an exception is thrown - * - * @author Michael Isvy - * <p/> - * Also see how the bean of type 'SimpleMappingExceptionResolver' has been declared inside - * /WEB-INF/mvc-core-config.xml - */ -@Controller -public class CrashController { - - @RequestMapping(value = "/oups", method = RequestMethod.GET) - public String triggerException() { - throw new RuntimeException("Expected: controller used to showcase what " + - "happens when an exception is thrown"); - } - - -} diff --git a/src/main/java/org/springframework/samples/petclinic/web/OwnerResource.java b/src/main/java/org/springframework/samples/petclinic/web/OwnerResource.java index 851a3ff7..e9cba805 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/OwnerResource.java +++ b/src/main/java/org/springframework/samples/petclinic/web/OwnerResource.java @@ -31,6 +31,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import javax.validation.Valid; + /** * @author Juergen Hoeller * @author Ken Krebs @@ -98,7 +100,7 @@ public class OwnerResource { * Update Owner */ @RequestMapping(value = "/owner/{ownerId}", method = RequestMethod.PUT) - public Owner updateOwner(@PathVariable("ownerId") int ownerId, @RequestBody Owner ownerRequest) { + public Owner updateOwner(@PathVariable("ownerId") int ownerId, @Valid @RequestBody Owner ownerRequest) { Owner ownerModel = retrieveOwner(ownerId); // This is done by hand for simplicity purpose. In a real life use-case we should consider using MapStruct. ownerModel.setFirstName(ownerRequest.getFirstName()); diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetResource.java b/src/main/java/org/springframework/samples/petclinic/web/PetResource.java index 3651968b..c96b3571 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetResource.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetResource.java @@ -15,19 +15,23 @@ */ package org.springframework.samples.petclinic.web; -import java.util.Collection; +import java.util.Date; import java.util.Map; +import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -43,23 +47,22 @@ public class PetResource { private final ClinicService clinicService; - @Autowired public PetResource(ClinicService clinicService) { this.clinicService = clinicService; } - @ModelAttribute("types") - public Collection<PetType> populatePetTypes() { - return this.clinicService.findPetTypes(); - } - @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { dataBinder.setDisallowedFields("id"); } - @RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.GET) + @GetMapping("/petTypes") + Object getPetTypes() { + return clinicService.findPetTypes(); + } + + @GetMapping("/owners/{ownerId}/pets/new") public String initCreationForm(@PathVariable("ownerId") int ownerId, Map<String, Object> model) { Owner owner = this.clinicService.findOwnerById(ownerId); Pet pet = new Pet(); @@ -68,7 +71,7 @@ public class PetResource { return "pets/createOrUpdatePetForm"; } - @RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.POST) + @PostMapping("/owners/{ownerId}/pets/new") public String processCreationForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { new PetValidator().validate(pet, result); if (result.hasErrors()) { @@ -80,10 +83,10 @@ public class PetResource { } } - @RequestMapping(value = "/owner/*/pet/{petId}", method = RequestMethod.GET) - public Pet findPet(@PathVariable("petId") int petId) { + @GetMapping("/owner/*/pet/{petId}") + public PetDetails findPet(@PathVariable("petId") int petId) { Pet pet = this.clinicService.findPetById(petId); - return pet; + return new PetDetails(pet); } @RequestMapping(value = "/owners/{ownerId}/pets/{petId}/edit", method = {RequestMethod.PUT, RequestMethod.POST}) @@ -99,4 +102,24 @@ public class PetResource { } } + @Getter + static class PetDetails { + + long id; + String name; + String owner; + @DateTimeFormat(pattern = "yyyy-MM-dd") + Date birthDate; + PetType type; + + PetDetails(Pet pet) { + this.id = pet.getId(); + this.name = pet.getName(); + this.owner = pet.getOwner().getFirstName() + " " + pet.getOwner().getLastName(); + this.birthDate = pet.getBirthDate(); + this.type = pet.getType(); + } + + } + } diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java b/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java deleted file mode 100644 index 3d47d220..00000000 --- a/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2002-2013 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.samples.petclinic.web; - - -import java.text.ParseException; -import java.util.Collection; -import java.util.Locale; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.format.Formatter; -import org.springframework.samples.petclinic.model.PetType; -import org.springframework.samples.petclinic.service.ClinicService; - -/** - * Instructs Spring MVC on how to parse and print elements of type 'PetType'. Starting from Spring 3.0, Formatters have - * come as an improvement in comparison to legacy PropertyEditors. See the following links for more details: - The - * Spring ref doc: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html#format-Formatter-SPI - * - A nice blog entry from Gordon Dickens: http://gordondickens.com/wordpress/2010/09/30/using-spring-3-0-custom-type-converter/ - * <p/> - * Also see how the bean 'conversionService' has been declared inside /WEB-INF/mvc-core-config.xml - * - * @author Mark Fisher - * @author Juergen Hoeller - * @author Michael Isvy - */ -public class PetTypeFormatter implements Formatter<PetType> { - - private final ClinicService clinicService; - - - @Autowired - public PetTypeFormatter(ClinicService clinicService) { - this.clinicService = clinicService; - } - - @Override - public String print(PetType petType, Locale locale) { - return petType.getName(); - } - - @Override - public PetType parse(String text, Locale locale) throws ParseException { - Collection<PetType> findPetTypes = this.clinicService.findPetTypes(); - for (PetType type : findPetTypes) { - if (type.getName().equals(text)) { - return type; - } - } - throw new ParseException("type not found: " + text, 0); - } - -} diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java b/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java index 03a1bca7..fbb7dd5b 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java @@ -35,14 +35,14 @@ public class PetValidator { } else if (pet.isNew() && pet.getOwner().getPet(name, true) != null) { errors.rejectValue("name", "duplicate", "already exists"); } - + // type validation if (pet.isNew() && pet.getType() == null) { errors.rejectValue("type", "required", "required"); } - + // birth date validation - if (pet.getBirthDate()==null) { + if (pet.getBirthDate() == null) { errors.rejectValue("birthDate", "required", "required"); } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/VetResource.java b/src/main/java/org/springframework/samples/petclinic/web/VetResource.java index 968c4d25..7661e97f 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VetResource.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VetResource.java @@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.samples.petclinic.model.Vet; import org.springframework.samples.petclinic.service.ClinicService; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -36,17 +37,13 @@ public class VetResource { private final ClinicService clinicService; - @Autowired public VetResource(ClinicService clinicService) { this.clinicService = clinicService; } - @RequestMapping(value="/vets", method = RequestMethod.GET, - produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping("/vets") public Collection<Vet> showResourcesVetList() { return this.clinicService.findVets(); } - - } diff --git a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java index f3f6f3ff..705ed2b5 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java @@ -26,9 +26,11 @@ import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -72,13 +74,13 @@ public class VisitController { } // Spring MVC calls method loadPetWithVisit(...) before initNewVisitForm is called - @RequestMapping(value = "/owners/*/pets/{petId}/visits/new", method = RequestMethod.GET) + @GetMapping("/owners/*/pets/{petId}/visits/new") public String initNewVisitForm(@PathVariable("petId") int petId, Map<String, Object> model) { return "pets/createOrUpdateVisitForm"; } // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called - @RequestMapping(value = "/owners/{ownerId}/pets/{petId}/visits/new", method = RequestMethod.POST) + @PostMapping("/owners/{ownerId}/pets/{petId}/visits/new") public String processNewVisitForm(@Valid Visit visit, BindingResult result) { if (result.hasErrors()) { return "pets/createOrUpdateVisitForm"; @@ -88,7 +90,7 @@ public class VisitController { } } - @RequestMapping(value = "/owners/*/pets/{petId}/visits", method = RequestMethod.GET) + @GetMapping("/owners/*/pets/{petId}/visits") public String showVisits(@PathVariable int petId, Map<String, Object> model) { model.put("visits", this.clinicService.findPetById(petId).getVisits()); return "visitList"; diff --git a/src/main/java/org/springframework/samples/petclinic/web/package-info.java b/src/main/java/org/springframework/samples/petclinic/web/package-info.java deleted file mode 100644 index c909ccf7..00000000 --- a/src/main/java/org/springframework/samples/petclinic/web/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ - -/** - * - * The classes in this package represent PetClinic's web presentation layer. - * - */ -package org.springframework.samples.petclinic.web; - diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..025f89af --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,22 @@ +# database init, supports mysql too +database=hsqldb +spring.datasource.schema=classpath*:db/${database}/schema.sql +spring.datasource.data=classpath*:db/${database}/data.sql + +# Web +spring.mvc.view.prefix=/WEB-INF/jsp/ +spring.mvc.view.suffix=.jsp + +# JPA +spring.jpa.hibernate.ddl-auto=none + +# Internationalization +spring.messages.basename=messages/messages + +# Actuator / Management +management.contextPath=/manage + +# Logging +logging.level.org.springframework=INFO + +server.context-path=/petclinic \ No newline at end of file diff --git a/src/main/resources/cache/ehcache.xml b/src/main/resources/cache/ehcache.xml deleted file mode 100644 index 32e50995..00000000 --- a/src/main/resources/cache/ehcache.xml +++ /dev/null @@ -1,17 +0,0 @@ -<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="ehcache.xsd" - updateCheck="false"> - <diskStore path="java.io.tmpdir"/> - - <!-- objects are evicted from the cache every 60 seconds --> - <cache name="vets" - timeToLiveSeconds="60" - maxElementsInMemory="100" - eternal="false" - overflowToDisk="false" - maxElementsOnDisk="10000000" - diskPersistent="false" - diskExpiryThreadIntervalSeconds="1" - memoryStoreEvictionPolicy="LRU"/> - -</ehcache> diff --git a/src/main/resources/cache/ehcache.xsd b/src/main/resources/cache/ehcache.xsd deleted file mode 100644 index bfc19ddb..00000000 --- a/src/main/resources/cache/ehcache.xsd +++ /dev/null @@ -1,419 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.7"> - - <xs:element name="ehcache"> - <xs:complexType> - <xs:sequence> - <xs:element maxOccurs="1" minOccurs="0" ref="managementRESTService"/> - <xs:element maxOccurs="1" minOccurs="0" ref="diskStore"/> - <xs:element maxOccurs="1" minOccurs="0" ref="sizeOfPolicy"/> - <xs:element maxOccurs="1" minOccurs="0" ref="transactionManagerLookup"/> - <xs:element maxOccurs="1" minOccurs="0" ref="cacheManagerEventListenerFactory"/> - <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerProviderFactory"/> - <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerListenerFactory"/> - <xs:element maxOccurs="1" minOccurs="0" ref="terracottaConfig"/> - <xs:element maxOccurs="1" minOccurs="0" ref="defaultCache"/> - <xs:element maxOccurs="unbounded" minOccurs="0" ref="cache"/> - </xs:sequence> - <xs:attribute name="name" use="optional"/> - <xs:attribute default="true" name="updateCheck" type="xs:boolean" use="optional"/> - <xs:attribute default="autodetect" name="monitoring" type="monitoringType" use="optional"/> - <xs:attribute default="true" name="dynamicConfig" type="xs:boolean" use="optional"/> - <xs:attribute default="15" name="defaultTransactionTimeoutInSeconds" type="xs:integer" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalHeap" type="memoryUnitOrPercentage" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalOffHeap" type="memoryUnit" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalDisk" type="memoryUnit" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="managementRESTService"> - <xs:complexType> - <xs:attribute name="enabled" type="xs:boolean" use="optional"/> - <xs:attribute name="bind" use="optional"/> - <xs:attribute name="securityServiceLocation" use="optional"/> - <xs:attribute name="securityServiceTimeout" use="optional" type="xs:integer"/> - <xs:attribute name="sslEnabled" use="optional" type="xs:boolean"/> - <xs:attribute name="needClientAuth" use="optional" type="xs:boolean"/> - <xs:attribute name="sampleHistorySize" use="optional" type="xs:integer"/> - <xs:attribute name="sampleIntervalSeconds" use="optional" type="xs:integer"/> - <xs:attribute name="sampleSearchIntervalSeconds" use="optional" type="xs:integer"/> - </xs:complexType> - </xs:element> - <xs:element name="diskStore"> - <xs:complexType> - <xs:attribute name="path" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="transactionManagerLookup"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheManagerEventListenerFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheManagerPeerProviderFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheManagerPeerListenerFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="terracottaConfig"> - <xs:complexType> - <xs:sequence> - <xs:element maxOccurs="1" minOccurs="0" name="tc-config"> - <xs:complexType> - <xs:sequence> - <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute default="localhost:9510" name="url" use="optional"/> - <xs:attribute name="rejoin" type="xs:boolean" use="optional" default="false"/> - </xs:complexType> - </xs:element> - <!-- add clone support for addition of cacheExceptionHandler. Important! --> - <xs:element name="defaultCache"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheDecoratorFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="pinning"/> - <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/> - <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="elementValueComparator"/> - <xs:element minOccurs="0" maxOccurs="1" ref="sizeOfPolicy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="persistence"/> - </xs:sequence> - <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/> - <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/> - <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/> - <xs:attribute name="eternal" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxElementsInMemory" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalHeap" type="xs:integer" use="optional"/> - <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/> - <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/> - <xs:attribute name="overflowToDisk" type="xs:boolean" use="optional"/> - <xs:attribute name="timeToIdleSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="timeToLiveSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="maxElementsOnDisk" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalDisk" type="xs:integer" use="optional"/> - <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off"/> - <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/> - <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cache"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheDecoratorFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/> - <xs:element minOccurs="0" maxOccurs="1" ref="pinning"/> - <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/> - <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="searchable"/> - <xs:element minOccurs="0" maxOccurs="1" ref="elementValueComparator"/> - <xs:element minOccurs="0" maxOccurs="1" ref="sizeOfPolicy"/> - <xs:element minOccurs="0" maxOccurs="1" ref="persistence"/> - </xs:sequence> - <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/> - <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/> - <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/> - <xs:attribute name="eternal" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxElementsInMemory" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalHeap" type="xs:integer" use="optional"/> - <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/> - <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="overflowToDisk" type="xs:boolean" use="optional"/> - <xs:attribute name="timeToIdleSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="timeToLiveSeconds" type="xs:integer" use="optional"/> - <xs:attribute name="maxElementsOnDisk" type="xs:integer" use="optional"/> - <xs:attribute name="maxEntriesLocalDisk" type="xs:integer" use="optional"/> - <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off"/> - <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="logging" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/> - <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/> - <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalHeap" type="memoryUnitOrPercentage" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalOffHeap" type="memoryUnitOrPercentage" use="optional"/> - <xs:attribute default="0" name="maxBytesLocalDisk" type="memoryUnitOrPercentage" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheEventListenerFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - <xs:attribute name="listenFor" use="optional" type="notificationScope" default="all"/> - </xs:complexType> - </xs:element> - <xs:element name="bootstrapCacheLoaderFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheExtensionFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheExceptionHandlerFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheLoaderFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="cacheDecoratorFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - <xs:element name="searchAttribute"> - <xs:complexType> - <xs:attribute name="name" use="required" type="xs:string"/> - <xs:attribute name="expression" type="xs:string"/> - <xs:attribute name="class" type="xs:string"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - - <xs:element name="searchable"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="unbounded" ref="searchAttribute"/> - </xs:sequence> - <xs:attribute name="keys" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="values" use="optional" type="xs:boolean" default="true"/> - </xs:complexType> - </xs:element> - - <xs:element name="pinning"> - <xs:complexType> - <xs:attribute name="store" use="required" type="pinningStoreType"/> - </xs:complexType> - </xs:element> - - <xs:element name="terracotta"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="1" ref="nonstop"/> - </xs:sequence> - <xs:attribute name="clustered" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="valueMode" use="optional" type="terracottaCacheValueType" default="serialization"/> - <xs:attribute name="coherentReads" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="localKeyCache" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="localKeyCacheSize" use="optional" type="xs:positiveInteger" default="300000"/> - <xs:attribute name="orphanEviction" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="orphanEvictionPeriod" use="optional" type="xs:positiveInteger" default="4"/> - <xs:attribute name="copyOnRead" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="coherent" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="consistency" use="optional" type="consistencyType" default="eventual"/> - <xs:attribute name="synchronousWrites" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="concurrency" use="optional" type="xs:nonNegativeInteger" default="0"/> - <xs:attribute name="localCacheEnabled" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="compressionEnabled" use="optional" type="xs:boolean" default="false"/> - </xs:complexType> - </xs:element> - <xs:simpleType name="consistencyType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="strong"/> - <xs:enumeration value="eventual"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="nonstop"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="1" ref="timeoutBehavior"/> - </xs:sequence> - <xs:attribute name="enabled" use="optional" type="xs:boolean" default="true"/> - <xs:attribute name="immediateTimeout" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="timeoutMillis" use="optional" type="xs:positiveInteger" default="30000"/> - </xs:complexType> - </xs:element> - <xs:element name="timeoutBehavior"> - <xs:complexType> - <xs:attribute name="type" use="optional" type="timeoutBehaviorType" default="exception"/> - <xs:attribute name="properties" use="optional" default=""/> - <xs:attribute name="propertySeparator" use="optional" default=","/> - </xs:complexType> - </xs:element> - <xs:simpleType name="timeoutBehaviorType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="noop"/> - <xs:enumeration value="exception"/> - <xs:enumeration value="localReads"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="monitoringType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="autodetect"/> - <xs:enumeration value="on"/> - <xs:enumeration value="off"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="pinningStoreType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="localHeap"/> - <xs:enumeration value="localMemory"/> - <xs:enumeration value="inCache"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="terracottaCacheValueType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="serialization"/> - <xs:enumeration value="identity"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="transactionalMode"> - <xs:restriction base="xs:string"> - <xs:enumeration value="off"/> - <xs:enumeration value="xa_strict"/> - <xs:enumeration value="xa"/> - <xs:enumeration value="local"/> - </xs:restriction> - </xs:simpleType> - - <xs:element name="cacheWriter"> - <xs:complexType> - <xs:sequence> - <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriterFactory"/> - </xs:sequence> - <xs:attribute name="writeMode" use="optional" type="writeModeType" default="write-through"/> - <xs:attribute name="notifyListenersOnException" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="minWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="maxWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="rateLimitPerSecond" use="optional" type="xs:nonNegativeInteger" default="0"/> - <xs:attribute name="writeCoalescing" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="writeBatching" use="optional" type="xs:boolean" default="false"/> - <xs:attribute name="writeBatchSize" use="optional" type="xs:positiveInteger" default="1"/> - <xs:attribute name="retryAttempts" use="optional" type="xs:nonNegativeInteger" default="0"/> - <xs:attribute name="retryAttemptDelaySeconds" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="writeBehindConcurrency" use="optional" type="xs:nonNegativeInteger" default="1"/> - <xs:attribute name="writeBehindMaxQueueSize" use="optional" type="xs:nonNegativeInteger" default="0"/> - </xs:complexType> - </xs:element> - <xs:simpleType name="writeModeType"> - <xs:restriction base="xs:string"> - <xs:enumeration value="write-through"/> - <xs:enumeration value="write-behind"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="cacheWriterFactory"> - <xs:complexType> - <xs:attribute name="class" use="required"/> - <xs:attribute name="properties" use="optional"/> - <xs:attribute name="propertySeparator" use="optional"/> - </xs:complexType> - </xs:element> - - <xs:element name="copyStrategy"> - <xs:complexType> - <xs:attribute name="class" use="required" type="xs:string"/> - </xs:complexType> - </xs:element> - - <xs:element name="elementValueComparator"> - <xs:complexType> - <xs:attribute name="class" use="required" type="xs:string"/> - </xs:complexType> - </xs:element> - - <xs:element name="sizeOfPolicy"> - <xs:complexType> - <xs:attribute name="maxDepth" use="required" type="xs:integer"/> - <xs:attribute name="maxDepthExceededBehavior" use="optional" default="continue" - type="maxDepthExceededBehavior"/> - </xs:complexType> - </xs:element> - - <xs:element name="persistence"> - <xs:complexType> - <xs:attribute name="strategy" use="required" type="persistenceStrategy"/> - <xs:attribute name="synchronousWrites" use="optional" default="false" type="xs:boolean"/> - </xs:complexType> - </xs:element> - - <xs:simpleType name="persistenceStrategy"> - <xs:restriction base="xs:string"> - <xs:enumeration value="localTempSwap"/> - <xs:enumeration value="localRestartable"/> - <xs:enumeration value="none"/> - <xs:enumeration value="distributed"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="maxDepthExceededBehavior"> - <xs:restriction base="xs:string"> - <xs:enumeration value="continue"/> - <xs:enumeration value="abort"/> - </xs:restriction> - </xs:simpleType> - - <xs:simpleType name="notificationScope"> - <xs:restriction base="xs:string"> - <xs:enumeration value="local"/> - <xs:enumeration value="remote"/> - <xs:enumeration value="all"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="memoryUnit"> - <xs:restriction base="xs:token"> - <xs:pattern value="[0-9]+[bBkKmMgG]?"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="memoryUnitOrPercentage"> - <xs:restriction base="xs:token"> - <xs:pattern value="([0-9]+[bBkKmMgG]?|100%|[0-9]{1,2}%)"/> - </xs:restriction> - </xs:simpleType> -</xs:schema> \ No newline at end of file diff --git a/src/main/resources/dandelion/datatables/datatables.properties b/src/main/resources/dandelion/datatables/datatables.properties deleted file mode 100644 index 08b1e439..00000000 --- a/src/main/resources/dandelion/datatables/datatables.properties +++ /dev/null @@ -1,6 +0,0 @@ -# ================================== -# Dandelion-Datatables configuration -# ================================== - -# Disable the asset management of Dandelion-Core for all non-DataTable-related assets -main.standalone=true \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index 830ef37d..00000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE xml> - -<configuration scan="true" scanPeriod="30 seconds"> - - <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> - <resetJUL>true</resetJUL> - </contextListener> - - <!-- To enable JMX Management --> - <jmxConfigurator/> - - <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> - <encoder> - <pattern>%-5level %logger{0} - %msg%n</pattern> - </encoder> - </appender> - - <!--<logger name="org.hibernate" level="debug"/> --> - <logger name="org.springframework.samples.petclinic" level="debug"/> - - <root level="info"> - <appender-ref ref="console"/> - </root> -</configuration> diff --git a/src/main/resources/spring/business-config.xml b/src/main/resources/spring/business-config.xml deleted file mode 100644 index 99cf4c1d..00000000 --- a/src/main/resources/spring/business-config.xml +++ /dev/null @@ -1,96 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Repository and Service layers ---> -<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" - xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - - <!-- ========================= RESOURCE DEFINITIONS ========================= --> - - <!-- import the dataSource definition --> - <import resource="datasource-config.xml"/> - - <context:component-scan - base-package="org.springframework.samples.petclinic.service"/> - - <!-- Configurer that replaces ${...} placeholders with values from a properties file --> - <!-- (in this case, JDBC-related settings for the JPA EntityManager definition below) --> - <context:property-placeholder location="classpath:spring/data-access.properties" system-properties-mode="OVERRIDE"/> - - <!-- enables scanning for @Transactional annotations --> - <tx:annotation-driven /> - - - <!-- ================== 3 Profiles to choose from =================== - - jdbc (uses Spring" JdbcTemplate) - - jpa - - spring-data-jpa - =============================================================================--> - - <beans profile="jpa,spring-data-jpa"> - <!-- JPA EntityManagerFactory --> - <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" - p:dataSource-ref="dataSource"> - <property name="jpaVendorAdapter"> - <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" - p:database="${jpa.database}" p:showSql="${jpa.showSql}"/> - <!-- the 'database' parameter refers to the database dialect being used. - By default, Hibernate will use a 'HSQL' dialect because 'jpa.database' has been set to 'HSQL' - inside file spring/data-access.properties - - --> - </property> - <!-- gDickens: BOTH Persistence Unit and Packages to Scan are NOT compatible, persistenceUnit will win --> - <property name="persistenceUnitName" value="petclinic"/> - <property name="packagesToScan" value="org.springframework.samples.petclinic"/> - </bean> - - <!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) --> - <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" - p:entityManagerFactory-ref="entityManagerFactory"/> - - - <!-- - Post-processor to perform exception translation on @Repository classes (from native - exceptions such as JPA PersistenceExceptions to Spring's DataAccessException hierarchy). - --> - <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> - - </beans> - - <beans profile="jdbc"> - <!-- Transaction manager for a single JDBC DataSource (alternative to JTA) --> - <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" - p:dataSource-ref="dataSource"/> - - <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> - <constructor-arg ref="dataSource"/> - </bean> - - <bean id="namedParameterJdbcTemplate" - class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> - <constructor-arg ref="dataSource"/> - </bean> - - <context:component-scan base-package="org.springframework.samples.petclinic.repository.jdbc"/> - </beans> - - <beans profile="jpa"> - <!-- - Loads JPA beans - Will automatically be transactional due to @Transactional. - EntityManager will be auto-injected due to @PersistenceContext. - PersistenceExceptions will be auto-translated due to @Repository. - --> - <context:component-scan base-package="org.springframework.samples.petclinic.repository.jpa"/> - </beans> - - <beans profile="spring-data-jpa"> - <jpa:repositories base-package="org.springframework.samples.petclinic.repository.springdatajpa"/> - </beans> -</beans> \ No newline at end of file diff --git a/src/main/resources/spring/data-access.properties b/src/main/resources/spring/data-access.properties deleted file mode 100644 index c1cc3cef..00000000 --- a/src/main/resources/spring/data-access.properties +++ /dev/null @@ -1,41 +0,0 @@ -# Properties file with JDBC and JPA settings. -# -# Applied by <context:property-placeholder location="jdbc.properties"/> from -# various application context XML files (e.g., "applicationContext-*.xml"). -# Targeted at system administrators, to avoid touching the context XML files. - -#------------------------------------------------------------------------------- -# HSQL Settings - -jdbc.driverClassName=org.hsqldb.jdbcDriver -jdbc.url=jdbc:hsqldb:mem:petclinic -jdbc.username=sa -jdbc.password= - -# Properties that control the population of schema and data for a new data source -jdbc.initLocation=classpath:db/hsqldb/initDB.sql -jdbc.dataLocation=classpath:db/hsqldb/populateDB.sql - -# Property that determines which database to use with an AbstractJpaVendorAdapter -jpa.database=HSQL - -jpa.showSql=true - -#------------------------------------------------------------------------------- -# MySQL Settings - -#jdbc.driverClassName=com.mysql.jdbc.Driver -#jdbc.url=jdbc:mysql://localhost:3306/petclinic -#jdbc.username=root -#jdbc.password= - -# Properties that control the population of schema and data for a new data source -#jdbc.initLocation=classpath:db/mysql/initDB.sql -#jdbc.dataLocation=classpath:db/mysql/populateDB.sql - -# Property that determines which Hibernate dialect to use -# (only applied with "applicationContext-hibernate.xml") -#hibernate.dialect=org.hibernate.dialect.MySQLDialect - -# Property that determines which database to use with an AbstractJpaVendorAdapter -#jpa.database=MYSQL diff --git a/src/main/resources/spring/datasource-config.xml b/src/main/resources/spring/datasource-config.xml deleted file mode 100644 index f7412996..00000000 --- a/src/main/resources/spring/datasource-config.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Application context definition for PetClinic Datasource. ---> -<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:p="http://www.springframework.org/schema/p" - xmlns:context="http://www.springframework.org/schema/context" - xmlns:jdbc="http://www.springframework.org/schema/jdbc" - xmlns:jee="http://www.springframework.org/schema/jee" - xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd - http://www.springframework.org/schema/jdbc - http://www.springframework.org/schema/jdbc/spring-jdbc.xsd - http://www.springframework.org/schema/jee - http://www.springframework.org/schema/jee/spring-jee.xsd"> - - <!-- ========================= DATASOURCE DEFINITION ========================= --> - - <!-- Configurer that replaces ${...} placeholders with values from a properties file --> - <!-- (in this case, JDBC-related settings for the dataSource definition below) --> - <context:property-placeholder location="classpath:spring/data-access.properties" system-properties-mode="OVERRIDE"/> - - <!-- DataSource configuration for the tomcat jdbc connection pool - See here for more details on commons-dbcp versus tomcat-jdbc: - http://blog.ippon.fr/2013/03/13/improving-the-performance-of-the-spring-petclinic-sample-application-part-3-of-5/--> - <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" - p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" - p:username="${jdbc.username}" p:password="${jdbc.password}"/> - - <!-- Database initializer. If any of the script fails, the initialization stops. --> - <!-- As an alternative, for embedded databases see <jdbc:embedded-database/>. --> - <jdbc:initialize-database data-source="dataSource"> - <jdbc:script location="${jdbc.initLocation}"/> - <jdbc:script location="${jdbc.dataLocation}"/> - </jdbc:initialize-database> - - <beans profile="javaee" > - <!-- JNDI DataSource for JEE environments --> - <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/> - </beans> -</beans> \ No newline at end of file diff --git a/src/main/resources/spring/mvc-core-config.xml b/src/main/resources/spring/mvc-core-config.xml deleted file mode 100644 index 51d2ce82..00000000 --- a/src/main/resources/spring/mvc-core-config.xml +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - DispatcherServlet application context for PetClinic's web tier. ---> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:p="http://www.springframework.org/schema/p" - xmlns:context="http://www.springframework.org/schema/context" - xmlns:mvc="http://www.springframework.org/schema/mvc" - xsi:schemaLocation="http://www.springframework.org/schema/mvc - http://www.springframework.org/schema/mvc/spring-mvc.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd"> - - <import resource="mvc-view-config.xml"/> - - <!-- - - POJOs labeled with the @Controller and @Service annotations are auto-detected. - --> - <context:component-scan - base-package="org.springframework.samples.petclinic.web"/> - - <mvc:annotation-driven conversion-service="conversionService"> - <mvc:message-converters> - <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> - <property name="objectMapper"> - <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" /> - </property> - </bean> - </mvc:message-converters> - </mvc:annotation-driven> - - <!-- all resources inside folder src/main/webapp/resources are mapped so they can be refered to inside JSP files - (see header.jsp for more details) --> - <mvc:resources mapping="/resources/**" location="/resources/"/> - - <!-- uses WebJars so Javascript and CSS libs can be declared as Maven dependencies (Bootstrap, jQuery...) --> - <mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/"/> - - <mvc:view-controller path="/" view-name="welcome" /> - - <!-- serve static resources (*.html, ...) from src/main/webapp/ - Required when both servlet-mapping is '/' and static resources need to be served --> - <mvc:default-servlet-handler /> - - <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> - <property name="formatters"> - <set> - <bean class="org.springframework.samples.petclinic.web.PetTypeFormatter"/> - </set> - </property> - </bean> - - <!-- - - Message source for this context, loaded from localized "messages_xx" files. - - Files are stored inside src/main/resources - --> - <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" - p:basename="messages/messages"/> - - <!-- - - This bean resolves specific types of exceptions to corresponding logical - - view names for error views. - --> - <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> - <!-- view name resolved using bean of type InternalResourceViewResolver (declared in mvc-view-config.xml) --> - <property name="defaultErrorView" value="exception"/> - <!-- results into 'WEB-INF/jsp/exception.jsp' --> - <property name="warnLogCategory" value="warn"/> - <!-- needed otherwise exceptions won't be logged anywhere --> - </bean> - -</beans> diff --git a/src/main/resources/spring/mvc-view-config.xml b/src/main/resources/spring/mvc-view-config.xml deleted file mode 100644 index 190005f3..00000000 --- a/src/main/resources/spring/mvc-view-config.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - DispatcherServlet application context for PetClinic's web tier. ---> -<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:mvc="http://www.springframework.org/schema/mvc" - xsi:schemaLocation="http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm.xsd - http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - <mvc:view-resolvers> - <mvc:bean-name /> - </mvc:view-resolvers> - -</beans> diff --git a/src/main/resources/spring/tools-config.xml b/src/main/resources/spring/tools-config.xml deleted file mode 100644 index 1be7e3b6..00000000 --- a/src/main/resources/spring/tools-config.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Application context definition for PetClinic on JPA. ---> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:aop="http://www.springframework.org/schema/aop" - xmlns:context="http://www.springframework.org/schema/context" - xmlns:cache="http://www.springframework.org/schema/cache" - xsi:schemaLocation="http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/cache - http://www.springframework.org/schema/cache/spring-cache.xsd - http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd"> - - <!-- - Simply defining this bean will cause requests to owner names to be saved. - This aspect is defined in petclinic.jar's META-INF/aop.xml file. - Note that we can dependency inject this bean like any other bean. - --> - <aop:aspectj-autoproxy> - <aop:include name="callMonitor"/> - </aop:aspectj-autoproxy> - - <!-- Call monitoring aspect that monitors call count and call invocation time --> - <bean id="callMonitor" class="org.springframework.samples.petclinic.util.CallMonitoringAspect"/> - - <!-- - Exporter that exposes the CallMonitoringAspect via JMX, - based on the @ManagedResource, @ManagedAttribute, and @ManagedOperation annotations. - --> - <context:mbean-export/> - - <!-- enables scanning for @Cacheable annotation --> - <cache:annotation-driven/> - - <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> - <property name="cacheManager" ref="ehcache"/> - </bean> - - <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> - <property name="configLocation" value="classpath:cache/ehcache.xml"/> - </bean> - - -</beans> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index fb397e89..00000000 --- a/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="ISO-8859-1"?> -<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns="http://java.sun.com/xml/ns/javaee" - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee -http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" - id="WebApp_ID" version="2.5"> - - <display-name>Spring PetClinic</display-name> - <description>Spring PetClinic sample application</description> - - <context-param> - <param-name>spring.profiles.active</param-name> - <param-value>jpa</param-value> - </context-param> - - <!-- When using Spring JDBC, use the following: --> - <!-- <context-param> - <param-name>spring.profiles.active</param-name> - <param-value>jdbc</param-value> - </context-param> --> - - <!-- When using Spring Data JPA, uncomment the following: --> - <!-- - <context-param> - <param-name>spring.profiles.active</param-name> - <param-value>spring-data-jpa</param-value> - </context-param> - --> - - <!-- - - Location of the XML file that defines the root application context. - - Applied by ContextLoaderListener. - --> - <context-param> - <param-name>contextConfigLocation</param-name> - <param-value>classpath:spring/business-config.xml, classpath:spring/tools-config.xml</param-value> - </context-param> - - <listener> - <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> - </listener> - - <!-- -- Servlet that dispatches request to registered handlers (Controller implementations). ---> - <servlet> - <servlet-name>petclinic</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> - <init-param> - <param-name>contextConfigLocation</param-name> - <param-value>classpath:spring/mvc-core-config.xml</param-value> - </init-param> - <load-on-startup>1</load-on-startup> - </servlet> - - <servlet-mapping> - <servlet-name>petclinic</servlet-name> - <url-pattern>/</url-pattern> - </servlet-mapping> - - - - <!-- used so we can use forms of method type 'PUT' and 'DELETE' (such as in the Pet form) -see here: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#rest-method-conversion ---> - <filter> - <filter-name>httpMethodFilter</filter-name> - <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> - </filter> - - <filter-mapping> - <filter-name>httpMethodFilter</filter-name> - <servlet-name>petclinic</servlet-name> - </filter-mapping> - - <!-- used to provide the ability to enter Chinese characters inside the Owner Form --> - <filter> - <filter-name>encodingFilter</filter-name> - <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> - <init-param> - <param-name>encoding</param-name> - <param-value>UTF-8</param-value> - </init-param> - <init-param> - <param-name>forceEncoding</param-name> - <param-value>true</param-value> - </init-param> - </filter> - - <filter-mapping> - <filter-name>encodingFilter</filter-name> - <url-pattern>/*</url-pattern> - </filter-mapping> - -</web-app> \ No newline at end of file diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html index 44123baf..e98ef1fe 100644 --- a/src/main/webapp/index.html +++ b/src/main/webapp/index.html @@ -5,9 +5,8 @@ <head> <title>PetClinic :: a Spring Framework demonstration</title> - <link rel="stylesheet" href="bower_components/bootstrap/docs/assets/css/bootstrap.css" /> - <link href="resources/css/petclinic.css" rel="stylesheet"/> - + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" /> + <link href="resources/css/petclinic.css" rel="stylesheet"/> <script src="bower_components/angular/angular.js"></script> <script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script> <script src="bower_components/angular-resource/angular-resource.js"></script> @@ -20,9 +19,7 @@ <body class="container"> <div ui-view="header"></div> - <div ui-view="content"></div> - <div ui-view="footer"></div> </body> diff --git a/src/main/webapp/resources/css/petclinic.css b/src/main/webapp/resources/css/petclinic.css index 76a8ef83..e69de29b 100644 --- a/src/main/webapp/resources/css/petclinic.css +++ b/src/main/webapp/resources/css/petclinic.css @@ -1,20 +0,0 @@ -.container { - padding-top: 10px; - width: 700px; -} - -.form-horizontal { - width: 100%; -} - -input[type="text"] { - height: 25px; -} - -.navbar .nav > li > a { - color: #000000; -} - -.form-horizontal .control-label { - text-align: left; -} diff --git a/src/main/webapp/scripts/app/fragments/bodyHeader.html b/src/main/webapp/scripts/app/fragments/bodyHeader.html index 8bdf2397..43faefce 100644 --- a/src/main/webapp/scripts/app/fragments/bodyHeader.html +++ b/src/main/webapp/scripts/app/fragments/bodyHeader.html @@ -1,23 +1,24 @@ +<nav class="navbar navbar-default"> + <div class="container-fluid"> + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" + data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" ui-sref="app">Pet Clinic</a> -<img src="resources/images/banner-graphic.png" var="banner"/> + </div> -<div class="navbar" style="width: 601px;"> - <div class="navbar-inner"> - <ul class="nav"> - <li style="width: 120px;"> - <a ui-sref="app"><i class="icon-home"></i> Home</a> - </li> - <li style="width: 150px;"> - <a ui-sref="app.ownersearch"><i class="icon-search"></i> Find owners</a> - </li> - <li style="width: 160px;"> - <a ui-sref="app.vets"><i class="icon-th-list"></i> Veterinarians</a> - </li> - <li style="width: 110px;"> - <a href="oups.html" title="trigger a RuntimeException to see how it is handled"> - <i class="icon-warning-sign"></i> Error</a> - </li> - </ul> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav"> + <li><a ui-sref="app">Home</a></li> + <li><a ui-sref="app.ownersearch">Owner</a></li> + <li><a ui-sref="app.vets">Vets</a></li> + </ul> + </div> </div> -</div> - +</nav> \ No newline at end of file diff --git a/src/main/webapp/scripts/app/fragments/footer.html b/src/main/webapp/scripts/app/fragments/footer.html index 683e19cc..7a64bc41 100644 --- a/src/main/webapp/scripts/app/fragments/footer.html +++ b/src/main/webapp/scripts/app/fragments/footer.html @@ -1,11 +1,4 @@ - -<table class="footer"> - <tr> - <td width="70%"></td> - <td align="right"> - <img src="resources/images/spring-pivotal-logo.png" alt="Sponsored by Pivotal"/> - </td> - </tr> -</table> - +<div style="text-align: right"> + <img src="resources/images/spring-pivotal-logo.png" alt="Sponsored by Pivotal"/> +</div> diff --git a/src/main/webapp/scripts/app/pet/PetController.js b/src/main/webapp/scripts/app/pet/PetController.js index a766a281..a454a444 100644 --- a/src/main/webapp/scripts/app/pet/PetController.js +++ b/src/main/webapp/scripts/app/pet/PetController.js @@ -1,13 +1,11 @@ 'use strict'; function loadPet($scope, $resource, $stateParams) { - var petResource = $resource('/petclinic/owner/' + $stateParams.ownerid +"/pet/" +$stateParams.petid); + var petResource = $resource('/petclinic/owner/' + $stateParams.ownerid +"/pet/" + $stateParams.petid); $scope.pet = petResource.get(); + $scope.types = $resource("/petclinic/petTypes").query(); } - - - /* * Form used to create and edit pets */ diff --git a/src/main/webapp/scripts/app/pet/petForm.html b/src/main/webapp/scripts/app/pet/petForm.html index d8aa79bd..a1a09073 100644 --- a/src/main/webapp/scripts/app/pet/petForm.html +++ b/src/main/webapp/scripts/app/pet/petForm.html @@ -1,44 +1,38 @@ -<!DOCTYPE html> - -<script> - $(function () { - $("#birthDate").datepicker({ dateFormat: 'yy/mm/dd'}); - }); -</script> <div class="container"> - <h2>Pet (work in progress) </h2> + <h2>Pet</h2> + <form class="form-horizontal" name="petForm" data-ng-controller="petFormController"> - <fieldset> - <div class="control-group" id="owner"> - <label class="control-label"> Owner </label> - {{pet.owner.firstName}} {{pet.owner.lastName}} - </div> - <div class="control-group" id="name"> - <label class="control-label">Name </label> - <input ng-model="pet.name" name="name" required/> + <div class="form-group"> + <label class="col-sm-2 control-label">Owner</label> + <div class="col-sm-6"> + <p class="form-control-static">{{pet.owner}}</p> + </div> + </div> + + <div class="form-group"> + <label class="col-sm-2 control-label">Name </label> + <div class="col-sm-6"> + <input class="form-control col-sm-4" ng-model="pet.name" name="name" required type="text"/> <span ng-show="petForm.name.$error.required" class="help-inline"> Name is required.</span> </div> - <div class="control-group" id="birthDate"> - <label class="control-label">Birth date </label> - <input ng-model="pet.birthDate" value="{{pet.birthDate | date:'MM/dd/yyyy'}} name="birthDate" required/> + </div> + + <div class="form-group"> + <label class="col-sm-2 control-label">Birth date </label> + <div class="col-sm-6"> + <input class="form-control" ng-model="pet.birthDate" value="{{pet.birthDate}}" required type="text"/> <span ng-show="petForm.name.$error.required" class="help-inline"> birth date is required.</span> </div> - - - <div class="control-group"> - <petclinic:selectField name="type" label="Type " names="${types}" size="5"/> </div> - <div class="form-actions"> - <c:choose> - <c:when test="${pet['new']}"> - <button type="submit">Add Pet</button> - </c:when> - <c:otherwise> - <button type="submit">Update Pet</button> - </c:otherwise> - </c:choose> + + <div class="form-group"> + <label class="col-sm-2 control-label">Type </label> + <div class="col-sm-6"> + <select class="form-control" ng-model="pet.type.id"> + <option ng-repeat="x in types" value="{{x.id}}">{{x.name}}</option> + </select> + </div> </div> - </fieldset> </form> </div> -- GitLab