Skip to content

Commit a705cba

Browse files
authored
SDK-1389 Add an example on using async execution to shop-book a room (#104)
1 parent d60b869 commit a705cba

File tree

6 files changed

+189
-50
lines changed

6 files changed

+189
-50
lines changed

examples/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<dependency>
1818
<groupId>com.expediagroup</groupId>
1919
<artifactId>rapid-sdk</artifactId>
20-
<version>4.3.0-SNAPSHOT</version>
20+
<version>4.3.0</version>
2121
</dependency>
2222

2323
<dependency>

examples/src/main/java/com/expediagroup/sdk/rapid/examples/RapidSdkDemoApplication.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.expediagroup.sdk.rapid.examples.salesprofiles.DefaultRapidPartnerProfile;
44
import com.expediagroup.sdk.rapid.examples.scenarios.booking.CancelHeldBookingScenario;
5+
import com.expediagroup.sdk.rapid.examples.scenarios.booking.AsyncSingleRoomBookScenario;
56
import com.expediagroup.sdk.rapid.examples.scenarios.booking.MultiRoomHoldAndResumeBookScenario;
67
import com.expediagroup.sdk.rapid.examples.scenarios.booking.SingleRoomBookScenario;
78
import com.expediagroup.sdk.rapid.examples.scenarios.geography.GetListOfRegionNamesScenario;
@@ -54,12 +55,22 @@ public static void main(String[] args) {
5455
2. Checking room prices for the property
5556
3. Booking the property
5657
*/
57-
58-
logger.info("Running Book Single Room Scenario using the default profile...");
58+
logger.info("Running Book Single Room Scenario using the default profile in synchronous manner...");
5959
SingleRoomBookScenario singleRoomBookScenario = new SingleRoomBookScenario();
6060
singleRoomBookScenario.setProfile(new DefaultRapidPartnerProfile());
6161
singleRoomBookScenario.run();
6262

63+
/* Run Async Single Room Book Scenario using the default profile
64+
This scenario demonstrates the following:
65+
1. Shopping for properties
66+
2. Checking room prices for the property
67+
3. Booking the property in asynchronous manner
68+
*/
69+
logger.info("Running Book Single Room Scenario using the default profile in asynchronous manner...");
70+
AsyncSingleRoomBookScenario asyncSingleRoomBookScenario = new AsyncSingleRoomBookScenario();
71+
asyncSingleRoomBookScenario.setProfile(new DefaultRapidPartnerProfile());
72+
asyncSingleRoomBookScenario.run();
73+
6374
/* Run Multiple Room Hold and Resume Book Scenario using the default profile
6475
This scenario demonstrates the following:
6576
1. Shopping for properties with specifying multiple occupancy instances for multiple rooms
@@ -175,7 +186,7 @@ public static void main(String[] args) {
175186
logger.info("=======================================================================================");
176187
logger.info("=======================================================================================");
177188
logger.info("== ==");
178-
logger.info("== That's all folks! Thanks for watching the demonstration of RAPID SDK. ==");
189+
logger.info("== That's all folks! That was the demonstration of RAPID SDK. ==");
179190
logger.info("== ==");
180191
logger.info("=======================================================================================");
181192
logger.info("=======================================================================================");
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.expediagroup.sdk.rapid.examples.scenarios.booking;
2+
3+
import com.expediagroup.sdk.rapid.examples.Constants;
4+
import com.expediagroup.sdk.rapid.examples.salesprofiles.RapidPartnerSalesProfile;
5+
import com.expediagroup.sdk.rapid.examples.scenarios.RapidScenario;
6+
import com.expediagroup.sdk.rapid.examples.services.BookService;
7+
import com.expediagroup.sdk.rapid.examples.services.ShopService;
8+
import com.expediagroup.sdk.rapid.models.Itinerary;
9+
import com.expediagroup.sdk.rapid.models.ItineraryCreation;
10+
import com.expediagroup.sdk.rapid.models.Property;
11+
import com.expediagroup.sdk.rapid.models.PropertyAvailability;
12+
import com.expediagroup.sdk.rapid.models.RoomPriceCheck;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
import java.util.Arrays;
17+
import java.util.List;
18+
import java.util.concurrent.CompletableFuture;
19+
20+
public class AsyncSingleRoomBookScenario implements RapidScenario {
21+
22+
private static final Logger logger = LoggerFactory.getLogger(AsyncSingleRoomBookScenario.class);
23+
private ShopService shopService = new ShopService();
24+
private RapidPartnerSalesProfile rapidPartnerSalesProfile;
25+
26+
@Override
27+
public void setProfile(RapidPartnerSalesProfile rapidPartnerSalesProfile) {
28+
this.rapidPartnerSalesProfile = rapidPartnerSalesProfile;
29+
}
30+
31+
@Override
32+
public void run() {
33+
34+
// Shopping for properties
35+
logger.info("Async call - Getting property availability for test property: {}", Constants.TEST_PROPERTY_ID);
36+
37+
shopService.asyncGetSingleRoomPropertiesAvailability(this.rapidPartnerSalesProfile)
38+
.thenApply(response -> response.getData())
39+
.thenCompose(this::checkRoomPrices)
40+
.thenCompose(this::bookRoom)
41+
.thenCompose(this::getItinerary)
42+
.thenAccept(itinerary -> {
43+
if (itinerary != null) {
44+
logger.info("Itinerary: {}", itinerary.getItineraryId());
45+
}
46+
});
47+
48+
}
49+
50+
private CompletableFuture<Itinerary> getItinerary(ItineraryCreation itineraryCreation) {
51+
if (itineraryCreation == null) {
52+
return CompletableFuture.completedFuture(null);
53+
}
54+
55+
logger.info("Booking Success. Itinerary id: {}", itineraryCreation.getItineraryId());
56+
57+
// Manage booking
58+
logger.info("Getting itinerary by itinerary id...");
59+
BookService bookService = new BookService();
60+
return bookService.asyncGetReservationByItineraryId(itineraryCreation)
61+
.thenApply(response -> response.getData());
62+
}
63+
64+
private CompletableFuture<ItineraryCreation> bookRoom(RoomPriceCheck roomPriceCheck) {
65+
if (roomPriceCheck == null) {
66+
return CompletableFuture.completedFuture(null);
67+
}
68+
69+
logger.info("Room Price Check: {}", roomPriceCheck.getStatus());
70+
71+
// Booking a single room in the property
72+
logger.info("Booking a room in test property: {}...", Constants.TEST_PROPERTY_ID);
73+
74+
BookService bookService = new BookService();
75+
return bookService.asyncCreateBooking(roomPriceCheck, Arrays.asList("2"))
76+
.thenApply(response -> response.getData());
77+
}
78+
79+
private CompletableFuture<RoomPriceCheck> checkRoomPrices(List<Property> propertyAvailabilityList) {
80+
if (propertyAvailabilityList == null || propertyAvailabilityList.isEmpty()) {
81+
logger.error("No property availability found for the test property.");
82+
return CompletableFuture.completedFuture(null);
83+
}
84+
85+
logger.info("Property Availability: {}", propertyAvailabilityList.get(0).getStatus());
86+
87+
// Checking room prices for the property
88+
logger.info("Checking room prices for the property: {}...", Constants.TEST_PROPERTY_ID);
89+
Property property = propertyAvailabilityList.get(0);
90+
if (property instanceof PropertyAvailability) {
91+
PropertyAvailability propertyAvailability = (PropertyAvailability) property;
92+
return shopService.asyncCheckRoomPrices(propertyAvailability, 0, 0)
93+
.thenApply(response -> response.getData());
94+
} else {
95+
return CompletableFuture.completedFuture(null);
96+
}
97+
}
98+
}

examples/src/main/java/com/expediagroup/sdk/rapid/examples/services/BookService.java

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.expediagroup.sdk.rapid.models.PaymentRequest;
1414
import com.expediagroup.sdk.rapid.models.PhoneRequest;
1515
import com.expediagroup.sdk.rapid.models.RoomPriceCheck;
16-
import com.expediagroup.sdk.rapid.models.RoomPriceCheckLinks;
1716
import com.expediagroup.sdk.rapid.operations.DeleteHeldBookingOperation;
1817
import com.expediagroup.sdk.rapid.operations.DeleteHeldBookingOperationContext;
1918
import com.expediagroup.sdk.rapid.operations.GetReservationByItineraryIdOperation;
@@ -27,6 +26,7 @@
2726
import java.util.Collections;
2827
import java.util.List;
2928
import java.util.UUID;
29+
import java.util.concurrent.CompletableFuture;
3030

3131
public class BookService extends RapidService {
3232

@@ -47,10 +47,7 @@ public Response<ItineraryCreation> createBooking(RoomPriceCheck roomPriceCheck,
4747
.travelerHandlingInstructions("Please use the card provided for payment. Avoid cancellation as this is for a corporate traveler. Contact traveler if any issues.")
4848
.build();
4949

50-
RoomPriceCheckLinks roomPriceCheckLinks = roomPriceCheck.getLinks();
51-
if (roomPriceCheckLinks == null) throw new RuntimeException();
52-
Link bookLink = roomPriceCheckLinks.getBook();
53-
if (bookLink == null) throw new RuntimeException();
50+
Link bookLink = roomPriceCheck.getLinks().getBook();
5451

5552
PostItineraryOperationContext postItineraryOperationContext =
5653
PostItineraryOperationContext.builder().customerIp("127.0.0.1").build();
@@ -59,6 +56,33 @@ public Response<ItineraryCreation> createBooking(RoomPriceCheck roomPriceCheck,
5956
return rapidClient.execute(operation);
6057
}
6158

59+
public CompletableFuture<Response<ItineraryCreation>> asyncCreateBooking(RoomPriceCheck roomPriceCheck, List<String> occupancy) {
60+
61+
// In the Book request, include corresponding separate instances of room in the rooms array for each room you wish to book. */
62+
List<CreateItineraryRequestRoom> rooms = Collections.nCopies(occupancy.size(), createRoom());
63+
64+
CreateItineraryRequest createItineraryRequest = CreateItineraryRequest.builder()
65+
.affiliateReferenceId(UUID.randomUUID().toString().substring(0, 28))
66+
.hold(false)
67+
68+
.phone(phone())
69+
.rooms(rooms)
70+
.payments(payments())
71+
.affiliateMetadata("data_point_1:123|data_point2:This is data.")
72+
.taxRegistrationNumber("12345678910")
73+
.travelerHandlingInstructions("Please use the card provided for payment. Avoid cancellation as this is for a corporate traveler. Contact traveler if any issues.")
74+
.build();
75+
76+
Link bookLink = roomPriceCheck.getLinks().getBook();
77+
78+
PostItineraryOperationContext postItineraryOperationContext =
79+
PostItineraryOperationContext.builder().customerIp("127.0.0.1").build();
80+
81+
PostItineraryOperation operation = new PostItineraryOperation(bookLink, postItineraryOperationContext, createItineraryRequest);
82+
83+
return rapidClient.executeAsync(operation);
84+
}
85+
6286
public Response<ItineraryCreation> createBookingWithHold(RoomPriceCheck roomPriceCheck, List<String> occupancy) {
6387

6488
// In the Book request, include corresponding separate instances of room in the rooms array for each room you wish to book. */
@@ -77,10 +101,7 @@ public Response<ItineraryCreation> createBookingWithHold(RoomPriceCheck roomPric
77101
.travelerHandlingInstructions("Please use the card provided for payment. Avoid cancellation as this is for a corporate traveler. Contact traveler if any issues.")
78102
.build();
79103

80-
RoomPriceCheckLinks roomPriceCheckLinks = roomPriceCheck.getLinks();
81-
if (roomPriceCheckLinks == null) throw new RuntimeException();
82-
Link bookLink = roomPriceCheckLinks.getBook();
83-
if (bookLink == null) throw new RuntimeException();
104+
Link bookLink = roomPriceCheck.getLinks().getBook();
84105

85106
PostItineraryOperationContext postItineraryOperationContext =
86107
PostItineraryOperationContext.builder().customerIp("127.0.0.1").build();
@@ -102,10 +123,7 @@ public Response<Nothing> resumeBooking(ItineraryCreation itineraryCreation) {
102123
}
103124

104125
public Response<Itinerary> getReservationByItineraryId(ItineraryCreation itineraryCreation) {
105-
ItineraryCreationLinks itineraryCreationLinks = itineraryCreation.getLinks();
106-
if (itineraryCreationLinks == null) throw new RuntimeException();
107-
Link retrieveLink = itineraryCreationLinks.getRetrieve();
108-
if (retrieveLink == null) throw new RuntimeException();
126+
Link retrieveLink = itineraryCreation.getLinks().getRetrieve();
109127

110128
GetReservationByItineraryIdOperationContext getReservationByItineraryIdOperationContext =
111129
GetReservationByItineraryIdOperationContext.builder().customerIp("127.0.0.1").build();
@@ -125,6 +143,16 @@ public Response<Nothing> cancelHeldReservationByItineraryId(ItineraryCreation it
125143
return rapidClient.execute(new DeleteHeldBookingOperation(cancelLink, deleteHeldBookingOperationContext));
126144
}
127145

146+
public CompletableFuture<Response<Itinerary>> asyncGetReservationByItineraryId(ItineraryCreation itineraryCreation) {
147+
148+
Link retrieveLink = itineraryCreation.getLinks().getRetrieve();
149+
150+
GetReservationByItineraryIdOperationContext getReservationByItineraryIdOperationContext =
151+
GetReservationByItineraryIdOperationContext.builder().customerIp("127.0.0.1").build();
152+
153+
return rapidClient.executeAsync(new GetReservationByItineraryIdOperation(retrieveLink, getReservationByItineraryIdOperationContext ));
154+
}
155+
128156
/* Helper methods */
129157
private CreateItineraryRequestRoom createRoom() {
130158
return CreateItineraryRequestRoom.builder()

examples/src/main/java/com/expediagroup/sdk/rapid/examples/services/RapidService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.expediagroup.sdk.rapid.examples.services;
22

3-
import com.expediagroup.sdk.rapid.examples.Constants;
43
import com.expediagroup.sdk.rapid.client.RapidClient;
4+
import com.expediagroup.sdk.rapid.examples.Constants;
55

66
public abstract class RapidService {
77

examples/src/main/java/com/expediagroup/sdk/rapid/examples/services/ShopService.java

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,9 @@
33
import com.expediagroup.sdk.core.model.Response;
44
import com.expediagroup.sdk.rapid.examples.Constants;
55
import com.expediagroup.sdk.rapid.examples.salesprofiles.RapidPartnerSalesProfile;
6-
import com.expediagroup.sdk.rapid.models.BedGroupAvailability;
7-
import com.expediagroup.sdk.rapid.models.BedGroupAvailabilityLinks;
86
import com.expediagroup.sdk.rapid.models.Link;
97
import com.expediagroup.sdk.rapid.models.Property;
108
import com.expediagroup.sdk.rapid.models.PropertyAvailability;
11-
import com.expediagroup.sdk.rapid.models.PropertyAvailabilityLinks;
12-
import com.expediagroup.sdk.rapid.models.Rate;
13-
import com.expediagroup.sdk.rapid.models.RoomAvailability;
149
import com.expediagroup.sdk.rapid.models.RoomPriceCheck;
1510
import com.expediagroup.sdk.rapid.operations.GetAdditionalAvailabilityOperation;
1611
import com.expediagroup.sdk.rapid.operations.GetAvailabilityOperation;
@@ -21,8 +16,7 @@
2116
import java.time.LocalDate;
2217
import java.util.Arrays;
2318
import java.util.List;
24-
import java.util.Map;
25-
import java.util.Optional;
19+
import java.util.concurrent.CompletableFuture;
2620

2721
public class ShopService extends RapidService {
2822

@@ -46,6 +40,26 @@ public Response<List<Property>> getSingleRoomPropertiesAvailability(RapidPartner
4640
return rapidClient.execute(operation);
4741
}
4842

43+
public CompletableFuture<Response<List<Property>>> asyncGetSingleRoomPropertiesAvailability(RapidPartnerSalesProfile rapidPartnerSalesProfile) {
44+
GetAvailabilityOperationParams params = GetAvailabilityOperationParams.builder()
45+
.customerIp(Constants.CUSTOMER_IP)
46+
.checkin(LocalDate.now().plusDays(14).toString())
47+
.checkout(LocalDate.now().plusDays(15).toString())
48+
.currency("USD")
49+
.countryCode("US")
50+
.language("en-US")
51+
.occupancy(Arrays.asList("2"))
52+
.propertyId(Arrays.asList(Constants.TEST_PROPERTY_ID))
53+
.salesChannel("website")
54+
.salesEnvironment("hotel_only")
55+
.ratePlanCount(BigDecimal.ONE)
56+
.build();
57+
58+
GetAvailabilityOperation operation = new GetAvailabilityOperation(params);
59+
60+
return rapidClient.executeAsync(operation);
61+
}
62+
4963
public Response<List<Property>> getMultipleRoomsPropertiesAvailability(RapidPartnerSalesProfile rapidPartnerSalesProfile, List<String> occupancy) {
5064

5165
GetAvailabilityOperationParams params = GetAvailabilityOperationParams.builder()
@@ -69,38 +83,26 @@ public Response<List<Property>> getMultipleRoomsPropertiesAvailability(RapidPart
6983

7084
public Response<RoomPriceCheck> checkRoomPrices(PropertyAvailability propertyAvailability, int selectedRoomIndex, int selectedRateIndex) {
7185

72-
List<RoomAvailability> rooms = propertyAvailability.getRooms();
73-
if (rooms == null) throw new RuntimeException();
74-
75-
List<Rate> rates = rooms.get(selectedRoomIndex).getRates();
76-
if (rates == null) throw new RuntimeException();
77-
78-
Rate selectedRate = rates.get(selectedRateIndex);
79-
if (selectedRate == null) throw new RuntimeException();
80-
81-
Map<String, BedGroupAvailability> bedGroups = selectedRate.getBedGroups();
82-
if (bedGroups == null) throw new RuntimeException();
83-
84-
Optional<Map.Entry<String, BedGroupAvailability>> bedGroupAvailabilityEntry = bedGroups.entrySet().stream().findFirst();
85-
if (!bedGroupAvailabilityEntry.isPresent()) throw new RuntimeException();
86-
87-
BedGroupAvailabilityLinks links = bedGroupAvailabilityEntry.get().getValue().getLinks();
88-
if (links == null) throw new RuntimeException();
89-
90-
Link priceCheckLink = links.getPriceCheck();
91-
if (priceCheckLink == null) throw new RuntimeException();
86+
Link priceCheckLink = propertyAvailability.getRooms().get(selectedRoomIndex).getRates().get(selectedRateIndex).getBedGroups().entrySet()
87+
.stream().findFirst().get().getValue().getLinks().getPriceCheck();
9288

9389
PriceCheckOperation operation = new PriceCheckOperation(priceCheckLink, null);
9490
return rapidClient.execute(operation);
9591
}
9692

9793
public Response<List<PropertyAvailability>> getAdditionalAvailability(PropertyAvailability propertyAvailability) {
98-
PropertyAvailabilityLinks links = propertyAvailability.getLinks();
99-
if (links == null) throw new RuntimeException();
100-
101-
Link additionalRatesLink = links.getAdditionalRates();
102-
if (additionalRatesLink == null) throw new RuntimeException();
94+
Link additionalRatesLink = propertyAvailability.getLinks().getAdditionalRates();
10395

10496
return rapidClient.execute(new GetAdditionalAvailabilityOperation(additionalRatesLink, null));
10597
}
98+
99+
public CompletableFuture<Response<RoomPriceCheck>> asyncCheckRoomPrices(PropertyAvailability propertyAvailability, int selectedRoomIndex, int selectedRateIndex) {
100+
101+
Link priceCheckLink = propertyAvailability.getRooms().get(selectedRoomIndex).getRates().get(selectedRateIndex).getBedGroups().entrySet()
102+
.stream().findFirst().get().getValue().getLinks().getPriceCheck();
103+
104+
PriceCheckOperation operation = new PriceCheckOperation(priceCheckLink, null);
105+
106+
return rapidClient.executeAsync(operation);
107+
}
106108
}

0 commit comments

Comments
 (0)