@RequestMapping(value = "/waiter/bills/{billId}", method = RequestMethod.GET)
  public String showBillInWaiter(
      @PathVariable("billId") String billId, Model uiModel, Locale locale) {

    // warmup stuff
    Bill bill = warmupRestaurant(billId, uiModel);
    Restaurant resto = bill.getDiningTable().getRestaurant();

    List<Order> allPreparedOrders = orderService.findPreparedOrdersForRestaurant(resto);
    uiModel.addAttribute("allPreparedOrders", allPreparedOrders);

    List<Bill> allSubmittedBills = billService.findSubmittedBillsForRestaurant(resto);
    uiModel.addAttribute("allSubmittedBills", allSubmittedBills);

    uiModel.addAttribute(
        "message",
        new Message(
            "info",
            messageSource.getMessage("label_bill_amount", new Object[] {}, locale)
                + ": "
                + bill.getPriceAllOrders()
                + " "
                + messageSource.getMessage("label_currency", new Object[] {}, locale)));

    return "hartigehap/waiter";
  }
  @RequestMapping(value = "/waiter/orders/{orderId}", method = RequestMethod.GET)
  public String showOrderInWaiter(
      @PathVariable("orderId") String orderId, Model uiModel, Locale locale) {

    // warmup stuff
    Order order = warmupRestaurantByOrder(orderId, uiModel);
    Restaurant resto = order.getBill().getDiningTable().getRestaurant();

    List<Order> allPreparedOrders = orderService.findPreparedOrdersForRestaurant(resto);
    uiModel.addAttribute("allPreparedOrders", allPreparedOrders);

    List<Bill> allSubmittedBills = billService.findSubmittedBillsForRestaurant(resto);
    uiModel.addAttribute("allSubmittedBills", allSubmittedBills);

    String orderContent = "";
    for (OrderItem orderItem : order.getOrderItems()) {
      orderContent +=
          orderItem.getMenuItem().getId() + " (" + orderItem.getQuantity() + "x)" + "; ";
    }

    uiModel.addAttribute(
        "message",
        new Message(
            "info",
            messageSource.getMessage("label_order_content", new Object[] {}, locale)
                + ": "
                + orderContent));

    return "hartigehap/waiter";
  }
  @RequestMapping(value = "/restaurants/{restaurantName}/kitchen", method = RequestMethod.GET)
  public String showKitchen(@PathVariable("restaurantName") String restaurantName, Model uiModel) {

    // warmup stuff
    Collection<Restaurant> restaurants = restaurantService.findAll();
    uiModel.addAttribute("restaurants", restaurants);
    Restaurant restaurant = restaurantService.fetchWarmedUp(restaurantName);
    uiModel.addAttribute("restaurant", restaurant);

    List<Order> allSubmittedOrders = orderService.findSubmittedOrdersForRestaurant(restaurant);
    uiModel.addAttribute("allSubmittedOrders", allSubmittedOrders);

    List<Order> allPlannedOrders = orderService.findPlannedOrdersForRestaurant(restaurant);
    uiModel.addAttribute("allPlannedOrders", allPlannedOrders);

    return "hartigehap/kitchen";
  }
 private Order warmupRestaurantByOrder(String orderId, Model uiModel) {
   Order order = orderService.findById(Long.valueOf(orderId));
   Collection<Restaurant> restaurants = restaurantService.findAll();
   uiModel.addAttribute("restaurants", restaurants);
   Restaurant restaurant =
       restaurantService.fetchWarmedUp(order.getBill().getDiningTable().getRestaurant().getId());
   uiModel.addAttribute("restaurant", restaurant);
   return order;
 }
 private void orderHasBeenServed(Order order) {
   try {
     orderService.orderServed(order);
   } catch (StateException e) {
     log.error(
         "Internal error has occurred! Order "
             + Long.valueOf(order.getId())
             + "has not been changed to served state!",
         e);
   }
 }
  // this method serves kitchen subsystem and waiter subsystem requests,
  // which is quite confusing!
  // Reason is that the actual resource "orders/{orderId}" that is asked for,
  // is the same for kitchen subsystem and waiter subsystem,
  // meaning that the request URI is the same (according to REST).
  // You cannot have two methods with the same request URI mapping.
  // It is because the "event" request parameter (which is the distinguishing
  // parameter) is part of the HTTP body and can therefore not be
  // used for the request mapping.
  @RequestMapping(value = "/orders/{orderId}", method = RequestMethod.PUT)
  public String receiveEvent(
      @PathVariable("orderId") String orderId,
      @RequestParam String event,
      Model uiModel,
      Locale locale) {

    Order order = orderService.findById(Long.valueOf(orderId));
    Restaurant restaurant = warmupRestaurant(order, uiModel);

    switch (event) {
      case "planOrder":
        try {
          orderService.planOrder(order);
        } catch (StateException e) {
          logger.error(
              "Internal error has occurred! Order "
                  + Long.valueOf(orderId)
                  + "has not been changed to planned state!",
              e);

          // StateException triggers a rollback; consequently all Entities are invalidated by
          // Hibernate
          // So new warmup needed
          warmupRestaurant(order, uiModel);
          return "hartigehap/kitchen";
        }
        return "redirect:/restaurants/" + restaurant.getId() + "/kitchen";
        // break unreachable

      case "orderHasBeenPrepared":
        try {
          orderService.orderPrepared(order);
        } catch (StateException e) {
          logger.error(
              "Internal error has occurred! Order "
                  + Long.valueOf(orderId)
                  + "has not been changed to prepared state!",
              e);

          // StateException triggers a rollback; consequently all Entities are invalidated by
          // Hibernate
          // So new warmup needed
          warmupRestaurant(order, uiModel);
          return "hartigehap/kitchen";
        }
        return "redirect:/restaurants/" + restaurant.getId() + "/kitchen";
        // break unreachable

      case "orderHasBeenServed":
        try {
          orderService.orderServed(order);
        } catch (StateException e) {
          logger.error(
              "Internal error has occurred! Order "
                  + Long.valueOf(orderId)
                  + "has not been changed to served state!",
              e);

          // StateException triggers a rollback; consequently all Entities are invalidated by
          // Hibernate
          // So new warmup needed
          warmupRestaurant(order, uiModel);
          return "hartigehap/waiter";
        }
        return "redirect:/restaurants/" + restaurant.getId() + "/waiter";
        // break unreachable

      default:
        logger.error("Internal error: event " + event + " not recognized");
        return "redirect:/restaurants/" + restaurant.getId();
    }
  }