From e22a7833d6408730b35dff808f56b51443c9c0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Fri, 14 Mar 2025 16:16:40 +0100 Subject: [PATCH] Migrate Axis client to Axis2 This commit migrates the Airline client to Axis2. The biggest problem was that Axis2 parses date differently and always adds a timezone. As a result, the input string is no longer compliant with ISO 8601. The server has been updated to tolerate both that format and the one with a timezone attached. The build is also simpler as it leverages the Axis2 wsdl2code maven plugin, rather than calling wsdl2java via ant. Closes gh-16 --- .../.mvn/wrapper/maven-wrapper.jar | Bin .../.mvn/wrapper/maven-wrapper.properties | 0 airline/client/{axis1 => axis}/mvnw | 0 airline/client/{axis1 => axis}/mvnw.cmd | 0 airline/client/axis/pom.xml | 89 +++++++++++++ airline/client/{axis1 => axis}/readme.txt | 0 .../airline/client/axis}/AxisMain.java | 62 ++++++--- .../src/main/resources/log4j.properties | 0 airline/client/axis1/pom.xml | 121 ------------------ .../samples/airline/ws/AirlineEndpoint.java | 47 ++++--- pom.xml | 29 +++-- 11 files changed, 182 insertions(+), 166 deletions(-) rename airline/client/{axis1 => axis}/.mvn/wrapper/maven-wrapper.jar (100%) rename airline/client/{axis1 => axis}/.mvn/wrapper/maven-wrapper.properties (100%) rename airline/client/{axis1 => axis}/mvnw (100%) rename airline/client/{axis1 => axis}/mvnw.cmd (100%) create mode 100644 airline/client/axis/pom.xml rename airline/client/{axis1 => axis}/readme.txt (100%) rename airline/client/{axis1/src/main/java/org/springframework/ws/samples/airline/client/axis1 => axis/src/main/java/org/springframework/ws/samples/airline/client/axis}/AxisMain.java (56%) rename airline/client/{axis1 => axis}/src/main/resources/log4j.properties (100%) delete mode 100644 airline/client/axis1/pom.xml diff --git a/airline/client/axis1/.mvn/wrapper/maven-wrapper.jar b/airline/client/axis/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from airline/client/axis1/.mvn/wrapper/maven-wrapper.jar rename to airline/client/axis/.mvn/wrapper/maven-wrapper.jar diff --git a/airline/client/axis1/.mvn/wrapper/maven-wrapper.properties b/airline/client/axis/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from airline/client/axis1/.mvn/wrapper/maven-wrapper.properties rename to airline/client/axis/.mvn/wrapper/maven-wrapper.properties diff --git a/airline/client/axis1/mvnw b/airline/client/axis/mvnw similarity index 100% rename from airline/client/axis1/mvnw rename to airline/client/axis/mvnw diff --git a/airline/client/axis1/mvnw.cmd b/airline/client/axis/mvnw.cmd similarity index 100% rename from airline/client/axis1/mvnw.cmd rename to airline/client/axis/mvnw.cmd diff --git a/airline/client/axis/pom.xml b/airline/client/axis/pom.xml new file mode 100644 index 0000000..b07193e --- /dev/null +++ b/airline/client/axis/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + org.springframework.ws + spring-ws-samples + 2.1.0-SNAPSHOT + ../../../pom.xml + + airline-client-axis + Spring Web Services Samples - Airline - Client - Axis + + + ${project.basedir}/target/generated-sources/axis + ${project.basedir}/../airline.wsdl + + + + + org.apache.axis2 + axis2-adb + + + org.apache.axis2 + axis2-transport-local + + + org.apache.axis2 + axis2-transport-http + + + + + + + org.apache.axis2 + axis2-wsdl2code-maven-plugin + + + wsdl2code + + wsdl2code + + + + + true + + + http://www.springframework.org/spring-ws/samples/airline/definitions + org.springframework.ws.samples.airline.client.axis + + + http://www.springframework.org/spring-ws/samples/airline/schemas/messages + org.springframework.ws.samples.airline.client.axis + + + http://www.springframework.org/spring-ws/samples/airline/schemas/types + org.springframework.ws.samples.airline.client.axis + + + ${generated-sources} + ${wsdl} + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + process-sources + + add-source + + + + ${generated-sources}/src + + + + + + + + + diff --git a/airline/client/axis1/readme.txt b/airline/client/axis/readme.txt similarity index 100% rename from airline/client/axis1/readme.txt rename to airline/client/axis/readme.txt diff --git a/airline/client/axis1/src/main/java/org/springframework/ws/samples/airline/client/axis1/AxisMain.java b/airline/client/axis/src/main/java/org/springframework/ws/samples/airline/client/axis/AxisMain.java similarity index 56% rename from airline/client/axis1/src/main/java/org/springframework/ws/samples/airline/client/axis1/AxisMain.java rename to airline/client/axis/src/main/java/org/springframework/ws/samples/airline/client/axis/AxisMain.java index dbd81be..0c1a35d 100644 --- a/airline/client/axis1/src/main/java/org/springframework/ws/samples/airline/client/axis1/AxisMain.java +++ b/airline/client/axis/src/main/java/org/springframework/ws/samples/airline/client/axis/AxisMain.java @@ -14,35 +14,39 @@ * limitations under the License. */ -package org.springframework.ws.samples.airline.client.axis1; +package org.springframework.ws.samples.airline.client.axis; import java.rmi.RemoteException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; -import javax.xml.rpc.ServiceException; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.AirportCode; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.BookFlightRequest; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.BookFlightResponse; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.Flight; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.FrequentFlyerUsername; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.GetFlightsRequest; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.GetFlightsResponse; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.Name; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.PassengersChoice; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.Passengers_type0; +import org.springframework.ws.samples.airline.client.axis.AirlineServiceStub.Ticket; /** * Simple client that calls the GetFlights and BookFlight - * operations using JAX-RPC (Axis 1). + * operations using Axis 2 and HTTP. * * @author Arjen Poutsma + * @author Stephane Nicoll */ public class AxisMain { - public static void main(String[] args) throws ServiceException, RemoteException { - - AirlineServiceLocator service = new AirlineServiceLocator(); - - if (args.length > 0) { - service.setAirlineSoap11EndpointAddress(args[0]); - } - - Airline airline = service.getAirlineSoap11(); + public static void main(String[] args) throws RemoteException { + AirlineServiceStub airline = (args.length > 0) ? new AirlineServiceStub(args[0]) : new AirlineServiceStub(); GetFlightsRequest request = new GetFlightsRequest(); - request.setFrom("AMS"); - request.setTo("VCE"); + request.setFrom(createAirportCode("AMS")); + request.setTo(createAirportCode("VCE")); Calendar departureCalendar = Calendar.getInstance(); departureCalendar.set(Calendar.YEAR, 2006); departureCalendar.set(Calendar.MONTH, Calendar.JANUARY); @@ -52,7 +56,8 @@ public class AxisMain { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); System.out.println("Requesting flights on " + dateFormat.format(departureDate)); - Flight[] flights = airline.getFlights(request); + GetFlightsResponse flightsResponse = airline.getFlights(request); + Flight[] flights = flightsResponse.getFlight(); System.out.println("Got " + flights.length + " results"); @@ -61,23 +66,24 @@ public class AxisMain { BookFlightRequest bookFlightRequest = new BookFlightRequest(); bookFlightRequest.setFlightNumber(flights[0].getNumber()); bookFlightRequest.setDepartureTime(flights[0].getDepartureTime()); - BookFlightRequestPassengers passengers = new BookFlightRequestPassengers(); - passengers.setUsername("john"); + Passengers_type0 passengers = new Passengers_type0(); + passengers.addPassengersChoice(createPassenger("john")); bookFlightRequest.setPassengers(passengers); - Ticket ticket = airline.bookFlight(bookFlightRequest); + BookFlightResponse bookFlightResponse = airline.bookFlight(bookFlightRequest); + Ticket ticket = bookFlightResponse.getBookFlightResponse(); writeTicket(ticket); } } private static void writeTicket(Ticket ticket) { - System.out.println("Ticket " + ticket.getId()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); System.out.println("Ticket issue date:\t" + dateFormat.format(ticket.getIssueDate())); - for (int i = 0; i < ticket.getPassengers().length; i++) { - writeName(ticket.getPassengers()[i]); + Name[] passengers = ticket.getPassengers().getPassenger(); + for (Name passenger : passengers) { + writeName(passenger); } writeFlight(ticket.getFlight()); } @@ -103,4 +109,18 @@ public class AxisMain { System.out.println("\t" + flight.getTo().getCity()); } + private static AirportCode createAirportCode(String code) { + AirportCode airportCode = new AirportCode(); + airportCode.setAirportCode(code); + return airportCode; + } + + private static PassengersChoice createPassenger(String username) { + PassengersChoice passenger = new PassengersChoice(); + FrequentFlyerUsername frequentFlyerUsername = new FrequentFlyerUsername(); + frequentFlyerUsername.setFrequentFlyerUsername(username); + passenger.setUsername(frequentFlyerUsername); + return passenger; + } + } diff --git a/airline/client/axis1/src/main/resources/log4j.properties b/airline/client/axis/src/main/resources/log4j.properties similarity index 100% rename from airline/client/axis1/src/main/resources/log4j.properties rename to airline/client/axis/src/main/resources/log4j.properties diff --git a/airline/client/axis1/pom.xml b/airline/client/axis1/pom.xml deleted file mode 100644 index ed373e9..0000000 --- a/airline/client/axis1/pom.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - 4.0.0 - - org.springframework.ws - spring-ws-samples - 2.1.0-SNAPSHOT - ../../../pom.xml - - airline-client-axis1 - Spring Web Services Samples - Airline - Client - Axis1 - - - ${project.basedir}/target/generated-sources/axis - ${project.basedir}/target/classes - ${project.basedir}/../airline.wsdl - - - - - axis - axis - - - org.apache.axis - axis-jaxrpc - - - - - - - org.apache.maven.plugins - maven-antrun-plugin - - - axis - axis - ${axis.version} - - - axis - axis-ant - ${axis.version} - - - - - generate-sources - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - run - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-source - process-sources - - add-source - - - - ${sourcesDir} - - - - - - - - - diff --git a/airline/server/src/main/java/org/springframework/ws/samples/airline/ws/AirlineEndpoint.java b/airline/server/src/main/java/org/springframework/ws/samples/airline/ws/AirlineEndpoint.java index c275fb9..b4d3fef 100644 --- a/airline/server/src/main/java/org/springframework/ws/samples/airline/ws/AirlineEndpoint.java +++ b/airline/server/src/main/java/org/springframework/ws/samples/airline/ws/AirlineEndpoint.java @@ -16,38 +16,52 @@ package org.springframework.ws.samples.airline.ws; -import static org.springframework.ws.samples.airline.ws.AirlineWebServiceConstants.*; - -import jakarta.xml.bind.JAXBElement; - -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; - import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +import jakarta.xml.bind.JAXBElement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.ws.samples.airline.domain.FrequentFlyer; import org.springframework.ws.samples.airline.domain.Passenger; import org.springframework.ws.samples.airline.domain.ServiceClass; -import org.springframework.ws.samples.airline.schema.*; +import org.springframework.ws.samples.airline.schema.BookFlightRequest; +import org.springframework.ws.samples.airline.schema.GetFlightsResponse; +import org.springframework.ws.samples.airline.schema.Name; +import org.springframework.ws.samples.airline.schema.ObjectFactory; +import org.springframework.ws.samples.airline.schema.Ticket; import org.springframework.ws.samples.airline.schema.support.SchemaConversionUtils; import org.springframework.ws.samples.airline.service.AirlineService; import org.springframework.ws.samples.airline.service.NoSeatAvailableException; import org.springframework.ws.samples.airline.service.NoSuchFlightException; import org.springframework.ws.samples.airline.service.NoSuchFrequentFlyerException; -import org.springframework.ws.server.endpoint.annotation.*; -import org.w3c.dom.Document; -import org.w3c.dom.Element; +import org.springframework.ws.server.endpoint.annotation.Endpoint; +import org.springframework.ws.server.endpoint.annotation.Namespace; +import org.springframework.ws.server.endpoint.annotation.PayloadRoot; +import org.springframework.ws.server.endpoint.annotation.RequestPayload; +import org.springframework.ws.server.endpoint.annotation.ResponsePayload; +import org.springframework.ws.server.endpoint.annotation.XPathParam; + +import static org.springframework.ws.samples.airline.ws.AirlineWebServiceConstants.BOOK_FLIGHT_REQUEST; +import static org.springframework.ws.samples.airline.ws.AirlineWebServiceConstants.GET_FLIGHTS_REQUEST; +import static org.springframework.ws.samples.airline.ws.AirlineWebServiceConstants.GET_FREQUENT_FLYER_MILEAGE_REQUEST; +import static org.springframework.ws.samples.airline.ws.AirlineWebServiceConstants.GET_FREQUENT_FLYER_MILEAGE_RESPONSE; +import static org.springframework.ws.samples.airline.ws.AirlineWebServiceConstants.MESSAGES_NAMESPACE; /** * Endpoint that handles the Airline Web Service messages using a combination of JAXB2 @@ -60,6 +74,8 @@ public class AirlineEndpoint { private static final Logger logger = LoggerFactory.getLogger(AirlineEndpoint.class); + private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd[XXX][X]"); + private final ObjectFactory objectFactory = new ObjectFactory(); private final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); @@ -91,7 +107,8 @@ public class AirlineEndpoint { logger.debug("Received GetFlightsRequest '" + from + "' to '" + to + "' on " + departureDateString); } - ZonedDateTime departureDate = LocalDate.parse(departureDateString).atStartOfDay(ZoneId.systemDefault()); + ZonedDateTime departureDate = LocalDate.parse(departureDateString, dateFormatter) + .atStartOfDay(ZoneId.systemDefault()); ServiceClass serviceClass = null; if (StringUtils.hasLength(serviceClassString)) { diff --git a/pom.xml b/pom.xml index 1eac4d8..6735d47 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,8 @@ ${project.basedir}/target/classes ${project.basedir}/airline/client/airline.wsdl - 1.4 + 2.0.0 + 1.7.9 3.2.0 0.15.0 1.2.0 @@ -46,7 +47,7 @@ - airline/client/axis1 + airline/client/axis airline/client/jax-ws airline/client/jms airline/client/saaj @@ -62,11 +63,6 @@ - - axis - axis - ${axis.version} - com.sun.xml.ws jaxws-tools @@ -83,8 +79,18 @@ ${jaxen.version} - org.apache.axis - axis-jaxrpc + org.apache.axis2 + axis2-adb + ${axis.version} + + + org.apache.axis2 + axis2-transport-local + ${axis.version} + + + org.apache.axis2 + axis2-transport-http ${axis.version} @@ -118,6 +124,11 @@ jaxws-maven-plugin ${jaxws-maven-plugin.version} + + org.apache.axis2 + axis2-wsdl2code-maven-plugin + ${axis2-wsdl2code-maven-plugin} + org.codehaus.mojo jaxb2-maven-plugin