diff --git a/samples/airline/hsqldb/build.xml b/samples/airline/hsqldb/build.xml deleted file mode 100644 index 5488845a..00000000 --- a/samples/airline/hsqldb/build.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/airline/pom.xml b/samples/airline/pom.xml index 707704e0..2de9b9e5 100644 --- a/samples/airline/pom.xml +++ b/samples/airline/pom.xml @@ -1,4 +1,5 @@ - + spring-ws-samples org.springframework.ws @@ -31,153 +32,6 @@ - - - - hsqldb - - - hsqldb - hsqldb - 1.8.0.7 - runtime - - - - - org.hsqldb.jdbcDriver - sa - - jdbc:hsqldb:hsql://localhost/airline - org.hibernate.dialect.HSQLDialect - - - - - - org.codehaus.mojo - sql-maven-plugin - - - hsqldb - hsqldb - 1.8.0.7 - - - - ${jdbc.driverClassName} - ${jdbc.url} - ${jdbc.username} - ${jdbc.password} - - ${basedir}/src/main/sql/hsqldb/airline-schema.sql - ${basedir}/src/main/sql/airline-dataload.sql - - - - - - - - mysql - - - mysql - mysql-connector-java - 5.0.4 - - - - - com.mysql.jdbc.Driver - airline - airline - jdbc:mysql://localhost/airline - org.hibernate.dialect.MySQLInnoDBDialect - - - - - - org.codehaus.mojo - sql-maven-plugin - - - mysql - mysql-connector-java - 5.0.4 - - - - ${jdbc.driverClassName} - ${jdbc.url} - ${jdbc.username} - ${jdbc.password} - - ${basedir}/src/main/sql/mysql/airline-schema.sql - ${basedir}/src/main/sql/airline-dataload.sql - - - - - - - - postgresql - - - postgresql - postgresql - 8.1-407.jdbc3 - - - - - org.postgresql.Driver - airline - airline - jdbc:postgresql://localhost/airline - org.hibernate.dialect.PostgreSQLDialect - - - - - - org.codehaus.mojo - sql-maven-plugin - - - postgresql - postgresql - 8.1-407.jdbc3 - - - - ${jdbc.driverClassName} - ${jdbc.url} - ${jdbc.username} - ${jdbc.password} - - ${basedir}/src/main/sql/postgresql/airline-schema.sql - ${basedir}/src/main/sql/airline-dataload.sql - - - - - - - - - - org.hsqldb.jdbcDriver - sa - - jdbc:hsqldb:mem:airline - org.hibernate.dialect.HSQLDialect - create-drop - java.net @@ -228,6 +82,23 @@ src/main/webapp/WEB-INF/xsd + + maven-antrun-plugin + + + process-classes + + + + + + + run + + + + @@ -329,26 +200,26 @@ com.sun.xml.bind jaxb-impl - 2.1.3 + 2.1.5 runtime - + - org.hibernate - hibernate-entitymanager - 3.2.1.ga + org.apache.openjpa + openjpa-lib + 1.0.0 + + + org.apache.openjpa + openjpa-persistence-jdbc + 1.0.0 + + + javax.activation + activation + 1.1 runtime - - org.hibernate - hibernate-annotations - 3.2.1.ga - - - org.hibernate - hibernate - 3.2.4.sp1 - commons-dbcp commons-dbcp @@ -369,7 +240,7 @@ hsqldb hsqldb 1.8.0.7 - test + runtime @@ -426,7 +297,7 @@ org.acegisecurity acegi-security-tiger - 1.0.3 + 1.0.5 org.springframework @@ -441,12 +312,5 @@ test 2.2 - - - easymock - easymock - 1.2_Java1.3 - test - diff --git a/samples/airline/readme.txt b/samples/airline/readme.txt index ef076104..77bc7a4f 100644 --- a/samples/airline/readme.txt +++ b/samples/airline/readme.txt @@ -12,28 +12,11 @@ Multiple clients are available, showing interoperability with Axis 1, SAAJ, C#, 2. INSTALLATION -The Airline sample is a normal web application that connects to a database of your choice. By using Maven2 profiles, it -supports three databases: HSQLDB (the easiest to setup), MySQL, or PostgreSQL. +The Airline sample is a normal web application that connects to a HSQLDB database. -To execute the sample with the supplied HSQLDB: +To execute the sample, run "mvn jetty:run" to run the sample in the Jetty6 Web container. -1. Start a command shell in the subdirectory hsqldb, and run "ant". This starts a HSQLDB server with a database named - airline. -2. Run "mvn -P hsqldb sql:execute" to create the schema and insert data into the database. -3. Run "mvn -P hsqldb jetty:run" to run the sample in the Jetty6 Web container. - -To execute the sample with MySQL or PostgreSQL: - -1. Change the properties in the pom.xml file to reflect your database connection settings. There are three profiles - (one for each supported database), so make sure to edit the right section. The areas to change are indicated with - comments. -2. Run "mvn -P sql:execute", where is "mysql" or "postgresql", to create the schema and insert - data into the database. -3. Run "mvn -P jetty:run", where is "mysql" or "postgresql", to run the sample in the Jetty6 - Web container. - -To create a war file instead of running in Jetty, follow the steps above, but replace the "jetty:run" with "package" in -the last step. +To create a war file instead of running in Jetty, use "mvn package". 3. THE CLIENTS diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/TicketDao.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/TicketDao.java index 44833eea..e3be0acd 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/TicketDao.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/TicketDao.java @@ -21,6 +21,6 @@ import org.springframework.ws.samples.airline.domain.Ticket; public interface TicketDao { - Ticket save(Ticket ticket) throws DataAccessException; + void save(Ticket ticket) throws DataAccessException; } diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/DatabaseInitializer.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/DatabaseInitializer.java new file mode 100644 index 00000000..311e95f6 --- /dev/null +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/DatabaseInitializer.java @@ -0,0 +1,102 @@ +/* + * Copyright 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.airline.dao.jpa; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.joda.time.DateTime; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallbackWithoutResult; +import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.ws.samples.airline.domain.Airport; +import org.springframework.ws.samples.airline.domain.Flight; +import org.springframework.ws.samples.airline.domain.FrequentFlyer; +import org.springframework.ws.samples.airline.domain.ServiceClass; + +/** + * A simple class that uses JPA to initialize the database. + * + * @author Arjen Poutsma + * @since 1.1.0 + */ +public class DatabaseInitializer implements InitializingBean { + + private static final Log logger = LogFactory.getLog(DatabaseInitializer.class); + + @PersistenceContext + private EntityManager entityManager; + + private Airport amsterdam; + + private Airport venice; + + private TransactionTemplate transactionTemplate; + + public void setTransactionManager(PlatformTransactionManager transactionManager) { + this.transactionTemplate = new TransactionTemplate(transactionManager); + } + + public void afterPropertiesSet() throws Exception { + transactionTemplate.execute(new TransactionCallbackWithoutResult() { + protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { + logger.info("Initializing Database"); + createAirports(); + createFlights(); + createFrequentFlyers(); + } + }); + } + + private void createAirports() { + amsterdam = new Airport("AMS", "Schiphol Airport", "Amsterdam"); + entityManager.persist(amsterdam); + venice = new Airport("VCE", "Marco Polo Airport", "Venice"); + entityManager.persist(venice); + } + + private void createFlights() { + Flight flight = new Flight(); + flight.setNumber("KL1653"); + flight.setDepartureTime(new DateTime(2006, 1, 31, 10, 5, 0, 0)); + flight.setFrom(amsterdam); + flight.setArrivalTime(new DateTime(2006, 1, 31, 12, 25, 0, 0)); + flight.setTo(venice); + flight.setServiceClass(ServiceClass.ECONOMY); + flight.setSeatsAvailable(5); + flight.setMiles(200); + entityManager.persist(flight); + flight = new Flight(); + flight.setNumber("KL1654"); + flight.setDepartureTime(new DateTime(2006, 2, 5, 12, 40, 0, 0)); + flight.setFrom(venice); + flight.setArrivalTime(new DateTime(2006, 2, 5, 14, 15, 0, 0)); + flight.setTo(amsterdam); + flight.setServiceClass(ServiceClass.ECONOMY); + flight.setSeatsAvailable(5); + flight.setMiles(200); + entityManager.persist(flight); + } + + private void createFrequentFlyers() { + entityManager.persist(new FrequentFlyer("John", "Doe", "john", "changeme")); + } +} diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaFlightDao.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaFlightDao.java index c3185767..72ca105d 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaFlightDao.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaFlightDao.java @@ -40,11 +40,11 @@ public class JpaFlightDao implements FlightDao { String toAirportCode, Interval interval, ServiceClass serviceClass) throws DataAccessException { - Query query = entityManager.createQuery("SELECT f FROM Flight f WHERE f.from.code = :from " + - "AND f.to.code = :to AND f.departureTime >= :start AND f.departureTime <= :end AND " + + Query query = entityManager.createQuery("SELECT f FROM Flight f WHERE f.from.code = :fromParam " + + "AND f.to.code = :toParam AND f.departureTime >= :start AND f.departureTime <= :end AND " + "f.serviceClass = :class"); - query.setParameter("from", fromAirportCode); - query.setParameter("to", toAirportCode); + query.setParameter("fromParam", fromAirportCode); + query.setParameter("toParam", toAirportCode); query.setParameter("start", interval.getStart()); query.setParameter("end", interval.getEnd()); query.setParameter("class", serviceClass); diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDao.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDao.java index e4a1517e..ba11a44c 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDao.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDao.java @@ -30,7 +30,7 @@ public class JpaTicketDao implements TicketDao { @PersistenceContext private EntityManager entityManager; - public Ticket save(Ticket ticket) throws DataAccessException { - return entityManager.merge(ticket); + public void save(Ticket ticket) throws DataAccessException { + entityManager.persist(ticket); } } diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Flight.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Flight.java index a94b8ff2..102859f0 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Flight.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Flight.java @@ -27,7 +27,7 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import org.hibernate.annotations.Type; +import org.apache.openjpa.persistence.Persistent; import org.joda.time.DateTime; @Entity @@ -43,7 +43,7 @@ public class Flight implements Serializable { private String number; @Column(name = "DEPARTURE_TIME") - @Type(type = "org.springframework.ws.samples.airline.domain.hibernate.DateTimeUserType") + @Persistent private DateTime departureTime; @ManyToOne @@ -51,7 +51,7 @@ public class Flight implements Serializable { private Airport from; @Column(name = "ARRIVAL_TIME") - @Type(type = "org.springframework.ws.samples.airline.domain.hibernate.DateTimeUserType") + @Persistent private DateTime arrivalTime; @ManyToOne @@ -160,11 +160,7 @@ public class Flight implements Serializable { if (!departureTime.equals(flight.departureTime)) { return false; } - if (!number.equals(flight.number)) { - return false; - } - - return true; + return number.equals(flight.number); } public int hashCode() { diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Ticket.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Ticket.java index 6eed2097..da3593f1 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Ticket.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/Ticket.java @@ -31,7 +31,7 @@ import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.Table; -import org.hibernate.annotations.Type; +import org.apache.openjpa.persistence.Persistent; import org.joda.time.LocalDate; @Entity @@ -43,7 +43,7 @@ public class Ticket implements Serializable { private Long id; @Column(name = "ISSUE_DATE") - @Type(type = "org.springframework.ws.samples.airline.domain.hibernate.LocalDateUserType") + @Persistent private LocalDate issueDate; @ManyToOne diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/hibernate/DateTimeUserType.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/hibernate/DateTimeUserType.java deleted file mode 100644 index 1f4e320b..00000000 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/hibernate/DateTimeUserType.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.samples.airline.domain.hibernate; - -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.sql.Types; - -import org.hibernate.HibernateException; -import org.hibernate.usertype.UserType; -import org.joda.time.DateTime; - -/** @author Arjen Poutsma */ -public class DateTimeUserType implements UserType { - - public int[] sqlTypes() { - return new int[]{Types.TIMESTAMP}; - } - - public Class returnedClass() { - return DateTime.class; - } - - public boolean isMutable() { - return false; - } - - public Object deepCopy(Object value) throws HibernateException { - return value; - } - - public Serializable disassemble(Object value) throws HibernateException { - return (Serializable) value; - } - - public Object assemble(Serializable cached, Object owner) throws HibernateException { - return cached; - } - - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return original; - } - - public boolean equals(Object x, Object y) throws HibernateException { - return x == y || !(x == null || y == null) && x.equals(y); - } - - public int hashCode(Object x) throws HibernateException { - return x.hashCode(); - } - - public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { - Timestamp timestamp = rs.getTimestamp(names[0]); - if (rs.wasNull()) { - return null; - } - return new DateTime(timestamp); - } - - public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { - if (value == null) { - st.setNull(index, Types.TIMESTAMP); - } - else { - DateTime dateTime = (DateTime) value; - Timestamp timestamp = new Timestamp(dateTime.getMillis()); - st.setTimestamp(index, timestamp); - } - } - -} diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/hibernate/LocalDateUserType.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/hibernate/LocalDateUserType.java deleted file mode 100644 index 45d63868..00000000 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/hibernate/LocalDateUserType.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2007 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.samples.airline.domain.hibernate; - -import java.io.Serializable; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; - -import org.hibernate.HibernateException; -import org.hibernate.dialect.Dialect; -import org.hibernate.type.LiteralType; -import org.hibernate.usertype.UserType; -import org.joda.time.LocalDate; - -public class LocalDateUserType implements UserType, LiteralType { - - public int[] sqlTypes() { - return new int[]{Types.DATE}; - } - - public Class returnedClass() { - return LocalDate.class; - } - - public boolean isMutable() { - return false; - } - - public Object deepCopy(Object value) throws HibernateException { - return value; - } - - public Serializable disassemble(Object value) throws HibernateException { - return (Serializable) value; - } - - public Object assemble(Serializable cached, Object owner) throws HibernateException { - return cached; - } - - public Object replace(Object original, Object target, Object owner) throws HibernateException { - return original; - } - - public boolean equals(Object x, Object y) throws HibernateException { - return x == y || !(x == null || y == null) && x.equals(y); - } - - public int hashCode(Object x) throws HibernateException { - return x.hashCode(); - } - - public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException { - Date sqlDate = rs.getDate(names[0]); - if (rs.wasNull()) { - return null; - } - return new LocalDate(sqlDate.getTime()); - } - - public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException { - if (value == null) { - st.setNull(index, Types.DATE); - } - else { - LocalDate localDate = (LocalDate) value; - Date sqlDate = new Date(localDate.toDateMidnight().getMillis()); - st.setDate(index, sqlDate); - } - } - - public String objectToSQLString(Object value, Dialect dialect) throws Exception { - LocalDate localDate = (LocalDate) value; - return localDate.toString(); - } -} diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/openjpa/DateTimeValueHandler.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/openjpa/DateTimeValueHandler.java new file mode 100644 index 00000000..544e0b0d --- /dev/null +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/openjpa/DateTimeValueHandler.java @@ -0,0 +1,55 @@ +/* + * Copyright 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.airline.domain.openjpa; + +import java.sql.Timestamp; + +import org.apache.openjpa.jdbc.kernel.JDBCStore; +import org.apache.openjpa.jdbc.meta.JavaSQLTypes; +import org.apache.openjpa.jdbc.meta.ValueMapping; +import org.apache.openjpa.jdbc.meta.strats.AbstractValueHandler; +import org.apache.openjpa.jdbc.schema.Column; +import org.apache.openjpa.jdbc.schema.ColumnIO; +import org.joda.time.DateTime; + +/** + * @author Arjen Poutsma + * @since 1.1.0 + */ +public class DateTimeValueHandler extends AbstractValueHandler { + + private static final DateTimeValueHandler instance = new DateTimeValueHandler(); + + public static DateTimeValueHandler getInstance() { + return instance; + } + + public Column[] map(ValueMapping vm, String name, ColumnIO io, boolean adapt) { + Column col = new Column(); + col.setName(name); + col.setJavaType(JavaSQLTypes.TIMESTAMP); + return new Column[]{col}; + } + + public Object toDataStoreValue(ValueMapping valueMapping, Object val, JDBCStore jdbcStore) { + return val == null ? null : new Timestamp(((DateTime) val).getMillis()); + } + + public Object toObjectValue(ValueMapping valueMapping, Object val) { + return val == null ? null : new DateTime(val); + } +} diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/openjpa/LocalDateValueHandler.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/openjpa/LocalDateValueHandler.java new file mode 100644 index 00000000..d19c623b --- /dev/null +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/domain/openjpa/LocalDateValueHandler.java @@ -0,0 +1,49 @@ +/* + * Copyright 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.samples.airline.domain.openjpa; + +import java.sql.Date; + +import org.apache.openjpa.jdbc.kernel.JDBCStore; +import org.apache.openjpa.jdbc.meta.JavaSQLTypes; +import org.apache.openjpa.jdbc.meta.ValueMapping; +import org.apache.openjpa.jdbc.meta.strats.AbstractValueHandler; +import org.apache.openjpa.jdbc.schema.Column; +import org.apache.openjpa.jdbc.schema.ColumnIO; +import org.joda.time.LocalDate; + +/** + * @author Arjen Poutsma + * @since 1.1.0 + */ +public class LocalDateValueHandler extends AbstractValueHandler { + + public Column[] map(ValueMapping vm, String name, ColumnIO io, boolean adapt) { + Column col = new Column(); + col.setName(name); + col.setJavaType(JavaSQLTypes.DATE); + return new Column[]{col}; + } + + public Object toDataStoreValue(ValueMapping valueMapping, Object val, JDBCStore jdbcStore) { + return val == null ? null : new Date(((LocalDate) val).toDateMidnight().getMillis()); + } + + public Object toObjectValue(ValueMapping valueMapping, Object val) { + return val == null ? null : new LocalDate(val); + } +} diff --git a/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java b/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java index fc7e9324..4e6456a7 100644 --- a/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java +++ b/samples/airline/src/main/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImpl.java @@ -91,7 +91,8 @@ public class AirlineServiceImpl implements AirlineService { } flight.substractSeats(passengers.size()); flightDao.update(flight); - return ticketDao.save(ticket); + ticketDao.save(ticket); + return ticket; } public Flight getFlight(Long id) throws NoSuchFlightException { diff --git a/samples/airline/src/main/resources/META-INF/persistence.xml b/samples/airline/src/main/resources/META-INF/persistence.xml index 6ad8d053..5f671782 100644 --- a/samples/airline/src/main/resources/META-INF/persistence.xml +++ b/samples/airline/src/main/resources/META-INF/persistence.xml @@ -1,9 +1,9 @@ - + org.apache.openjpa.persistence.PersistenceProviderImpl org.springframework.ws.samples.airline.domain.Airport org.springframework.ws.samples.airline.domain.Flight org.springframework.ws.samples.airline.domain.FrequentFlyer diff --git a/samples/airline/src/main/resources/log4j.properties b/samples/airline/src/main/resources/log4j.properties index 0f73a758..c44d7a4a 100644 --- a/samples/airline/src/main/resources/log4j.properties +++ b/samples/airline/src/main/resources/log4j.properties @@ -1,6 +1,7 @@ log4j.rootLogger=WARN, stdout log4j.logger.org.springframework.ws=DEBUG log4j.logger.org.springframework.xml=DEBUG +log4j.logger.openjpa=INFO log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout diff --git a/samples/airline/src/main/resources/org/springframework/ws/samples/airline/dao/jpa/applicationContext-jpa.xml b/samples/airline/src/main/resources/org/springframework/ws/samples/airline/dao/jpa/applicationContext-jpa.xml index e375f89b..894cec18 100644 --- a/samples/airline/src/main/resources/org/springframework/ws/samples/airline/dao/jpa/applicationContext-jpa.xml +++ b/samples/airline/src/main/resources/org/springframework/ws/samples/airline/dao/jpa/applicationContext-jpa.xml @@ -1,9 +1,6 @@ - + @@ -25,13 +22,26 @@ + + + + + - - + + - + + commons + buildSchema + + FieldStrategies='org.joda.time.DateTime=org.springframework.ws.samples.airline.domain.openjpa.DateTimeValueHandler, + org.joda.time.LocalDate=org.springframework.ws.samples.airline.domain.openjpa.LocalDateValueHandler' + + org.apache.openjpa.jdbc.sql.HSQLDictionary + @@ -40,14 +50,10 @@ - - - - - - - - + + + + diff --git a/samples/airline/src/main/sql/airline-dataload.sql b/samples/airline/src/main/sql/airline-dataload.sql deleted file mode 100644 index d898b23c..00000000 --- a/samples/airline/src/main/sql/airline-dataload.sql +++ /dev/null @@ -1,9 +0,0 @@ -INSERT INTO AIRPORT(CODE, NAME, CITY) VALUES('AMS', 'Schiphol Airport', 'Amsterdam'); -INSERT INTO AIRPORT(CODE, NAME, CITY) VALUES('VCE', 'Marco Polo Airport', 'Venice'); - -INSERT INTO FLIGHT(ID, NUMBER, DEPARTURE_TIME, FROM_AIRPORT_CODE, ARRIVAL_TIME, TO_AIRPORT_CODE, SERVICE_CLASS, SEATS_AVAILABLE, MILES) VALUES (1,'KL1653','2006-01-31 10:05:00', 'AMS', '2006-01-31 12:25:00', 'VCE', 'ECONOMY', 5, 200); - -INSERT INTO FLIGHT(ID, NUMBER, DEPARTURE_TIME, FROM_AIRPORT_CODE, ARRIVAL_TIME, TO_AIRPORT_CODE, SERVICE_CLASS, SEATS_AVAILABLE, MILES) VALUES (2,'KL1654','2006-02-05 12:40:00', 'VCE', '2006-02-05 14:15:00', 'AMS', 'ECONOMY', 5, 200); - -INSERT INTO PASSENGER(ID, FIRST_NAME, LAST_NAME) VALUES (1, 'John', 'Doe'); -INSERT INTO FREQUENT_FLYER(PASSENGER_ID, USERNAME, PASSWORD, MILES) VALUES (1, 'john', 'changeme', 10); \ No newline at end of file diff --git a/samples/airline/src/main/sql/hsqldb/airline-schema.sql b/samples/airline/src/main/sql/hsqldb/airline-schema.sql deleted file mode 100644 index c51d829e..00000000 --- a/samples/airline/src/main/sql/hsqldb/airline-schema.sql +++ /dev/null @@ -1,61 +0,0 @@ -DROP TABLE FREQUENT_FLYER IF EXISTS; -DROP TABLE PASSENGER_TICKET IF EXISTS; -DROP TABLE PASSENGER IF EXISTS; -DROP TABLE TICKET IF EXISTS; -DROP TABLE FLIGHT IF EXISTS; -DROP TABLE AIRPORT IF EXISTS; - -CREATE TABLE AIRPORT ( - CODE char(3) NOT NULL, - NAME varchar(20) NOT NULL, - CITY varchar(255) NOT NULL, - PRIMARY KEY (CODE) -); - -CREATE TABLE FLIGHT ( - ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1), - NUMBER VARCHAR(20) NOT NULL, - DEPARTURE_TIME TIMESTAMP NOT NULL, - FROM_AIRPORT_CODE CHAR(3) NOT NULL, - ARRIVAL_TIME TIMESTAMP NOT NULL, - TO_AIRPORT_CODE CHAR(3) NOT NULL, - SEATS_AVAILABLE INT NOT NULL, - SERVICE_CLASS VARCHAR(10) NOT NULL, - MILES INT NOT NULL, - PRIMARY KEY (ID), - UNIQUE (NUMBER, DEPARTURE_TIME), - CONSTRAINT FK_FLIGHT_AIRPORT_FROM FOREIGN KEY (FROM_AIRPORT_CODE) REFERENCES AIRPORT, - CONSTRAINT FK_FLIGHT_AIRPORT_TO FOREIGN KEY (TO_AIRPORT_CODE) REFERENCES AIRPORT -); - -CREATE TABLE TICKET ( - ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1), - ISSUE_DATE DATE NOT NULL, - FLIGHT_ID BIGINT NOT NULL, - PRIMARY KEY (ID), - CONSTRAINT FK_TICKET_FLIGHT FOREIGN KEY (FLIGHT_ID) REFERENCES FLIGHT -); - -CREATE TABLE PASSENGER ( - ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1), - FIRST_NAME VARCHAR(30), - LAST_NAME VARCHAR(30), - PRIMARY KEY (ID) -); - -CREATE TABLE PASSENGER_TICKET ( - TICKET_ID BIGINT NOT NULL, - PASSENGER_ID BIGINT NOT NULL, - PRIMARY KEY (TICKET_ID, PASSENGER_ID), - CONSTRAINT PASSENGER_TICKET_TICKET FOREIGN KEY (TICKET_ID) REFERENCES TICKET, - CONSTRAINT PASSENGER_TICKET_PASSENGER FOREIGN KEY (PASSENGER_ID) REFERENCES PASSENGER -); - -CREATE TABLE FREQUENT_FLYER ( - PASSENGER_ID BIGINT NOT NULL, - MILES INTEGER, - PASSWORD VARCHAR(255), - USERNAME VARCHAR(255), - PRIMARY KEY (PASSENGER_ID), - CONSTRAINT FREQUENT_FLYER_PASSENGER FOREIGN KEY (PASSENGER_ID) REFERENCES PASSENGER -) \ No newline at end of file diff --git a/samples/airline/src/main/sql/mysql/airline-schema.sql b/samples/airline/src/main/sql/mysql/airline-schema.sql deleted file mode 100644 index f9a48ee5..00000000 --- a/samples/airline/src/main/sql/mysql/airline-schema.sql +++ /dev/null @@ -1,56 +0,0 @@ -USE AIRLINE; - -DROP TABLE IF EXISTS FREQUENT_FLYER; -DROP TABLE IF EXISTS PASSENGER_TICKET; -DROP TABLE IF EXISTS PASSENGER; -DROP TABLE IF EXISTS TICKET; -DROP TABLE IF EXISTS FLIGHT; -DROP TABLE IF EXISTS AIRPORT; - -CREATE TABLE AIRPORT ( - CODE CHAR(3) NOT NULL PRIMARY KEY, - NAME VARCHAR(20) NOT NULL, - CITY VARCHAR(20) NOT NULL -) TYPE=INNODB; - -CREATE TABLE FLIGHT ( - ID INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, - NUMBER VARCHAR(20) NOT NULL, - DEPARTURE_TIME DATETIME NOT NULL, - FROM_AIRPORT_CODE CHAR(3) NOT NULL REFERENCES AIRPORT(CODE), - ARRIVAL_TIME DATETIME NOT NULL, - TO_AIRPORT_CODE CHAR(3) NOT NULL REFERENCES AIRPORT(CODE), - SERVICE_CLASS VARCHAR(10) NOT NULL, - SEATS_AVAILABLE INT(4) UNSIGNED NOT NULL, - MILES INT(4) UNSIGNED NOT NULL, - UNIQUE KEY IDX_NUMBER_DEPARTURE_TIME (NUMBER, DEPARTURE_TIME) -) TYPE=INNODB; - -CREATE TABLE TICKET ( - ID INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, - ISSUE_DATE DATE NOT NULL, - FLIGHT_ID INT(4) UNSIGNED NOT NULL REFERENCES FLIGHT(ID) -) TYPE=INNODB; - -CREATE TABLE PASSENGER ( - ID INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, - FIRST_NAME VARCHAR(30), - LAST_NAME VARCHAR(30) -) TYPE=INNODB; - -CREATE TABLE PASSENGER_TICKET ( - PASSENGER_ID INT(4) UNSIGNED NOT NULL REFERENCES PASSENGER(ID), - TICKET_ID INT(4) UNSIGNED NOT NULL REFERENCES TICKET(ID) -) TYPE=INNODB; - -CREATE TABLE FREQUENT_FLYER ( - PASSENGER_ID INT(4) UNSIGNED NOT NULL PRIMARY KEY REFERENCES PASSENGER(ID), - USERNAME VARCHAR(10) NOT NULL, - PASSWORD VARCHAR(10) NOT NULL, - MILES INT(4) UNSIGNED NOT NULL, - UNIQUE KEY IDX_USERNAME (USERNAME) -) TYPE=INNODB; - - - - diff --git a/samples/airline/src/main/sql/postgresql/airline-schema.sql b/samples/airline/src/main/sql/postgresql/airline-schema.sql deleted file mode 100644 index ba9039c3..00000000 --- a/samples/airline/src/main/sql/postgresql/airline-schema.sql +++ /dev/null @@ -1,50 +0,0 @@ -DROP TABLE FREQUENT_FLYER; -DROP TABLE PASSENGER_TICKET; -DROP TABLE PASSENGER; -DROP TABLE TICKET; -DROP TABLE FLIGHT; -DROP TABLE AIRPORT; - -CREATE TABLE AIRPORT ( - CODE CHAR(3) NOT NULL PRIMARY KEY, - NAME VARCHAR(20) NOT NULL, - CITY VARCHAR(20) NOT NULL -); - -CREATE TABLE FLIGHT ( - ID BIGSERIAL NOT NULL PRIMARY KEY, - NUMBER VARCHAR(20) NOT NULL, - DEPARTURE_TIME TIMESTAMP NOT NULL, - FROM_AIRPORT_CODE CHAR(3) NOT NULL REFERENCES AIRPORT(CODE), - ARRIVAL_TIME TIMESTAMP NOT NULL, - TO_AIRPORT_CODE CHAR(3) NOT NULL REFERENCES AIRPORT(CODE), - SERVICE_CLASS VARCHAR(10) NOT NULL, - SEATS_AVAILABLE INT NOT NULL, - MILES INT NOT NULL, - UNIQUE(NUMBER, DEPARTURE_TIME) -); - -CREATE TABLE TICKET ( - ID BIGSERIAL NOT NULL PRIMARY KEY, - ISSUE_DATE DATE NOT NULL, - FLIGHT_ID INT NOT NULL REFERENCES FLIGHT(ID) -); - -CREATE TABLE PASSENGER ( - ID BIGSERIAL NOT NULL PRIMARY KEY, - FIRST_NAME VARCHAR(30), - LAST_NAME VARCHAR(30) -); - -CREATE TABLE PASSENGER_TICKET ( - PASSENGER_ID INT NOT NULL REFERENCES PASSENGER(ID), - TICKET_ID INT NOT NULL REFERENCES TICKET(ID) -); - -CREATE TABLE FREQUENT_FLYER ( - PASSENGER_ID INT NOT NULL PRIMARY KEY REFERENCES PASSENGER(ID), - USERNAME VARCHAR(10) NOT NULL, - PASSWORD VARCHAR(10) NOT NULL, - MILES INT NOT NULL, - UNIQUE (USERNAME) -); diff --git a/samples/airline/src/test/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDaoTest.java b/samples/airline/src/test/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDaoTest.java index 0b62c8c7..292070da 100644 --- a/samples/airline/src/test/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDaoTest.java +++ b/samples/airline/src/test/java/org/springframework/ws/samples/airline/dao/jpa/JpaTicketDaoTest.java @@ -16,25 +16,17 @@ package org.springframework.ws.samples.airline.dao.jpa; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.springframework.test.jpa.AbstractJpaTests; import org.springframework.ws.samples.airline.dao.TicketDao; -import org.springframework.ws.samples.airline.domain.Airport; import org.springframework.ws.samples.airline.domain.Flight; import org.springframework.ws.samples.airline.domain.Passenger; -import org.springframework.ws.samples.airline.domain.ServiceClass; import org.springframework.ws.samples.airline.domain.Ticket; public class JpaTicketDaoTest extends AbstractJpaTests { private TicketDao ticketDao; - private Flight flight; - - private Passenger passenger; - public void setTicketDao(TicketDao ticketDao) { this.ticketDao = ticketDao; } @@ -44,23 +36,6 @@ public class JpaTicketDaoTest extends AbstractJpaTests { return new String[]{"applicationContext-jpa.xml"}; } - @Override - protected void onSetUpBeforeTransaction() throws Exception { - DateTime departureTime = new DateTime(2006, 1, 31, 10, 5, 0, 0, DateTimeZone.UTC); - DateTime arrivalTime = new DateTime(2006, 1, 31, 12, 25, 0, 0, DateTimeZone.UTC); - Airport fromAirport = new Airport("RTM", "Rotterdam Airport", "Rotterdam"); - Airport toAirport = new Airport("OSL", "Gardermoen", "Oslo"); - flight = new Flight(42L); - flight.setNumber("KL1653"); - flight.setDepartureTime(departureTime); - flight.setFrom(fromAirport); - flight.setArrivalTime(arrivalTime); - flight.setTo(toAirport); - flight.setServiceClass(ServiceClass.BUSINESS); - flight.setSeatsAvailable(90); - passenger = new Passenger(42L, "Arjen", "Poutsma"); - } - @Override protected void onSetUpInTransaction() throws Exception { jdbcTemplate.update("INSERT INTO AIRPORT(CODE, NAME, CITY) VALUES('RTM', 'Rotterdam Airport', 'Rotterdam')"); @@ -71,13 +46,15 @@ public class JpaTicketDaoTest extends AbstractJpaTests { } public void testSave() throws Exception { + Passenger passenger = new Passenger("Arjen", "Poutsma"); + Flight flight = sharedEntityManager.find(Flight.class, 42L); Ticket ticket = new Ticket(); ticket.addPassenger(passenger); ticket.setFlight(flight); ticket.setIssueDate(new LocalDate()); int startTicketCount = jdbcTemplate.queryForInt("SELECT COUNT(0) FROM TICKET"); int startPassengerCount = jdbcTemplate.queryForInt("SELECT COUNT(0) FROM PASSENGER"); - ticket = ticketDao.save(ticket); + ticketDao.save(ticket); sharedEntityManager.flush(); assertNotNull("No Id generated", ticket.getId()); int endTicketCount = jdbcTemplate.queryForInt("SELECT COUNT(0) FROM TICKET"); diff --git a/samples/airline/src/test/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImplTest.java b/samples/airline/src/test/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImplTest.java index b3773e2f..1ab8f4dd 100644 --- a/samples/airline/src/test/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImplTest.java +++ b/samples/airline/src/test/java/org/springframework/ws/samples/airline/service/impl/AirlineServiceImplTest.java @@ -21,7 +21,6 @@ import java.util.List; import junit.framework.TestCase; import static org.easymock.EasyMock.*; -import org.easymock.IAnswer; import org.joda.time.DateTime; import org.joda.time.LocalDate; import org.springframework.ws.samples.airline.dao.FlightDao; @@ -68,11 +67,7 @@ public class AirlineServiceImplTest extends TestCase { expect(flightDaoMock.update(flight)).andReturn(flight); Ticket ticket = new Ticket(); ticket.setFlight(flight); - expect(ticketDaoMock.save(isA(Ticket.class))).andAnswer(new IAnswer() { - public Ticket answer() throws Throwable { - return (Ticket) getCurrentArguments()[0]; - } - }); + ticketDaoMock.save(isA(Ticket.class)); replay(flightDaoMock, ticketDaoMock, securityServiceMock); @@ -97,11 +92,7 @@ public class AirlineServiceImplTest extends TestCase { expect(securityServiceMock.getFrequentFlyer("john")).andReturn(frequentFlyer); expect(flightDaoMock.getFlight(flightNumber, departureTime)).andReturn(flight); expect(flightDaoMock.update(flight)).andReturn(flight); - expect(ticketDaoMock.save(isA(Ticket.class))).andAnswer(new IAnswer() { - public Ticket answer() throws Throwable { - return (Ticket) getCurrentArguments()[0]; - } - }); + ticketDaoMock.save(isA(Ticket.class)); replay(flightDaoMock, ticketDaoMock, securityServiceMock);