diff --git a/pom.xml b/pom.xml index 803ccc6e29cbb8d6db40dbe538051748314e47f8..f02ba022f7d11b2efd22898d94e9653a11c0d3b7 100644 --- a/pom.xml +++ b/pom.xml @@ -1,318 +1,962 @@ <?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> - <groupId>org.springframework.samples</groupId> - <artifactId>spring-petclinic</artifactId> - <name>petclinic</name> - <packaging>war</packaging> - <version>1.0.0-SNAPSHOT</version> - <properties> - <spring.version>3.2.1.RELEASE</spring.version> - <slf4j.version>1.7.0</slf4j.version> - <log4j.version>1.2.17</log4j.version> - <hibernate.version>4.1.4.Final</hibernate.version> - <aspectj.version>1.7.1</aspectj.version> - <hibernate.validator.version>4.2.0.Final</hibernate.validator.version> - <joda.version>2.0</joda.version> - <spring.data.jpa>1.1.0.RELEASE</spring.data.jpa> - <junit.version>4.10</junit.version> - </properties> - <dependencies> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.springframework.samples</groupId> + <artifactId>spring-petclinic</artifactId> + <version>1.0.0-SNAPSHOT</version> - <!-- Spring --> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context</artifactId> - <version>${spring.version}</version> - <exclusions> - <!-- Exclude Commons Logging in favor of SLF4j --> - <exclusion> - <groupId>org.apache.commons</groupId> - <artifactId>commons-logging</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context-support</artifactId> - <version>${spring.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-orm</artifactId> - <version>${spring.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-oxm</artifactId> - <version>${spring.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-webmvc</artifactId> - <version>${spring.version}</version> - </dependency> - - <!-- will be a transitive dependency from Spring 3.2.2 --> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-web</artifactId> - <version>${spring.version}</version> - </dependency> + <name>petclinic</name> + <packaging>war</packaging> - <!-- added because this dependency is missing in Spring 3.2.1 (can be removed from Spring 3.2.2) --> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-jdbc</artifactId> - <version>${spring.version}</version> - </dependency> + <properties> + <antlr.version>2.7.7</antlr.version> + <aspectj.version>1.7.1</aspectj.version> + <commons-dbcp.version>1.4</commons-dbcp.version> + <commons-lang3.version>3.1</commons-lang3.version> + <commons-pool.version>1.6</commons-pool.version> + <ehcache.version>2.6.3</ehcache.version> + <hamcrest.version>1.3</hamcrest.version> + <hibernate-jpa.version>1.0.1.Final</hibernate-jpa.version> + <hibernate-validator.version>4.3.0.Final</hibernate-validator.version> + <hibernate.version>4.1.9.Final</hibernate.version> + <hsqldb.version>2.2.9</hsqldb.version> + <jadira-usertype-core.version>3.1.0.CR1</jadira-usertype-core.version> + <javassist.version>3.17.1-GA</javassist.version> + <java.version>1.6</java.version> + <javax-el.version>2.2</javax-el.version> + <jaxb-api.version>2.2.7</jaxb-api.version> + <jaxb-impl.version>2.2.7-b53</jaxb-impl.version> + <jboss-logging.version>3.1.2.GA</jboss-logging.version> + <jdom.version>2.0.2</jdom.version> + <jodatime-hibernate.version>1.3</jodatime-hibernate.version> + <jodatime-jsptags.version>1.1.1</jodatime-jsptags.version> + <jodatime.version>2.1</jodatime.version> + <jsp.version>2.2</jsp.version> + <jstl.version>1.2</jstl.version> + <jta.version>1.1</jta.version> + <junit.version>4.11</junit.version> + <logback.version>1.0.9</logback.version> + <log4j.version>1.2.17</log4j.version> + <maven-assembly-plugin.version>2.4</maven-assembly-plugin.version> + <maven-clean-plugin.version>2.5</maven-clean-plugin.version> + <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version> + <maven-dependency-plugin.version>2.6</maven-dependency-plugin.version> + <maven-deploy-plugin.version>2.7</maven-deploy-plugin.version> + <maven-eclipse-plugin.version>2.9</maven-eclipse-plugin.version> + <maven-enforcer-plugin.version>1.2</maven-enforcer-plugin.version> + <maven-help-plugin.version>2.1.1</maven-help-plugin.version> + <maven-install-plugin.version>2.4</maven-install-plugin.version> + <maven-jar-plugin.version>2.4</maven-jar-plugin.version> + <maven-javadoc-plugin.version>2.9</maven-javadoc-plugin.version> + <maven-jetty-plugin.version>8.1.9.v20130131</maven-jetty-plugin.version> + <maven-m2e-lifecycle-plugin.version>1.0.0</maven-m2e-lifecycle-plugin.version> + <maven-plugin-plugin.version>3.2</maven-plugin-plugin.version> + <maven-project-info-reports-plugin.version>2.6</maven-project-info-reports-plugin.version> + <maven-release-plugin.version>2.4</maven-release-plugin.version> + <maven-resources-plugin.version>2.6</maven-resources-plugin.version> + <maven-site-plugin.version>3.2</maven-site-plugin.version> + <maven-source-plugin.version>2.2.1</maven-source-plugin.version> + <maven-surefire-plugin.version>2.13</maven-surefire-plugin.version> + <maven-taglist-plugin.version>2.4</maven-taglist-plugin.version> + <maven.version.range>[2.2.1,3.1.0)</maven.version.range> + <maven-war-plugin.version>2.3</maven-war-plugin.version> + <mysql.version>5.1.22</mysql.version> + <!-- gDickens: Best Practice: ALWAYS define source encoding for platform independence --> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <rome.version>1.0</rome.version> + <servlet.version>2.5</servlet.version> + <slf4j.version>1.7.2</slf4j.version> + <spring-data-jpa.version>1.3.0.RELEASE</spring-data-jpa.version> + <spring-framework.version>3.2.1.RELEASE</spring-framework.version> + <validation.version>1.0.0.GA</validation.version> + <webjars-bootstrap.version>2.3.0</webjars-bootstrap.version> + <webjars-jquery-ui.version>1.9.2</webjars-jquery-ui.version> + <webjars-jquery.version>1.9.0</webjars-jquery.version> + </properties> - <!-- Logging --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>jcl-over-slf4j</artifactId> - <version>${slf4j.version}</version> - <scope>runtime</scope> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>${slf4j.version}</version> - <scope>runtime</scope> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>${slf4j.version}</version> - <scope>runtime</scope> - </dependency> - - <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - <version>${log4j.version}</version> - <scope>runtime</scope> - </dependency> + <dependencies> + <!-- Spring --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-orm</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-oxm</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-webmvc</artifactId> + </dependency> + <!-- will be a transitive dependency from Spring 3.2.2 --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-web</artifactId> + </dependency> + <!-- added because this dependency is missing in Spring 3.2.1 + (can be removed from Spring 3.2.2) --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jdbc</artifactId> + </dependency> + <!-- Logging --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jul-to-slf4j</artifactId> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency> - <!-- DataSource --> - <dependency> - <groupId>commons-dbcp</groupId> - <artifactId>commons-dbcp</artifactId> - <version>1.4</version> - <scope>runtime</scope> - </dependency> + <!-- DataSource --> + <dependency> + <groupId>commons-dbcp</groupId> + <artifactId>commons-dbcp</artifactId> + </dependency> + <dependency> + <groupId>org.hsqldb</groupId> + <artifactId>hsqldb</artifactId> + </dependency> + <!-- MySQL JDBC Connector --> + <!-- gDickens: standard mysql library + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>${mysql.version}</version> + </dependency> + --> + <!-- Hibernate JPA Provider --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-entitymanager</artifactId> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-validator</artifactId> + </dependency> + <dependency> + <groupId>net.sf.ehcache</groupId> + <artifactId>ehcache-core</artifactId> + </dependency> + <!-- ********************************************************************** + ** SPRING DATA ** + ********************************************************************** --> + <dependency> + <groupId>org.springframework.data</groupId> + <artifactId>spring-data-jpa</artifactId> + </dependency> + <!-- Servlet --> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + </dependency> + <!-- Webjars (static dependencies distributed as JAR files) --> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>bootstrap</artifactId> + </dependency> + <dependency> + <groupId>org.webjars</groupId> + <artifactId>jquery-ui</artifactId> + </dependency> + <!-- Rome RSS --> + <dependency> + <groupId>rome</groupId> + <artifactId>rome</artifactId> + </dependency> + <dependency> + <groupId>org.jdom</groupId> + <artifactId>jdom</artifactId> + </dependency> + <!-- JAXB --> + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-impl</artifactId> + </dependency> + <!-- Test dependencies --> + <!-- gDickens: Using JUnit 4.11 for cleaner Hamcrest support --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + </dependency> + <dependency> + <groupId>javax.transaction</groupId> + <artifactId>jta</artifactId> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + </dependency> + <dependency> + <groupId>org.jadira.usertype</groupId> + <artifactId>usertype.core</artifactId> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time-jsptags</artifactId> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time-hibernate</artifactId> + </dependency> + <!-- gDickens: used for Spring MVC Test framework + * Do not use hamcrest-all, hamcrest-library + * (hamcrest-core in dep mgmt, is used by junit) --> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-library</artifactId> + </dependency> + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjweaver</artifactId> + </dependency> + </dependencies> - <dependency> - <groupId>org.hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <version>2.2.8</version> - <scope>runtime</scope> - </dependency> - <!-- MySQL JDBC Connector --> - <!-- - <dependency> <groupId>com.mysql.jdbc</groupId> - <artifactId>com.springsource.com.mysql.jdbc</artifactId> - <version>5.1.6</version> </dependency> - --> - - <!-- AOP --> - <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> - </dependency> + <!-- gDickens: Best Practice to ALWAYS include the Maven plugin versions --> + <build> + <defaultGoal>install</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>${maven-compiler-plugin.version}</version> + <configuration> + <compilerArguments> + <Xlint/> + </compilerArguments> + <verbose>true</verbose> + <source>${java.version}</source> + <target>${java.version}</target> + <showWarnings>true</showWarnings> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${maven-surefire-plugin.version}</version> + <configuration> + <includes> + <include>**/*Tests.java</include> + </includes> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>${maven-war-plugin.version}</version> + <configuration> + <warName>petclinic</warName> + </configuration> + </plugin> + <!-- gDickens: Include the Builders and Natures --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>${maven-eclipse-plugin.version}</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-dependency-plugin</artifactId> + <version>${maven-dependency-plugin.version}</version> + <executions> + <execution> + <id>install</id> + <phase>install</phase> + <goals> + <goal>sources</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-deploy-plugin</artifactId> + <version>${maven-deploy-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-install-plugin</artifactId> + <version>${maven-install-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-release-plugin</artifactId> + <version>${maven-release-plugin.version}</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-assembly-plugin</artifactId> + <version>${maven-assembly-plugin.version}</version> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-clean-plugin</artifactId> + <version>${maven-clean-plugin.version}</version> + <configuration> + <filesets> + <fileset> + <directory>${project.basedir}</directory> + <includes> + <include>target</include> + <include>surefire*</include> + </includes> + <followSymlinks>false</followSymlinks> + </fileset> + </filesets> + </configuration> + </plugin> + <plugin> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + <version>${maven-jetty-plugin.version}</version> + <configuration> + <webAppConfig> + <contextPath>/${project.name}</contextPath> + </webAppConfig> + <!-- + "stopPort" - Port number to receive a stop command and shutdown - use "mvn jetty:stop" + "stopKey" - String value that must be sent to the stopPort to validate the stop command + --> + <stopPort>9966</stopPort> + <stopKey>shutterdown</stopKey> + <systemProperties> + <systemProperty> + <name>logback.configurationFile</name> + <value>./src/main/resources/logback.xml</value> + </systemProperty> + <systemProperty> + <name>com.sun.management.jmxremote</name> + <value>true</value> + </systemProperty> + <systemProperty> + <name>com.sun.management.jmxremote.port</name> + <value>8050</value> + </systemProperty> + <systemProperty> + <name>com.sun.management.jmxremote.ssl</name> + <value>false</value> + </systemProperty> + <systemProperty> + <name>com.sun.management.jmxremote.authenticate</name> + <value>false</value> + </systemProperty> + </systemProperties> + </configuration> + <dependencies> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <version>${slf4j.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4j.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jul-to-slf4j</artifactId> + <version>${slf4j.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>${logback.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>commons-dbcp</groupId> + <artifactId>commons-dbcp</artifactId> + <version>${commons-dbcp.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>commons-pool</groupId> + <artifactId>commons-pool</artifactId> + <version>${commons-pool.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.jdom</groupId> + <artifactId>jdom</artifactId> + <version>${jdom.version}</version> + <scope>runtime</scope> + </dependency> + </dependencies> + </plugin> + <!-- ******************************************************* + gDickens: For reliable builds, ensure: + * NO duplicate jars of differing versions + * NO old versions of logging and Spring are included directly or Transitively + * All plugins have the version included as per Maven + * Legacy jars that have been replaced (javassist, should be org.javassist, etc) + ************************************************************ --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + <version>${maven-enforcer-plugin.version}</version> + <executions> + <execution> + <id>enforce-banned-dependencies</id> + <goals> + <goal>enforce</goal> + </goals> + <configuration> + <rules> + <!-- Ensure no conflicting jar versions --> + <requireUpperBoundDeps/> + <requirePluginVersions/> + <dependencyConvergence/> + <bannedDependencies> + <searchTransitive>true</searchTransitive> + <excludes> + <exclude>javassist</exclude> + <exclude>commons-logging</exclude> + <exclude>aspectj</exclude> + <exclude>asm</exclude> + <exclude>hsqldb</exclude> + <exclude>log4j</exclude> + <exclude>org.slf4j:1.5*</exclude> + <exclude>org.slf4j:1.6*</exclude> + <exclude>org.springframework:spring:2.*</exclude> + <exclude>org.springframework:spring*:3.0.*</exclude> + <exclude>org.springframework:spring*:3.1.*</exclude> + </excludes> + </bannedDependencies> + <requireMavenVersion> + <version>${maven.version.range}</version> + </requireMavenVersion> + <requireJavaVersion> + <version>${java.version}</version> + </requireJavaVersion> + </rules> + <fail>true</fail> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>${maven-resources-plugin.version}</version> + <configuration> + <encoding>${project.build.sourceEncoding}</encoding> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-site-plugin</artifactId> + <version>${maven-site-plugin.version}</version> + <executions> + <execution> + <id>attach-descriptor</id> + <goals> + <goal>attach-descriptor</goal> + </goals> + </execution> + </executions> + <configuration> + <reportPlugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-report-plugin</artifactId> + <version>${maven-surefire-plugin.version}</version> + <configuration> + <outputDirectory>${project.reporting.outputDirectory}/testresults</outputDirectory> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>${maven-javadoc-plugin.version}</version> + <configuration> + <aggregate>true</aggregate> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-project-info-reports-plugin</artifactId> + <version>${maven-project-info-reports-plugin.version}</version> + <configuration> + <dependencyDetailsEnabled>false</dependencyDetailsEnabled> + <dependencyLocationsEnabled>false</dependencyLocationsEnabled> + </configuration> + </plugin> + </reportPlugins> + <locales>en</locales> + </configuration> + </plugin> - <!-- Hibernate --> - <!-- JPA --> - <!-- Hibernate JPA Provider --> - <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> - - <!-- ********************************************************************** - ** SPRING DATA ** - ********************************************************************** --> - - <dependency> - <groupId>org.springframework.data</groupId> - <artifactId>spring-data-jpa</artifactId> - <version>${spring.data.jpa}</version> - </dependency> + </plugins> - <!-- Servlet --> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - <version>2.5</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jstl</artifactId> - <version>1.2</version> - </dependency> - - <!-- Webjars (static dependencies distributed as JAR files) --> - <dependency> - <groupId>org.webjars</groupId> - <artifactId>bootstrap</artifactId> - <version>2.2.1</version> - </dependency> - - <dependency> - <groupId>org.webjars</groupId> - <artifactId>jquery-ui</artifactId> - <version>1.9.1</version> - </dependency> - - <!-- Rome RSS --> - <dependency> - <groupId>rome</groupId> - <artifactId>rome</artifactId> - <version>1.0</version> - </dependency> - - <dependency> - <groupId>org.jdom</groupId> - <artifactId>jdom</artifactId> - <version>2.0.2</version> - <scope>runtime</scope> - </dependency> - - <!-- JAXB --> - <dependency> - <groupId>com.sun.xml.bind</groupId> - <artifactId>jaxb-impl</artifactId> - <version>2.2.6</version> - <scope>provided</scope> - </dependency> + <!-- gDickens: For Eclipse's M2E plugin support --> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>1.0.0</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + <versionRange>[1.0.0,)</versionRange> + <goals> + <goal>enforce</goal> + </goals> + </pluginExecutionFilter> + <action> + <execute/> + </action> + </pluginExecution> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <versionRange>[2.4,)</versionRange> + <goals> + <goal>unpack</goal> + <goal>sources</goal> + </goals> + </pluginExecutionFilter> + <action> + <execute/> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + + + <!-- gDickens: Best Practice: Specify the transitive dependency versions, to ensure that older versions + of projects are NOT included. + + This is particularly important to Spring projects where projects such as Spring-Data, may + include previous Spring libraries. + --> + <dependencyManagement> + <dependencies> + <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> + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjtools</artifactId> + <version>${aspectj.version}</version> + </dependency> + <!-- HIBERNATE --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core</artifactId> + <version>${hibernate.version}</version> + <exclusions> + <exclusion> + <groupId>asm</groupId> + <artifactId>asm-attrs</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-entitymanager</artifactId> + <version>${hibernate.version}</version> + </dependency> + <dependency> + <groupId>org.hibernate.javax.persistence</groupId> + <artifactId>hibernate-jpa-2.0-api</artifactId> + <version>${hibernate-jpa.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> + <dependency> + <groupId>org.jadira.usertype</groupId> + <artifactId>usertype.core</artifactId> + <version>${jadira-usertype-core.version}</version> + </dependency> + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + <version>${validation.version}</version> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jstl</artifactId> + <version>${jstl.version}</version> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + <version>${servlet.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>javax.xml.bind</groupId> + <artifactId>jaxb-api</artifactId> + <version>${jaxb-api.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-impl</artifactId> + <version>${jaxb-impl.version}</version> + <scope>provided</scope> + </dependency> + <!-- SPRING, SPRING, SPRINGITY SPRING --> + <dependency> + <groupId>org.springframework.data</groupId> + <artifactId>spring-data-jpa</artifactId> + <version>${spring-data-jpa.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <version>${spring-framework.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + <version>${spring-framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>${spring-framework.version}</version> + </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-web</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-expression</artifactId> + <version>${spring-framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-tx</artifactId> + <version>${spring-framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + <version>${spring-framework.version}</version> + <exclusions> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-aspects</artifactId> + <version>${spring-framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + <version>${spring-framework.version}</version> + <exclusions> + <exclusion> + <groupId>quartz</groupId> + <artifactId>quartz</artifactId> + </exclusion> + </exclusions> + </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> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jms</artifactId> + <version>${spring-framework.version}</version> + </dependency> + <dependency> + <groupId>javax.transaction</groupId> + <artifactId>jta</artifactId> + <version>${jta.version}</version> + </dependency> + <dependency> + <groupId>org.javassist</groupId> + <artifactId>javassist</artifactId> + <version>${javassist.version}</version> + </dependency> + + <!-- Apache Commons + --> + <dependency> + <groupId>commons-dbcp</groupId> + <artifactId>commons-dbcp</artifactId> + <version>${commons-dbcp.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>${commons-lang3.version}</version> + </dependency> + <dependency> + <groupId>commons-pool</groupId> + <artifactId>commons-pool</artifactId> + <version>${commons-pool.version}</version> + <scope>runtime</scope> + </dependency> + + <!-- Logging with SLF4J & LogBack --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <version>${slf4j.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4j.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jul-to-slf4j</artifactId> + <version>${slf4j.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>${logback.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-core</artifactId> + <version>${logback.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>rome</groupId> + <artifactId>rome</artifactId> + <version>${rome.version}</version> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + <version>${jodatime.version}</version> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time-hibernate</artifactId> + <version>${jodatime-hibernate.version}</version> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time-jsptags</artifactId> + <version>${jodatime-jsptags.version}</version> + </dependency> + <dependency> + <groupId>antlr</groupId> + <artifactId>antlr</artifactId> + <version>${antlr.version}</version> + </dependency> + + <!-- Databases --> + <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> + </dependency> + <dependency> + <groupId>javax.servlet.jsp.jstl</groupId> + <artifactId>jstl-api</artifactId> + <version>${jstl.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.web</groupId> + <artifactId>jstl-impl</artifactId> + <version>${jstl.version}</version> + </dependency> + <dependency> + <groupId>javax.el</groupId> + <artifactId>el-api</artifactId> + <version>${javax-el.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>javax.servlet.jsp</groupId> + <artifactId>jsp-api</artifactId> + <version>${jsp.version}</version> + <scope>provided</scope> + </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> + <dependency> + <groupId>org.jboss.logging</groupId> + <artifactId>jboss-logging</artifactId> + <version>${jboss-logging.version}</version> + </dependency> + <dependency> + <groupId>org.jdom</groupId> + <artifactId>jdom</artifactId> + <version>${jdom.version}</version> + <scope>runtime</scope> + </dependency> + <!-- Test Artifacts --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-library</artifactId> + <version>${hamcrest.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-core</artifactId> + <version>${hamcrest.version}</version> + <scope>test</scope> + </dependency> + </dependencies> + </dependencyManagement> - <!-- Test dependencies --> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>${junit.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - <version>${spring.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>javax.transaction</groupId> - <artifactId>jta</artifactId> - <version>1.1</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>net.sf.ehcache</groupId> - <artifactId>ehcache</artifactId> - <version>2.5.2</version> - <type>pom</type> - </dependency> - - <dependency> - <groupId>joda-time</groupId> - <artifactId>joda-time</artifactId> - <version>${joda.version}</version> - </dependency> - - <dependency> - <groupId>org.jadira.usertype</groupId> - <artifactId>usertype.core</artifactId> - <version>3.0.0.CR1</version> - </dependency> - <dependency> - <groupId>joda-time</groupId> - <artifactId>joda-time-jsptags</artifactId> - <version>1.1</version> - </dependency> - - <!-- used for Spring MVC Test framework --> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-all</artifactId> - <version>1.3</version> - </dependency> - - - </dependencies> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <verbose>true</verbose> - <source>1.6</source> - <target>1.6</target> - <showWarnings>true</showWarnings> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <includes> - <include>**/*Tests.java</include> - </includes> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <configuration> - <warName>petclinic</warName> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-eclipse-plugin</artifactId> - <version>2.8</version> - <configuration> - <downloadSources>true</downloadSources> - <downloadJavadocs>true</downloadJavadocs> - <wtpversion>2.0</wtpversion> - <sourceIncludes> - <sourceInclude>**/*.*</sourceInclude> - </sourceIncludes> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <executions> - <execution> - <id>install</id> - <phase>install</phase> - <goals> - <goal>sources</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> </project> \ No newline at end of file diff --git a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java index 9770ef7bece1eca1c2f96f2ea110b20ea406adc3..8dfbfe90b4310b667c83b9d38e6e3619970b2218 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java @@ -21,28 +21,28 @@ import javax.persistence.Id; import javax.persistence.MappedSuperclass; /** - * Simple JavaBean domain object with an id property. - * Used as a base class for objects needing this property. + * Simple JavaBean domain object with an id property. Used as a base class for objects needing this property. * * @author Ken Krebs * @author Juergen Hoeller */ @MappedSuperclass public class BaseEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - protected Integer id; - + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected Integer id; - public void setId(Integer id) { - this.id = id; - } - public Integer getId() { - return id; - } + public void setId(Integer id) { + this.id = id; + } - public boolean isNew() { - return (this.id == null); - } + public Integer getId() { + return id; + } + + public boolean isNew() { + return (this.id == null); + } } 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 a5064eb936e2bdb5053c9ece77227b13c6bdc49d..cb36a6267a88372a99982fe1e6e566415f6e41ca 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java @@ -20,8 +20,8 @@ import javax.persistence.MappedSuperclass; /** - * Simple JavaBean domain object adds a name property to <code>BaseEntity</code>. - * Used as a base class for objects needing these properties. + * Simple JavaBean domain object adds a name property to <code>BaseEntity</code>. Used as a base class for objects + * needing these properties. * * @author Ken Krebs * @author Juergen Hoeller @@ -29,21 +29,21 @@ import javax.persistence.MappedSuperclass; @MappedSuperclass public class NamedEntity extends BaseEntity { - @Column(name="name") - private String name; - + @Column(name = "name") + private String name; - public void setName(String name) { - this.name = name; - } - public String getName() { - return this.name; - } + public void setName(String name) { + this.name = name; + } - @Override - public String toString() { - return this.getName(); - } + public String getName() { + return this.name; + } + + @Override + public String toString() { + return this.getName(); + } } 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 7b4d90b3f3b7be900094a4e041a327b60ac2e8ca..c0efd4670f5fcf1561cba85b7df46053bebaaa26 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Owner.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Owner.java @@ -15,24 +15,15 @@ */ package org.springframework.samples.petclinic.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.validation.constraints.Digits; - import org.hibernate.validator.constraints.NotEmpty; import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; import org.springframework.core.style.ToStringCreator; +import javax.persistence.*; +import javax.validation.constraints.Digits; +import java.util.*; + /** * Simple JavaBean domain object representing an owner. * @@ -41,111 +32,113 @@ import org.springframework.core.style.ToStringCreator; * @author Sam Brannen * @author Michael Isvy */ -@Entity @Table(name="owners") +@Entity +@Table(name = "owners") public class Owner extends Person { - @Column(name="address") - @NotEmpty - private String address; - - @Column(name="city") - @NotEmpty - private String city; - - @Column(name="telephone") - @NotEmpty @Digits(fraction = 0, integer = 10) - private String telephone; - - @OneToMany(cascade=CascadeType.ALL, mappedBy="owner") - private Set<Pet> pets; - - - public String getAddress() { - return this.address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getCity() { - return this.city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getTelephone() { - return this.telephone; - } - - public void setTelephone(String telephone) { - this.telephone = telephone; - } - - protected void setPetsInternal(Set<Pet> pets) { - this.pets = pets; - } - - protected Set<Pet> getPetsInternal() { - if (this.pets == null) { - this.pets = new HashSet<Pet>(); - } - return this.pets; - } - - public List<Pet> getPets() { - List<Pet> sortedPets = new ArrayList<Pet>(getPetsInternal()); - PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true)); - return Collections.unmodifiableList(sortedPets); - } - - public void addPet(Pet pet) { - getPetsInternal().add(pet); - pet.setOwner(this); - } - - /** - * Return the Pet with the given name, or null if none found for this Owner. - * - * @param name to test - * @return true if pet name is already in use - */ - public Pet getPet(String name) { - return getPet(name, false); - } - - /** - * Return the Pet with the given name, or null if none found for this Owner. - * - * @param name to test - * @return true if pet name is already in use - */ - public Pet getPet(String name, boolean ignoreNew) { - name = name.toLowerCase(); - for (Pet pet : getPetsInternal()) { - if (!ignoreNew || !pet.isNew()) { - String compName = pet.getName(); - compName = compName.toLowerCase(); - if (compName.equals(name)) { - return pet; - } - } - } - return null; - } - - @Override - public String toString() { - return new ToStringCreator(this) - - .append("id", this.getId()) - .append("new", this.isNew()) - .append("lastName", this.getLastName()) - .append("firstName", this.getFirstName()) - .append("address", this.address) - .append("city", this.city) - .append("telephone", this.telephone) - .toString(); - } + @Column(name = "address") + @NotEmpty + private String address; + + @Column(name = "city") + @NotEmpty + private String city; + + @Column(name = "telephone") + @NotEmpty + @Digits(fraction = 0, integer = 10) + private String telephone; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner") + private Set<Pet> pets; + + + public String getAddress() { + return this.address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return this.city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTelephone() { + return this.telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + protected void setPetsInternal(Set<Pet> pets) { + this.pets = pets; + } + + protected Set<Pet> getPetsInternal() { + if (this.pets == null) { + this.pets = new HashSet<Pet>(); + } + return this.pets; + } + + public List<Pet> getPets() { + List<Pet> sortedPets = new ArrayList<Pet>(getPetsInternal()); + PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true)); + return Collections.unmodifiableList(sortedPets); + } + + public void addPet(Pet pet) { + getPetsInternal().add(pet); + pet.setOwner(this); + } + + /** + * Return the Pet with the given name, or null if none found for this Owner. + * + * @param name to test + * @return true if pet name is already in use + */ + public Pet getPet(String name) { + return getPet(name, false); + } + + /** + * Return the Pet with the given name, or null if none found for this Owner. + * + * @param name to test + * @return true if pet name is already in use + */ + public Pet getPet(String name, boolean ignoreNew) { + name = name.toLowerCase(); + for (Pet pet : getPetsInternal()) { + if (!ignoreNew || !pet.isNew()) { + String compName = pet.getName(); + compName = compName.toLowerCase(); + if (compName.equals(name)) { + return pet; + } + } + } + return null; + } + + @Override + public String toString() { + return new ToStringCreator(this) + + .append("id", this.getId()) + .append("new", this.isNew()) + .append("lastName", this.getLastName()) + .append("firstName", this.getFirstName()) + .append("address", this.address) + .append("city", this.city) + .append("telephone", this.telephone) + .toString(); + } } 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 97f1edbc54da2e1d87dcc5716187193ed8990057..5e8655d920741d24bb026ccf3b8916a7449ae737 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Person.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Person.java @@ -15,11 +15,11 @@ */ package org.springframework.samples.petclinic.model; +import org.hibernate.validator.constraints.NotEmpty; + import javax.persistence.Column; import javax.persistence.MappedSuperclass; -import org.hibernate.validator.constraints.NotEmpty; - /** * Simple JavaBean domain object representing an person. * @@ -27,31 +27,30 @@ import org.hibernate.validator.constraints.NotEmpty; */ @MappedSuperclass public class Person extends BaseEntity { - - @Column(name="first_name") - @NotEmpty - protected String firstName; - @Column(name="last_name") - @NotEmpty - protected String lastName; + @Column(name = "first_name") + @NotEmpty + protected String firstName; - public String getFirstName() { - return this.firstName; - } + @Column(name = "last_name") + @NotEmpty + protected String lastName; - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public String getFirstName() { + return this.firstName; + } - public String getLastName() { - return this.lastName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } - public void setLastName(String lastName) { - this.lastName = lastName; - } + public String getLastName() { + return this.lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/model/Pet.java b/src/main/java/org/springframework/samples/petclinic/model/Pet.java index f5f279a03d2dd5b1624d5338ff378d9c424c1e52..5b3c806f9036411544feff523df782c91d91c137 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Pet.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Pet.java @@ -15,27 +15,15 @@ */ package org.springframework.samples.petclinic.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.Table; - import org.hibernate.annotations.Type; import org.joda.time.DateTime; import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; import org.springframework.format.annotation.DateTimeFormat; +import javax.persistence.*; +import java.util.*; + /** * Simple business object representing a pet. * @@ -43,70 +31,71 @@ import org.springframework.format.annotation.DateTimeFormat; * @author Juergen Hoeller * @author Sam Brannen */ -@Entity @Table(name="pets") +@Entity +@Table(name = "pets") public class Pet extends NamedEntity { - @Column(name="birth_date") - @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") - @DateTimeFormat(pattern="yyyy/MM/dd") - private DateTime birthDate; + @Column(name = "birth_date") + @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") + @DateTimeFormat(pattern = "yyyy/MM/dd") + private DateTime birthDate; - @ManyToOne + @ManyToOne @JoinColumn(name = "type_id") - private PetType type; - - @ManyToOne + private PetType type; + + @ManyToOne @JoinColumn(name = "owner_id") - private Owner owner; - - @OneToMany(cascade=CascadeType.ALL, mappedBy="pet", fetch=FetchType.EAGER) - private Set<Visit> visits; - - - public void setBirthDate(DateTime birthDate) { - this.birthDate = birthDate; - } - - public DateTime getBirthDate() { - return this.birthDate; - } - - public void setType(PetType type) { - this.type = type; - } - - public PetType getType() { - return this.type; - } - - protected void setOwner(Owner owner) { - this.owner = owner; - } - - public Owner getOwner() { - return this.owner; - } - - protected void setVisitsInternal(Set<Visit> visits) { - this.visits = visits; - } - - protected Set<Visit> getVisitsInternal() { - if (this.visits == null) { - this.visits = new HashSet<Visit>(); - } - return this.visits; - } - - public List<Visit> getVisits() { - List<Visit> sortedVisits = new ArrayList<Visit>(getVisitsInternal()); - PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false)); - return Collections.unmodifiableList(sortedVisits); - } - - public void addVisit(Visit visit) { - getVisitsInternal().add(visit); - visit.setPet(this); - } + private Owner owner; + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.EAGER) + private Set<Visit> visits; + + + public void setBirthDate(DateTime birthDate) { + this.birthDate = birthDate; + } + + public DateTime getBirthDate() { + return this.birthDate; + } + + public void setType(PetType type) { + this.type = type; + } + + public PetType getType() { + return this.type; + } + + protected void setOwner(Owner owner) { + this.owner = owner; + } + + public Owner getOwner() { + return this.owner; + } + + protected void setVisitsInternal(Set<Visit> visits) { + this.visits = visits; + } + + protected Set<Visit> getVisitsInternal() { + if (this.visits == null) { + this.visits = new HashSet<Visit>(); + } + return this.visits; + } + + public List<Visit> getVisits() { + List<Visit> sortedVisits = new ArrayList<Visit>(getVisitsInternal()); + PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false)); + return Collections.unmodifiableList(sortedVisits); + } + + public void addVisit(Visit visit) { + getVisitsInternal().add(visit); + visit.setPet(this); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/model/PetType.java b/src/main/java/org/springframework/samples/petclinic/model/PetType.java index 8b3f1c0f61451f59a92e143eecffbc4ada5dc31e..50cf0399a7702ea2ec46da4c46626c935a045a5e 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/PetType.java +++ b/src/main/java/org/springframework/samples/petclinic/model/PetType.java @@ -21,7 +21,8 @@ import javax.persistence.Table; /** * @author Juergen Hoeller */ -@Entity @Table(name="types") +@Entity +@Table(name = "types") public class PetType extends NamedEntity { } diff --git a/src/main/java/org/springframework/samples/petclinic/model/Specialty.java b/src/main/java/org/springframework/samples/petclinic/model/Specialty.java index 35724a8e35258f34cc7dfe14f9dce5b48fb65b92..6ea209cd45ac5fdaa287aabe9b3bfd7d71682102 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Specialty.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Specialty.java @@ -20,10 +20,11 @@ import javax.persistence.Table; /** * Models a {@link Vet Vet's} specialty (for example, dentistry). - * + * * @author Juergen Hoeller */ -@Entity @Table(name="specialties") +@Entity +@Table(name = "specialties") public class Specialty extends NamedEntity { } diff --git a/src/main/java/org/springframework/samples/petclinic/model/Vet.java b/src/main/java/org/springframework/samples/petclinic/model/Vet.java index 328b8c3052f7d28741ab3507ddb486c5b9e4f854..4d767e0f35e6c071239f32c4769b9d1155ab1761 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Vet.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Vet.java @@ -15,23 +15,13 @@ */ package org.springframework.samples.petclinic.model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.Table; -import javax.xml.bind.annotation.XmlElement; - import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; +import javax.persistence.*; +import javax.xml.bind.annotation.XmlElement; +import java.util.*; + /** * Simple JavaBean domain object representing a veterinarian. * @@ -40,39 +30,40 @@ import org.springframework.beans.support.PropertyComparator; * @author Sam Brannen * @author Arjen Poutsma */ -@Entity @Table(name="vets") +@Entity +@Table(name = "vets") public class Vet extends Person { - @ManyToMany(fetch=FetchType.EAGER) - @JoinTable (name="vet_specialties",joinColumns = @JoinColumn(name = "vet_id"), - inverseJoinColumns= @JoinColumn(name = "specialty_id")) - private Set<Specialty> specialties; + @ManyToMany(fetch = FetchType.EAGER) + @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), + inverseJoinColumns = @JoinColumn(name = "specialty_id")) + private Set<Specialty> specialties; - protected void setSpecialtiesInternal(Set<Specialty> specialties) { - this.specialties = specialties; - } + protected void setSpecialtiesInternal(Set<Specialty> specialties) { + this.specialties = specialties; + } - protected Set<Specialty> getSpecialtiesInternal() { - if (this.specialties == null) { - this.specialties = new HashSet<Specialty>(); - } - return this.specialties; - } + protected Set<Specialty> getSpecialtiesInternal() { + if (this.specialties == null) { + this.specialties = new HashSet<Specialty>(); + } + return this.specialties; + } - @XmlElement - public List<Specialty> getSpecialties() { - List<Specialty> sortedSpecs = new ArrayList<Specialty>(getSpecialtiesInternal()); - PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true)); - return Collections.unmodifiableList(sortedSpecs); - } + @XmlElement + public List<Specialty> getSpecialties() { + List<Specialty> sortedSpecs = new ArrayList<Specialty>(getSpecialtiesInternal()); + PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true)); + return Collections.unmodifiableList(sortedSpecs); + } - public int getNrOfSpecialties() { - return getSpecialtiesInternal().size(); - } + public int getNrOfSpecialties() { + return getSpecialtiesInternal().size(); + } - public void addSpecialty(Specialty specialty) { - getSpecialtiesInternal().add(specialty); - } + public void addSpecialty(Specialty specialty) { + getSpecialtiesInternal().add(specialty); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/model/Vets.java b/src/main/java/org/springframework/samples/petclinic/model/Vets.java index 6882eabe744363be52e1d912bf42e84ba7fcb6b4..48676e9a68ba974b900b8db3e4bf7c02d849f21b 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Vets.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Vets.java @@ -16,29 +16,28 @@ */ package org.springframework.samples.petclinic.model; -import java.util.ArrayList; -import java.util.List; - import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; +import java.util.List; /** - * Simple domain object representing a list of veterinarians. Mostly here to be used for the 'vets' - * {@link org.springframework.web.servlet.view.xml.MarshallingView}. + * Simple domain object representing a list of veterinarians. Mostly here to be used for the 'vets' {@link + * org.springframework.web.servlet.view.xml.MarshallingView}. * * @author Arjen Poutsma */ @XmlRootElement public class Vets { - private List<Vet> vets; + private List<Vet> vets; - @XmlElement - public List<Vet> getVetList() { - if (vets == null) { - vets = new ArrayList<Vet>(); - } - return vets; - } + @XmlElement + public List<Vet> getVetList() { + if (vets == null) { + vets = new ArrayList<Vet>(); + } + return vets; + } } 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 704021d201acfc5d18553d59fa072549113b4b73..9ea0897f86064758dd5a39b024c5c0e505874155 100644 --- a/src/main/java/org/springframework/samples/petclinic/model/Visit.java +++ b/src/main/java/org/springframework/samples/petclinic/model/Visit.java @@ -15,88 +15,105 @@ */ package org.springframework.samples.petclinic.model; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - import org.hibernate.annotations.Type; import org.hibernate.validator.constraints.NotEmpty; import org.joda.time.DateTime; import org.springframework.format.annotation.DateTimeFormat; +import javax.persistence.*; + /** * Simple JavaBean domain object representing a visit. * * @author Ken Krebs */ -@Entity @Table(name="visits") +@Entity +@Table(name = "visits") public class Visit extends BaseEntity { - /** Holds value of property date. */ - @Column(name="visit_date") - @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") - @DateTimeFormat(pattern="yyyy/MM/dd") - private DateTime date; - - /** Holds value of property description. */ - @NotEmpty - @Column(name="description") - private String description; - - /** Holds value of property pet. */ - @ManyToOne + /** + * Holds value of property date. + */ + @Column(name = "visit_date") + @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") + @DateTimeFormat(pattern = "yyyy/MM/dd") + private DateTime date; + + /** + * Holds value of property description. + */ + @NotEmpty + @Column(name = "description") + private String description; + + /** + * Holds value of property pet. + */ + @ManyToOne @JoinColumn(name = "pet_id") - private Pet pet; - - - /** Creates a new instance of Visit for the current date */ - public Visit() { - this.date = new DateTime(); - } - - - /** Getter for property date. - * @return Value of property date. - */ - public DateTime getDate() { - return this.date; - } - - /** Setter for property date. - * @param date New value of property date. - */ - public void setDate(DateTime date) { - this.date = date; - } - - /** Getter for property description. - * @return Value of property description. - */ - public String getDescription() { - return this.description; - } - - /** Setter for property description. - * @param description New value of property description. - */ - public void setDescription(String description) { - this.description = description; - } - - /** Getter for property pet. - * @return Value of property pet. - */ - public Pet getPet() { - return this.pet; - } - - /** Setter for property pet. - * @param pet New value of property pet. - */ - public void setPet(Pet pet) { - this.pet = pet; - } + private Pet pet; + + + /** + * Creates a new instance of Visit for the current date + */ + public Visit() { + this.date = new DateTime(); + } + + + /** + * Getter for property date. + * + * @return Value of property date. + */ + public DateTime getDate() { + return this.date; + } + + /** + * Setter for property date. + * + * @param date New value of property date. + */ + public void setDate(DateTime date) { + this.date = date; + } + + /** + * Getter for property description. + * + * @return Value of property description. + */ + public String getDescription() { + return this.description; + } + + /** + * Setter for property description. + * + * @param description New value of property description. + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Getter for property pet. + * + * @return Value of property pet. + */ + public Pet getPet() { + return this.pet; + } + + /** + * Setter for property pet. + * + * @param pet New value of property pet. + */ + public void setPet(Pet pet) { + this.pet = pet; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java index 2046abe0eb4a0c3519c99bf197b1fbd977b2c0a3..e87aa5fbda2a165120c28c71b315ddf88ff3ee9f 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java @@ -30,49 +30,51 @@ */ package org.springframework.samples.petclinic.repository; -import java.util.Collection; - import org.springframework.dao.DataAccessException; import org.springframework.samples.petclinic.model.BaseEntity; import org.springframework.samples.petclinic.model.Owner; +import java.util.Collection; + /** - * Repository class for <code>Owner</code> domain objects - * All method names are compliant with Spring Data naming conventions so this interface can easily be - * extended for Spring Data - * See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation - * + * Repository class for <code>Owner</code> domain objects All method names are compliant with Spring Data naming + * conventions so this interface can easily be extended for Spring Data See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation + * * @author Ken Krebs * @author Juergen Hoeller * @author Sam Brannen * @author Michael Isvy - */ + */ public interface OwnerRepository { - /** - * Retrieve <code>Owner</code>s from the data store by last name, - * returning all owners whose last name <i>starts</i> with the given name. - * @param lastName Value to search for - * @return a <code>Collection</code> of matching <code>Owner</code>s - * (or an empty <code>Collection</code> if none found) - */ - Collection<Owner> findByLastName(String lastName) throws DataAccessException; + /** + * Retrieve <code>Owner</code>s from the data store by last name, returning all owners whose last name <i>starts</i> + * with the given name. + * + * @param lastName Value to search for + * @return a <code>Collection</code> of matching <code>Owner</code>s (or an empty <code>Collection</code> if none + * found) + */ + Collection<Owner> findByLastName(String lastName) throws DataAccessException; - /** - * Retrieve an <code>Owner</code> from the data store by id. - * @param id the id to search for - * @return the <code>Owner</code> if found - * @throws org.springframework.dao.DataRetrievalFailureException if not found - */ - Owner findById(int id) throws DataAccessException; + /** + * Retrieve an <code>Owner</code> from the data store by id. + * + * @param id the id to search for + * @return the <code>Owner</code> if found + * @throws org.springframework.dao.DataRetrievalFailureException + * if not found + */ + Owner findById(int id) throws DataAccessException; - /** - * Save an <code>Owner</code> to the data store, either inserting or updating it. - * @param owner the <code>Owner</code> to save - * @see BaseEntity#isNew - */ - void save(Owner owner) throws DataAccessException; + /** + * Save an <code>Owner</code> to the data store, either inserting or updating it. + * + * @param owner the <code>Owner</code> to save + * @see BaseEntity#isNew + */ + void save(Owner owner) throws DataAccessException; } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java index 4cbd48d86c409b9e5492fd7442c7820a211d40cd..a075bc00ade20fc84f00b9b9aeea2c89a4970fe8 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java @@ -15,18 +15,16 @@ */ package org.springframework.samples.petclinic.repository; -import java.util.List; - import org.springframework.dao.DataAccessException; import org.springframework.samples.petclinic.model.BaseEntity; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; +import java.util.List; + /** - * Repository class for <code>Pet</code> domain objects - * All method names are compliant with Spring Data naming conventions so this interface can easily be - * extended for Spring Data - * See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation + * Repository class for <code>Pet</code> domain objects All method names are compliant with Spring Data naming + * conventions so this interface can easily be extended for Spring Data See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation * * @author Ken Krebs * @author Juergen Hoeller @@ -35,25 +33,29 @@ import org.springframework.samples.petclinic.model.PetType; */ public interface PetRepository { - /** - * Retrieve all <code>PetType</code>s from the data store. - * @return a <code>Collection</code> of <code>PetType</code>s - */ - List<PetType> findPetTypes() throws DataAccessException; + /** + * Retrieve all <code>PetType</code>s from the data store. + * + * @return a <code>Collection</code> of <code>PetType</code>s + */ + List<PetType> findPetTypes() throws DataAccessException; - /** - * Retrieve a <code>Pet</code> from the data store by id. - * @param id the id to search for - * @return the <code>Pet</code> if found - * @throws org.springframework.dao.DataRetrievalFailureException if not found - */ - Pet findById(int id) throws DataAccessException; + /** + * Retrieve a <code>Pet</code> from the data store by id. + * + * @param id the id to search for + * @return the <code>Pet</code> if found + * @throws org.springframework.dao.DataRetrievalFailureException + * if not found + */ + Pet findById(int id) throws DataAccessException; - /** - * Save a <code>Pet</code> to the data store, either inserting or updating it. - * @param pet the <code>Pet</code> to save - * @see BaseEntity#isNew - */ - void save(Pet pet) throws DataAccessException; + /** + * Save a <code>Pet</code> to the data store, either inserting or updating it. + * + * @param pet the <code>Pet</code> to save + * @see BaseEntity#isNew + */ + void save(Pet pet) throws DataAccessException; } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java index 183192e549b66627278e5c16d713daf665c9a6f7..44f504d3a7167734dfe5dcd2bd9634e8e6e34600 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java @@ -15,16 +15,14 @@ */ package org.springframework.samples.petclinic.repository; -import java.util.Collection; - import org.springframework.dao.DataAccessException; import org.springframework.samples.petclinic.model.Vet; +import java.util.Collection; + /** - * Repository class for <code>Vet</code> domain objects - * All method names are compliant with Spring Data naming conventions so this interface can easily be - * extended for Spring Data - * See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation + * Repository class for <code>Vet</code> domain objects All method names are compliant with Spring Data naming + * conventions so this interface can easily be extended for Spring Data See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation * * @author Ken Krebs * @author Juergen Hoeller @@ -33,11 +31,12 @@ import org.springframework.samples.petclinic.model.Vet; */ public interface VetRepository { - /** - * Retrieve all <code>Vet</code>s from the data store. - * @return a <code>Collection</code> of <code>Vet</code>s - */ - Collection<Vet> findAll() throws DataAccessException; + /** + * Retrieve all <code>Vet</code>s from the data store. + * + * @return a <code>Collection</code> of <code>Vet</code>s + */ + Collection<Vet> findAll() throws DataAccessException; } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java index a78b10bc0be9f32577b4268dba0232857cba0644..760f2001dab8040c25e58155652cabeec93c23dc 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java @@ -15,17 +15,15 @@ */ package org.springframework.samples.petclinic.repository; -import java.util.List; - import org.springframework.dao.DataAccessException; import org.springframework.samples.petclinic.model.BaseEntity; import org.springframework.samples.petclinic.model.Visit; +import java.util.List; + /** - * Repository class for <code>Visit</code> domain objects - * All method names are compliant with Spring Data naming conventions so this interface can easily be - * extended for Spring Data - * See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation + * Repository class for <code>Visit</code> domain objects All method names are compliant with Spring Data naming + * conventions so this interface can easily be extended for Spring Data See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation * * @author Ken Krebs * @author Juergen Hoeller @@ -34,13 +32,14 @@ import org.springframework.samples.petclinic.model.Visit; */ public interface VisitRepository { - /** - * Save a <code>Visit</code> to the data store, either inserting or updating it. - * @param visit the <code>Visit</code> to save - * @see BaseEntity#isNew - */ - void save(Visit visit) throws DataAccessException; + /** + * Save a <code>Visit</code> to the data store, either inserting or updating it. + * + * @param visit the <code>Visit</code> to save + * @see BaseEntity#isNew + */ + void save(Visit visit) throws DataAccessException; - List<Visit> findByPetId(Integer petId); + List<Visit> findByPetId(Integer petId); } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java index d186bb9497092412e26be3d2b5a98e60899fb2c5..646378d6cdc30d1e61cdaa0ffd97a7af2e72e551 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImpl.java @@ -15,13 +15,6 @@ */ package org.springframework.samples.petclinic.repository.jdbc; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.sql.DataSource; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; @@ -39,10 +32,15 @@ import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.stereotype.Repository; +import javax.sql.DataSource; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * A simple JDBC-based implementation of the {@link OwnerRepository} interface. * - * * @author Ken Krebs * @author Juergen Hoeller * @author Rob Harrop @@ -53,119 +51,115 @@ import org.springframework.stereotype.Repository; @Repository public class JdbcOwnerRepositoryImpl implements OwnerRepository { - private VisitRepository visitRepository; - - private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - - private SimpleJdbcInsert insertOwner; - - @Autowired - public JdbcOwnerRepositoryImpl(DataSource dataSource, NamedParameterJdbcTemplate namedParameterJdbcTemplate, - VisitRepository visitRepository) { - - this.insertOwner = new SimpleJdbcInsert(dataSource) - .withTableName("owners") - .usingGeneratedKeyColumns("id"); - - this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - - this.visitRepository = visitRepository; - } - - - - - /** - * Loads {@link Owner Owners} from the data store by last name, returning - * all owners whose last name <i>starts</i> with the given name; also loads - * the {@link Pet Pets} and {@link Visit Visits} for the corresponding - * owners, if not already loaded. - */ - public Collection<Owner> findByLastName(String lastName) throws DataAccessException { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("lastName", lastName+"%"); - List<Owner> owners = this.namedParameterJdbcTemplate.query( - "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE last_name like :lastName", - params, - ParameterizedBeanPropertyRowMapper.newInstance(Owner.class) - ); - loadOwnersPetsAndVisits(owners); - return owners; - } - - /** - * Loads the {@link Owner} with the supplied <code>id</code>; also loads - * the {@link Pet Pets} and {@link Visit Visits} for the corresponding - * owner, if not already loaded. - */ - public Owner findById(int id) throws DataAccessException { - Owner owner; - try { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("id", id); - owner = this.namedParameterJdbcTemplate.queryForObject( - "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE id= :id", - params, - ParameterizedBeanPropertyRowMapper.newInstance(Owner.class) - ); - } - catch (EmptyResultDataAccessException ex) { - throw new ObjectRetrievalFailureException(Owner.class, new Integer(id)); - } - loadPetsAndVisits(owner); - return owner; - } - - public void loadPetsAndVisits(final Owner owner) { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("id", owner.getId().intValue()); - final List<JdbcPet> pets = this.namedParameterJdbcTemplate.query( - "SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE owner_id=:id", - params, - new JdbcPetRowMapper() - ); - for (JdbcPet pet : pets) { - owner.addPet(pet); - pet.setType(EntityUtils.getById(getPetTypes(), PetType.class, pet.getTypeId())); - List<Visit> visits = this.visitRepository.findByPetId(pet.getId()); - for (Visit visit : visits) { - pet.addVisit(visit); - } - } - } - - public void save(Owner owner) throws DataAccessException { - BeanPropertySqlParameterSource parameterSource = new BeanPropertySqlParameterSource(owner); - if (owner.isNew()) { - Number newKey = this.insertOwner.executeAndReturnKey(parameterSource); - owner.setId(newKey.intValue()); - } - else { - this.namedParameterJdbcTemplate.update( - "UPDATE owners SET first_name=:firstName, last_name=:lastName, address=:address, " + - "city=:city, telephone=:telephone WHERE id=:id", - parameterSource); - } - } - - public Collection<PetType> getPetTypes() throws DataAccessException { - return this.namedParameterJdbcTemplate.query( - "SELECT id, name FROM types ORDER BY name", new HashMap<String,Object>(), - ParameterizedBeanPropertyRowMapper.newInstance(PetType.class)); - } - - /** - * Loads the {@link Pet} and {@link Visit} data for the supplied - * {@link List} of {@link Owner Owners}. - * - * @param owners the list of owners for whom the pet and visit data should be loaded - * @see #loadPetsAndVisits(Owner) - */ - private void loadOwnersPetsAndVisits(List<Owner> owners) { - for (Owner owner : owners) { - loadPetsAndVisits(owner); - } - } + private VisitRepository visitRepository; + + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private SimpleJdbcInsert insertOwner; + + @Autowired + public JdbcOwnerRepositoryImpl(DataSource dataSource, NamedParameterJdbcTemplate namedParameterJdbcTemplate, + VisitRepository visitRepository) { + + this.insertOwner = new SimpleJdbcInsert(dataSource) + .withTableName("owners") + .usingGeneratedKeyColumns("id"); + + this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); + + this.visitRepository = visitRepository; + } + + + /** + * Loads {@link Owner Owners} from the data store by last name, returning all owners whose last name <i>starts</i> with + * the given name; also loads the {@link Pet Pets} and {@link Visit Visits} for the corresponding owners, if not + * already loaded. + */ + @Override + public Collection<Owner> findByLastName(String lastName) throws DataAccessException { + Map<String, Object> params = new HashMap<String, Object>(); + params.put("lastName", lastName + "%"); + List<Owner> owners = this.namedParameterJdbcTemplate.query( + "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE last_name like :lastName", + params, + ParameterizedBeanPropertyRowMapper.newInstance(Owner.class) + ); + loadOwnersPetsAndVisits(owners); + return owners; + } + + /** + * Loads the {@link Owner} with the supplied <code>id</code>; also loads the {@link Pet Pets} and {@link Visit Visits} + * for the corresponding owner, if not already loaded. + */ + @Override + public Owner findById(int id) throws DataAccessException { + Owner owner; + try { + Map<String, Object> params = new HashMap<String, Object>(); + params.put("id", id); + owner = this.namedParameterJdbcTemplate.queryForObject( + "SELECT id, first_name, last_name, address, city, telephone FROM owners WHERE id= :id", + params, + ParameterizedBeanPropertyRowMapper.newInstance(Owner.class) + ); + } catch (EmptyResultDataAccessException ex) { + throw new ObjectRetrievalFailureException(Owner.class, new Integer(id)); + } + loadPetsAndVisits(owner); + return owner; + } + + public void loadPetsAndVisits(final Owner owner) { + Map<String, Object> params = new HashMap<String, Object>(); + params.put("id", owner.getId().intValue()); + final List<JdbcPet> pets = this.namedParameterJdbcTemplate.query( + "SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE owner_id=:id", + params, + new JdbcPetRowMapper() + ); + for (JdbcPet pet : pets) { + owner.addPet(pet); + pet.setType(EntityUtils.getById(getPetTypes(), PetType.class, pet.getTypeId())); + List<Visit> visits = this.visitRepository.findByPetId(pet.getId()); + for (Visit visit : visits) { + pet.addVisit(visit); + } + } + } + + @Override + public void save(Owner owner) throws DataAccessException { + BeanPropertySqlParameterSource parameterSource = new BeanPropertySqlParameterSource(owner); + if (owner.isNew()) { + Number newKey = this.insertOwner.executeAndReturnKey(parameterSource); + owner.setId(newKey.intValue()); + } else { + this.namedParameterJdbcTemplate.update( + "UPDATE owners SET first_name=:firstName, last_name=:lastName, address=:address, " + + "city=:city, telephone=:telephone WHERE id=:id", + parameterSource); + } + } + + public Collection<PetType> getPetTypes() throws DataAccessException { + return this.namedParameterJdbcTemplate.query( + "SELECT id, name FROM types ORDER BY name", new HashMap<String, Object>(), + ParameterizedBeanPropertyRowMapper.newInstance(PetType.class)); + } + + /** + * Loads the {@link Pet} and {@link Visit} data for the supplied {@link List} of {@link Owner Owners}. + * + * @param owners the list of owners for whom the pet and visit data should be loaded + * @see #loadPetsAndVisits(Owner) + */ + private void loadOwnersPetsAndVisits(List<Owner> owners) { + for (Owner owner : owners) { + loadPetsAndVisits(owner); + } + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java index 25d93a3ca8f0437ec45699708bfb72c1a8d15ce1..b548629c76b899eea94d4e7c5493a292303c0fd1 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPet.java @@ -18,33 +18,33 @@ package org.springframework.samples.petclinic.repository.jdbc; import org.springframework.samples.petclinic.model.Pet; /** - * Subclass of Pet that carries temporary id properties which - * are only relevant for a JDBC implmentation of the ClinicService. + * Subclass of Pet that carries temporary id properties which are only relevant for a JDBC implmentation of the + * ClinicService. * * @author Juergen Hoeller * @see JdbcClinicImpl */ class JdbcPet extends Pet { - private int typeId; + private int typeId; - private int ownerId; + private int ownerId; - public void setTypeId(int typeId) { - this.typeId = typeId; - } + public void setTypeId(int typeId) { + this.typeId = typeId; + } - public int getTypeId() { - return this.typeId; - } + public int getTypeId() { + return this.typeId; + } - public void setOwnerId(int ownerId) { - this.ownerId = ownerId; - } + public void setOwnerId(int ownerId) { + this.ownerId = ownerId; + } - public int getOwnerId() { - return this.ownerId; - } + public int getOwnerId() { + return this.ownerId; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java index 693a77ea2876a0a60bf139d7bdeb302ceb3b9ccf..f11b5b05b9d62019ab035d26b381ff96c951cad3 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImpl.java @@ -15,12 +15,6 @@ */ package org.springframework.samples.petclinic.repository.jdbc; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.sql.DataSource; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; @@ -39,8 +33,12 @@ import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.stereotype.Repository; +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** - * * @author Ken Krebs * @author Juergen Hoeller * @author Rob Harrop @@ -51,84 +49,84 @@ import org.springframework.stereotype.Repository; @Repository public class JdbcPetRepositoryImpl implements PetRepository { - private NamedParameterJdbcTemplate namedParameterJdbcTemplate; - - private SimpleJdbcInsert insertPet; - - private OwnerRepository ownerRepository; - - private VisitRepository visitRepository; - - - @Autowired - public JdbcPetRepositoryImpl(DataSource dataSource, OwnerRepository ownerRepository, VisitRepository visitRepository) { - this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); - - this.insertPet = new SimpleJdbcInsert(dataSource) - .withTableName("pets") - .usingGeneratedKeyColumns("id"); - - this.ownerRepository = ownerRepository; - this.visitRepository = visitRepository; - } - - public List<PetType> findPetTypes() throws DataAccessException { - Map<String, Object> params = new HashMap<String,Object>(); - return this.namedParameterJdbcTemplate.query( - "SELECT id, name FROM types ORDER BY name", - params, - ParameterizedBeanPropertyRowMapper.newInstance(PetType.class)); - } - - public Pet findById(int id) throws DataAccessException { - JdbcPet pet; - try { - Map<String, Object> params = new HashMap<String, Object>(); - params.put("id", id); - pet = this.namedParameterJdbcTemplate.queryForObject( - "SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE id=:id", - params, - new JdbcPetRowMapper()); - } - catch (EmptyResultDataAccessException ex) { - throw new ObjectRetrievalFailureException(Pet.class, new Integer(id)); - } - Owner owner = this.ownerRepository.findById(pet.getOwnerId()); - owner.addPet(pet); - pet.setType(EntityUtils.getById(findPetTypes(), PetType.class, pet.getTypeId())); - - List<Visit> visits = this.visitRepository.findByPetId(pet.getId()); - for (Visit visit : visits) { - pet.addVisit(visit); - } - return pet; - } - - public void save(Pet pet) throws DataAccessException { - if (pet.isNew()) { - Number newKey = this.insertPet.executeAndReturnKey( - createPetParameterSource(pet)); - pet.setId(newKey.intValue()); - } - else { - this.namedParameterJdbcTemplate.update( - "UPDATE pets SET name=:name, birth_date=:birth_date, type_id=:type_id, " + - "owner_id=:owner_id WHERE id=:id", - createPetParameterSource(pet)); - } - } - - /** - * Creates a {@link MapSqlParameterSource} based on data values from the - * supplied {@link Pet} instance. - */ - private MapSqlParameterSource createPetParameterSource(Pet pet) { - return new MapSqlParameterSource() - .addValue("id", pet.getId()) - .addValue("name", pet.getName()) - .addValue("birth_date", pet.getBirthDate().toDate()) - .addValue("type_id", pet.getType().getId()) - .addValue("owner_id", pet.getOwner().getId()); - } + private NamedParameterJdbcTemplate namedParameterJdbcTemplate; + + private SimpleJdbcInsert insertPet; + + private OwnerRepository ownerRepository; + + private VisitRepository visitRepository; + + + @Autowired + public JdbcPetRepositoryImpl(DataSource dataSource, OwnerRepository ownerRepository, VisitRepository visitRepository) { + this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); + + this.insertPet = new SimpleJdbcInsert(dataSource) + .withTableName("pets") + .usingGeneratedKeyColumns("id"); + + this.ownerRepository = ownerRepository; + this.visitRepository = visitRepository; + } + + @Override + public List<PetType> findPetTypes() throws DataAccessException { + Map<String, Object> params = new HashMap<String, Object>(); + return this.namedParameterJdbcTemplate.query( + "SELECT id, name FROM types ORDER BY name", + params, + ParameterizedBeanPropertyRowMapper.newInstance(PetType.class)); + } + + @Override + public Pet findById(int id) throws DataAccessException { + JdbcPet pet; + try { + Map<String, Object> params = new HashMap<String, Object>(); + params.put("id", id); + pet = this.namedParameterJdbcTemplate.queryForObject( + "SELECT id, name, birth_date, type_id, owner_id FROM pets WHERE id=:id", + params, + new JdbcPetRowMapper()); + } catch (EmptyResultDataAccessException ex) { + throw new ObjectRetrievalFailureException(Pet.class, new Integer(id)); + } + Owner owner = this.ownerRepository.findById(pet.getOwnerId()); + owner.addPet(pet); + pet.setType(EntityUtils.getById(findPetTypes(), PetType.class, pet.getTypeId())); + + List<Visit> visits = this.visitRepository.findByPetId(pet.getId()); + for (Visit visit : visits) { + pet.addVisit(visit); + } + return pet; + } + + @Override + public void save(Pet pet) throws DataAccessException { + if (pet.isNew()) { + Number newKey = this.insertPet.executeAndReturnKey( + createPetParameterSource(pet)); + pet.setId(newKey.intValue()); + } else { + this.namedParameterJdbcTemplate.update( + "UPDATE pets SET name=:name, birth_date=:birth_date, type_id=:type_id, " + + "owner_id=:owner_id WHERE id=:id", + createPetParameterSource(pet)); + } + } + + /** + * Creates a {@link MapSqlParameterSource} based on data values from the supplied {@link Pet} instance. + */ + private MapSqlParameterSource createPetParameterSource(Pet pet) { + return new MapSqlParameterSource() + .addValue("id", pet.getId()) + .addValue("name", pet.getName()) + .addValue("birth_date", pet.getBirthDate().toDate()) + .addValue("type_id", pet.getType().getId()) + .addValue("owner_id", pet.getOwner().getId()); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java index f76c639cd7c98d5c0d5a4c8321b9ef9d373fd790..0193a86530478353946b8724cbf19f05b1d0a728 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRowMapper.java @@ -15,27 +15,28 @@ */ package org.springframework.samples.petclinic.repository.jdbc; +import org.joda.time.DateTime; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; -import org.joda.time.DateTime; -import org.springframework.jdbc.core.simple.ParameterizedRowMapper; - /** - * {@link ParameterizedRowMapper} implementation mapping data from a - * {@link ResultSet} to the corresponding properties of the {@link JdbcPet} class. + * {@link ParameterizedRowMapper} implementation mapping data from a {@link ResultSet} to the corresponding properties + * of the {@link JdbcPet} class. */ class JdbcPetRowMapper implements ParameterizedRowMapper<JdbcPet> { - public JdbcPet mapRow(ResultSet rs, int rownum) throws SQLException { - JdbcPet pet = new JdbcPet(); - pet.setId(rs.getInt("id")); - pet.setName(rs.getString("name")); - Date birthDate = rs.getDate("birth_date"); - pet.setBirthDate(new DateTime(birthDate)); - pet.setTypeId(rs.getInt("type_id")); - pet.setOwnerId(rs.getInt("owner_id")); - return pet; - } + @Override + public JdbcPet mapRow(ResultSet rs, int rownum) throws SQLException { + JdbcPet pet = new JdbcPet(); + pet.setId(rs.getInt("id")); + pet.setName(rs.getString("name")); + Date birthDate = rs.getDate("birth_date"); + pet.setBirthDate(new DateTime(birthDate)); + pet.setTypeId(rs.getInt("type_id")); + pet.setOwnerId(rs.getInt("owner_id")); + return pet; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java index 0783bd52a3cdb97dbb197587953c990265daf751..a354c2a83f72647533f50946027eb9bfa713115e 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImpl.java @@ -15,12 +15,6 @@ */ package org.springframework.samples.petclinic.repository.jdbc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.dao.DataAccessException; @@ -33,11 +27,16 @@ import org.springframework.samples.petclinic.repository.VetRepository; import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.stereotype.Repository; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + /** + * A simple JDBC-based implementation of the {@link VetRepository} interface. Uses @Cacheable to cache the result of the + * {@link findAll} method * - * A simple JDBC-based implementation of the {@link VetRepository} interface. - * Uses @Cacheable to cache the result of the {@link findAll} method - * * @author Ken Krebs * @author Juergen Hoeller * @author Rob Harrop @@ -49,44 +48,48 @@ import org.springframework.stereotype.Repository; @Repository public class JdbcVetRepositoryImpl implements VetRepository { - private JdbcTemplate jdbcTemplate; + private JdbcTemplate jdbcTemplate; - @Autowired - public JdbcVetRepositoryImpl(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } + @Autowired + public JdbcVetRepositoryImpl(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } - /** - * Refresh the cache of Vets that the ClinicService is holding. - * @see org.springframework.samples.petclinic.model.service.ClinicService#findVets() - */ - @Cacheable(value="vets") - public Collection<Vet> findAll() throws DataAccessException { - List<Vet> vets = new ArrayList<Vet>(); - // Retrieve the list of all vets. - vets.addAll(this.jdbcTemplate.query( - "SELECT id, first_name, last_name FROM vets ORDER BY last_name,first_name", - ParameterizedBeanPropertyRowMapper.newInstance(Vet.class))); + /** + * Refresh the cache of Vets that the ClinicService is holding. + * + * @see org.springframework.samples.petclinic.model.service.ClinicService#findVets() + */ + @Override + @Cacheable(value = "vets") + public Collection<Vet> findAll() throws DataAccessException { + List<Vet> vets = new ArrayList<Vet>(); + // Retrieve the list of all vets. + vets.addAll(this.jdbcTemplate.query( + "SELECT id, first_name, last_name FROM vets ORDER BY last_name,first_name", + ParameterizedBeanPropertyRowMapper.newInstance(Vet.class))); - // Retrieve the list of all possible specialties. - final List<Specialty> specialties = this.jdbcTemplate.query( - "SELECT id, name FROM specialties", - ParameterizedBeanPropertyRowMapper.newInstance(Specialty.class)); + // Retrieve the list of all possible specialties. + final List<Specialty> specialties = this.jdbcTemplate.query( + "SELECT id, name FROM specialties", + ParameterizedBeanPropertyRowMapper.newInstance(Specialty.class)); - // Build each vet's list of specialties. - for (Vet vet : vets) { - final List<Integer> vetSpecialtiesIds = this.jdbcTemplate.query( - "SELECT specialty_id FROM vet_specialties WHERE vet_id=?", - new ParameterizedRowMapper<Integer>() { - public Integer mapRow(ResultSet rs, int row) throws SQLException { - return Integer.valueOf(rs.getInt(1)); - }}, - vet.getId().intValue()); - for (int specialtyId : vetSpecialtiesIds) { - Specialty specialty = EntityUtils.getById(specialties, Specialty.class, specialtyId); - vet.addSpecialty(specialty); - } - } - return vets; - } + // Build each vet's list of specialties. + for (Vet vet : vets) { + final List<Integer> vetSpecialtiesIds = this.jdbcTemplate.query( + "SELECT specialty_id FROM vet_specialties WHERE vet_id=?", + new ParameterizedRowMapper<Integer>() { + @Override + public Integer mapRow(ResultSet rs, int row) throws SQLException { + return Integer.valueOf(rs.getInt(1)); + } + }, + vet.getId().intValue()); + for (int specialtyId : vetSpecialtiesIds) { + Specialty specialty = EntityUtils.getById(specialties, Specialty.class, specialtyId); + vet.addSpecialty(specialty); + } + } + return vets; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java index e0f6eb4225d33d48eee5dd52c9f3fb1531999e12..e8081aaef4d87bc11ae16184097c51e1b72a90da 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImpl.java @@ -15,13 +15,6 @@ */ package org.springframework.samples.petclinic.repository.jdbc; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Date; -import java.util.List; - -import javax.sql.DataSource; - import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -33,10 +26,15 @@ import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.stereotype.Repository; +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; + /** * A simple JDBC-based implementation of the {@link VisitRepository} interface. * - * * @author Ken Krebs * @author Juergen Hoeller * @author Rob Harrop @@ -48,63 +46,64 @@ import org.springframework.stereotype.Repository; @Repository public class JdbcVisitRepositoryImpl implements VisitRepository { - private JdbcTemplate jdbcTemplate; + private JdbcTemplate jdbcTemplate; - private SimpleJdbcInsert insertVisit; + private SimpleJdbcInsert insertVisit; - @Autowired - public JdbcVisitRepositoryImpl(DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + @Autowired + public JdbcVisitRepositoryImpl(DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); - this.insertVisit = new SimpleJdbcInsert(dataSource) - .withTableName("visits") - .usingGeneratedKeyColumns("id"); - } + this.insertVisit = new SimpleJdbcInsert(dataSource) + .withTableName("visits") + .usingGeneratedKeyColumns("id"); + } - public void save(Visit visit) throws DataAccessException { - if (visit.isNew()) { - Number newKey = this.insertVisit.executeAndReturnKey( - createVisitParameterSource(visit)); - visit.setId(newKey.intValue()); - } - else { - throw new UnsupportedOperationException("Visit update not supported"); - } - } + @Override + public void save(Visit visit) throws DataAccessException { + if (visit.isNew()) { + Number newKey = this.insertVisit.executeAndReturnKey( + createVisitParameterSource(visit)); + visit.setId(newKey.intValue()); + } else { + throw new UnsupportedOperationException("Visit update not supported"); + } + } - public void deletePet(int id) throws DataAccessException { - this.jdbcTemplate.update("DELETE FROM pets WHERE id=?", id); - } + public void deletePet(int id) throws DataAccessException { + this.jdbcTemplate.update("DELETE FROM pets WHERE id=?", id); + } - /** - * Creates a {@link MapSqlParameterSource} based on data values from the - * supplied {@link Visit} instance. - */ - private MapSqlParameterSource createVisitParameterSource(Visit visit) { - return new MapSqlParameterSource() - .addValue("id", visit.getId()) - .addValue("visit_date", visit.getDate().toDate()) - .addValue("description", visit.getDescription()) - .addValue("pet_id", visit.getPet().getId()); - } + /** + * Creates a {@link MapSqlParameterSource} based on data values from the supplied {@link Visit} instance. + */ + private MapSqlParameterSource createVisitParameterSource(Visit visit) { + return new MapSqlParameterSource() + .addValue("id", visit.getId()) + .addValue("visit_date", visit.getDate().toDate()) + .addValue("description", visit.getDescription()) + .addValue("pet_id", visit.getPet().getId()); + } - public List<Visit> findByPetId(Integer petId) { - final List<Visit> visits = this.jdbcTemplate.query( - "SELECT id, visit_date, description FROM visits WHERE pet_id=?", - new ParameterizedRowMapper<Visit>() { - public Visit mapRow(ResultSet rs, int row) throws SQLException { - Visit visit = new Visit(); - visit.setId(rs.getInt("id")); - Date visitDate = rs.getDate("visit_date"); - visit.setDate(new DateTime(visitDate)); - visit.setDescription(rs.getString("description")); - return visit; - } - }, - petId); - return visits; - } + @Override + public List<Visit> findByPetId(Integer petId) { + final List<Visit> visits = this.jdbcTemplate.query( + "SELECT id, visit_date, description FROM visits WHERE pet_id=?", + new ParameterizedRowMapper<Visit>() { + @Override + public Visit mapRow(ResultSet rs, int row) throws SQLException { + Visit visit = new Visit(); + visit.setId(rs.getInt("id")); + Date visitDate = rs.getDate("visit_date"); + visit.setDate(new DateTime(visitDate)); + visit.setDescription(rs.getString("description")); + return visit; + } + }, + petId); + return visits; + } } 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 898998056e6292a1b5f10356133e7be49f8422d0..3b85bfd8d350ed7249465de3e21033db7454a2a9 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 @@ -15,15 +15,14 @@ */ package org.springframework.samples.petclinic.repository.jpa; -import java.util.Collection; +import org.springframework.samples.petclinic.model.Owner; +import org.springframework.samples.petclinic.repository.OwnerRepository; +import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; - -import org.springframework.samples.petclinic.model.Owner; -import org.springframework.samples.petclinic.repository.OwnerRepository; -import org.springframework.stereotype.Repository; +import java.util.Collection; /** * JPA implementation of the {@link OwnerRepository} interface. @@ -37,31 +36,34 @@ import org.springframework.stereotype.Repository; @Repository public class JpaOwnerRepositoryImpl implements OwnerRepository { - @PersistenceContext - private EntityManager em; - + @PersistenceContext + private EntityManager em; + - @SuppressWarnings("unchecked") - public Collection<Owner> findByLastName(String lastName) { - // using 'join fetch' because a single query should load both owners and pets - // using 'left join fetch' because it might happen that an owner does not have pets yet - Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName"); - query.setParameter("lastName", lastName + "%"); - return query.getResultList(); - } + @Override + @SuppressWarnings("unchecked") + public Collection<Owner> findByLastName(String lastName) { + // using 'join fetch' because a single query should load both owners and pets + // using 'left join fetch' because it might happen that an owner does not have pets yet + Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName"); + query.setParameter("lastName", lastName + "%"); + return query.getResultList(); + } - public Owner findById(int id) { - // using 'join fetch' because a single query should load both owners and pets - // using 'left join fetch' because it might happen that an owner does not have pets yet - Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); - query.setParameter("id", id); - return (Owner) query.getSingleResult(); - } + @Override + public Owner findById(int id) { + // using 'join fetch' because a single query should load both owners and pets + // using 'left join fetch' because it might happen that an owner does not have pets yet + Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); + query.setParameter("id", id); + return (Owner) query.getSingleResult(); + } - public void save(Owner owner) { - this.em.merge(owner); + @Override + public void save(Owner owner) { + this.em.merge(owner); - } + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java index c83fd6966e50b12efa1a7e82908659b7b8bf339b..4073c9d863f84ac23d83e14eb4fd81ba94bcc3f5 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImpl.java @@ -15,16 +15,15 @@ */ package org.springframework.samples.petclinic.repository.jpa; -import java.util.List; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.repository.PetRepository; import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; + /** * JPA implementation of the {@link PetRepository} interface. * @@ -37,20 +36,23 @@ import org.springframework.stereotype.Repository; @Repository public class JpaPetRepositoryImpl implements PetRepository { - @PersistenceContext - private EntityManager em; + @PersistenceContext + private EntityManager em; - @SuppressWarnings("unchecked") - public List<PetType> findPetTypes() { - return this.em.createQuery("SELECT ptype FROM PetType ptype ORDER BY ptype.name").getResultList(); - } + @Override + @SuppressWarnings("unchecked") + public List<PetType> findPetTypes() { + return this.em.createQuery("SELECT ptype FROM PetType ptype ORDER BY ptype.name").getResultList(); + } - public Pet findById(int id) { - return this.em.find(Pet.class, id); - } + @Override + public Pet findById(int id) { + return this.em.find(Pet.class, id); + } - public void save(Pet pet) { - this.em.merge(pet); - } + @Override + public void save(Pet pet) { + this.em.merge(pet); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java index b32abc7447aaf2394987386c00fe471f170025f1..5ab58d3ec86a894ae8ede2e79745fbaecc22890d 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImpl.java @@ -15,19 +15,18 @@ */ package org.springframework.samples.petclinic.repository.jpa; -import java.util.Collection; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - import org.springframework.cache.annotation.Cacheable; import org.springframework.samples.petclinic.model.Vet; import org.springframework.samples.petclinic.repository.VetRepository; import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.Collection; + /** -* JPA implementation of the {@link VetRepository} interface. - * + * JPA implementation of the {@link VetRepository} interface. + * * @author Mike Keith * @author Rod Johnson * @author Sam Brannen @@ -37,14 +36,15 @@ import org.springframework.stereotype.Repository; @Repository public class JpaVetRepositoryImpl implements VetRepository { - @PersistenceContext - private EntityManager em; + @PersistenceContext + private EntityManager em; - @Cacheable(value="vets") - @SuppressWarnings("unchecked") - public Collection<Vet> findAll() { - return this.em.createQuery("SELECT vet FROM Vet vet join fetch vet.specialties ORDER BY vet.lastName, vet.firstName").getResultList(); - } + @Override + @Cacheable(value = "vets") + @SuppressWarnings("unchecked") + public Collection<Vet> findAll() { + return this.em.createQuery("SELECT vet FROM Vet vet join fetch vet.specialties ORDER BY vet.lastName, vet.firstName").getResultList(); + } } 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 3500a437fbe8f97781a84e697a9e96431bfd82b5..e9fbf07a867c17d929fff0556cc0cd0d6cbd65f9 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 @@ -15,19 +15,18 @@ */ package org.springframework.samples.petclinic.repository.jpa; -import java.util.List; +import org.springframework.samples.petclinic.model.Visit; +import org.springframework.samples.petclinic.repository.VisitRepository; +import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; - -import org.springframework.samples.petclinic.model.Visit; -import org.springframework.samples.petclinic.repository.VisitRepository; -import org.springframework.stereotype.Repository; +import java.util.List; /** * JPA implementation of the ClinicService interface using EntityManager. - * + * <p/> * <p>The mappings are defined in "orm.xml" located in the META-INF directory. * * @author Mike Keith @@ -39,20 +38,22 @@ import org.springframework.stereotype.Repository; @Repository public class JpaVisitRepositoryImpl implements VisitRepository { - @PersistenceContext - private EntityManager em; + @PersistenceContext + private EntityManager em; - public void save(Visit visit) { - this.em.merge(visit); - } + @Override + public void save(Visit visit) { + this.em.merge(visit); + } - @SuppressWarnings("unchecked") - public List<Visit> findByPetId(Integer petId) { - Query query = this.em.createQuery("SELECT visit FROM Visit v where v.pets.id= :id"); - query.setParameter("id", petId); - return query.getResultList(); - } + @Override + @SuppressWarnings("unchecked") + public List<Visit> findByPetId(Integer petId) { + Query query = this.em.createQuery("SELECT visit FROM Visit v where v.pets.id= :id"); + query.setParameter("id", petId); + return query.getResultList(); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java index 6f28d798cc8d21b3249f30f6fc493ac00069c31d..e6d050e59919215fba431bf6da931a21cd0e2cfb 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImpl.java @@ -15,51 +15,53 @@ */ package org.springframework.samples.petclinic.repository.springdatajpa; -import java.util.Collection; +import org.springframework.samples.petclinic.model.Owner; +import org.springframework.samples.petclinic.repository.OwnerRepository; +import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; - -import org.springframework.samples.petclinic.model.Owner; -import org.springframework.samples.petclinic.repository.OwnerRepository; -import org.springframework.stereotype.Repository; +import java.util.Collection; /** - * Using native JPA instead of Spring Data JPA here because of this query: - * "SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName" - * See https://jira.springsource.org/browse/DATAJPA-292 for more details. + * Using native JPA instead of Spring Data JPA here because of this query: "SELECT owner FROM Owner owner left join + * fetch owner.pets WHERE owner.lastName LIKE :lastName" See https://jira.springsource.org/browse/DATAJPA-292 for more + * details. * * @author Michael Isvy */ @Repository public class JpaOwnerRepositoryImpl implements OwnerRepository { - @PersistenceContext - private EntityManager em; - + @PersistenceContext + private EntityManager em; + - @SuppressWarnings("unchecked") - public Collection<Owner> findByLastName(String lastName) { - // using 'join fetch' because a single query should load both owners and pets - // using 'left join fetch' because it might happen that an owner does not have pets yet - Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName"); - query.setParameter("lastName", lastName + "%"); - return query.getResultList(); - } + @Override + @SuppressWarnings("unchecked") + public Collection<Owner> findByLastName(String lastName) { + // using 'join fetch' because a single query should load both owners and pets + // using 'left join fetch' because it might happen that an owner does not have pets yet + Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName"); + query.setParameter("lastName", lastName + "%"); + return query.getResultList(); + } - public Owner findById(int id) { - // using 'join fetch' because a single query should load both owners and pets - // using 'left join fetch' because it might happen that an owner does not have pets yet - Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); - query.setParameter("id", id); - return (Owner) query.getSingleResult(); - } + @Override + public Owner findById(int id) { + // using 'join fetch' because a single query should load both owners and pets + // using 'left join fetch' because it might happen that an owner does not have pets yet + Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id"); + query.setParameter("id", id); + return (Owner) query.getSingleResult(); + } - public void save(Owner owner) { - this.em.merge(owner); + @Override + public void save(Owner owner) { + this.em.merge(owner); - } + } } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepository.java index 4cdf1ac132960b89b18e72c0b7e14c4e45a95aef..e510facd9a102d04261a7ceecf12377c64f882a4 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataPetRepository.java @@ -15,8 +15,6 @@ */ package org.springframework.samples.petclinic.repository.springdatajpa; -import java.util.List; - import org.springframework.dao.DataAccessException; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; @@ -24,6 +22,8 @@ import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.repository.PetRepository; +import java.util.List; + /** * Spring Data JPA specialization of the {@link PetRepository} interface * @@ -31,7 +31,8 @@ import org.springframework.samples.petclinic.repository.PetRepository; * @since 15.1.2013 */ public interface SpringDataPetRepository extends PetRepository, Repository<Pet, Integer> { - - @Query("SELECT ptype FROM PetType ptype ORDER BY ptype.name") - List<PetType> findPetTypes() throws DataAccessException; + + @Override + @Query("SELECT ptype FROM PetType ptype ORDER BY ptype.name") + List<PetType> findPetTypes() throws DataAccessException; } diff --git a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepository.java b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepository.java index 93b0c2a1cc2fe3a315a60fc467664a72d206f2ba..84740224b7fa9fe997ab9ee5f24938f8f79014e8 100644 --- a/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataVisitRepository.java @@ -18,7 +18,7 @@ package org.springframework.samples.petclinic.repository.springdatajpa; import org.springframework.data.repository.Repository; import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.repository.VisitRepository; - + /** * Spring Data JPA specialization of the {@link VisitRepository} interface * diff --git a/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java b/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java index 17440fb1142a649609492134ed0064f0f5e998e4..0ea3d7f16d9931f5c56b25bc7a3d0d2c5ae25086 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java +++ b/src/main/java/org/springframework/samples/petclinic/service/ClinicService.java @@ -15,14 +15,10 @@ */ package org.springframework.samples.petclinic.service; -import java.util.Collection; - import org.springframework.dao.DataAccessException; -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.model.Vet; -import org.springframework.samples.petclinic.model.Visit; +import org.springframework.samples.petclinic.model.*; + +import java.util.Collection; /** @@ -31,21 +27,21 @@ import org.springframework.samples.petclinic.model.Visit; * @author Michael Isvy */ public interface ClinicService { - - public Collection<PetType> findPetTypes() throws DataAccessException; - - public Owner findOwnerById(int id) throws DataAccessException; - - public Pet findPetById(int id) throws DataAccessException; - public void savePet(Pet pet) throws DataAccessException; + public Collection<PetType> findPetTypes() throws DataAccessException; + + public Owner findOwnerById(int id) throws DataAccessException; + + public Pet findPetById(int id) throws DataAccessException; + + public void savePet(Pet pet) throws DataAccessException; + + public void saveVisit(Visit visit) throws DataAccessException; - public void saveVisit(Visit visit) throws DataAccessException; - - public Collection<Vet> findVets() throws DataAccessException; + public Collection<Vet> findVets() throws DataAccessException; - public void saveOwner(Owner owner) throws DataAccessException; + public void saveOwner(Owner owner) throws DataAccessException; - Collection<Owner> findOwnerByLastName(String lastName) throws DataAccessException; + Collection<Owner> findOwnerByLastName(String lastName) throws DataAccessException; } diff --git a/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java b/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java index eeb40371cadb5521ede3dd5ca9efdd8ba364d7b5..e03c1eb2cc744f16f95a171c2159578f4579b485 100644 --- a/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java +++ b/src/main/java/org/springframework/samples/petclinic/service/ClinicServiceImpl.java @@ -15,15 +15,9 @@ */ package org.springframework.samples.petclinic.service; -import java.util.Collection; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; -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.model.Vet; -import org.springframework.samples.petclinic.model.Visit; +import org.springframework.samples.petclinic.model.*; import org.springframework.samples.petclinic.repository.OwnerRepository; import org.springframework.samples.petclinic.repository.PetRepository; import org.springframework.samples.petclinic.repository.VetRepository; @@ -31,6 +25,8 @@ import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; + /** * Mostly used as a facade for all Petclinic controllers * @@ -38,70 +34,69 @@ import org.springframework.transaction.annotation.Transactional; */ @Service public class ClinicServiceImpl implements ClinicService { - - private PetRepository petRepository; - private VetRepository vetRepository; - private OwnerRepository ownerRepository; - private VisitRepository visitRepository; - - @Autowired - public ClinicServiceImpl(PetRepository petRepository, VetRepository vetRepository, OwnerRepository ownerRepository, VisitRepository visitRepository) { - this.petRepository = petRepository; - this.vetRepository = vetRepository; - this.ownerRepository = ownerRepository; - this.visitRepository = visitRepository; - } - - @Transactional(readOnly=true) - public Collection<PetType> findPetTypes() throws DataAccessException { - return petRepository.findPetTypes(); - } - - @Transactional(readOnly=true) - public Owner findOwnerById(int id) throws DataAccessException { - return ownerRepository.findById(id); - } - - @Transactional(readOnly=true) - public Collection<Owner> findOwnerByLastName(String lastName) throws DataAccessException { - return ownerRepository.findByLastName(lastName); - } - - @Transactional - public void saveOwner(Owner owner) throws DataAccessException { - ownerRepository.save(owner); - } - - - @Transactional - public void saveVisit(Visit visit) throws DataAccessException { - visitRepository.save(visit); - } - - - @Transactional(readOnly=true) - public Pet findPetById(int id) throws DataAccessException { - return petRepository.findById(id); - } - - @Transactional - public void savePet(Pet pet) throws DataAccessException { - petRepository.save(pet); - } - - @Transactional(readOnly=true) - public Collection<Vet> findVets() throws DataAccessException { - return vetRepository.findAll(); - } - - - - - - - - - - + + private PetRepository petRepository; + private VetRepository vetRepository; + private OwnerRepository ownerRepository; + private VisitRepository visitRepository; + + @Autowired + public ClinicServiceImpl(PetRepository petRepository, VetRepository vetRepository, OwnerRepository ownerRepository, VisitRepository visitRepository) { + this.petRepository = petRepository; + this.vetRepository = vetRepository; + this.ownerRepository = ownerRepository; + this.visitRepository = visitRepository; + } + + @Override + @Transactional(readOnly = true) + public Collection<PetType> findPetTypes() throws DataAccessException { + return petRepository.findPetTypes(); + } + + @Override + @Transactional(readOnly = true) + public Owner findOwnerById(int id) throws DataAccessException { + return ownerRepository.findById(id); + } + + @Override + @Transactional(readOnly = true) + public Collection<Owner> findOwnerByLastName(String lastName) throws DataAccessException { + return ownerRepository.findByLastName(lastName); + } + + @Override + @Transactional + public void saveOwner(Owner owner) throws DataAccessException { + ownerRepository.save(owner); + } + + + @Override + @Transactional + public void saveVisit(Visit visit) throws DataAccessException { + visitRepository.save(visit); + } + + + @Override + @Transactional(readOnly = true) + public Pet findPetById(int id) throws DataAccessException { + return petRepository.findById(id); + } + + @Override + @Transactional + public void savePet(Pet pet) throws DataAccessException { + petRepository.save(pet); + } + + @Override + @Transactional(readOnly = true) + public Collection<Vet> findVets() throws DataAccessException { + return vetRepository.findAll(); + } + } diff --git a/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java b/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java index 116e7f7aa0d4df14baca633db3141f2ab84cccd7..cad19ede0e5d8cd94d999dcd81e0ffb5eef33bfb 100644 --- a/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java +++ b/src/main/java/org/springframework/samples/petclinic/util/CallMonitoringAspect.java @@ -24,8 +24,8 @@ import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.util.StopWatch; /** - * Simple aspect that monitors call count and call invocation time. - * It uses JMX annotations and therefore can be monitored using any JMX console such as the jConsole + * Simple aspect that monitors call count and call invocation time. It uses JMX annotations and therefore can be + * monitored using any JMX console such as the jConsole * * @author Rob Harrop * @author Juergen Hoeller @@ -36,61 +36,58 @@ import org.springframework.util.StopWatch; @Aspect public class CallMonitoringAspect { - private boolean isEnabled = true; - - private int callCount = 0; - - private long accumulatedCallTime = 0; - - - @ManagedAttribute - public void setEnabled(boolean enabled) { - isEnabled = enabled; - } - - @ManagedAttribute - public boolean isEnabled() { - return isEnabled; - } - - @ManagedOperation - public void reset() { - this.callCount = 0; - this.accumulatedCallTime = 0; - } - - @ManagedAttribute - public int getCallCount() { - return callCount; - } - - @ManagedAttribute - public long getCallTime() { - return (this.callCount > 0 ? this.accumulatedCallTime / this.callCount : 0); - } - - - @Around("within(@org.springframework.stereotype.Repository *)") - public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { - if (this.isEnabled) { - StopWatch sw = new StopWatch(joinPoint.toShortString()); - - sw.start("invoke"); - try { - return joinPoint.proceed(); - } - finally { - sw.stop(); - synchronized (this) { - this.callCount++; - this.accumulatedCallTime += sw.getTotalTimeMillis(); - } - } - } - - else { - return joinPoint.proceed(); - } - } + private boolean isEnabled = true; + + private int callCount = 0; + + private long accumulatedCallTime = 0; + + + @ManagedAttribute + public void setEnabled(boolean enabled) { + isEnabled = enabled; + } + + @ManagedAttribute + public boolean isEnabled() { + return isEnabled; + } + + @ManagedOperation + public void reset() { + this.callCount = 0; + this.accumulatedCallTime = 0; + } + + @ManagedAttribute + public int getCallCount() { + return callCount; + } + + @ManagedAttribute + public long getCallTime() { + return (this.callCount > 0 ? this.accumulatedCallTime / this.callCount : 0); + } + + + @Around("within(@org.springframework.stereotype.Repository *)") + public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { + if (this.isEnabled) { + StopWatch sw = new StopWatch(joinPoint.toShortString()); + + sw.start("invoke"); + try { + return joinPoint.proceed(); + } finally { + sw.stop(); + synchronized (this) { + this.callCount++; + this.accumulatedCallTime += sw.getTotalTimeMillis(); + } + } + } else { + return joinPoint.proceed(); + } + } } diff --git a/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java b/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java index 822fed9b1f4dbcf90af60ee6173f0b703e08e9df..5e538bdca0da046309b283e09b5bcdcac4a3ec88 100644 --- a/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java +++ b/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java @@ -16,41 +16,40 @@ package org.springframework.samples.petclinic.util; -import java.util.Collection; - import org.springframework.orm.ObjectRetrievalFailureException; import org.springframework.samples.petclinic.model.BaseEntity; +import java.util.Collection; + /** - * Utility methods for handling entities. Separate from the BaseEntity class - * mainly because of dependency on the ORM-associated - * ObjectRetrievalFailureException. + * Utility methods for handling entities. Separate from the BaseEntity class mainly because of dependency on the + * ORM-associated ObjectRetrievalFailureException. * * @author Juergen Hoeller * @author Sam Brannen - * @since 29.10.2003 * @see org.springframework.samples.petclinic.model.BaseEntity + * @since 29.10.2003 */ public abstract class EntityUtils { - /** - * Look up the entity of the given class with the given id in the given - * collection. - * - * @param entities the collection to search - * @param entityClass the entity class to look up - * @param entityId the entity id to look up - * @return the found entity - * @throws ObjectRetrievalFailureException if the entity was not found - */ - public static <T extends BaseEntity> T getById(Collection<T> entities, Class<T> entityClass, int entityId) - throws ObjectRetrievalFailureException { - for (T entity : entities) { - if (entity.getId().intValue() == entityId && entityClass.isInstance(entity)) { - return entity; - } - } - throw new ObjectRetrievalFailureException(entityClass, new Integer(entityId)); - } + /** + * Look up the entity of the given class with the given id in the given collection. + * + * @param entities the collection to search + * @param entityClass the entity class to look up + * @param entityId the entity id to look up + * @return the found entity + * @throws ObjectRetrievalFailureException + * if the entity was not found + */ + public static <T extends BaseEntity> T getById(Collection<T> entities, Class<T> entityClass, int entityId) + throws ObjectRetrievalFailureException { + for (T entity : entities) { + if (entity.getId().intValue() == entityId && entityClass.isInstance(entity)) { + return entity; + } + } + throw new ObjectRetrievalFailureException(entityClass, new Integer(entityId)); + } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/CrashController.java b/src/main/java/org/springframework/samples/petclinic/web/CrashController.java index 6575b71daf6c5c3ab57c352082194517c06c2454..e413f3f3b8c73c3ed4931447dc123d419ab998c6 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/CrashController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/CrashController.java @@ -21,20 +21,20 @@ import org.springframework.web.bind.annotation.RequestMethod; /** * Controller used to showcase what happens when an exception is thrown - * + * * @author Michael Isvy - * - * Also see how the bean of type 'SimpleMappingExceptionResolver' has been declared inside /WEB-INF/mvc-core-config.xml + * <p/> + * Also see how the bean of type 'SimpleMappingExceptionResolver' has been declared inside + * /WEB-INF/mvc-core-config.xml */ @Controller -public class CrashController { +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"); - } + @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/OwnerController.java b/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java index 6edafdd3904cec5e8ec8c78e5bf42b9f0ab75569..b05ecbf86f926b1f5a01443f1afd5a1c9016a219 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/OwnerController.java @@ -15,10 +15,6 @@ */ package org.springframework.samples.petclinic.web; -import java.util.Collection; - -import javax.validation.Valid; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.service.ClinicService; @@ -26,16 +22,14 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.servlet.ModelAndView; +import javax.validation.Valid; +import java.util.Collection; + /** - * * @author Juergen Hoeller * @author Ken Krebs * @author Arjen Poutsma @@ -45,101 +39,98 @@ import org.springframework.web.servlet.ModelAndView; @SessionAttributes(types = Owner.class) public class OwnerController { - private final ClinicService clinicService; - - - @Autowired - public OwnerController(ClinicService clinicService) { - this.clinicService = clinicService; - } - - @InitBinder - public void setAllowedFields(WebDataBinder dataBinder) { - dataBinder.setDisallowedFields("id"); - } - - @RequestMapping(value="/owners/new", method = RequestMethod.GET) - public String initCreationForm(Model model) { - Owner owner = new Owner(); - model.addAttribute(owner); - return "owners/createOrUpdateOwnerForm"; - } - - @RequestMapping(value="/owners/new", method = RequestMethod.POST) - public String processCreationForm(@Valid Owner owner, BindingResult result, SessionStatus status) { - if (result.hasErrors()) { - return "owners/createOrUpdateOwnerForm"; - } - else { - this.clinicService.saveOwner(owner); - status.setComplete(); - return "redirect:/owners/" + owner.getId(); - } - } - - @RequestMapping(value = "/owners/find", method = RequestMethod.GET) - public String initFindForm(Model model) { - model.addAttribute("owner", new Owner()); - return "owners/findOwners"; - } - - @RequestMapping(value = "/owners", method = RequestMethod.GET) - public String processFindForm(Owner owner, BindingResult result, Model model) { - - // allow parameterless GET request for /owners to return all records - if (owner.getLastName() == null) { - owner.setLastName(""); // empty string signifies broadest possible search - } - - // find owners by last name - Collection<Owner> results = this.clinicService.findOwnerByLastName(owner.getLastName()); - if (results.size() < 1) { - // no owners found - result.rejectValue("lastName", "notFound", "not found"); - return "owners/findOwners"; - } - if (results.size() > 1) { - // multiple owners found - model.addAttribute("selections", results); - return "owners/ownersList"; - } - else { - // 1 owner found - owner = results.iterator().next(); - return "redirect:/owners/" + owner.getId(); - } - } - - @RequestMapping(value="/owners/{ownerId}/edit", method = RequestMethod.GET) - public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) { - Owner owner = this.clinicService.findOwnerById(ownerId); - model.addAttribute(owner); - return "owners/createOrUpdateOwnerForm"; - } - - @RequestMapping(value="/owners/{ownerId}/edit", method = RequestMethod.PUT) - public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, SessionStatus status) { - if (result.hasErrors()) { - return "owners/createOrUpdateOwnerForm"; - } - else { - this.clinicService.saveOwner(owner); - status.setComplete(); - return "redirect:/owners/{ownerId}"; - } - } - - /** - * Custom handler for displaying an owner. - * - * @param ownerId the ID of the owner to display - * @return a ModelMap with the model attributes for the view - */ - @RequestMapping("/owners/{ownerId}") - public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { - ModelAndView mav = new ModelAndView("owners/ownerDetails"); - mav.addObject(this.clinicService.findOwnerById(ownerId)); - return mav; - } + private final ClinicService clinicService; + + + @Autowired + public OwnerController(ClinicService clinicService) { + this.clinicService = clinicService; + } + + @InitBinder + public void setAllowedFields(WebDataBinder dataBinder) { + dataBinder.setDisallowedFields("id"); + } + + @RequestMapping(value = "/owners/new", method = RequestMethod.GET) + public String initCreationForm(Model model) { + Owner owner = new Owner(); + model.addAttribute(owner); + return "owners/createOrUpdateOwnerForm"; + } + + @RequestMapping(value = "/owners/new", method = RequestMethod.POST) + public String processCreationForm(@Valid Owner owner, BindingResult result, SessionStatus status) { + if (result.hasErrors()) { + return "owners/createOrUpdateOwnerForm"; + } else { + this.clinicService.saveOwner(owner); + status.setComplete(); + return "redirect:/owners/" + owner.getId(); + } + } + + @RequestMapping(value = "/owners/find", method = RequestMethod.GET) + public String initFindForm(Model model) { + model.addAttribute("owner", new Owner()); + return "owners/findOwners"; + } + + @RequestMapping(value = "/owners", method = RequestMethod.GET) + public String processFindForm(Owner owner, BindingResult result, Model model) { + + // allow parameterless GET request for /owners to return all records + if (owner.getLastName() == null) { + owner.setLastName(""); // empty string signifies broadest possible search + } + + // find owners by last name + Collection<Owner> results = this.clinicService.findOwnerByLastName(owner.getLastName()); + if (results.size() < 1) { + // no owners found + result.rejectValue("lastName", "notFound", "not found"); + return "owners/findOwners"; + } + if (results.size() > 1) { + // multiple owners found + model.addAttribute("selections", results); + return "owners/ownersList"; + } else { + // 1 owner found + owner = results.iterator().next(); + return "redirect:/owners/" + owner.getId(); + } + } + + @RequestMapping(value = "/owners/{ownerId}/edit", method = RequestMethod.GET) + public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) { + Owner owner = this.clinicService.findOwnerById(ownerId); + model.addAttribute(owner); + return "owners/createOrUpdateOwnerForm"; + } + + @RequestMapping(value = "/owners/{ownerId}/edit", method = RequestMethod.PUT) + public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, SessionStatus status) { + if (result.hasErrors()) { + return "owners/createOrUpdateOwnerForm"; + } else { + this.clinicService.saveOwner(owner); + status.setComplete(); + return "redirect:/owners/{ownerId}"; + } + } + + /** + * Custom handler for displaying an owner. + * + * @param ownerId the ID of the owner to display + * @return a ModelMap with the model attributes for the view + */ + @RequestMapping("/owners/{ownerId}") + public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { + ModelAndView mav = new ModelAndView("owners/ownerDetails"); + mav.addObject(this.clinicService.findOwnerById(ownerId)); + return mav; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetController.java b/src/main/java/org/springframework/samples/petclinic/web/PetController.java index 2c0c0b73c5f0b3fd38da05ded96f6ad32367f711..3161071d99d73bb20c4e75543d0f3475882ba2f4 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetController.java @@ -15,8 +15,6 @@ */ package org.springframework.samples.petclinic.web; -import java.util.Collection; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.model.Pet; @@ -26,16 +24,12 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; -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.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.support.SessionStatus; +import java.util.Collection; + /** - * * @author Juergen Hoeller * @author Ken Krebs * @author Arjen Poutsma @@ -44,65 +38,63 @@ import org.springframework.web.bind.support.SessionStatus; @SessionAttributes("pet") public class PetController { - private final ClinicService clinicService; + private final ClinicService clinicService; - @Autowired - public PetController(ClinicService clinicService) { - this.clinicService = clinicService; - } + @Autowired + public PetController(ClinicService clinicService) { + this.clinicService = clinicService; + } - @ModelAttribute("types") - public Collection<PetType> populatePetTypes() { - return this.clinicService.findPetTypes(); - } + @ModelAttribute("types") + public Collection<PetType> populatePetTypes() { + return this.clinicService.findPetTypes(); + } - @InitBinder - public void setAllowedFields(WebDataBinder dataBinder) { - dataBinder.setDisallowedFields("id"); - } + @InitBinder + public void setAllowedFields(WebDataBinder dataBinder) { + dataBinder.setDisallowedFields("id"); + } - @RequestMapping(value="/owners/{ownerId}/pets/new", method = RequestMethod.GET) - public String initCreationForm(@PathVariable("ownerId") int ownerId, Model model) { - Owner owner = this.clinicService.findOwnerById(ownerId); - Pet pet = new Pet(); - owner.addPet(pet); - model.addAttribute("pet", pet); - return "pets/createOrUpdatePetForm"; - } + @RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.GET) + public String initCreationForm(@PathVariable("ownerId") int ownerId, Model model) { + Owner owner = this.clinicService.findOwnerById(ownerId); + Pet pet = new Pet(); + owner.addPet(pet); + model.addAttribute("pet", pet); + return "pets/createOrUpdatePetForm"; + } - @RequestMapping(value="/owners/{ownerId}/pets/new", method = RequestMethod.POST) - public String processCreationForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { - new PetValidator().validate(pet, result); - if (result.hasErrors()) { - return "pets/createOrUpdatePetForm"; - } - else { - this.clinicService.savePet(pet); - status.setComplete(); - return "redirect:/owners/{ownerId}"; - } - } + @RequestMapping(value = "/owners/{ownerId}/pets/new", method = RequestMethod.POST) + public String processCreationForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { + new PetValidator().validate(pet, result); + if (result.hasErrors()) { + return "pets/createOrUpdatePetForm"; + } else { + this.clinicService.savePet(pet); + status.setComplete(); + return "redirect:/owners/{ownerId}"; + } + } - @RequestMapping(value="/owners/*/pets/{petId}/edit", method = RequestMethod.GET) - public String initUpdateForm(@PathVariable("petId") int petId, Model model) { - Pet pet = this.clinicService.findPetById(petId); - model.addAttribute("pet", pet); - return "pets/createOrUpdatePetForm"; - } + @RequestMapping(value = "/owners/*/pets/{petId}/edit", method = RequestMethod.GET) + public String initUpdateForm(@PathVariable("petId") int petId, Model model) { + Pet pet = this.clinicService.findPetById(petId); + model.addAttribute("pet", pet); + return "pets/createOrUpdatePetForm"; + } - @RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = { RequestMethod.PUT, RequestMethod.POST }) - public String processUpdateForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { - // we're not using @Valid annotation here because it is easier to define such validation rule in Java - new PetValidator().validate(pet, result); - if (result.hasErrors()) { - return "pets/createOrUpdatePetForm"; - } - else { - this.clinicService.savePet(pet); - status.setComplete(); - return "redirect:/owners/{ownerId}"; - } - } + @RequestMapping(value = "/owners/{ownerId}/pets/{petId}/edit", method = {RequestMethod.PUT, RequestMethod.POST}) + public String processUpdateForm(@ModelAttribute("pet") Pet pet, BindingResult result, SessionStatus status) { + // we're not using @Valid annotation here because it is easier to define such validation rule in Java + new PetValidator().validate(pet, result); + if (result.hasErrors()) { + return "pets/createOrUpdatePetForm"; + } else { + this.clinicService.savePet(pet); + status.setComplete(); + return "redirect:/owners/{ownerId}"; + } + } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java b/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java index 6217ba82f2dafc36179d1e65bcbc3fdaba041224..725f32f30f1b407c7f267437bae1a559fe143881 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetTypeFormatter.java @@ -16,52 +16,51 @@ 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; +import java.text.ParseException; +import java.util.Collection; +import java.util.Locale; + /** - * 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 + * 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; + private final ClinicService clinicService; - @Autowired - public PetTypeFormatter(ClinicService clinicService) { - this.clinicService = clinicService; - } + @Autowired + public PetTypeFormatter(ClinicService clinicService) { + this.clinicService = clinicService; + } - @Override - public String print(PetType petType, Locale locale) { - return petType.getName(); - } + @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); - } + @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 fbf080e87daced6c25eaabea00ac0755e8953721..7068dd878b0ae04d6fe27a6183fb64569f718d45 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java +++ b/src/main/java/org/springframework/samples/petclinic/web/PetValidator.java @@ -27,14 +27,13 @@ import org.springframework.validation.Errors; */ public class PetValidator { - public void validate(Pet pet, Errors errors) { - String name = pet.getName(); - if (!StringUtils.hasLength(name)) { - errors.rejectValue("name", "required", "required"); - } - else if (pet.isNew() && pet.getOwner().getPet(name, true) != null) { - errors.rejectValue("name", "duplicate", "already exists"); - } - } + public void validate(Pet pet, Errors errors) { + String name = pet.getName(); + if (!StringUtils.hasLength(name)) { + errors.rejectValue("name", "required", "required"); + } else if (pet.isNew() && pet.getOwner().getPet(name, true) != null) { + errors.rejectValue("name", "duplicate", "already exists"); + } + } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/VetController.java b/src/main/java/org/springframework/samples/petclinic/web/VetController.java index dfbc216a7e95cb0ff5200b88253313309db093f0..0f5478556b4a9d9844a44d82bfb65a0c40f88477 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VetController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VetController.java @@ -23,7 +23,6 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** - * * @author Juergen Hoeller * @author Mark Fisher * @author Ken Krebs @@ -32,26 +31,23 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller public class VetController { - private final ClinicService clinicService; - - - @Autowired - public VetController(ClinicService clinicService) { - this.clinicService = clinicService; - } - - @RequestMapping("/vets") - public String showVetList(Model model) { - // Here we are returning an object of type 'Vets' rather than a collection of Vet objects - // so it is simpler for Object-Xml mapping - Vets vets = new Vets(); - vets.getVetList().addAll(this.clinicService.findVets()); - model.addAttribute("vets", vets); - return "vets/vetList"; - } + private final ClinicService clinicService; + @Autowired + public VetController(ClinicService clinicService) { + this.clinicService = clinicService; + } + @RequestMapping("/vets") + public String showVetList(Model model) { + // Here we are returning an object of type 'Vets' rather than a collection of Vet objects + // so it is simpler for Object-Xml mapping + Vets vets = new Vets(); + vets.getVetList().addAll(this.clinicService.findVets()); + model.addAttribute("vets", vets); + return "vets/vetList"; + } } diff --git a/src/main/java/org/springframework/samples/petclinic/web/VetsAtomView.java b/src/main/java/org/springframework/samples/petclinic/web/VetsAtomView.java index 6df94372ef8a700e81ab26e7541dbd69f9f1e930..d379aebf1412185c27af4b7a918fb6e14bafcc28 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VetsAtomView.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VetsAtomView.java @@ -15,60 +15,58 @@ */ package org.springframework.samples.petclinic.web; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.sun.syndication.feed.atom.Content; +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Feed; import org.springframework.samples.petclinic.model.Vet; import org.springframework.samples.petclinic.model.Vets; import org.springframework.web.servlet.view.feed.AbstractAtomFeedView; -import com.sun.syndication.feed.atom.Content; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.atom.Feed; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** - * A view creating a Atom representation from a list of Visit objects. - * + * A view creating a Atom representation from a list of Visit objects. + * * @author Alef Arendsen * @author Arjen Poutsma */ public class VetsAtomView extends AbstractAtomFeedView { - @Override - protected void buildFeedMetadata(Map<String, Object> model, Feed feed, HttpServletRequest request) { - feed.setId("tag:springsource.org"); - feed.setTitle("Veterinarians"); - //feed.setUpdated(date); - } + @Override + protected void buildFeedMetadata(Map<String, Object> model, Feed feed, HttpServletRequest request) { + feed.setId("tag:springsource.org"); + feed.setTitle("Veterinarians"); + //feed.setUpdated(date); + } + + @Override + protected List<Entry> buildFeedEntries(Map<String, Object> model, + HttpServletRequest request, HttpServletResponse response) throws Exception { - @Override - protected List<Entry> buildFeedEntries(Map<String, Object> model, - HttpServletRequest request, HttpServletResponse response) throws Exception { + Vets vets = (Vets) model.get("vets"); + List<Vet> vetList = vets.getVetList(); + List<Entry> entries = new ArrayList<Entry>(vetList.size()); - Vets vets = (Vets) model.get("vets"); - List<Vet> vetList = vets.getVetList(); - List<Entry> entries = new ArrayList<Entry>(vetList.size()); + for (Vet vet : vetList) { + Entry entry = new Entry(); + // see http://diveintomark.org/archives/2004/05/28/howto-atom-id#other + entry.setId(String.format("tag:springsource.org,%s", vet.getId())); + entry.setTitle(String.format("Vet: %s %s", vet.getFirstName(), vet.getLastName())); + //entry.setUpdated(visit.getDate().toDate()); - for (Vet vet : vetList) { - Entry entry = new Entry(); - // see http://diveintomark.org/archives/2004/05/28/howto-atom-id#other - entry.setId(String.format("tag:springsource.org,%s", vet.getId())); - entry.setTitle(String.format("Vet: %s %s", vet.getFirstName(), vet.getLastName())); - //entry.setUpdated(visit.getDate().toDate()); + Content summary = new Content(); + summary.setValue(vet.getSpecialties().toString()); + entry.setSummary(summary); - Content summary = new Content(); - summary.setValue(vet.getSpecialties().toString()); - entry.setSummary(summary); + entries.add(entry); + } + response.setContentType("blabla"); + return entries; - entries.add(entry); - } - response.setContentType("blabla"); - return entries; + } - } - } 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 b72e0cad356a1ecfe2180a37a67cfe61a1dd6858..7de96693931f9890c80ca77454826d2f60fed2fe 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/VisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/VisitController.java @@ -15,8 +15,6 @@ */ package org.springframework.samples.petclinic.web; -import javax.validation.Valid; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.Visit; @@ -25,16 +23,13 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.servlet.ModelAndView; +import javax.validation.Valid; + /** - * * @author Juergen Hoeller * @author Ken Krebs * @author Arjen Poutsma @@ -44,45 +39,44 @@ import org.springframework.web.servlet.ModelAndView; @SessionAttributes("visit") public class VisitController { - private final ClinicService clinicService; + private final ClinicService clinicService; - @Autowired - public VisitController(ClinicService clinicService) { - this.clinicService = clinicService; - } + @Autowired + public VisitController(ClinicService clinicService) { + this.clinicService = clinicService; + } - @InitBinder - public void setAllowedFields(WebDataBinder dataBinder) { - dataBinder.setDisallowedFields("id"); - } + @InitBinder + public void setAllowedFields(WebDataBinder dataBinder) { + dataBinder.setDisallowedFields("id"); + } - @RequestMapping(value="/owners/*/pets/{petId}/visits/new", method = RequestMethod.GET) - public String initNewVisitForm(@PathVariable("petId") int petId, Model model) { - Pet pet = this.clinicService.findPetById(petId); - Visit visit = new Visit(); - pet.addVisit(visit); - model.addAttribute("visit", visit); - return "pets/createOrUpdateVisitForm"; - } + @RequestMapping(value = "/owners/*/pets/{petId}/visits/new", method = RequestMethod.GET) + public String initNewVisitForm(@PathVariable("petId") int petId, Model model) { + Pet pet = this.clinicService.findPetById(petId); + Visit visit = new Visit(); + pet.addVisit(visit); + model.addAttribute("visit", visit); + return "pets/createOrUpdateVisitForm"; + } - @RequestMapping(value="/owners/{ownerId}/pets/{petId}/visits/new", method = RequestMethod.POST) - public String processNewVisitForm(@Valid Visit visit, BindingResult result, SessionStatus status) { - if (result.hasErrors()) { - return "pets/createOrUpdateVisitForm"; - } - else { - this.clinicService.saveVisit(visit); - status.setComplete(); - return "redirect:/owners/{ownerId}"; - } - } + @RequestMapping(value = "/owners/{ownerId}/pets/{petId}/visits/new", method = RequestMethod.POST) + public String processNewVisitForm(@Valid Visit visit, BindingResult result, SessionStatus status) { + if (result.hasErrors()) { + return "pets/createOrUpdateVisitForm"; + } else { + this.clinicService.saveVisit(visit); + status.setComplete(); + return "redirect:/owners/{ownerId}"; + } + } - @RequestMapping(value="/owners/*/pets/{petId}/visits", method=RequestMethod.GET) - public ModelAndView showVisits(@PathVariable int petId) { - ModelAndView mav = new ModelAndView("visitList"); - mav.addObject("visits", this.clinicService.findPetById(petId).getVisits()); - return mav; - } + @RequestMapping(value = "/owners/*/pets/{petId}/visits", method = RequestMethod.GET) + public ModelAndView showVisits(@PathVariable int petId) { + ModelAndView mav = new ModelAndView("visitList"); + mav.addObject("visits", this.clinicService.findPetById(petId).getVisits()); + return mav; + } } diff --git a/src/main/java/overview.html b/src/main/java/overview.html index 1eb7a2e8c194f8fac74dd8a8eabc4ccbe753d8d8..df4f4d6b7fb8f9f0a0dc3befe95d923f3019516e 100644 --- a/src/main/java/overview.html +++ b/src/main/java/overview.html @@ -1,7 +1,7 @@ <html> <body> <p> -The Spring Data Binding framework, an internal library used by Spring Web Flow. + The Spring Data Binding framework, an internal library used by Spring Web Flow. </p> </body> </html> \ No newline at end of file diff --git a/src/main/resources/db/hsqldb/initDB.sql b/src/main/resources/db/hsqldb/initDB.sql index a76d662dd809fc9f9292f8013e51b76941b7916d..a16c42decececbc48a6ef27748bbbe5288c2e247 100644 --- a/src/main/resources/db/hsqldb/initDB.sql +++ b/src/main/resources/db/hsqldb/initDB.sql @@ -1,64 +1,64 @@ -drop table vet_specialties if exists; -drop table vets if exists; -drop table specialties if exists; -drop table visits if exists; -drop table pets if exists; -drop table types if exists; -drop table owners if exists; +DROP TABLE vet_specialties IF EXISTS; +DROP TABLE vets IF EXISTS; +DROP TABLE specialties IF EXISTS; +DROP TABLE visits IF EXISTS; +DROP TABLE pets IF EXISTS; +DROP TABLE types IF EXISTS; +DROP TABLE owners IF EXISTS; CREATE TABLE vets ( - id INTEGER IDENTITY PRIMARY KEY, - first_name VARCHAR(30), - last_name VARCHAR(30) + id INTEGER IDENTITY PRIMARY KEY, + first_name VARCHAR(30), + last_name VARCHAR(30) ); -CREATE INDEX vets_last_name ON vets(last_name); +CREATE INDEX vets_last_name ON vets (last_name); CREATE TABLE specialties ( - id INTEGER IDENTITY PRIMARY KEY, - name VARCHAR(80) + id INTEGER IDENTITY PRIMARY KEY, + name VARCHAR(80) ); -CREATE INDEX specialties_name ON specialties(name); +CREATE INDEX specialties_name ON specialties (name); CREATE TABLE vet_specialties ( - vet_id INTEGER NOT NULL, - specialty_id INTEGER NOT NULL + vet_id INTEGER NOT NULL, + specialty_id INTEGER NOT NULL ); -alter table vet_specialties add constraint fk_vet_specialties_vets foreign key (vet_id) references vets(id); -alter table vet_specialties add constraint fk_vet_specialties_specialties foreign key (specialty_id) references specialties(id); +ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id); +ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id); CREATE TABLE types ( - id INTEGER IDENTITY PRIMARY KEY, - name VARCHAR(80) + id INTEGER IDENTITY PRIMARY KEY, + name VARCHAR(80) ); -CREATE INDEX types_name ON types(name); +CREATE INDEX types_name ON types (name); CREATE TABLE owners ( - id INTEGER IDENTITY PRIMARY KEY, - first_name VARCHAR(30), - last_name VARCHAR(30), - address VARCHAR(255), - city VARCHAR(80), - telephone VARCHAR(20) + id INTEGER IDENTITY PRIMARY KEY, + first_name VARCHAR(30), + last_name VARCHAR(30), + address VARCHAR(255), + city VARCHAR(80), + telephone VARCHAR(20) ); -CREATE INDEX owners_last_name ON owners(last_name); +CREATE INDEX owners_last_name ON owners (last_name); CREATE TABLE pets ( - id INTEGER IDENTITY PRIMARY KEY, - name VARCHAR(30), - birth_date DATE, - type_id INTEGER NOT NULL, - owner_id INTEGER NOT NULL + id INTEGER IDENTITY PRIMARY KEY, + name VARCHAR(30), + birth_date DATE, + type_id INTEGER NOT NULL, + owner_id INTEGER NOT NULL ); -alter table pets add constraint fk_pets_owners foreign key (owner_id) references owners(id); -alter table pets add constraint fk_pets_types foreign key (type_id) references types(id); -CREATE INDEX pets_name ON pets(name); +ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); +ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); +CREATE INDEX pets_name ON pets (name); CREATE TABLE visits ( - id INTEGER IDENTITY PRIMARY KEY, - pet_id INTEGER NOT NULL, - visit_date DATE, - description VARCHAR(255) + id INTEGER IDENTITY PRIMARY KEY, + pet_id INTEGER NOT NULL, + visit_date DATE, + description VARCHAR(255) ); -alter table visits add constraint fk_visits_pets foreign key (pet_id) references pets(id); -CREATE INDEX visits_pet_id ON visits(pet_id); +ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); +CREATE INDEX visits_pet_id ON visits (pet_id); diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml index 8167066b136a779deebee14bccbe691337f0d40d..32e509953fb574c4d8d553f990121c766ac8a470 100644 --- a/src/main/resources/ehcache.xml +++ b/src/main/resources/ehcache.xml @@ -1,17 +1,17 @@ <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="ehcache.xsd" - updateCheck="false"> + xsi:noNamespaceSchemaLocation="ehcache.xsd" + updateCheck="false"> <diskStore path="java.io.tmpdir"/> - <!-- objects are evicted from the cache every 60 seconds --> + <!-- 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" /> - + timeToLiveSeconds="60" + maxElementsInMemory="100" + eternal="false" + overflowToDisk="false" + maxElementsOnDisk="10000000" + diskPersistent="false" + diskExpiryThreadIntervalSeconds="1" + memoryStoreEvictionPolicy="LRU"/> + </ehcache> diff --git a/src/main/resources/ehcache.xsd b/src/main/resources/ehcache.xsd index 2a539199fed4c3b0951b686afd5fa5ac6f989450..bfc19ddb1e7d3c2f437ad36c129b5520f6c46f87 100644 --- a/src/main/resources/ehcache.xsd +++ b/src/main/resources/ehcache.xsd @@ -227,13 +227,13 @@ </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: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"> @@ -371,26 +371,27 @@ <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:attribute name="maxDepthExceededBehavior" use="optional" default="continue" + type="maxDepthExceededBehavior"/> </xs:complexType> </xs:element> - <xs:element name="persistence"> - <xs:complexType> + <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: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"/> diff --git a/src/main/resources/log4j.dtd b/src/main/resources/log4j.dtd deleted file mode 100644 index d92a6e7bc65f617f30683bf3df1a99f683e0da86..0000000000000000000000000000000000000000 --- a/src/main/resources/log4j.dtd +++ /dev/null @@ -1,166 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<!-- Authors: Chris Taylor, Ceki Gulcu. --> - -<!-- Version: 1.2 --> - -<!-- A configuration element consists of optional renderer -elements,appender elements, categories and an optional root -element. --> - -<!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?, - categoryFactory?)> - -<!-- The "threshold" attribute takes a level value such that all --> -<!-- logging statements with a level equal or below this value are --> -<!-- disabled. --> - -<!-- Setting the "debug" enable the printing of internal log4j logging --> -<!-- statements. --> - -<!-- By default, debug attribute is "null", meaning that we not do touch --> -<!-- internal log4j logging settings. The "null" value for the threshold --> -<!-- attribute can be misleading. The threshold field of a repository --> -<!-- cannot be set to null. The "null" value for the threshold attribute --> -<!-- simply means don't touch the threshold field, the threshold field --> -<!-- keeps its old value. --> - -<!ATTLIST log4j:configuration - xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" - threshold (all|debug|info|warn|error|fatal|off|null) "null" - debug (true|false|null) "null" -> - -<!-- renderer elements allow the user to customize the conversion of --> -<!-- message objects to String. --> - -<!ELEMENT renderer EMPTY> -<!ATTLIST renderer - renderedClass CDATA #REQUIRED - renderingClass CDATA #REQUIRED -> - -<!-- Appenders must have a name and a class. --> -<!-- Appenders may contain an error handler, a layout, optional parameters --> -<!-- and filters. They may also reference (or include) other appenders. --> -<!ELEMENT appender (errorHandler?, param*, layout?, filter*, appender-ref*)> -<!ATTLIST appender - name ID #REQUIRED - class CDATA #REQUIRED -> - -<!ELEMENT layout (param*)> -<!ATTLIST layout - class CDATA #REQUIRED -> - -<!ELEMENT filter (param*)> -<!ATTLIST filter - class CDATA #REQUIRED -> - -<!-- ErrorHandlers can be of any class. They can admit any number of --> -<!-- parameters. --> - -<!ELEMENT errorHandler (param*, root-ref?, logger-ref*, appender-ref?)> -<!ATTLIST errorHandler - class CDATA #REQUIRED -> - -<!ELEMENT root-ref EMPTY> - -<!ELEMENT logger-ref EMPTY> -<!ATTLIST logger-ref - ref IDREF #REQUIRED -> - -<!ELEMENT param EMPTY> -<!ATTLIST param - name CDATA #REQUIRED - value CDATA #REQUIRED -> - - -<!-- The priority class is org.apache.log4j.Level by default --> -<!ELEMENT priority (param*)> -<!ATTLIST priority - class CDATA #IMPLIED - value CDATA #REQUIRED -> - -<!-- The level class is org.apache.log4j.Level by default --> -<!ELEMENT level (param*)> -<!ATTLIST level - class CDATA #IMPLIED - value CDATA #REQUIRED -> - - -<!-- If no level element is specified, then the configurator MUST not --> -<!-- touch the level of the named category. --> -<!ELEMENT category (param*,(priority|level)?,appender-ref*)> -<!ATTLIST category - class CDATA #IMPLIED - name CDATA #REQUIRED - additivity (true|false) "true" -> - -<!-- If no level element is specified, then the configurator MUST not --> -<!-- touch the level of the named logger. --> -<!ELEMENT logger (level?,appender-ref*)> -<!ATTLIST logger - name ID #REQUIRED - additivity (true|false) "true" -> - - -<!ELEMENT categoryFactory (param*)> -<!ATTLIST categoryFactory - class CDATA #REQUIRED> - -<!ELEMENT appender-ref EMPTY> -<!ATTLIST appender-ref - ref IDREF #REQUIRED -> - -<!-- If no priority element is specified, then the configurator MUST not --> -<!-- touch the priority of root. --> -<!-- The root category always exists and cannot be subclassed. --> -<!ELEMENT root (param*, (priority|level)?, appender-ref*)> - - -<!-- ==================================================================== --> -<!-- A logging event --> -<!-- ==================================================================== --> -<!ELEMENT log4j:eventSet (log4j:event*)> -<!ATTLIST log4j:eventSet - xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/" - version (1.1|1.2) "1.2" - includesLocationInfo (true|false) "true" -> - - - -<!ELEMENT log4j:event (log4j:message, log4j:NDC?, log4j:throwable?, - log4j:locationInfo?) > - -<!-- The timestamp format is application dependent. --> -<!ATTLIST log4j:event - logger CDATA #REQUIRED - level CDATA #REQUIRED - thread CDATA #REQUIRED - timestamp CDATA #REQUIRED -> - -<!ELEMENT log4j:message (#PCDATA)> -<!ELEMENT log4j:NDC (#PCDATA)> - -<!ELEMENT log4j:throwable (#PCDATA)> - -<!ELEMENT log4j:locationInfo EMPTY> -<!ATTLIST log4j:locationInfo - class CDATA #REQUIRED - method CDATA #REQUIRED - file CDATA #REQUIRED - line CDATA #REQUIRED -> diff --git a/src/main/resources/log4j.xml b/src/main/resources/log4j.xml deleted file mode 100755 index f52e0fcec6706890088becad7b9998e51e08c706..0000000000000000000000000000000000000000 --- a/src/main/resources/log4j.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> - - <!-- Appenders --> - <appender name="console" class="org.apache.log4j.ConsoleAppender"> - <param name="Target" value="System.out" /> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%-5p: %c - %m%n" /> - </layout> - </appender> - - <logger name="org.springframework.test.web"> - <level value="trace" /> - </logger> - - <!-- Root Logger --> - <root> - <priority value="info" /><!-- - <level value="info"></level> - --><appender-ref ref="console" /> - </root> - -</log4j:configuration> \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..3213b02624b7391ca225f902f88630e9a4edeb18 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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.springframework.samples.petclinic" level="debug"/> + + <root level="warn"> + <appender-ref ref="console"/> + </root> +</configuration> diff --git a/src/main/resources/spring/dao-config.xml b/src/main/resources/spring/dao-config.xml index d4a411057ac0054ce10a74ec86fa06420e3c2ae8..c29a9bd4ca5e36182e10b7cd4ad8f99e4ff229f9 100644 --- a/src/main/resources/spring/dao-config.xml +++ b/src/main/resources/spring/dao-config.xml @@ -1,101 +1,107 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Application context definition for PetClinic on JPA. + 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: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"/> - - - <!-- 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/jdbc.properties"/> - - <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= --> - - <!-- - Activates various annotations to be detected in bean classes: Spring's - @Required and @Autowired, as well as JSR 250's @PostConstruct, - @PreDestroy and @Resource (if available) and JPA's @PersistenceContext - and @PersistenceUnit (if available). - --> - <context:annotation-config/> - - <!-- - Instruct Spring to perform declarative transaction management - automatically on annotated classes. - - for mode="aspectj"/ see SPR-6392 - --> - <tx:annotation-driven/> - - <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}" /> - </property> - <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"> - <!-- - 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"/> - - <!-- Custom configuration for the custom implementation based on JPA --> - <bean id="owerRepository" class="org.springframework.samples.petclinic.repository.springdatajpa.JpaOwnerRepositoryImpl"/> - - </beans> +<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"/> + + + <!-- 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/jdbc.properties"/> + + <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= --> + + <!-- + Activates various annotations to be detected in bean classes: Spring's + @Required and @Autowired, as well as JSR 250's @PostConstruct, + @PreDestroy and @Resource (if available) and JPA's @PersistenceContext + and @PersistenceUnit (if available). + --> + <context:annotation-config/> + + <!-- + Instruct Spring to perform declarative transaction management + automatically on annotated classes. + + for mode="aspectj"/ see SPR-6392 + --> + <tx:annotation-driven/> + + <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}"/> + </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"> + <!-- + 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"/> + + <!-- Custom configuration for the custom implementation based on JPA --> + <bean id="owerRepository" + class="org.springframework.samples.petclinic.repository.springdatajpa.JpaOwnerRepositoryImpl"/> + </beans> </beans> \ No newline at end of file diff --git a/src/main/resources/spring/datasource-config.xml b/src/main/resources/spring/datasource-config.xml index d803c0a2f536be1667bf0643d63f1c3f6000cd3f..2efe12010fe16400078c36a7a9fb60f2da0f133d 100644 --- a/src/main/resources/spring/datasource-config.xml +++ b/src/main/resources/spring/datasource-config.xml @@ -1,37 +1,39 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Application context definition for PetClinic Datasource. + 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" - 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"> - - <!-- ========================= DATASOURCE DEFINITION ========================= --> + xmlns:p="http://www.springframework.org/schema/p" + xmlns:context="http://www.springframework.org/schema/context" + xmlns:jdbc="http://www.springframework.org/schema/jdbc" + 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"> - <!-- 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/jdbc.properties"/> + <!-- ========================= DATASOURCE DEFINITION ========================= --> - <!-- DataSource configuration for Apache Commons DBCP. --> - <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" - p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" - p:username="${jdbc.username}" p:password="${jdbc.password}"/> - - <!-- JNDI DataSource for JEE environments --> - <!-- - <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/> - --> + <!-- 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/jdbc.properties"/> - <!-- 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> + <!-- DataSource configuration for Apache Commons DBCP. --> + <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" + p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" + p:username="${jdbc.username}" p:password="${jdbc.password}"/> + + <!-- JNDI DataSource for JEE environments --> + <!-- + <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/petclinic"/> + --> + + <!-- 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> \ No newline at end of file diff --git a/src/main/resources/spring/jdbc.properties b/src/main/resources/spring/jdbc.properties index 214778bdc63bd264be3c8ebd0f86c800d9bc9b3a..21d1560b4cc615df5693f1e37d2ad4a10759ae8d 100644 --- a/src/main/resources/spring/jdbc.properties +++ b/src/main/resources/spring/jdbc.properties @@ -4,9 +4,6 @@ # various application context XML files (e.g., "applicationContext-*.xml"). # Targeted at system administrators, to avoid touching the context XML files. - - - #------------------------------------------------------------------------------- # HSQL Settings diff --git a/src/main/resources/spring/mvc-core-config.xml b/src/main/resources/spring/mvc-core-config.xml index d814c256df8ed99d027dbe0cf5c40d410f936363..8aa5d61f0ba0c0d7747df79967def893cc2cabb3 100644 --- a/src/main/resources/spring/mvc-core-config.xml +++ b/src/main/resources/spring/mvc-core-config.xml @@ -1,57 +1,63 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - - DispatcherServlet application context for PetClinic's web tier. + - 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:oxm="http://www.springframework.org/schema/oxm" 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/oxm http://www.springframework.org/schema/oxm/spring-oxm.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, org.springframework.samples.petclinic.service"/> - - <mvc:annotation-driven conversion-service="conversionService" /> - - <!-- 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"/> - - - <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 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, org.springframework.samples.petclinic.service"/> + + <mvc:annotation-driven conversion-service="conversionService"/> + + <!-- 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"/> + + <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 index 053fa3fdb5b19b60796e086abd525e2c1194b23f..8425754acc4a273c56f407646f41d72b6e6fc634 100644 --- a/src/main/resources/spring/mvc-view-config.xml +++ b/src/main/resources/spring/mvc-view-config.xml @@ -2,52 +2,50 @@ <!-- - 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:oxm="http://www.springframework.org/schema/oxm" 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/oxm http://www.springframework.org/schema/oxm/spring-oxm.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"> - - - <!-- - - The ContentNegotiatingViewResolver delegates to the InternalResourceViewResolver and BeanNameViewResolver, - - and uses the requested media type (determined by the path extension) to pick a matching view. - - When the media type is 'text/html', it will delegate to the InternalResourceViewResolver's JstlView, - - otherwise to the BeanNameViewResolver. - --> - <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> - <property name="contentNegotiationManager" ref="cnManager"/> - </bean> - - <!-- Simple strategy: only path extension is taken into account --> - <bean id="cnManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> - <property name="favorPathExtension" value="true"/> - <property name="ignoreAcceptHeader" value="true"/> - </bean> - - <!-- Default viewClass: JSTL view (JSP with html output) --> - <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> - <!-- Example: a logical view name of 'vets' is mapped to '/WEB-INF/jsp/vets.jsp' --> - <property name="prefix" value="/WEB-INF/jsp/" /> - <property name="suffix" value=".jsp" /> - </bean> - - <!-- Used here for 'xml' and 'atom' views --> - <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" /> - - <!-- Renders an Atom feed of the visits. Used by the BeanNameViewResolver --> - <bean id="vets/vetList.atom" class="org.springframework.samples.petclinic.web.VetsAtomView"/> - - <!-- Renders an XML view. Used by the BeanNameViewResolver --> - <bean id="vets/vetList.xml" class="org.springframework.web.servlet.view.xml.MarshallingView"> - <property name="marshaller" ref="marshaller"/> - </bean> - - <oxm:jaxb2-marshaller id="marshaller"> - <!-- Object-XML mapping declared using annotations inside 'Vets' --> - <oxm:class-to-be-bound name="org.springframework.samples.petclinic.model.Vets"/> - </oxm:jaxb2-marshaller> +<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" + xsi:schemaLocation="http://www.springframework.org/schema/oxm + http://www.springframework.org/schema/oxm/spring-oxm.xsd + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd"> + <!-- + - The ContentNegotiatingViewResolver delegates to the InternalResourceViewResolver and BeanNameViewResolver, + - and uses the requested media type (determined by the path extension) to pick a matching view. + - When the media type is 'text/html', it will delegate to the InternalResourceViewResolver's JstlView, + - otherwise to the BeanNameViewResolver. + --> + <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> + <property name="contentNegotiationManager" ref="cnManager"/> + </bean> + + <!-- Simple strategy: only path extension is taken into account --> + <bean id="cnManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> + <property name="favorPathExtension" value="true"/> + <property name="ignoreAcceptHeader" value="true"/> + </bean> + + <!-- Default viewClass: JSTL view (JSP with html output) --> + <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> + <!-- Example: a logical view name of 'vets' is mapped to '/WEB-INF/jsp/vets.jsp' --> + <property name="prefix" value="/WEB-INF/jsp/"/> + <property name="suffix" value=".jsp"/> + </bean> + + <!-- Used here for 'xml' and 'atom' views --> + <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> + + <!-- Renders an Atom feed of the visits. Used by the BeanNameViewResolver --> + <bean id="vets/vetList.atom" class="org.springframework.samples.petclinic.web.VetsAtomView"/> + + <!-- Renders an XML view. Used by the BeanNameViewResolver --> + <bean id="vets/vetList.xml" class="org.springframework.web.servlet.view.xml.MarshallingView"> + <property name="marshaller" ref="marshaller"/> + </bean> + + <oxm:jaxb2-marshaller id="marshaller"> + <!-- Object-XML mapping declared using annotations inside 'Vets' --> + <oxm:class-to-be-bound name="org.springframework.samples.petclinic.model.Vets"/> + </oxm:jaxb2-marshaller> </beans> diff --git a/src/main/resources/spring/tools-config.xml b/src/main/resources/spring/tools-config.xml index cf204ba2a08335740578b49de5abf37ccc695102..e64c18931773a3ebe70c0341d56a9b48131e4a08 100644 --- a/src/main/resources/spring/tools-config.xml +++ b/src/main/resources/spring/tools-config.xml @@ -2,44 +2,48 @@ <!-- 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> - +<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:ehcache.xml"/> + <property name="configLocation" value="classpath:ehcache.xml"/> </bean> - - - - + + </beans> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/exception.jsp b/src/main/webapp/WEB-INF/jsp/exception.jsp index 42c7e29a25804d6d6e2ec9156696dbfc235d353a..86416dbaaaa692928679a45524eb9e04445b6dfd 100644 --- a/src/main/webapp/WEB-INF/jsp/exception.jsp +++ b/src/main/webapp/WEB-INF/jsp/exception.jsp @@ -1,27 +1,29 @@ <html lang="en"> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <jsp:include page="fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="fragments/bodyHeader.jsp"/> - <spring:url value="/resources/images/pets.png" var="petsImage"/> - <img src="${petsImage}" /> - <h2>Something happened...</h2> - <p>${exception.message}</p> - - <!-- Exception: ${exception.message}. +<div class="container"> + <jsp:include page="fragments/bodyHeader.jsp"/> + <spring:url value="/resources/images/pets.png" var="petsImage"/> + <img src="${petsImage}"/> + + <h2>Something happened...</h2> + + <p>${exception.message}</p> + + <!-- Exception: ${exception.message}. <c:forEach items="${exception.stackTrace}" var="stackTrace"> ${stackTrace} </c:forEach> --> - - - <jsp:include page="fragments/footer.jsp"/> - </div> + + <jsp:include page="fragments/footer.jsp"/> + +</div> </body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp b/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp index f8f4645c75c20e033c79617f5d4d7d92cff9cdea..76c18441738461939ec6b004a082d9e3d48d2714 100644 --- a/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp +++ b/src/main/webapp/WEB-INF/jsp/fragments/bodyHeader.jsp @@ -2,16 +2,23 @@ <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <spring:url value="/resources/images/banner-graphic.png" var="banner"/> -<img src="${banner}" /> -<div class="navbar" style="width: 601px;"> - <div class="navbar-inner"> - <ul class="nav"> - <li style="width: 100px;"><a href="<spring:url value="/" htmlEscape="true" />"><i class="icon-home"></i> Home</a></li> - <li style="width: 130px;"><a href="<spring:url value="/owners/find.html" htmlEscape="true" />"><i class="icon-search"></i> Find owners</a></li> - <li style="width: 140px;"><a href="<spring:url value="/vets.html" htmlEscape="true" />"><i class="icon-th-list"></i> Veterinarians</a></li> - <li style="width: 90px;"><a href="<spring:url value="/oups.html" htmlEscape="true" />" title="trigger a RuntimeException to see how it is handled"><i class="icon-warning-sign"></i> Error</a></li> - <li style="width: 80px;"><a href="#" title="not available yet. Work in progress!!"><i class=" icon-question-sign"></i> Help</a></li> - </ul> - </div> +<img src="${banner}"/> + +<div class="navbar" style="width: 601px;"> + <div class="navbar-inner"> + <ul class="nav"> + <li style="width: 100px;"><a href="<spring:url value="/" htmlEscape="true" />"><i class="icon-home"></i> + Home</a></li> + <li style="width: 130px;"><a href="<spring:url value="/owners/find.html" htmlEscape="true" />"><i + class="icon-search"></i> Find owners</a></li> + <li style="width: 140px;"><a href="<spring:url value="/vets.html" htmlEscape="true" />"><i + class="icon-th-list"></i> Veterinarians</a></li> + <li style="width: 90px;"><a href="<spring:url value="/oups.html" htmlEscape="true" />" + title="trigger a RuntimeException to see how it is handled"><i + class="icon-warning-sign"></i> Error</a></li> + <li style="width: 80px;"><a href="#" title="not available yet. Work in progress!!"><i + class=" icon-question-sign"></i> Help</a></li> + </ul> + </div> </div> diff --git a/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp b/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp index a031e66cfbb2fa11f68851bb01183da5c75e6dbf..dccec75d2dd93b16fb99c1ed37b48bf9d1630d02 100644 --- a/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp +++ b/src/main/webapp/WEB-INF/jsp/fragments/footer.jsp @@ -1,10 +1,11 @@ <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> - <table class="footer"> +<table class="footer"> <tr> - <td></td> - <td align="right"><img src="<spring:url value="/resources/images/springsource-logo.png" htmlEscape="true" />" alt="Sponsored by SpringSource"/></td> + <td></td> + <td align="right"><img src="<spring:url value="/resources/images/springsource-logo.png" htmlEscape="true" />" + alt="Sponsored by SpringSource"/></td> </tr> - </table> +</table> diff --git a/src/main/webapp/WEB-INF/jsp/fragments/headTag.jsp b/src/main/webapp/WEB-INF/jsp/fragments/headTag.jsp index bfcd938380c240a30c81915e734247b9b10993c6..c1be474c24e628943b5d740c0941a9cbdc3ff16d 100644 --- a/src/main/webapp/WEB-INF/jsp/fragments/headTag.jsp +++ b/src/main/webapp/WEB-INF/jsp/fragments/headTag.jsp @@ -1,28 +1,28 @@ <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <!-- - PetClinic :: a Spring Framework demonstration +PetClinic :: a Spring Framework demonstration --> <head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <title>PetClinic :: a Spring Framework demonstration</title> - - - <spring:url value="/webjars/bootstrap/2.2.1/css/bootstrap.min.css" var="bootstrapCss" /> - <link href="${bootstrapCss}" rel="stylesheet"/> - - <spring:url value="/resources/css/petclinic.css" var="petclinicCss" /> - <link href="${petclinicCss}" rel="stylesheet"/> - - <spring:url value="/webjars/jquery/1.8.2/jquery.js" var="jQuery" /> - <script src="${jQuery}"></script> - - <spring:url value="/webjars/jquery-ui/1.9.1/js/jquery-ui-1.9.1.custom.js" var="jQueryUi" /> - <script src="${jQueryUi}"></script> - - <spring:url value="/webjars/jquery-ui/1.9.1/css/smoothness/jquery-ui-1.9.1.custom.css" var="jQueryUiCss" /> - <link href="${jQueryUiCss}" rel="stylesheet"></link> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> + <title>PetClinic :: a Spring Framework demonstration</title> + + + <spring:url value="/webjars/bootstrap/2.2.1/css/bootstrap.min.css" var="bootstrapCss"/> + <link href="${bootstrapCss}" rel="stylesheet"/> + + <spring:url value="/resources/css/petclinic.css" var="petclinicCss"/> + <link href="${petclinicCss}" rel="stylesheet"/> + + <spring:url value="/webjars/jquery/1.8.2/jquery.js" var="jQuery"/> + <script src="${jQuery}"></script> + + <spring:url value="/webjars/jquery-ui/1.9.1/js/jquery-ui-1.9.1.custom.js" var="jQueryUi"/> + <script src="${jQueryUi}"></script> + + <spring:url value="/webjars/jquery-ui/1.9.1/css/smoothness/jquery-ui-1.9.1.custom.css" var="jQueryUiCss"/> + <link href="${jQueryUiCss}" rel="stylesheet"></link> </head> diff --git a/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp b/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp index 043814eaa5706fabd980d6c1e53c013a0a19b15e..9179dbc3abdd7c12d7518ec45a650a115495d794 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/createOrUpdateOwnerForm.jsp @@ -11,36 +11,36 @@ <jsp:include page="../fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp"/> - <c:choose> - <c:when test="${owner['new']}"><c:set var="method" value="post"/></c:when> - <c:otherwise><c:set var="method" value="put"/></c:otherwise> - </c:choose> - - <h2> - <c:if test="${owner['new']}">New </c:if> Owner - </h2> - <form:form modelAttribute="owner" method="${method}" class="form-horizontal" id="add-owner-form"> - <petclinic:inputField label="First Name" name="firstName" /> - <petclinic:inputField label="Last Name" name="lastName" /> - <petclinic:inputField label="Address" name="address" /> - <petclinic:inputField label="City" name="city" /> - <petclinic:inputField label="Telephone" name="telephone" /> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + <c:choose> + <c:when test="${owner['new']}"><c:set var="method" value="post"/></c:when> + <c:otherwise><c:set var="method" value="put"/></c:otherwise> + </c:choose> - <div class="form-actions"> - <c:choose> - <c:when test="${owner['new']}"> - <button type="submit">Add Owner</button> - </c:when> - <c:otherwise> - <button type="submit">Update Owner</button> - </c:otherwise> - </c:choose> - </div> - </form:form> - </div> - <jsp:include page="../fragments/footer.jsp"/> + <h2> + <c:if test="${owner['new']}">New </c:if> Owner + </h2> + <form:form modelAttribute="owner" method="${method}" class="form-horizontal" id="add-owner-form"> + <petclinic:inputField label="First Name" name="firstName"/> + <petclinic:inputField label="Last Name" name="lastName"/> + <petclinic:inputField label="Address" name="address"/> + <petclinic:inputField label="City" name="city"/> + <petclinic:inputField label="Telephone" name="telephone"/> + + <div class="form-actions"> + <c:choose> + <c:when test="${owner['new']}"> + <button type="submit">Add Owner</button> + </c:when> + <c:otherwise> + <button type="submit">Update Owner</button> + </c:otherwise> + </c:choose> + </div> + </form:form> +</div> +<jsp:include page="../fragments/footer.jsp"/> </body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp b/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp index 4f86370fd9348d43062e284e19e26e03e587ca2b..cd2808c88ce3230882981fa95de66e83a90bbd29 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/findOwners.jsp @@ -8,31 +8,32 @@ <jsp:include page="../fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp"/> - - <h2>Find Owners</h2> - - <spring:url value="/owners.html" var="formUrl"/> - <form:form modelAttribute="owner" action="${fn:escapeXml(formUrl)}" method="get" class="form-horizontal" id="search-owner-form"> - <fieldset> - <div class="control-group" id="lastName"> - <label class="control-label">Last name </label> - <form:input path="lastName" size="30" maxlength="80"/> - <span class="help-inline"><form:errors path="*" /></span> - </div> - <div class="form-actions"> - <button type="submit">Find Owner</button> - </div> - </fieldset> - </form:form> - - <br/> - <a href='<spring:url value="/owners/new" htmlEscape="true"/>'>Add Owner</a> - - <jsp:include page="../fragments/footer.jsp"/> - - </div> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + + <h2>Find Owners</h2> + + <spring:url value="/owners.html" var="formUrl"/> + <form:form modelAttribute="owner" action="${fn:escapeXml(formUrl)}" method="get" class="form-horizontal" + id="search-owner-form"> + <fieldset> + <div class="control-group" id="lastName"> + <label class="control-label">Last name </label> + <form:input path="lastName" size="30" maxlength="80"/> + <span class="help-inline"><form:errors path="*"/></span> + </div> + <div class="form-actions"> + <button type="submit">Find Owner</button> + </div> + </fieldset> + </form:form> + + <br/> + <a href='<spring:url value="/owners/new" htmlEscape="true"/>'>Add Owner</a> + + <jsp:include page="../fragments/footer.jsp"/> + +</div> </body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp b/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp index 00e40d50fe09aaa316b511b2146dfaa2f5df1197..97175553df38d092ffd7b285ab0205c378c13016 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/ownerDetails.jsp @@ -9,111 +9,111 @@ <jsp:include page="../fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp"/> - - <h2>Owner Information</h2> - - <table class="table table-striped" style="width:600px;"> - <tr> - <th>Name</th> - <td><b><c:out value="${owner.firstName} ${owner.lastName}"/></b></td> - </tr> - <tr> - <th>Address</th> - <td><c:out value="${owner.address}"/></td> - </tr> - <tr> - <th>City</th> - <td><c:out value="${owner.city}"/></td> - </tr> - <tr> - <th>Telephone </th> - <td><c:out value="${owner.telephone}"/></td> - </tr> - </table> - <table class="table-buttons"> - <tr> - <td colspan="2" align="center"> - <spring:url value="{ownerId}/edit.html" var="editUrl"> - <spring:param name="ownerId" value="${owner.id}" /> - </spring:url> - <a href="${fn:escapeXml(editUrl)}">Edit Owner</a> - </td> - <td> - <spring:url value="{ownerId}/pets/new.html" var="addUrl"> - <spring:param name="ownerId" value="${owner.id}" /> - </spring:url> - <a href="${fn:escapeXml(addUrl)}">Add New Pet</a> - </td> - </tr> - </table> - - <h2>Pets and Visits</h2> - - <c:forEach var="pet" items="${owner.pets}"> - <table class="table" style="width:600px;"> - <tr> - <td valign="top" style="width: 120px;"> - <dl class="dl-horizontal"> - <dt>Name</dt> - <dd><c:out value="${pet.name}"/></dd> - <dt>Birth Date</dt> - <dd><joda:format value="${pet.birthDate}" pattern="yyyy-MM-dd" /></dd> - <dt>Type</dt> - <dd><c:out value="${pet.type.name}"/></dd> - </dl> - </td> - <td valign="top"> - <table class="table-condensed"> - <thead> - <tr> - <th>Visit Date</th> - <th>Description</th> - </tr> - </thead> - <c:forEach var="visit" items="${pet.visits}"> - <tr> - <td><joda:format value="${visit.date}" pattern="yyyy-MM-dd"/></td> - <td><c:out value="${visit.description}"/></td> - </tr> - </c:forEach> - </table> - </td> - </tr> - </table> - <table class="table-buttons"> - <tr> - <td> - <spring:url value="/owners/{ownerId}/pets/{petId}/edit" var="petUrl"> - <spring:param name="ownerId" value="${owner.id}"/> - <spring:param name="petId" value="${pet.id}"/> - </spring:url> - <a href="${fn:escapeXml(petUrl)}">Edit Pet</a> - </td> - <td></td> - <td> - <spring:url value="/owners/{ownerId}/pets/{petId}/visits/new" var="visitUrl"> - <spring:param name="ownerId" value="${owner.id}"/> - <spring:param name="petId" value="${pet.id}"/> - </spring:url> - <a href="${fn:escapeXml(visitUrl)}">Add Visit</a> - </td> - <td></td> - <td> - <spring:url value="/owners/{ownerId}/pets/{petId}/visits.atom" var="feedUrl"> - <spring:param name="ownerId" value="${owner.id}"/> - <spring:param name="petId" value="${pet.id}"/> - </spring:url> - <a href="${fn:escapeXml(feedUrl)}" rel="alternate" type="application/atom+xml">Atom Feed</a> - </td> - </tr> - </table> - </c:forEach> - - <jsp:include page="../fragments/footer.jsp"/> - - </div> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + + <h2>Owner Information</h2> + + <table class="table table-striped" style="width:600px;"> + <tr> + <th>Name</th> + <td><b><c:out value="${owner.firstName} ${owner.lastName}"/></b></td> + </tr> + <tr> + <th>Address</th> + <td><c:out value="${owner.address}"/></td> + </tr> + <tr> + <th>City</th> + <td><c:out value="${owner.city}"/></td> + </tr> + <tr> + <th>Telephone</th> + <td><c:out value="${owner.telephone}"/></td> + </tr> + </table> + <table class="table-buttons"> + <tr> + <td colspan="2" align="center"> + <spring:url value="{ownerId}/edit.html" var="editUrl"> + <spring:param name="ownerId" value="${owner.id}"/> + </spring:url> + <a href="${fn:escapeXml(editUrl)}">Edit Owner</a> + </td> + <td> + <spring:url value="{ownerId}/pets/new.html" var="addUrl"> + <spring:param name="ownerId" value="${owner.id}"/> + </spring:url> + <a href="${fn:escapeXml(addUrl)}">Add New Pet</a> + </td> + </tr> + </table> + + <h2>Pets and Visits</h2> + + <c:forEach var="pet" items="${owner.pets}"> + <table class="table" style="width:600px;"> + <tr> + <td valign="top" style="width: 120px;"> + <dl class="dl-horizontal"> + <dt>Name</dt> + <dd><c:out value="${pet.name}"/></dd> + <dt>Birth Date</dt> + <dd><joda:format value="${pet.birthDate}" pattern="yyyy-MM-dd"/></dd> + <dt>Type</dt> + <dd><c:out value="${pet.type.name}"/></dd> + </dl> + </td> + <td valign="top"> + <table class="table-condensed"> + <thead> + <tr> + <th>Visit Date</th> + <th>Description</th> + </tr> + </thead> + <c:forEach var="visit" items="${pet.visits}"> + <tr> + <td><joda:format value="${visit.date}" pattern="yyyy-MM-dd"/></td> + <td><c:out value="${visit.description}"/></td> + </tr> + </c:forEach> + </table> + </td> + </tr> + </table> + <table class="table-buttons"> + <tr> + <td> + <spring:url value="/owners/{ownerId}/pets/{petId}/edit" var="petUrl"> + <spring:param name="ownerId" value="${owner.id}"/> + <spring:param name="petId" value="${pet.id}"/> + </spring:url> + <a href="${fn:escapeXml(petUrl)}">Edit Pet</a> + </td> + <td></td> + <td> + <spring:url value="/owners/{ownerId}/pets/{petId}/visits/new" var="visitUrl"> + <spring:param name="ownerId" value="${owner.id}"/> + <spring:param name="petId" value="${pet.id}"/> + </spring:url> + <a href="${fn:escapeXml(visitUrl)}">Add Visit</a> + </td> + <td></td> + <td> + <spring:url value="/owners/{ownerId}/pets/{petId}/visits.atom" var="feedUrl"> + <spring:param name="ownerId" value="${owner.id}"/> + <spring:param name="petId" value="${pet.id}"/> + </spring:url> + <a href="${fn:escapeXml(feedUrl)}" rel="alternate" type="application/atom+xml">Atom Feed</a> + </td> + </tr> + </table> + </c:forEach> + + <jsp:include page="../fragments/footer.jsp"/> + +</div> </body> diff --git a/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp b/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp index 53145ecc30686835df64f67f04c09a02e20ad0c2..03f785821b7f0dd0e66840bbc69ada5ef5f1eef9 100644 --- a/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp +++ b/src/main/webapp/WEB-INF/jsp/owners/ownersList.jsp @@ -9,42 +9,42 @@ <jsp:include page="../fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp"/> - <h2>Owners</h2> - - <table class="table table-striped"> - <thead> - <tr> - <th style="width: 150px;">Name</th> - <th style="width: 200px;">Address</th> - <th>City</th> - <th>Telephone</th> - <th style="width: 100px;">Pets</th> - </tr> - </thead> - <c:forEach var="owner" items="${selections}"> - <tr> - <td> - <spring:url value="owners/{ownerId}.html" var="ownerUrl"> - <spring:param name="ownerId" value="${owner.id}"/> - </spring:url> - <a href="${fn:escapeXml(ownerUrl)}"><c:out value="${owner.firstName} ${owner.lastName}" /></a> - </td> - <td><c:out value="${owner.address}"/></td> - <td><c:out value="${owner.city}"/></td> - <td><c:out value="${owner.telephone}"/></td> - <td> - <c:forEach var="pet" items="${owner.pets}"> - <c:out value="${pet.name}"/> - </c:forEach> - </td> - </tr> - </c:forEach> - </table> - <jsp:include page="../fragments/footer.jsp"/> - - </div> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + <h2>Owners</h2> + + <table class="table table-striped"> + <thead> + <tr> + <th style="width: 150px;">Name</th> + <th style="width: 200px;">Address</th> + <th>City</th> + <th>Telephone</th> + <th style="width: 100px;">Pets</th> + </tr> + </thead> + <c:forEach var="owner" items="${selections}"> + <tr> + <td> + <spring:url value="owners/{ownerId}.html" var="ownerUrl"> + <spring:param name="ownerId" value="${owner.id}"/> + </spring:url> + <a href="${fn:escapeXml(ownerUrl)}"><c:out value="${owner.firstName} ${owner.lastName}"/></a> + </td> + <td><c:out value="${owner.address}"/></td> + <td><c:out value="${owner.city}"/></td> + <td><c:out value="${owner.telephone}"/></td> + <td> + <c:forEach var="pet" items="${owner.pets}"> + <c:out value="${pet.name}"/> + </c:forEach> + </td> + </tr> + </c:forEach> + </table> + <jsp:include page="../fragments/footer.jsp"/> + +</div> </body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp index 8e114c3effa021804cf7b7a1835826190c414036..c33986abf1bc493a4fdcfad222df0e2ef8167404 100644 --- a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdatePetForm.jsp @@ -1,6 +1,6 @@ -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="petclinic" tagdir="/WEB-INF/tags" %> @@ -10,54 +10,54 @@ <body> <script> - $(function() { - $("#birthDate").datepicker({ dateFormat: 'yy/mm/dd'}); - }); + $(function () { + $("#birthDate").datepicker({ dateFormat: 'yy/mm/dd'}); + }); </script> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp" /> - <c:choose> - <c:when test="${pet['new']}"> - <c:set var="method" value="post" /> - </c:when> - <c:otherwise> - <c:set var="method" value="put" /> - </c:otherwise> - </c:choose> - - <h2> - <c:if test="${pet['new']}">New </c:if> - Pet - </h2> - - <form:form modelAttribute="pet" method="${method}" - class="form-horizontal"> - <div class="control-group" id="owner"> - <label class="control-label">Owner </label> - - <c:out value="${pet.owner.firstName} ${pet.owner.lastName}"/> - </div> - <petclinic:inputField label="Name" name="name" /> - <petclinic:inputField label="Birth Date" name="birthDate" /> - <div class="control-group"> - <label class="control-label">Type </label> - <form:select path="type" items="${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> - </form:form> - <c:if test="${!pet['new']}"> - </c:if> - <jsp:include page="../fragments/footer.jsp" /> - </div> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + <c:choose> + <c:when test="${pet['new']}"> + <c:set var="method" value="post"/> + </c:when> + <c:otherwise> + <c:set var="method" value="put"/> + </c:otherwise> + </c:choose> + + <h2> + <c:if test="${pet['new']}">New </c:if> + Pet + </h2> + + <form:form modelAttribute="pet" method="${method}" + class="form-horizontal"> + <div class="control-group" id="owner"> + <label class="control-label">Owner </label> + + <c:out value="${pet.owner.firstName} ${pet.owner.lastName}"/> + </div> + <petclinic:inputField label="Name" name="name"/> + <petclinic:inputField label="Birth Date" name="birthDate"/> + <div class="control-group"> + <label class="control-label">Type </label> + <form:select path="type" items="${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> + </form:form> + <c:if test="${!pet['new']}"> + </c:if> + <jsp:include page="../fragments/footer.jsp"/> +</div> </body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp index 80f7f0d0a464c28bb7a5a6b7a9516e0e22faa3cd..e1c8a052d6e7300df70c8692a63d6cd14aa55844 100644 --- a/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/pets/createOrUpdateVisitForm.jsp @@ -10,73 +10,75 @@ <body> - <script> - $(function() { - $("#date").datepicker({ dateFormat: 'yy/mm/dd'}); - }); - </script> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp"/> - <h2><c:if test="${visit['new']}">New </c:if>Visit</h2> - - <b>Pet</b> - <table class="table table-striped"> - <thead> - <tr> - <th>Name</th> - <th>Birth Date</th> - <th>Type</th> - <th>Owner</th> - </tr> - </thead> - <tr> - <td><c:out value="${visit.pet.name}" /></td> - <td><joda:format value="${visit.pet.birthDate}" pattern="yyyy/MM/dd"/></td> - <td><c:out value="${visit.pet.type.name}" /></td> - <td><c:out value="${visit.pet.owner.firstName} ${visit.pet.owner.lastName}" /></td> - </tr> - </table> - - <form:form modelAttribute="visit"> - <div class="control-group"> - <label class="control-label">Date </label> - <div class="controls"> - <form:input path="date" /> - <span class="help-inline"><form:errors path="date" /></span> - </div> - </div> - <div class="control-group"> - <label class="control-label">Description </label> - <div class="controls"> - <form:input path="description" /> - <span class="help-inline"><form:errors path="description" /></span> - </div> - </div> - <div class="form-actions"> - <input type="hidden" name="petId" value="${visit.pet.id}"/> - <button type="submit">Add Visit</button> - </div> - </form:form> - - <br/> - <b>Previous Visits</b> - <table style="width: 333px;"> - <tr> - <th>Date</th> - <th>Description</th> - </tr> - <c:forEach var="visit" items="${visit.pet.visits}"> - <c:if test="${!visit['new']}"> - <tr> - <td><joda:format value="${visit.date}" pattern="yyyy/MM/dd"/></td> - <td><c:out value="${visit.description}" /></td> - </tr> - </c:if> - </c:forEach> - </table> +<script> + $(function () { + $("#date").datepicker({ dateFormat: 'yy/mm/dd'}); + }); +</script> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + <h2><c:if test="${visit['new']}">New </c:if>Visit</h2> - </div> - <jsp:include page="../fragments/footer.jsp"/> + <b>Pet</b> + <table class="table table-striped"> + <thead> + <tr> + <th>Name</th> + <th>Birth Date</th> + <th>Type</th> + <th>Owner</th> + </tr> + </thead> + <tr> + <td><c:out value="${visit.pet.name}"/></td> + <td><joda:format value="${visit.pet.birthDate}" pattern="yyyy/MM/dd"/></td> + <td><c:out value="${visit.pet.type.name}"/></td> + <td><c:out value="${visit.pet.owner.firstName} ${visit.pet.owner.lastName}"/></td> + </tr> + </table> + + <form:form modelAttribute="visit"> + <div class="control-group"> + <label class="control-label">Date </label> + + <div class="controls"> + <form:input path="date"/> + <span class="help-inline"><form:errors path="date"/></span> + </div> + </div> + <div class="control-group"> + <label class="control-label">Description </label> + + <div class="controls"> + <form:input path="description"/> + <span class="help-inline"><form:errors path="description"/></span> + </div> + </div> + <div class="form-actions"> + <input type="hidden" name="petId" value="${visit.pet.id}"/> + <button type="submit">Add Visit</button> + </div> + </form:form> + + <br/> + <b>Previous Visits</b> + <table style="width: 333px;"> + <tr> + <th>Date</th> + <th>Description</th> + </tr> + <c:forEach var="visit" items="${visit.pet.visits}"> + <c:if test="${!visit['new']}"> + <tr> + <td><joda:format value="${visit.date}" pattern="yyyy/MM/dd"/></td> + <td><c:out value="${visit.description}"/></td> + </tr> + </c:if> + </c:forEach> + </table> + +</div> +<jsp:include page="../fragments/footer.jsp"/> </body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp b/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp index 54bb103564e2e8979a5e5035d111c2346d3ac769..4adaa14dbb929a1791c1f7c5ecf6c603e0411b37 100644 --- a/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp +++ b/src/main/webapp/WEB-INF/jsp/vets/vetList.jsp @@ -9,45 +9,45 @@ <jsp:include page="../fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="../fragments/bodyHeader.jsp"/> - - <h2>Veterinarians</h2> - - <table class="table table-stripped" style="width:600px;"> - <thead> - <tr> - <th>Name</th> - <th>Specialties</th> - </tr> - </thead> - <tbody> - <c:forEach var="vet" items="${vets.vetList}"> - <tr> - <td><c:out value="${vet.firstName} ${vet.lastName}" /></td> - <td> - <c:forEach var="specialty" items="${vet.specialties}"> - <c:out value="${specialty.name}" /> - </c:forEach> - <c:if test="${vet.nrOfSpecialties == 0}">none</c:if> - </td> - </tr> - </c:forEach> - </tbody> - </table> - <table class="table-buttons"> - <tr> - <td> - <a href="<spring:url value="/vets.xml" htmlEscape="true" />">View as XML</a> - </td> - <td> - <a href="<spring:url value="/vets.atom" htmlEscape="true" />">Subscribe to Atom feed</a> - </td> - </tr> - </table> - - <jsp:include page="../fragments/footer.jsp"/> - </div> - </body> +<div class="container"> + <jsp:include page="../fragments/bodyHeader.jsp"/> + + <h2>Veterinarians</h2> + + <table class="table table-stripped" style="width:600px;"> + <thead> + <tr> + <th>Name</th> + <th>Specialties</th> + </tr> + </thead> + <tbody> + <c:forEach var="vet" items="${vets.vetList}"> + <tr> + <td><c:out value="${vet.firstName} ${vet.lastName}"/></td> + <td> + <c:forEach var="specialty" items="${vet.specialties}"> + <c:out value="${specialty.name}"/> + </c:forEach> + <c:if test="${vet.nrOfSpecialties == 0}">none</c:if> + </td> + </tr> + </c:forEach> + </tbody> + </table> + <table class="table-buttons"> + <tr> + <td> + <a href="<spring:url value="/vets.xml" htmlEscape="true" />">View as XML</a> + </td> + <td> + <a href="<spring:url value="/vets.atom" htmlEscape="true" />">Subscribe to Atom feed</a> + </td> + </tr> + </table> + + <jsp:include page="../fragments/footer.jsp"/> +</div> +</body> </html> diff --git a/src/main/webapp/WEB-INF/jsp/welcome.jsp b/src/main/webapp/WEB-INF/jsp/welcome.jsp index ab7de63aaade3e55526b6308ab0932e71b48c0d5..12c9f2c716a0b2a7cac7d6f23f7cf23b0994fc6e 100644 --- a/src/main/webapp/WEB-INF/jsp/welcome.jsp +++ b/src/main/webapp/WEB-INF/jsp/welcome.jsp @@ -7,15 +7,15 @@ <jsp:include page="fragments/headTag.jsp"/> <body> - <div class="container"> - <jsp:include page="fragments/bodyHeader.jsp"/> - <h2><fmt:message key="welcome"/></h2> - <spring:url value="/resources/images/pets.png" htmlEscape="true" var="petsImage"/> - <img src="${petsImage}" /> - - <jsp:include page="fragments/footer.jsp"/> +<div class="container"> + <jsp:include page="fragments/bodyHeader.jsp"/> + <h2><fmt:message key="welcome"/></h2> + <spring:url value="/resources/images/pets.png" htmlEscape="true" var="petsImage"/> + <img src="${petsImage}"/> - </div> + <jsp:include page="fragments/footer.jsp"/> + +</div> </body> </html> diff --git a/src/main/webapp/WEB-INF/tags/inputField.tag b/src/main/webapp/WEB-INF/tags/inputField.tag index f70cf36e1d9e81a70f04aa2bbbae98329d23e222..796dc91c04e991a431573f358739b26dfa6655ba 100644 --- a/src/main/webapp/WEB-INF/tags/inputField.tag +++ b/src/main/webapp/WEB-INF/tags/inputField.tag @@ -1,16 +1,19 @@ <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> -<%@ attribute name="name" required="true" rtexprvalue="true" description="Name of corresponding property in bean object"%> -<%@ attribute name="label" required="true" rtexprvalue="true" description="Label appears in red color if input is considered as invalid after submission"%> +<%@ attribute name="name" required="true" rtexprvalue="true" + description="Name of corresponding property in bean object" %> +<%@ attribute name="label" required="true" rtexprvalue="true" + description="Label appears in red color if input is considered as invalid after submission" %> <spring:bind path="${name}"> - <c:set var="cssGroup" value="control-group ${status.error ? 'error' : '' }"/> - <div class="${cssGroup}"> - <label class="control-label">${label}</label> - <div class="controls"> - <form:input path="${name}"/> - <span class="help-inline">${status.errorMessage}</span> - </div> - </div> + <c:set var="cssGroup" value="control-group ${status.error ? 'error' : '' }"/> + <div class="${cssGroup}"> + <label class="control-label">${label}</label> + + <div class="controls"> + <form:input path="${name}"/> + <span class="help-inline">${status.errorMessage}</span> + </div> + </div> </spring:bind> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 79b9bf6bab2a71448de1ab9c435eefabd18c9e14..ef04c4a18b468f9e98ae954adf48a792322c81f5 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,64 +1,65 @@ <?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" -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"> + 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>jdbc</param-value> - <!-- Available profiles: - <param-value>jdbc</param-value> - <param-value>jpa</param-value> (in the case of plain JPA) - <param-value>spring-data-jpa</param-value> (in the case of Spring Data JPA) - --> - </context-param> + <display-name>Spring PetClinic</display-name> + <description>Spring PetClinic sample application</description> - <!-- - - Location of the XML file that defines the root application context. - - Applied by ContextLoaderServlet. - --> - <context-param> - <param-name>contextConfigLocation</param-name> - <param-value>classpath:spring/dao-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> + <context-param> + <param-name>spring.profiles.active</param-name> + <param-value>jdbc</param-value> + <!-- Available profiles: + <param-value>jdbc</param-value> + <param-value>jpa</param-value> (in the case of plain JPA) + <param-value>spring-data-jpa</param-value> (in the case of Spring Data JPA) + --> + </context-param> - <servlet-mapping> - <servlet-name>petclinic</servlet-name> - <url-pattern>/</url-pattern> - </servlet-mapping> + <!-- + - Location of the XML file that defines the root application context. + - Applied by ContextLoaderServlet. + --> + <context-param> + <param-name>contextConfigLocation</param-name> + <param-value>classpath:spring/dao-config.xml, classpath:spring/tools-config.xml</param-value> + </context-param> - <!-- used so we can use forms of method type 'PUT' and 'DELETE' - 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> + <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' + 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> - <filter-mapping> - <filter-name>httpMethodFilter</filter-name> - <servlet-name>petclinic</servlet-name> - </filter-mapping> - </web-app> \ No newline at end of file diff --git a/src/main/webapp/resources/css/petclinic.css b/src/main/webapp/resources/css/petclinic.css index 590cbe06ea239339c47a7add54078ce4541245c5..36ad67082f6991efe878779d9d42c0dc59999291 100644 --- a/src/main/webapp/resources/css/petclinic.css +++ b/src/main/webapp/resources/css/petclinic.css @@ -1,21 +1,21 @@ .container { - padding-top: 10px; - margin-left: 50px; - width: 700px; + padding-top: 10px; + margin-left: 50px; + width: 700px; } .form-horizontal { - width: 100%; + width: 100%; } input[type="text"] { - height: 25px; + height: 25px; } .navbar .nav > li > a { - color: #000000; + color: #000000; } - .form-horizontal .control-label { +.form-horizontal .control-label { text-align: left; } diff --git a/src/test/java/org/springframework/samples/petclinic/model/OwnerTests.java b/src/test/java/org/springframework/samples/petclinic/model/OwnerTests.java index 9c64e3778f09a9a985d6ad0182f801cc743b1b2d..2eba3d997a313a11b08ebab00ecbee9c715769a8 100644 --- a/src/test/java/org/springframework/samples/petclinic/model/OwnerTests.java +++ b/src/test/java/org/springframework/samples/petclinic/model/OwnerTests.java @@ -15,14 +15,12 @@ */ package org.springframework.samples.petclinic.model; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - import org.junit.Test; -import org.springframework.samples.petclinic.model.Owner; -import org.springframework.samples.petclinic.model.Pet; import org.springframework.transaction.annotation.Transactional; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + /** * JUnit test for the {@link Owner} class. * @@ -30,16 +28,17 @@ import org.springframework.transaction.annotation.Transactional; */ public class OwnerTests { - @Test @Transactional - public void testHasPet() { - Owner owner = new Owner(); - Pet fido = new Pet(); - fido.setName("Fido"); - assertNull(owner.getPet("Fido")); - assertNull(owner.getPet("fido")); - owner.addPet(fido); - assertEquals(fido, owner.getPet("Fido")); - assertEquals(fido, owner.getPet("fido")); - } + @Test + @Transactional + public void testHasPet() { + Owner owner = new Owner(); + Pet fido = new Pet(); + fido.setName("Fido"); + assertNull(owner.getPet("Fido")); + assertNull(owner.getPet("fido")); + owner.addPet(fido); + assertEquals(fido, owner.getPet("Fido")); + assertEquals(fido, owner.getPet("fido")); + } } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/AbstractOwnerRepositoryTests.java b/src/test/java/org/springframework/samples/petclinic/repository/AbstractOwnerRepositoryTests.java index f9752c82caf264599e78fd32b71ed58c4514e1c1..e8330dfcb3c995f9bea13be82638388f6ad51b0c 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/AbstractOwnerRepositoryTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/AbstractOwnerRepositoryTests.java @@ -15,44 +15,29 @@ */ package org.springframework.samples.petclinic.repository; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Collection; - import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Owner; -import org.springframework.samples.petclinic.repository.OwnerRepository; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + /** - * <p> - * Base class for {@link OwnerRepository} integration tests. - * </p> - * <p> - * Subclasses should specify Spring context configuration using {@link ContextConfiguration @ContextConfiguration} annotation - * </p> - * <p> - * AbstractOwnerRepositoryTests and its subclasses benefit from the following services - * provided by the Spring TestContext Framework: - * </p> - * <ul> - * <li><strong>Spring IoC container caching</strong> which spares us - * unnecessary set up time between test execution.</li> - * <li><strong>Dependency Injection</strong> of test fixture instances, - * meaning that we don't need to perform application context lookups. See the - * use of {@link Autowired @Autowired} on the <code>{@link AbstractOwnerRepositoryTests#ownerRepository ownerRepository}</code> instance - * variable, which uses autowiring <em>by type</em>. - * <li><strong>Transaction management</strong>, meaning each test method is - * executed in its own transaction, which is automatically rolled back by - * default. Thus, even if tests insert or otherwise change database state, there - * is no need for a teardown or cleanup script. - * <li> An {@link org.springframework.context.ApplicationContext ApplicationContext} is - * also inherited and can be used for explicit bean lookup if necessary. - * </li> - * </ul> + * <p> Base class for {@link OwnerRepository} integration tests. </p> <p> Subclasses should specify Spring context + * configuration using {@link ContextConfiguration @ContextConfiguration} annotation </p> <p> + * AbstractOwnerRepositoryTests and its subclasses benefit from the following services provided by the Spring + * TestContext Framework: </p> <ul> <li><strong>Spring IoC container caching</strong> which spares us unnecessary set up + * time between test execution.</li> <li><strong>Dependency Injection</strong> of test fixture instances, meaning that + * we don't need to perform application context lookups. See the use of {@link Autowired @Autowired} on the <code>{@link + * AbstractOwnerRepositoryTests#ownerRepository ownerRepository}</code> instance variable, which uses autowiring <em>by + * type</em>. <li><strong>Transaction management</strong>, meaning each test method is executed in its own transaction, + * which is automatically rolled back by default. Thus, even if tests insert or otherwise change database state, there + * is no need for a teardown or cleanup script. <li> An {@link org.springframework.context.ApplicationContext + * ApplicationContext} is also inherited and can be used for explicit bean lookup if necessary. </li> </ul> * * @author Ken Krebs * @author Rod Johnson @@ -62,52 +47,55 @@ import org.springframework.transaction.annotation.Transactional; */ public abstract class AbstractOwnerRepositoryTests { - @Autowired - protected OwnerRepository ownerRepository; - - @Test @Transactional - public void findOwners() { - Collection<Owner> owners = this.ownerRepository.findByLastName("Davis"); - assertEquals(2, owners.size()); - owners = this.ownerRepository.findByLastName("Daviss"); - assertEquals(0, owners.size()); - } + @Autowired + protected OwnerRepository ownerRepository; - @Test @Transactional - public void findSingleOwner() { - Owner owner1 = this.ownerRepository.findById(1); - assertTrue(owner1.getLastName().startsWith("Franklin")); - Owner owner10 = this.ownerRepository.findById(10); - assertEquals("Carlos", owner10.getFirstName()); + @Test + @Transactional + public void findOwners() { + Collection<Owner> owners = this.ownerRepository.findByLastName("Davis"); + assertEquals(2, owners.size()); + owners = this.ownerRepository.findByLastName("Daviss"); + assertEquals(0, owners.size()); + } - assertEquals(owner1.getPets().size(), 1); - } + @Test + @Transactional + public void findSingleOwner() { + Owner owner1 = this.ownerRepository.findById(1); + assertTrue(owner1.getLastName().startsWith("Franklin")); + Owner owner10 = this.ownerRepository.findById(10); + assertEquals("Carlos", owner10.getFirstName()); - @Test @Transactional - public void insertOwner() { - Collection<Owner> owners = this.ownerRepository.findByLastName("Schultz"); - int found = owners.size(); - Owner owner = new Owner(); - owner.setFirstName("Sam"); - owner.setLastName("Schultz"); - owner.setAddress("4, Evans Street"); - owner.setCity("Wollongong"); - owner.setTelephone("4444444444"); - this.ownerRepository.save(owner); - owners = this.ownerRepository.findByLastName("Schultz"); - assertEquals("Verifying number of owners after inserting a new one.", found + 1, owners.size()); - } + assertEquals(owner1.getPets().size(), 1); + } - @Test @Transactional - public void updateOwner() throws Exception { - Owner o1 = this.ownerRepository.findById(1); - String old = o1.getLastName(); - o1.setLastName(old + "X"); - this.ownerRepository.save(o1); - o1 = this.ownerRepository.findById(1); - assertEquals(old + "X", o1.getLastName()); - } + @Test + @Transactional + public void insertOwner() { + Collection<Owner> owners = this.ownerRepository.findByLastName("Schultz"); + int found = owners.size(); + Owner owner = new Owner(); + owner.setFirstName("Sam"); + owner.setLastName("Schultz"); + owner.setAddress("4, Evans Street"); + owner.setCity("Wollongong"); + owner.setTelephone("4444444444"); + this.ownerRepository.save(owner); + owners = this.ownerRepository.findByLastName("Schultz"); + assertEquals("Verifying number of owners after inserting a new one.", found + 1, owners.size()); + } + @Test + @Transactional + public void updateOwner() throws Exception { + Owner o1 = this.ownerRepository.findById(1); + String old = o1.getLastName(); + o1.setLastName(old + "X"); + this.ownerRepository.save(o1); + o1 = this.ownerRepository.findById(1); + assertEquals(old + "X", o1.getLastName()); + } } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/AbstractPetRepositoryTests.java b/src/test/java/org/springframework/samples/petclinic/repository/AbstractPetRepositoryTests.java index 7a565aca659ce81af56972aaf30c2e3407446526..691e07aba4212a199fab315393fd76b39d9321a4 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/AbstractPetRepositoryTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/AbstractPetRepositoryTests.java @@ -15,27 +15,23 @@ */ package org.springframework.samples.petclinic.repository; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.Collection; - import org.joda.time.DateTime; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; 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.repository.OwnerRepository; -import org.springframework.samples.petclinic.repository.PetRepository; import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + /** - * <p> - * Base class for {@link OwnerRepository} integration tests. - * </p> - * <p> + * <p> Base class for {@link OwnerRepository} integration tests. </p> + * <p/> * see javadoc inside {@link AbstractOwnerRepositoryTests} for more details * * @author Ken Krebs @@ -46,62 +42,66 @@ import org.springframework.transaction.annotation.Transactional; */ public abstract class AbstractPetRepositoryTests { - @Autowired - protected PetRepository petRepository; - - @Autowired - protected OwnerRepository ownerRepository; + @Autowired + protected PetRepository petRepository; + + @Autowired + protected OwnerRepository ownerRepository; + + @Test + @Transactional + public void getPetTypes() { + Collection<PetType> petTypes = this.petRepository.findPetTypes(); - @Test @Transactional - public void getPetTypes() { - Collection<PetType> petTypes = this.petRepository.findPetTypes(); - - PetType petType1 = EntityUtils.getById(petTypes, PetType.class, 1); - assertEquals("cat", petType1.getName()); - PetType petType4 = EntityUtils.getById(petTypes, PetType.class, 4); - assertEquals("snake", petType4.getName()); - } + PetType petType1 = EntityUtils.getById(petTypes, PetType.class, 1); + assertEquals("cat", petType1.getName()); + PetType petType4 = EntityUtils.getById(petTypes, PetType.class, 4); + assertEquals("snake", petType4.getName()); + } - @Test @Transactional - public void findPet() { - Collection<PetType> types = this.petRepository.findPetTypes(); - Pet pet7 = this.petRepository.findById(7); - assertTrue(pet7.getName().startsWith("Samantha")); - assertEquals(EntityUtils.getById(types, PetType.class, 1).getId(), pet7.getType().getId()); - assertEquals("Jean", pet7.getOwner().getFirstName()); - Pet pet6 = this.petRepository.findById(6); - assertEquals("George", pet6.getName()); - assertEquals(EntityUtils.getById(types, PetType.class, 4).getId(), pet6.getType().getId()); - assertEquals("Peter", pet6.getOwner().getFirstName()); - } + @Test + @Transactional + public void findPet() { + Collection<PetType> types = this.petRepository.findPetTypes(); + Pet pet7 = this.petRepository.findById(7); + assertTrue(pet7.getName().startsWith("Samantha")); + assertEquals(EntityUtils.getById(types, PetType.class, 1).getId(), pet7.getType().getId()); + assertEquals("Jean", pet7.getOwner().getFirstName()); + Pet pet6 = this.petRepository.findById(6); + assertEquals("George", pet6.getName()); + assertEquals(EntityUtils.getById(types, PetType.class, 4).getId(), pet6.getType().getId()); + assertEquals("Peter", pet6.getOwner().getFirstName()); + } - @Test @Transactional - public void insertPet() { - Owner owner6 = this.ownerRepository.findById(6); - int found = owner6.getPets().size(); - Pet pet = new Pet(); - pet.setName("bowser"); - Collection<PetType> types = this.petRepository.findPetTypes(); - pet.setType(EntityUtils.getById(types, PetType.class, 2)); - pet.setBirthDate(new DateTime()); - owner6.addPet(pet); - assertEquals(found + 1, owner6.getPets().size()); - // both storePet and storeOwner are necessary to cover all ORM tools - this.petRepository.save(pet); - this.ownerRepository.save(owner6); - owner6 = this.ownerRepository.findById(6); - assertEquals(found + 1, owner6.getPets().size()); - } + @Test + @Transactional + public void insertPet() { + Owner owner6 = this.ownerRepository.findById(6); + int found = owner6.getPets().size(); + Pet pet = new Pet(); + pet.setName("bowser"); + Collection<PetType> types = this.petRepository.findPetTypes(); + pet.setType(EntityUtils.getById(types, PetType.class, 2)); + pet.setBirthDate(new DateTime()); + owner6.addPet(pet); + assertEquals(found + 1, owner6.getPets().size()); + // both storePet and storeOwner are necessary to cover all ORM tools + this.petRepository.save(pet); + this.ownerRepository.save(owner6); + owner6 = this.ownerRepository.findById(6); + assertEquals(found + 1, owner6.getPets().size()); + } - @Test @Transactional - public void updatePet() throws Exception { - Pet pet7 = this.petRepository.findById(7); - String old = pet7.getName(); - pet7.setName(old + "X"); - this.petRepository.save(pet7); - pet7 = this.petRepository.findById(7); - assertEquals(old + "X", pet7.getName()); - } + @Test + @Transactional + public void updatePet() throws Exception { + Pet pet7 = this.petRepository.findById(7); + String old = pet7.getName(); + pet7.setName(old + "X"); + this.petRepository.save(pet7); + pet7 = this.petRepository.findById(7); + assertEquals(old + "X", pet7.getName()); + } } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/AbstractVetRepositoryTests.java b/src/test/java/org/springframework/samples/petclinic/repository/AbstractVetRepositoryTests.java index c17311c2880dafe195f605a46abbe8b5444a36fb..bd906ed55f60065f3abb2662e1873cd965426d52 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/AbstractVetRepositoryTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/AbstractVetRepositoryTests.java @@ -15,23 +15,19 @@ */ package org.springframework.samples.petclinic.repository; -import static org.junit.Assert.assertEquals; - -import java.util.Collection; - import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Vet; -import org.springframework.samples.petclinic.repository.OwnerRepository; -import org.springframework.samples.petclinic.repository.VetRepository; import org.springframework.samples.petclinic.util.EntityUtils; import org.springframework.transaction.annotation.Transactional; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + /** - * <p> - * Base class for {@link OwnerRepository} integration tests. - * </p> - * <p> + * <p> Base class for {@link OwnerRepository} integration tests. </p> + * <p/> * see javadoc inside {@link AbstractVetRepositoryTests} for more details * * @author Ken Krebs @@ -42,23 +38,24 @@ import org.springframework.transaction.annotation.Transactional; */ public abstract class AbstractVetRepositoryTests { - @Autowired - protected VetRepository vetRepository; - - - @Test @Transactional - public void findVets() { - Collection<Vet> vets = this.vetRepository.findAll(); - - Vet v1 = EntityUtils.getById(vets, Vet.class, 2); - assertEquals("Leary", v1.getLastName()); - assertEquals(1, v1.getNrOfSpecialties()); - assertEquals("radiology", (v1.getSpecialties().get(0)).getName()); - Vet v2 = EntityUtils.getById(vets, Vet.class, 3); - assertEquals("Douglas", v2.getLastName()); - assertEquals(2, v2.getNrOfSpecialties()); - assertEquals("dentistry", (v2.getSpecialties().get(0)).getName()); - assertEquals("surgery", (v2.getSpecialties().get(1)).getName()); - } + @Autowired + protected VetRepository vetRepository; + + + @Test + @Transactional + public void findVets() { + Collection<Vet> vets = this.vetRepository.findAll(); + + Vet v1 = EntityUtils.getById(vets, Vet.class, 2); + assertEquals("Leary", v1.getLastName()); + assertEquals(1, v1.getNrOfSpecialties()); + assertEquals("radiology", (v1.getSpecialties().get(0)).getName()); + Vet v2 = EntityUtils.getById(vets, Vet.class, 3); + assertEquals("Douglas", v2.getLastName()); + assertEquals(2, v2.getNrOfSpecialties()); + assertEquals("dentistry", (v2.getSpecialties().get(0)).getName()); + assertEquals("surgery", (v2.getSpecialties().get(1)).getName()); + } } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/AbstractVisitRepositoryTests.java b/src/test/java/org/springframework/samples/petclinic/repository/AbstractVisitRepositoryTests.java index 6ea8bbb981c43ff6ec9141501c2ee4b3569de1a6..59608789dcabcd591be50148e08ed8db4963a738 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/AbstractVisitRepositoryTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/AbstractVisitRepositoryTests.java @@ -15,22 +15,17 @@ */ package org.springframework.samples.petclinic.repository; -import static org.junit.Assert.assertEquals; - import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.Visit; -import org.springframework.samples.petclinic.repository.OwnerRepository; -import org.springframework.samples.petclinic.repository.PetRepository; -import org.springframework.samples.petclinic.repository.VisitRepository; import org.springframework.transaction.annotation.Transactional; +import static org.junit.Assert.assertEquals; + /** - * <p> - * Base class for {@link OwnerRepository} integration tests. - * </p> - * <p> + * <p> Base class for {@link OwnerRepository} integration tests. </p> + * <p/> * see javadoc inside {@link AbstractVetRepositoryTests} for more details * * @author Ken Krebs @@ -41,25 +36,26 @@ import org.springframework.transaction.annotation.Transactional; */ public abstract class AbstractVisitRepositoryTests { - @Autowired - protected VisitRepository visitRepository; - - @Autowired - protected PetRepository petRepository; + @Autowired + protected VisitRepository visitRepository; + + @Autowired + protected PetRepository petRepository; - @Test @Transactional - public void insertVisit() { - Pet pet7 = this.petRepository.findById(7); - int found = pet7.getVisits().size(); - Visit visit = new Visit(); - pet7.addVisit(visit); - visit.setDescription("test"); - // both storeVisit and storePet are necessary to cover all ORM tools - this.visitRepository.save(visit); - this.petRepository.save(pet7); - pet7 = this.petRepository.findById(7); - assertEquals(found + 1, pet7.getVisits().size()); - } + @Test + @Transactional + public void insertVisit() { + Pet pet7 = this.petRepository.findById(7); + int found = pet7.getVisits().size(); + Visit visit = new Visit(); + pet7.addVisit(visit); + visit.setDescription("test"); + // both storeVisit and storePet are necessary to cover all ORM tools + this.visitRepository.save(visit); + this.petRepository.save(pet7); + pet7 = this.petRepository.findById(7); + assertEquals(found + 1, pet7.getVisits().size()); + } } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImplTests.java index 6b074c95ad3548b4c0616411cf979cd0992ade56..fb6f1f8894d44c032b83c830957a4a44929a0829 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcOwnerRepositoryImplTests.java @@ -22,20 +22,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jdbc") public class JdbcOwnerRepositoryImplTests extends AbstractOwnerRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImplTests.java index c6d1434acefa393dee559b244d795ada0570b3e2..008818fc33718b25b5a18d01bcc0d9827b99de0f 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcPetRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jdbc") public class JdbcPetRepositoryImplTests extends AbstractPetRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImplTests.java index 86391486559bfbaf4b44c106e9624a1739b8988c..e2a4e8b7b00db8a19a1b35b1d8012727fb324903 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVetRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jdbc") public class JdbcVetRepositoryImplTests extends AbstractVetRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImplTests.java index 600e69c75b6ee531a90f745f95851d69f8ac1c63..6a349889296e261d01206797092d875fbccabaf8 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jdbc/JdbcVisitRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jdbc") public class JdbcVisitRepositoryImplTests extends AbstractVisitRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImplTests.java index a4e1348e0546897c21da212243a21982a651751b..2936515b000f54e33fe53e597b1a24bc146fa8b5 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaOwnerRepositoryImplTests.java @@ -8,27 +8,19 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Provides the following services: - * <ul> - * <li>Injects test dependencies, meaning that we don't need to perform - * application context lookups. See the setClinic() method. Injection uses - * autowiring by type.</li> - * <li>Executes each test method in its own transaction, which is automatically - * rolled back by default. This means that even if tests insert or otherwise - * change database state, there is no need for a teardown or cleanup script.</li> - * </ul> - * <p> - * </p> + * <p> Provides the following services: <ul> <li>Injects test dependencies, meaning that we don't need to perform + * application context lookups. See the setClinic() method. Injection uses autowiring by type.</li> <li>Executes each + * test method in its own transaction, which is automatically rolled back by default. This means that even if tests + * insert or otherwise change database state, there is no need for a teardown or cleanup script.</li> </ul> <p> </p> * * @author Rod Johnson * @author Sam Brannen * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jpa") public class JpaOwnerRepositoryImplTests extends AbstractOwnerRepositoryTests { - + } \ No newline at end of file diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImplTests.java index e09bf7ccdc6a3304ac395cac7038f6fcc6490c25..ec5b503377f04d3f185800fdbf112868dad5a066 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaPetRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jpa") public class JpaPetRepositoryImplTests extends AbstractPetRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImplTests.java index 635a482639197fea3ea3d5d029b77926c5fa1f89..433f34cc683131f875240f07aa8063b49905e022 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVetRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jpa") public class JpaVetRepositoryImplTests extends AbstractVetRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImplTests.java index 7e60adaec1a7db39a4cc2dd0ed5542c092b2b662..97e728a23365805617a76c08e63c1c5bcf9e42fa 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/jpa/JpaVisitRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jpa") public class JpaVisitRepositoryImplTests extends AbstractVisitRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImplTests.java index afd2cb40e58949928a2f7320de9e16c6f9086438..3130dc604078f7b17d2817aa992be32704b6706e 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaOwnerRepositoryImplTests.java @@ -8,27 +8,19 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Provides the following services: - * <ul> - * <li>Injects test dependencies, meaning that we don't need to perform - * application context lookups. See the setClinic() method. Injection uses - * autowiring by type.</li> - * <li>Executes each test method in its own transaction, which is automatically - * rolled back by default. This means that even if tests insert or otherwise - * change database state, there is no need for a teardown or cleanup script.</li> - * </ul> - * <p> - * </p> + * <p> Provides the following services: <ul> <li>Injects test dependencies, meaning that we don't need to perform + * application context lookups. See the setClinic() method. Injection uses autowiring by type.</li> <li>Executes each + * test method in its own transaction, which is automatically rolled back by default. This means that even if tests + * insert or otherwise change database state, there is no need for a teardown or cleanup script.</li> </ul> <p> </p> * * @author Rod Johnson * @author Sam Brannen * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("spring-data-jpa") public class JpaOwnerRepositoryImplTests extends AbstractOwnerRepositoryTests { - + } \ No newline at end of file diff --git a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaPetRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaPetRepositoryImplTests.java index ebcdbd965a70ddeb11bb723387f126860f87c7a2..842380d513169e299be9aecc3d741d8520c79364 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaPetRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaPetRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("spring-data-jpa") public class JpaPetRepositoryImplTests extends AbstractPetRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVetRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVetRepositoryImplTests.java index 84fdf99172e19da129091e494469f522f486542d..204cb6a7ba91830fe93a4d2bad1dc0699e48ab00 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVetRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVetRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("spring-data-jpa") public class JpaVetRepositoryImplTests extends AbstractVetRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVisitRepositoryImplTests.java b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVisitRepositoryImplTests.java index 146748a1d5a1a1aa46d4d0ccd067d3a365802875..0705700ae6641291149ff440033c1192f7a81052 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVisitRepositoryImplTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/JpaVisitRepositoryImplTests.java @@ -7,20 +7,15 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** - * <p> - * Integration tests for the {@link JdbcClinicImpl} implementation. - * </p> - * <p> - * </p> + * <p> Integration tests for the {@link JdbcClinicImpl} implementation. </p> <p> </p> * * @author Thomas Risberg - * @author Michael Isvy + * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("spring-data-jpa") public class JpaVisitRepositoryImplTests extends AbstractVisitRepositoryTests { - - + } diff --git a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepositoryTests.java b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepositoryTests.java index ba07be4b31e9197c8f8f382604bc7576287b2ba2..de53fa0489bb52f592423a296340fbe4be74d518 100644 --- a/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepositoryTests.java +++ b/src/test/java/org/springframework/samples/petclinic/repository/springdatajpa/SpringDataOwnerRepositoryTests.java @@ -11,9 +11,9 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * @author Michael Isvy */ -@ContextConfiguration(locations={"classpath:spring/dao-config.xml"}) +@ContextConfiguration(locations = {"classpath:spring/dao-config.xml"}) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("spring-data-jpa") public class SpringDataOwnerRepositoryTests extends AbstractOwnerRepositoryTests { - + } \ No newline at end of file diff --git a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java index 90b52e0b33fabf08ecbeb3ddeff0018a158c846b..51458c86f0b34d63f7f3e501acd7072ebb2d7fcb 100644 --- a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java +++ b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTest.java @@ -16,14 +16,8 @@ package org.springframework.samples.petclinic.web; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.sun.syndication.feed.atom.Entry; +import com.sun.syndication.feed.atom.Feed; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; @@ -31,63 +25,68 @@ import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.PetType; import org.springframework.samples.petclinic.model.Visit; -import com.sun.syndication.feed.atom.Entry; -import com.sun.syndication.feed.atom.Feed; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; /** - * @author Arjen Poutsma + * @author Arjen Poutsma * @author Michael Isvy */ public class VisitsAtomViewTest { - private VetsAtomView visitView; - - private Map<String, Object> model; - - private Feed feed; - - @Before - public void setUp() { - visitView = new VetsAtomView(); - PetType dog = new PetType(); - dog.setName("dog"); - Pet bello = new Pet(); - bello.setName("Bello"); - bello.setType(dog); - Visit belloVisit = new Visit(); - belloVisit.setPet(bello); - belloVisit.setDate(new DateTime(2009, 1, 1, 1, 1)); - belloVisit.setDescription("Bello visit"); - Pet wodan = new Pet(); - wodan.setName("Wodan"); - wodan.setType(dog); - Visit wodanVisit = new Visit(); - wodanVisit.setPet(wodan); - wodanVisit.setDate(new DateTime(2009, 1, 2, 1, 1)); - wodanVisit.setDescription("Wodan visit"); - List<Visit> visits = new ArrayList<Visit>(); - visits.add(belloVisit); - visits.add(wodanVisit); - - model = new HashMap<String, Object>(); - model.put("visits", visits); - feed = new Feed(); - - } - - - @Test - public void buildFeedMetadata() { - visitView.buildFeedMetadata(model, feed, null); - - assertNotNull("No id set", feed.getId()); - assertNotNull("No title set", feed.getTitle()); - assertEquals("Invalid update set", new DateTime(2009, 1, 2, 1, 1).toDate(), feed.getUpdated()); - } - - @Test - public void buildFeedEntries() throws Exception { - List<Entry> entries = visitView.buildFeedEntries(model, null, null); - assertEquals("Invalid amount of entries", 2, entries.size()); - } + private VetsAtomView visitView; + + private Map<String, Object> model; + + private Feed feed; + + @Before + public void setUp() { + visitView = new VetsAtomView(); + PetType dog = new PetType(); + dog.setName("dog"); + Pet bello = new Pet(); + bello.setName("Bello"); + bello.setType(dog); + Visit belloVisit = new Visit(); + belloVisit.setPet(bello); + belloVisit.setDate(new DateTime(2009, 1, 1, 1, 1)); + belloVisit.setDescription("Bello visit"); + Pet wodan = new Pet(); + wodan.setName("Wodan"); + wodan.setType(dog); + Visit wodanVisit = new Visit(); + wodanVisit.setPet(wodan); + wodanVisit.setDate(new DateTime(2009, 1, 2, 1, 1)); + wodanVisit.setDescription("Wodan visit"); + List<Visit> visits = new ArrayList<Visit>(); + visits.add(belloVisit); + visits.add(wodanVisit); + + model = new HashMap<String, Object>(); + model.put("visits", visits); + feed = new Feed(); + + } + + + @Test + public void buildFeedMetadata() { + visitView.buildFeedMetadata(model, feed, null); + + assertNotNull("No id set", feed.getId()); + assertNotNull("No title set", feed.getTitle()); + assertEquals("Invalid update set", new DateTime(2009, 1, 2, 1, 1).toDate(), feed.getUpdated()); + } + + @Test + public void buildFeedEntries() throws Exception { + List<Entry> entries = visitView.buildFeedEntries(model, null, null); + assertEquals("Invalid amount of entries", 2, entries.size()); + } } diff --git a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTestWithContainer-config.xml b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTestWithContainer-config.xml index e0fd0acd02f2b7d0eb87db84adb9672323f8add1..75f913087391e261b2669b92780e584fd00aac86 100644 --- a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTestWithContainer-config.xml +++ b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewTestWithContainer-config.xml @@ -2,10 +2,12 @@ <!-- - 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" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - <import resource="classpath:spring/dao-config.xml"/> - <import resource="classpath:spring/mvc-core-config.xml"/> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd"> + + <import resource="classpath:spring/dao-config.xml"/> + <import resource="classpath:spring/mvc-core-config.xml"/> </beans> diff --git a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewWithContainerTest.java b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewWithContainerTest.java index 1cfcdcf88877fee27f9e75e2fb63ad55e55fff48..542c2ee4edcb576bf027b7220ff8d3235ad20621 100644 --- a/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewWithContainerTest.java +++ b/src/test/java/org/springframework/samples/petclinic/web/VisitsAtomViewWithContainerTest.java @@ -16,12 +16,6 @@ package org.springframework.samples.petclinic.web; -import static org.hamcrest.Matchers.containsString; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,8 +30,12 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + /** - * @author Arjen Poutsma + * @author Arjen Poutsma * @author Michael Isvy */ @RunWith(SpringJUnit4ClassRunner.class) @@ -48,23 +46,24 @@ import org.springframework.web.context.WebApplicationContext; @ActiveProfiles("jdbc") public class VisitsAtomViewWithContainerTest { - @Autowired - private WebApplicationContext webApplicationContext; + @Autowired + private WebApplicationContext webApplicationContext; + + private MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build(); + } - private MockMvc mockMvc; - - @Before - public void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build(); - } + @Test + public void getVisits() throws Exception { + //gDickens: MediaType is not used + MediaType mediaType = MediaType.APPLICATION_ATOM_XML; + ResultActions actions = this.mockMvc.perform(get("/vets.atom")); + actions.andExpect(status().isOk()); + actions.andExpect(xpath("//*").string(containsString("Pet ClinicService Visits"))); + actions.andExpect(content().contentType("application/atom+xml")); - @Test - public void getVisits() throws Exception { - MediaType mediaType = MediaType.APPLICATION_ATOM_XML; - ResultActions actions = this.mockMvc.perform(get("/vets.atom")); - actions.andExpect(status().isOk()); - actions.andExpect(xpath("//*").string(containsString("Pet ClinicService Visits"))); - actions.andExpect(content().contentType("application/atom+xml")); - - } + } } diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml new file mode 100644 index 0000000000000000000000000000000000000000..5a3eb20025b872e37a7491a4292c73ee79e11c0b --- /dev/null +++ b/src/test/resources/logback-test.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration debug="true"> + + <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.springframework.samples.petclinic" level="debug"/> + <logger name="org.springframework.test.web" level="trace"/> + + <root level="warn"> + <appender-ref ref="console"/> + </root> +</configuration>