| /* | 
 |  * Copyright 2018, Google Inc. | 
 |  * All rights reserved. | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions are | 
 |  * met: | 
 |  * | 
 |  *     * Redistributions of source code must retain the above copyright | 
 |  * notice, this list of conditions and the following disclaimer. | 
 |  *     * Redistributions in binary form must reproduce the above | 
 |  * copyright notice, this list of conditions and the following disclaimer | 
 |  * in the documentation and/or other materials provided with the | 
 |  * distribution. | 
 |  *     * Neither the name of Google Inc. nor the names of its | 
 |  * contributors may be used to endorse or promote products derived from | 
 |  * this software without specific prior written permission. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 
 |  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 
 |  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 
 |  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 
 |  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
 |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
 |  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
 |  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
 |  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
 |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
 |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
 |  */ | 
 |  | 
 | package com.partner.mapsbooking.rest; | 
 |  | 
 | import com.google.protobuf.InvalidProtocolBufferException; | 
 | import com.google.protobuf.util.JsonFormat; | 
 | import ext.maps.booking.partner.v3.ApiV3; | 
 | import ext.maps.booking.partner.v3.Waitlist; | 
 | import javax.ws.rs.Consumes; | 
 | import javax.ws.rs.GET; | 
 | import javax.ws.rs.POST; | 
 | import javax.ws.rs.Path; | 
 | import javax.ws.rs.Produces; | 
 | import javax.ws.rs.core.MediaType; | 
 |  | 
 | /** Booking REST Server for API v3 with authentication. */ | 
 | @Path("/v3") | 
 | public class BookingService { | 
 |  | 
 |   private JsonFormat.Printer jsonPrinter() { | 
 |     return JsonFormat.printer().preservingProtoFieldNames(); | 
 |   } | 
 |  | 
 |   @Path("/HealthCheck") | 
 |   @GET | 
 |   @Produces(MediaType.TEXT_PLAIN) | 
 |   public String checkServer() { | 
 |     return "200"; | 
 |   } | 
 |  | 
 |   @Path("/CheckAvailability") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String checkAvailability(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String to protocol buffer | 
 |     ApiV3.CheckAvailabilityRequest.Builder requestBuilder = | 
 |         ApiV3.CheckAvailabilityRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.CheckAvailabilityRequest checkAvailabilityRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.CheckAvailabilityResponse response = performCheckAvailability(checkAvailabilityRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to perform availability check | 
 |   private ApiV3.CheckAvailabilityResponse performCheckAvailability( | 
 |       ApiV3.CheckAvailabilityRequest request) { | 
 |  | 
 |     //        Check availability business logic: | 
 |     //        e.g. | 
 |     //        ApiV3.Slot requestedSlot = request.getSlot(); | 
 |     //        int available_spots = ...; | 
 |     //        ApiV3.CheckAvailabilityResponse response = | 
 |     //                ApiV3.CheckAvailabilityResponse.newBuilder() | 
 |     //                        .setSlot(requestedSlot) | 
 |     //                        .setCountAvailable(available_spots) | 
 |     //                        .build(); | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/BatchAvailabilityLookup") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String batchAvailabilityLookup(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.BatchAvailabilityLookupRequest.Builder requestBuilder | 
 |         = ApiV3.BatchAvailabilityLookupRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.BatchAvailabilityLookupRequest batchAvailabilityLookupRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.BatchAvailabilityLookupResponse response | 
 |         = performBatchAvailabilityLookup(batchAvailabilityLookupRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to perform batch availability lookup | 
 |   private ApiV3.BatchAvailabilityLookupResponse performBatchAvailabilityLookup( | 
 |       ApiV3.BatchAvailabilityLookupRequest request) { | 
 |     //        BatchAvailabilityLookup logic: | 
 |     //        e.g. | 
 |     //        String merchantId = request.getMerchantId(); | 
 |     //        List<ApiV3.SlotTime> requestedSlotTimes = request.getSlotTimeList(); | 
 |     // | 
 |     //        List<ApiV3.SlotTimeAvailability> slotTimeAvailabilities = | 
 |     //             new ArrayList<SlotTimeAvailability>(); | 
 |     // | 
 |     //        loop through all requested slotTimes & | 
 |     //          populate slotTimeAvailabilities with availability status: | 
 |     //        e.g | 
 |     //        for (ApiV3.SlotTime slotTime : requestedSlotTimes) { | 
 |     //            slotTimeAvailabilities.add(SlotTimeAvailability.newBuilder() | 
 |     //                .setSlotTime(slotTime) | 
 |     //                .setAvailable(true) | 
 |     //                .build()); | 
 |     //        } | 
 |     // | 
 |     //        ApiV3.BatchAvailabilityLookupResponse response = | 
 |     //            ApiV3.BatchAvailabilityLookupResponse.newBuilder() | 
 |     //                .addAllSlotTimeAvailability(slotTimeAvailabilities).build(); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/CreateBooking") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String createBooking(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.CreateBookingRequest.Builder requestBuilder = ApiV3.CreateBookingRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.CreateBookingRequest createBookingRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.CreateBookingResponse response = performCreateBooking(createBookingRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to create a booking based on the request | 
 |   private ApiV3.CreateBookingResponse performCreateBooking(ApiV3.CreateBookingRequest request) { | 
 |  | 
 |     //        Create booking business logic: | 
 |     //        e.g. | 
 |     //        ApiV3.Booking createdBooking = ApiV3.Booking.newBuilder() | 
 |     //                .setBookingId("sampleBooking1") | 
 |     //                .setSlot(request.getSlot()) | 
 |     //                .setUserInformation(request.getUserInformation()) | 
 |     //                .setStatus(ApiV3.BookingStatus.CONFIRMED) | 
 |     //                .build(); | 
 |     // | 
 |     //        ApiV3.CreateBookingResponse response = ApiV3.CreateBookingResponse.newBuilder() | 
 |     //                .setBooking(createdBooking) | 
 |     //                .build(); | 
 |     // | 
 |     //        Business logic error -> set the BookingFailure in the response | 
 |     //        e.g. | 
 |     //        BookingServerModel.BookingFailure bookingFailure = | 
 |     // BookingServerModel.BookingFailure.newBuilder() | 
 |     //                .setCause(BookingServerModel.BookingFailure.Cause.SLOT_UNAVAILABLE) | 
 |     //                .setDescription("slot is not available now") | 
 |     //                .build(); | 
 |     //        BookingServerModel.CreateBookingResponse response = | 
 |     // BookingServerModel.CreateBookingResponse.newBuilder() | 
 |     //                .setBookingFailure(bookingFailure).build(); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/UpdateBooking") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String updateBooking(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.UpdateBookingRequest.Builder requestBuilder = ApiV3.UpdateBookingRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.UpdateBookingRequest updateBookingRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.UpdateBookingResponse response = performUpdateBooking(updateBookingRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to update the booking based on the request | 
 |   private ApiV3.UpdateBookingResponse performUpdateBooking(ApiV3.UpdateBookingRequest request) { | 
 |  | 
 |     //        Update booking business logic: | 
 |     //        e.g. | 
 |     //        ApiV3.Booking booking = request.getBooking(); | 
 |     //        ApiV3.Booking updatedBooking = ... | 
 |     //        ApiV3.UpdateBookingResponse response = ApiV3.UpdateBookingResponse.newBuilder() | 
 |     //                .setBooking(updatedBooking) | 
 |     //                .build(); | 
 |     // | 
 |     //        Business logic error -> set the BookingFailure in the response | 
 |     //        e.g. | 
 |     //        BookingServerModel.BookingFailure bookingFailure = | 
 |     // BookingServerModel.BookingFailure.newBuilder() | 
 |     //                .setCause(BookingServerModel.BookingFailure.Cause.BOOKING_NOT_CANCELLABLE) | 
 |     //                .setDescription("this booking is not cancellable") | 
 |     //                .build(); | 
 |     //        BookingServerModel.CreateBookingResponse response = | 
 |     // BookingServerModel.CreateBookingResponse.newBuilder() | 
 |     //                .setBookingFailure(bookingFailure).build(); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/GetBookingStatus") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String getBookingStatus(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.GetBookingStatusRequest.Builder requestBuilder = | 
 |         ApiV3.GetBookingStatusRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.GetBookingStatusRequest getBookingStatusRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.GetBookingStatusResponse response = performGetBookingStatus(getBookingStatusRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to get the booking status and prepayment status based on | 
 |   // the request | 
 |   private ApiV3.GetBookingStatusResponse performGetBookingStatus( | 
 |       ApiV3.GetBookingStatusRequest request) { | 
 |  | 
 |     //        Get booking status business logic: | 
 |     //        e.g. | 
 |     //        String bookingId = request.getBookingId(); | 
 |     //        ... | 
 |     //        ApiV3.GetBookingStatusResponse response = ApiV3.GetBookingStatusResponse.newBuilder() | 
 |     //                .setBookingId(bookingId) | 
 |     //                .setBookingStatus(ApiV3.BookingStatus.CONFIRMED) | 
 |     //                .setPrepaymentStatus(ApiV3.PrepaymentStatus.PREPAYMENT_NOT_PROVIDED) | 
 |     //                .build(); | 
 |     // | 
 |     //        If booking id is not found -> throw new NotFoundException("Booking id not found"); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/ListBookings") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String getListBooking(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.ListBookingsRequest.Builder requestBuilder = ApiV3.ListBookingsRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.ListBookingsRequest listBookingsRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.ListBookingsResponse response = performGetListBooking(listBookingsRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to look up all bookings with the given userId | 
 |   private ApiV3.ListBookingsResponse performGetListBooking(ApiV3.ListBookingsRequest request) { | 
 |  | 
 |     //        List bookings business logic: | 
 |     //        e.g. | 
 |     //        String userId = request.getUserId(); | 
 |     //        List<ApiV3.Booking> bookings = ... | 
 |     // | 
 |     //        ApiV3.ListBookingsResponse response = ApiV3.ListBookingsResponse.newBuilder() | 
 |     //                .addAllBookings(bookings) | 
 |     //                .build(); | 
 |     // | 
 |     //        If user id not found -> throw new NotFoundException("User id not found"); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/CheckOrderFulfillability") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String checkOrderFulfillability(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.CheckOrderFulfillabilityRequest.Builder requestBuilder = | 
 |         ApiV3.CheckOrderFulfillabilityRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.CheckOrderFulfillabilityRequest checkOrderFulfillabilityRequest = requestBuilder.build(); | 
 |  | 
 |     // For unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.CheckOrderFulfillabilityResponse response = | 
 |         performCheckOrderFulfillability(checkOrderFulfillabilityRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to perform order fulfillability check | 
 |   private ApiV3.CheckOrderFulfillabilityResponse performCheckOrderFulfillability( | 
 |       ApiV3.CheckOrderFulfillabilityRequest request) { | 
 |  | 
 |     //        Check order fulfillability business logic: | 
 |     //        e.g. | 
 |     //        String merchantId = request.getMerchantId(); | 
 |     //        List<ApiV3.LineItem> lineItems = request.getItemList(); | 
 |     // | 
 |     //        List<ApiV3.LineItemFulfillability> itemFulfillabilities = | 
 |     //                getLineItemFulfillability(merchantId,lineItems); | 
 |     //        ApiV3.OrderFulfillability.OrderFulfillabilityResult result = | 
 |     //                getOrderFulfillabilityResult(itemFulfillabilities); | 
 |     // | 
 |     //        ApiV3.OrderFulfillability.Builder orderFulfillability = | 
 |     // ApiV3.OrderFulfillability.newBuilder() | 
 |     //                .setResult(result); | 
 |     //        for (int i = 0; i < itemFulfillabilities.size(); i++) { | 
 |     //            orderFulfillability.setItemFulfillability(i, itemFulfillabilities.get(i)); | 
 |     //        } | 
 |     //        ApiV3.Price total = ...   // total processing fees & taxes for this order | 
 |     //        ApiV3.CheckOrderFulfillabilityResponse response = | 
 |     // ApiV3.CheckOrderFulfillabilityResponse.newBuilder() | 
 |     //                .setFulfillability(orderFulfillability.build()) | 
 |     //                .setFeesAndTaxes(total) | 
 |     //                .build(); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/CreateOrder") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String createOrder(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.CreateOrderRequest.Builder requestBuilder = ApiV3.CreateOrderRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.CreateOrderRequest createOrderRequest = requestBuilder.build(); | 
 |  | 
 |     // For unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.CreateOrderResponse response = performCreateOrder(createOrderRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to create the order based on the request | 
 |   private ApiV3.CreateOrderResponse performCreateOrder(ApiV3.CreateOrderRequest request) { | 
 |  | 
 |     //        Create order business logic: | 
 |     //        e.g. | 
 |     //        ApiV3.Order order = request.getOrder(); | 
 |     // | 
 |     //        normal case -> create this order in the backend, return response: | 
 |     //        ApiV3.CreateOrderResponse response = ApiV3.CreateOrderResponse.newBuilder() | 
 |     //                .setOrder(order) | 
 |     //                .build(); | 
 |     // | 
 |     //        Business logic error -> set the BookingFailure in the response | 
 |     //        e.g. | 
 |     //        ApiV3.OrderFailure orderFailure = ApiV3.OrderFailure.newBuilder() | 
 |     //                .setCause(ApiV3.OrderFailure.Cause.ORDER_UNFULFILLABLE) | 
 |     //                .setFulfillability(orderFulfillability...) | 
 |     //                .build(); | 
 |     //        ApiV3.CreateOrderResponse response = ApiV3.CreateOrderResponse.newBuilder() | 
 |     //                .setOrderFailure(orderFailure) | 
 |     //                .build(); | 
 |     // | 
 |     //        return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/ListOrders") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String listOrders(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     ApiV3.ListOrdersRequest.Builder requestBuilder = ApiV3.ListOrdersRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     ApiV3.ListOrdersRequest listOrdersRequest = requestBuilder.build(); | 
 |  | 
 |     // For unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     ApiV3.ListOrdersResponse response = getListOrders(listOrdersRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to list orders based on user id or order ids | 
 |   private ApiV3.ListOrdersResponse getListOrders(ApiV3.ListOrdersRequest request) { | 
 |  | 
 |     //        List orders business logic: | 
 |     //        e.g. | 
 |     //        String userId = request.getUserId(); | 
 |     //        ApiV3.ListOrdersRequest.OrderIds orderIds = request.getOrderIds(); | 
 |     //        List<ApiV3.Order> orders = new ArrayList<ApiV3.Order>(); | 
 |     //        if (userId != null) { | 
 |     //            orders = findOrdersByUserId(userId); | 
 |     //        } else if (orderIds != null) { | 
 |     //            List<String> orderId = orderIds.getOrderIdList(); | 
 |     //            orders = getOrders(orderId); | 
 |     //        } else { | 
 |     //            throw new NotFoundException("No userId or orderId matched"); | 
 |     //        } | 
 |     //        ApiV3.ListOrdersResponse.Builder response = ApiV3.ListOrdersResponse.newBuilder(); | 
 |     //        for (int i = 0; i < orders.size(); i++) { | 
 |     //            response.setOrder(i, orders.get(i)); | 
 |     //        } | 
 |     // | 
 |     //        return response.build(); | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |  | 
 |   /** | 
 |    * Waitlist Implementation | 
 |    * Proto File - | 
 |    * https://developers.google.com/maps-booking/reference/rest-api-v3/waitlists/proto-bundle | 
 |    */ | 
 |   @Path("/BatchGetWaitEstimates") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String batchGetWaitEstimates(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     Waitlist.BatchGetWaitEstimatesRequest.Builder requestBuilder | 
 |         = Waitlist.BatchGetWaitEstimatesRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     Waitlist.BatchGetWaitEstimatesRequest batchGetWaitEstimatesRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     Waitlist.BatchGetWaitEstimatesResponse response | 
 |         = performBatchGetWaitEstimates(batchGetWaitEstimatesRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to return wait estimates based on party size | 
 |   private Waitlist.BatchGetWaitEstimatesResponse performBatchGetWaitEstimates( | 
 |       Waitlist.BatchGetWaitEstimatesRequest request) { | 
 |     // String merchantId = request.getMerchantId(); | 
 |     // String serviceId = request.getServiceId(); | 
 |     // | 
 |     // List<Integer> requestedPartySizes = request.getPartySizeList(); | 
 |     // | 
 |     // Waitlist.BatchGetWaitEstimatesResponse response | 
 |     //     = Waitlist.BatchGetWaitEstimatesResponse.newBuilder().setWaitlistStatus( | 
 |     //           WaitlistStatus.OPEN).addAllWaitEstimate(...).build(); | 
 |     // | 
 |     // return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/CreateWaitlistEntry") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String createWaitlistEntry(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     Waitlist.CreateWaitlistEntryRequest.Builder requestBuilder | 
 |         = Waitlist.CreateWaitlistEntryRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     Waitlist.CreateWaitlistEntryRequest createWaitlistEntryRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     Waitlist.CreateWaitlistEntryResponse response | 
 |         = performCreateWaitlistEntry(createWaitlistEntryRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to create wait list entry based on request | 
 |   private Waitlist.CreateWaitlistEntryResponse performCreateWaitlistEntry( | 
 |       Waitlist.CreateWaitlistEntryRequest request) { | 
 |     // String merchantId = request.getMerchantId(); | 
 |     // String serviceId = request.getServiceId(); | 
 |     // int partySize = request.getPartySize(); | 
 |     // | 
 |     // Waitlist.UserInformation userInformation = request.getUserInformation(); | 
 |     // String idempotencyToken = request.getIdempotencyToken(); | 
 |     // | 
 |     // Normal Case -> return a unique waitlist_entry_id e.g | 
 |     // Waitlist.CreateWaitlistEntryResponse response | 
 |     //     = Waitlist.CreateWaitlistEntryResponse.newBuilder().setWaitlistEntryId(...).build(); | 
 |     // | 
 |     // Business logic error -> set the WaitlistBusinessLogicFailure in the response | 
 |     // | 
 |     // Waitlist.WaitlistBusinessLogicFailure waitlistBusinessLogicFailure | 
 |     //     = Waitlist.WaitlistBusinessLogicFailure.newBuilder() | 
 |     //         .setCause(Cause.WAITLIST_FULL).setDescription("").build(); | 
 |     // | 
 |     // Waitlist.CreateWaitlistEntryResponse response | 
 |     //     = Waitlist.CreateWaitlistEntryResponse.newBuilder() | 
 |     //         .setWaitlistBusinessLogicFailure(waitlistBusinessLogicFailure).build(); | 
 |     // | 
 |     // return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/GetWaitlistEntry") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String getWaitlistEntry(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     Waitlist.GetWaitlistEntryRequest.Builder requestBuilder | 
 |         = Waitlist.GetWaitlistEntryRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     Waitlist.GetWaitlistEntryRequest getWaitlistEntryRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // Normal path: get response object from the helper function | 
 |     Waitlist.GetWaitlistEntryResponse response | 
 |         = performGetWaitlistEntry(getWaitlistEntryRequest); | 
 |  | 
 |     // use JsonFormat to convert protocol buffer to Json | 
 |     String jsonResponse = jsonPrinter().print(response); | 
 |     return jsonResponse; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to return waitlist entry | 
 |   private Waitlist.GetWaitlistEntryResponse performGetWaitlistEntry( | 
 |       Waitlist.GetWaitlistEntryRequest request) { | 
 |     // String waitlistEntryId = request.getWaitlistEntryId(); | 
 |     // | 
 |     // Waitlist.GetWaitlistEntryResponse response = Waitlist.GetWaitlistEntryResponse.newBuilder() | 
 |     //     .setWaitlistEntry(WaitlistEntry...).build(); | 
 |     // | 
 |     // return response; | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 |  | 
 |   @Path("/DeleteWaitlistEntry") | 
 |   @POST | 
 |   @Produces(MediaType.APPLICATION_JSON) | 
 |   @Consumes(MediaType.APPLICATION_JSON) | 
 |   public String deleteWaitlistEntry(String request) throws InvalidProtocolBufferException { | 
 |  | 
 |     // use JsonFormat.Parser to convert Json String into protocol buffer | 
 |     Waitlist.DeleteWaitlistEntryRequest.Builder requestBuilder | 
 |         = Waitlist.DeleteWaitlistEntryRequest.newBuilder(); | 
 |     JsonFormat.Parser jsonParser = JsonFormat.parser(); | 
 |     jsonParser.merge(request, requestBuilder); | 
 |     Waitlist.DeleteWaitlistEntryRequest deleteWaitlistEntryRequest = requestBuilder.build(); | 
 |  | 
 |     // Unexpected error: throw exception and handle it in BookingExceptionMapper class, | 
 |     // return corresponding response and HTTP code | 
 |     // | 
 |     // If entry exists, delete it. Otherwise throw 404 | 
 |     performDeleteWaitlistEntry(deleteWaitlistEntryRequest); | 
 |  | 
 |     return ""; | 
 |   } | 
 |  | 
 |   // TODO(partner): Implement this method to return waitlist entry | 
 |   private void performDeleteWaitlistEntry(Waitlist.DeleteWaitlistEntryRequest request) { | 
 |  | 
 |     // String waitlistEntryId = request.getWaitlistEntryId(); | 
 |     // If waitlist entry Id exists, delete it | 
 |     // If waitlist entry id doesn't exist, return 404 | 
 |     // throw new WebApplicationException(404); | 
 |  | 
 |     throw new UnsupportedOperationException("Not implemented yet"); | 
 |   } | 
 | } |