@RequestMapping(method = RequestMethod.POST, value = "/planrecurrent/{clientId}")
  public @ResponseBody RecurrentJourney planRecurrentJourney(
      HttpServletRequest request,
      HttpServletResponse response,
      HttpSession session,
      @RequestBody RecurrentJourneyParameters parameters,
      @PathVariable String clientId)
      throws InvocationException, AcServiceException {
    try {
      User user = getUser(request);
      String userId = getUserId(user);
      if (userId == null) {
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        return null;
      }

      List<String> reqs = buildRecurrentJourneyPlannerRequest(parameters);
      List<SimpleLeg> legs = new ArrayList<SimpleLeg>();
      ObjectMapper mapper = new ObjectMapper();
      for (String req : reqs) {
        String plan =
            HTTPConnector.doGet(
                otpURL + SMARTPLANNER + RECURRENT, req, MediaType.APPLICATION_JSON, null, "UTF-8");
        List sl = mapper.readValue(plan, List.class);
        for (Object o : sl) {
          legs.add((SimpleLeg) mapper.convertValue(o, SimpleLeg.class));
        }
      }

      DomainObject res =
          getObjectByClientId(
              clientId, "smartcampus.services.journeyplanner.RecurrentJourneyObject");
      if (res != null) {
        String objectId = checkUser(res, userId);
        if (objectId == null) {
          response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        } else {
          RecurrentJourney oldJourney =
              mapper.convertValue(res.getContent().get("data"), RecurrentJourney.class);
          RecurrentJourney journey = new RecurrentJourney();
          journey.setParameters(parameters);
          journey.setLegs(legs);
          journey.setMonitorLegs(buildMonitorMap(legs, oldJourney.getMonitorLegs()));
          return journey;
        }
      } else {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
      }

    } catch (ConnectorException e0) {
      response.setStatus(e0.getCode());
    } catch (Exception e) {
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }

    return null;
  }
  @RequestMapping(method = RequestMethod.POST, value = "/planrecurrent")
  public @ResponseBody RecurrentJourney planRecurrentJourney(
      HttpServletRequest request,
      HttpServletResponse response,
      @RequestBody RecurrentJourneyParameters parameters,
      HttpSession session)
      throws InvocationException, AcServiceException {
    try {
      User user = getUser(request);
      String userId = getUserId(user);
      if (userId == null) {
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        return null;
      }

      List<String> reqs = buildRecurrentJourneyPlannerRequest(parameters);
      List<SimpleLeg> legs = new ArrayList<SimpleLeg>();
      ObjectMapper mapper = new ObjectMapper();
      for (String req : reqs) {
        String plan =
            HTTPConnector.doGet(
                otpURL + SMARTPLANNER + RECURRENT, req, MediaType.APPLICATION_JSON, null, "UTF-8");
        List sl = mapper.readValue(plan, List.class);
        for (Object o : sl) {
          legs.add((SimpleLeg) mapper.convertValue(o, SimpleLeg.class));
        }
      }

      RecurrentJourney journey = new RecurrentJourney();
      journey.setParameters(parameters);
      journey.setLegs(legs);
      journey.setMonitorLegs(buildMonitorMap(legs));

      response.setContentType("application/json; charset=utf-8");

      String result = mapper.writeValueAsString(journey);

      ServletOutputStream sos = response.getOutputStream();
      sos.write(result.getBytes());
    } catch (ConnectorException e0) {
      response.setStatus(e0.getCode());
    } catch (Exception e) {
      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    }

    return null;
  }