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);