@Override
  public boolean login(String username, String password) throws ServiceException {
    RestTemplate restTemplate = this.restClient.getRestTemplate();
    String url = this.restClient.createServiceUrl("/login");
    HttpHeaders headers = this.restClient.getHttpHeaders();
    headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE);

    MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
    form.add("user", username);
    form.add("password", password);

    HttpEntity<MultiValueMap<String, String>> entity =
        new HttpEntity<MultiValueMap<String, String>>(form, headers);

    LOG.info("Login " + username + " at " + url);

    UserStatusDto status = null;
    try {
      status = restTemplate.postForObject(url, entity, UserStatusDto.class);
    } catch (RestClientException e) {
      throw new ServiceException("Login failed: " + e.getMessage(), e);
    }

    if (status.getEvent() == UserEvent.AUTH_FAILURE) {
      return false;
    }

    LOG.debug("Login " + username + " successful");

    this.user = status;

    return true;
  }
  @Override
  public void logout() throws ServiceException {
    RestTemplate restTemplate = this.restClient.getRestTemplate();
    String url = this.restClient.createServiceUrl("/logout");

    LOG.info("Logout " + this.user.getUsername() + " at " + url);

    UserStatusDto status = null;
    try {
      this.updateLastLoginDate(this.user.getId());
      status = restTemplate.getForObject(url, UserStatusDto.class);
    } catch (RestClientException e) {
      throw new ServiceException("Logout failed: " + e.getMessage(), e);
    }

    if (status.getEvent() != UserEvent.LOGOUT) {
      throw new ServiceException("Logout failed: Invalid event");
    } else {
      LOG.debug("Logout " + this.user.getUsername() + " successful");
    }

    this.user = new UserStatusDto();
  }