/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual * contributors by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * 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.switchyard.quickstarts.camel.sap.binding.composer; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Set; import javax.activation.DataHandler; import org.fusesource.camel.component.sap.SapSynchronousRfcDestinationEndpoint; import org.fusesource.camel.component.sap.model.rfc.Structure; import org.fusesource.camel.component.sap.model.rfc.Table; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.switchyard.Exchange; import org.switchyard.Message; import org.switchyard.component.camel.common.composer.CamelBindingData; import org.switchyard.component.camel.common.composer.CamelMessageComposer; import org.switchyard.quickstarts.camel.sap.binding.bean.FlightConnectionInfo; import org.switchyard.quickstarts.camel.sap.binding.bean.FlightHop; import org.switchyard.quickstarts.camel.sap.binding.bean.PriceInfo; import org.switchyard.quickstarts.camel.sap.binding.bean.SeatAvailibility; /** * A MessageComposer for GetFlightConnectionDetailService. */ public class GetFlightConnectionDetailMessageComposer extends CamelMessageComposer { private static final Logger LOG = LoggerFactory.getLogger(GetFlightConnectionDetailMessageComposer.class); @Override public CamelBindingData decompose(Exchange exchange, CamelBindingData target) throws Exception { CamelBindingData response = super.decompose(exchange, target); // Get BAPI_FLCONN_GETLIST SAP Response object. Structure flightConnectionGetListResponse = exchange.getMessage().getContent(Structure.class); if (flightConnectionGetListResponse == null) { throw new Exception("No Flight Connection Get List Response."); } // Get the list of matching flight connections in response object. @SuppressWarnings("unchecked") Table<? extends Structure> connectionList = flightConnectionGetListResponse.get("FLIGHT_CONNECTION_LIST", Table.class); if (connectionList == null || connectionList.size() == 0) { throw new Exception("No Flight Connections"); } // Select the first connection. Structure connection = connectionList.get(0); // Create SAP Request object from target endpoint. SapSynchronousRfcDestinationEndpoint endpoint = response.getMessage().getExchange().getContext().getEndpoint("sap-srfc-destination:nplDest:BAPI_FLCONN_GETDETAIL", SapSynchronousRfcDestinationEndpoint.class); Structure request = endpoint.createRequest(); // Copy connection number of matching connection into request. String connectionNumber = connection.get("FLIGHTCONN", String.class); if (connectionNumber != null) { request.put("CONNECTIONNUMBER", connectionNumber); if (LOG.isDebugEnabled()) { LOG.debug("Added CONNECTIONNUMBER = '{}' to request", connectionNumber); } } else { throw new Exception("No Flight Connection Number"); } // Copy agency number of matching connection into request. String travelAgencyNumber = connection.get("AGENCYNUM", String.class); if (travelAgencyNumber != null) { request.put("TRAVELAGENCYNUMBER", travelAgencyNumber); if (LOG.isDebugEnabled()) { LOG.debug("Added TRAVELAGENCYNUMBER = '{}' to request", travelAgencyNumber); } } else { throw new Exception("No Agency Number"); } // Copy flight date of matching connection into request. Date flightDate = connection.get("FLIGHTDATE", Date.class); if (flightDate != null) { request.put("FLIGHTDATE", flightDate); if (LOG.isDebugEnabled()) { LOG.debug("Added FLIGHTDATE = '{}' to request", flightDate); } } else { throw new Exception("No Flight Date"); } // Include availability data in RFC response. request.put("NO_AVAILIBILITY", ""); // Put request object into body of exchange message. response.getMessage().setBody(request); return response; } @Override public Message compose(CamelBindingData source, Exchange exchange) throws Exception { Message response = exchange.createMessage(); // map context properties getContextMapper().mapFrom(source, exchange.getContext(response)); Set<String> attachements = source.getMessage().getAttachmentNames(); if (!attachements.isEmpty()) { for (Entry<String, DataHandler> entry : source.getMessage().getAttachments().entrySet()) { response.addAttachment(entry.getKey(), entry.getValue().getDataSource()); } } Structure flightConnectionGetDetailResponse = source.getMessage().getBody(Structure.class); if (flightConnectionGetDetailResponse == null) { throw new Exception("No Flight Connection Get Detail Response"); } // Create flight connection info bean. FlightConnectionInfo flightConnectionInfo = new FlightConnectionInfo(); // // Add connection data to flight connection info bean. // Structure connectionData = flightConnectionGetDetailResponse.get("CONNECTION_DATA", Structure.class); if (connectionData != null) { // Add travel agency number to flight connection info if set. String travelAgencyNumber = connectionData.get("AGENCYNUM", String.class); if (travelAgencyNumber != null) { flightConnectionInfo.setTravelAgencyNumber(travelAgencyNumber); if (LOG.isDebugEnabled()) { LOG.debug("Set travel agency number = '{}' in flight connection info", travelAgencyNumber); } } // Add flight connection number to flight connection info if set. String flightConnectionNumber = connectionData.get("FLIGHTCONN", String.class); if (flightConnectionNumber != null) { flightConnectionInfo.setFlightConnectionNumber(flightConnectionNumber); if (LOG.isDebugEnabled()) { LOG.debug("Set flight connection number = '{}' in flight connection info", flightConnectionNumber); } } // Add departure date to flight connection info if set. Date departureDate = connectionData.get("FLIGHTDATE", Date.class); if (departureDate != null) { flightConnectionInfo.setDepartureDate(departureDate); if (LOG.isDebugEnabled()) { LOG.debug("Set depature date = '{}' in flight connection info", departureDate); } } // Add departure airport to flight connection info if set. String departureAirport = connectionData.get("AIRPORTFR", String.class); if (departureAirport != null) { flightConnectionInfo.setDepartureAirport(departureAirport); if (LOG.isDebugEnabled()) { LOG.debug("Set departure airport = '{}' in flight connection info", departureAirport); } } // Add departure city to flight connection info if set. String departureCity = connectionData.get("CITYFROM", String.class); if (departureCity != null) { flightConnectionInfo.setDepartureCity(departureCity); if (LOG.isDebugEnabled()) { LOG.debug("Set departure city = '{}' in flight connection info", departureCity); } } // Add arrival airport to flight connection info if set. String arrivalAirport = connectionData.get("AIRPORTTO", String.class); if (arrivalAirport != null) { flightConnectionInfo.setArrivalAirport(arrivalAirport); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival airport = '{}' in flight connection info", arrivalAirport); } } // Add arrival city to flight connection info if set. String arrivalCity = connectionData.get("CITYTO", String.class); if (arrivalCity != null) { flightConnectionInfo.setArrivalCity(arrivalCity); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival city = '{}' in flight connection info", arrivalCity); } } // Add number of hops to flight connection info if set. String numberOfHops = connectionData.get("NUMHOPS", String.class); if (numberOfHops != null) { flightConnectionInfo.setNumberOfHops(numberOfHops); if (LOG.isDebugEnabled()) { LOG.debug("Set number of hops = '{}' in flight connection info", numberOfHops); } } // Add departure time to flight connection info if set. Date departureTime = connectionData.get("DEPTIME", Date.class); if (departureTime != null) { flightConnectionInfo.setDepartureTime(departureTime); if (LOG.isDebugEnabled()) { LOG.debug("Set departure time = '{}' in flight connection info", departureTime); } } // Add arrival time to flight connection info if set. Date arrivalTime = connectionData.get("ARRTIME", Date.class); if (arrivalTime != null) { flightConnectionInfo.setArrivalTime(arrivalTime); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival time = '{}' in flight connection info", arrivalTime); } } // Add arrival date to flight connection info if set. Date arrivalDate = connectionData.get("ARRDATE", Date.class); if (arrivalDate != null) { flightConnectionInfo.setArrivalDate(arrivalDate); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival date = '{}' in flight connection info", arrivalDate); } } // Add flight time to flight connection info if set. Integer flightTime = connectionData.get("FLIGHTTIME", Integer.class); if (flightTime != null) { flightConnectionInfo.setFlightTime(flightTime.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set flight time = '{}' in flight connection info", flightTime); } } } // // Add flight hop list to flight connection info bean. // @SuppressWarnings("unchecked") Table<Structure> hopList = flightConnectionGetDetailResponse.get("FLIGHT_HOP_LIST", Table.class); List<FlightHop> flightHopList = new ArrayList<FlightHop>(); for (Structure hop : hopList) { // Create flight hop object. FlightHop flightHop = new FlightHop(); // Add hop number to flight hop if set. String hopNumber = hop.get("HOP", String.class); if (hopNumber != null) { flightHop.setHopNumber(hopNumber); if (LOG.isDebugEnabled()) { LOG.debug("Set hop number = '{}' in flight hop", hopNumber); } } // Add airline code to flight hop if set. String airlineCode = hop.get("AIRLINEID", String.class); if (airlineCode != null) { flightHop.setAirlineCode(airlineCode); if (LOG.isDebugEnabled()) { LOG.debug("Set airline code = '{}' in flight hop", airlineCode); } } // Add airline name to flight hop if set. String airlineName = hop.get("AIRLINE", String.class); if (airlineName != null) { flightHop.setAirlineName(airlineName); if (LOG.isDebugEnabled()) { LOG.debug("Set airline name = '{}' in flight hop", airlineName); } } // Add flight connection number to flight hop if set. String flightConnectionNumber = hop.get("CONNECTID", String.class); if (flightConnectionNumber != null) { flightHop.setFlightConnectionNumber(flightConnectionNumber); if (LOG.isDebugEnabled()) { LOG.debug("Set flight connection number = '{}' in flight hop", flightConnectionNumber); } } // Add departure airport to flight hop if set. String depatureAirport = hop.get("AIRPORTFR", String.class); if (depatureAirport != null) { flightHop.setDepatureAirport(depatureAirport); if (LOG.isDebugEnabled()) { LOG.debug("Set departure airport = '{}' in flight hop", depatureAirport); } } // Add departure city to flight hop if set. String depatureCity = hop.get("CITYFROM", String.class); if (depatureCity != null) { flightHop.setDepatureCity(depatureCity); if (LOG.isDebugEnabled()) { LOG.debug("Set departure city = '{}' in flight hop", depatureCity); } } // Add departure country to flight hop if set. String departureCountry = hop.get("CTRYFR", String.class); if (departureCountry != null) { flightHop.setDepartureCountry(departureCountry); if (LOG.isDebugEnabled()) { LOG.debug("Set departure country = '{}' in flight hop", departureCountry); } } // Add departure country code to flight hop if set. String departureCountryIso = hop.get("CTRYFR_ISO", String.class); if (departureCountryIso != null) { flightHop.setDepartureCountryIso(departureCountryIso); if (LOG.isDebugEnabled()) { LOG.debug("Set departure iso country code = '{}' in flight hop", departureCountryIso); } } // Add arrival airport to flight hop if set. String arrivalAirport = hop.get("AIRPORTTO", String.class); if (arrivalAirport != null) { flightHop.setArrivalAirport(arrivalAirport); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival airport = '{}' in flight hop", arrivalAirport); } } // Add arrival city to flight hop if set. String arrivalCity = hop.get("CITYTO", String.class); if (arrivalCity != null) { flightHop.setArrivalCity(arrivalCity); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival city = '{}' in flight hop", arrivalCity); } } // Add arrival country to flight hop if set. String arrivalCountry = hop.get("CTRYTO", String.class); if (arrivalCountry != null) { flightHop.setArrivalCountry(arrivalCountry); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival country = '{}' in flight hop", arrivalCountry); } } // Add arrival country code to flight hop if set. String arrivalCountryIso = hop.get("CTRYTO_ISO", String.class); if (arrivalCountryIso != null) { flightHop.setArrivalCountryIso(arrivalCountryIso); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival iso country code = '{}' in flight hop", arrivalCountryIso); } } // Add departure date to flight hop if set. Date departureDate = hop.get("DEPDATE", Date.class); if (departureDate != null) { flightHop.setDepatureDate(departureDate); if (LOG.isDebugEnabled()) { LOG.debug("Set departure date = '{}' in flight hop", departureDate); } } // Add departure time to flight hop if set. Date departureTime = hop.get("DEPTIME", Date.class); if (departureTime != null) { flightHop.setDepatureTime(departureTime); if (LOG.isDebugEnabled()) { LOG.debug("Set departure time = '{}' in flight hop", departureTime); } } // Add arrival date to flight hop if set. Date arrivalDate = hop.get("ARRDATE", Date.class); if (arrivalDate != null) { flightHop.setArrivalDate(arrivalDate); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival date = '{}' in flight hop", arrivalDate); } } // Add arrival time to flight hop if set. Date arrivalTime = hop.get("ARRTIME", Date.class); if (arrivalTime != null) { flightHop.setArrivalTime(arrivalTime); if (LOG.isDebugEnabled()) { LOG.debug("Set arrival time = '{}' in flight hop", arrivalTime); } } // Add aircraft type to flight hop if set. String aircraftType = hop.get("PLANETYPE", String.class); if (aircraftType != null) { flightHop.setAircraftType(aircraftType); if (LOG.isDebugEnabled()) { LOG.debug("Set aircraft type = '{}' in flight hop", aircraftType); } } // Add flight hop flightHopList.add(flightHop); } // Add flight hop list to flight connection info. flightConnectionInfo.setFlightHopList(flightHopList); // // Add availability list to flight connection info bean. // @SuppressWarnings("unchecked") Table<Structure> availibilityList = flightConnectionGetDetailResponse.get("AVAILIBILITY", Table.class); List<SeatAvailibility> seatAvailiblityList = new ArrayList<SeatAvailibility>(); for (Structure availibility : availibilityList) { // Create seat availability object. SeatAvailibility seatAvailiblity = new SeatAvailibility(); // Add hop number to availability if set. String hopNumber = availibility.get("HOP", String.class); if (hopNumber != null) { seatAvailiblity.setHopNumber(hopNumber); if (LOG.isDebugEnabled()) { LOG.debug("Set hop number = '{}' in seat availibility", hopNumber); } } // Add economy class seat capacity to availability if set. Integer economyClassSeatCapacity = availibility.get("ECONOMAX", Integer.class); if (economyClassSeatCapacity != null) { seatAvailiblity.setEconomyClassSeatCapacity(economyClassSeatCapacity.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set economy class seat capacity = '{}' in seat availibility", economyClassSeatCapacity); } } // Add economy class free seats to availability if set. Integer economyClassFreeSeats = availibility.get("ECONOFREE", Integer.class); if (economyClassFreeSeats != null) { seatAvailiblity.setEconomyClassFreeSeats(economyClassFreeSeats.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set economy class free seats = '{}' in seat availibility", economyClassFreeSeats); } } // Add business class seat capacity to availability if set. Integer businessClassSeatCapacity = availibility.get("BUSINMAX", Integer.class); if (businessClassSeatCapacity != null) { seatAvailiblity.setBusinessClassSeatCapacity(businessClassSeatCapacity.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set business class seat capacity = '{}' in seat availibility", businessClassSeatCapacity); } } // Add business class free seats to availability if set. Integer businessClassFreeSeats = availibility.get("BUSINFREE", Integer.class); if (businessClassFreeSeats != null) { seatAvailiblity.setBusinessClassFreeSeats(businessClassFreeSeats.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set business class free seats = '{}' in seat availibility", businessClassFreeSeats); } } // Add first class seat capacity to availability if set. Integer firstClassClassSeatCapacity = availibility.get("FIRSTMAX", Integer.class); if (firstClassClassSeatCapacity != null) { seatAvailiblity.setFirstClassClassSeatCapacity(firstClassClassSeatCapacity.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set first class seat capacity = '{}' in seat availibility", firstClassClassSeatCapacity); } } // Add first class free seats to availability if set. Integer firstClassFreeSeats = availibility.get("FIRSTFREE", Integer.class); if (firstClassFreeSeats != null) { seatAvailiblity.setFirstClassFreeSeats(firstClassFreeSeats.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set first class free seats = '{}' in seat availibility", firstClassFreeSeats); } } // Add availability to list. seatAvailiblityList.add(seatAvailiblity); } // Add availability list to flight connection info. flightConnectionInfo.setSeatAvailibilityList(seatAvailiblityList); // // Add price info to flight connection info bean. // Structure prices = (Structure) flightConnectionGetDetailResponse.get("PRICE_INFO", Structure.class); if (prices != null) { // Create price info object. PriceInfo priceInfo = new PriceInfo(); // Add economy class airfare to availability if set. BigDecimal economyClassAirfare = prices.get("PRICE_ECO1", BigDecimal.class); if (economyClassAirfare != null) { priceInfo.setEconomyClassAirfare(economyClassAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set economy class airfare = '{}' in seat availibility", economyClassAirfare); } } // Add economy class child airfare to availability if set. BigDecimal economyClassChildAirfare = prices.get("PRICE_ECO2", BigDecimal.class); if (economyClassChildAirfare != null) { priceInfo.setEconomyClassChildAirfare(economyClassChildAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set economy class child airfare = '{}' in seat availibility", economyClassChildAirfare); } } // Add economy class small child airfare to availability if set. BigDecimal economyClassSmallChildAirfare = prices.get("PRICE_ECO3", BigDecimal.class); if (economyClassSmallChildAirfare != null) { priceInfo.setEconomyClassSmallChildAirfare(economyClassSmallChildAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set economy class small child airfare = '{}' in seat availibility", economyClassSmallChildAirfare); } } // Add business class airfare to availability if set. BigDecimal businessClassAirfare = prices.get("PRICE_BUS1", BigDecimal.class); if (businessClassAirfare != null) { priceInfo.setBusinessClassAirfare(businessClassAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set business class airfare = '{}' in seat availibility", businessClassAirfare); } } // Add business class child airfare to availability if set. BigDecimal businessClassChildAirfare = prices.get("PRICE_BUS2", BigDecimal.class); if (businessClassChildAirfare != null) { priceInfo.setBusinessClassChildAirfare(businessClassChildAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set business class child airfare = '{}' in seat availibility", businessClassChildAirfare); } } // Add business class small child airfare to availability if set. BigDecimal businessClassSmallChildAirfare = prices.get("PRICE_BUS3", BigDecimal.class); if (businessClassSmallChildAirfare != null) { priceInfo.setBusinessClassSmallChildAirfare(businessClassSmallChildAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set business class small child airfare = '{}' in seat availibility", businessClassSmallChildAirfare); } } // Add first class airfare to availability if set. BigDecimal firstClassAirfare = prices.get("PRICE_FST1", BigDecimal.class); if (firstClassAirfare != null) { priceInfo.setBusinessClassAirfare(firstClassAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set first class airfare = '{}' in seat availibility", firstClassAirfare); } } // Add first class child airfare to availability if set. BigDecimal firstClassChildAirfare = prices.get("PRICE_FST2", BigDecimal.class); if (firstClassChildAirfare != null) { priceInfo.setBusinessClassChildAirfare(firstClassChildAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set first class child airfare = '{}' in seat availibility", firstClassChildAirfare); } } // Add first class child airfare to availability if set. BigDecimal firstClassSmallChildAirfare = prices.get("PRICE_FST3", BigDecimal.class); if (firstClassSmallChildAirfare != null) { priceInfo.setBusinessClassSmallChildAirfare(firstClassSmallChildAirfare.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set first class small child airfare = '{}' in seat availibility", firstClassSmallChildAirfare); } } // Add first class small child airfare to availability if set. BigDecimal flightTaxes = prices.get("TAX", BigDecimal.class); if (flightTaxes != null) { priceInfo.setFlightTaxes(flightTaxes.toString()); if (LOG.isDebugEnabled()) { LOG.debug("Set flight taxes = '{}' in seat availibility", flightTaxes); } } // Add currency type to availability if set. String currency = prices.get("CURR", String.class); if (currency != null) { priceInfo.setCurrency(currency); if (LOG.isDebugEnabled()) { LOG.debug("Set local currency = '{}' in seat availibility", currency); } } // Add currency code to availability if set. String currencyIso = prices.get("CURR_ISO", String.class); if (currencyIso != null) { priceInfo.setCurrencyIso(currencyIso); if (LOG.isDebugEnabled()) { LOG.debug("Set local currency iso code = '{}' in seat availibility", currencyIso); } } // Add price info. flightConnectionInfo.setPriceInfo(priceInfo); } // Put flight connection info object response.setContent(flightConnectionInfo); return response; } }