@RequestMapping(value = "/oauth/addApp/{TOKEN}/{APPID}", method = RequestMethod.GET)
  @Timed
  public AddAppResponseDTO addApp(
      @PathVariable("TOKEN") String ott,
      @PathVariable("APPID") String appId,
      HttpServletRequest request)
      throws IOException, JAXBException, TokenNotFoundException, TokenAlreadyUsedException {
    AddAppResponseDTO response = new AddAppResponseDTO();
    log.debug("REST ADD CUSTOM APPS. token [{}]", ott);

    Token token = tokenRepository.findOneByOtt(ott);
    if (token == null) {
      throw new TokenNotFoundException(ott);
    }

    Person person = token.getPerson();
    Application application = token.getApplication();

    Application customApp = applicationRepository.findOne(new Long(appId));

    log.debug(
        "REST ADD CUSTOM APPS. person [{}], localid [{}], customApp [{}]",
        person,
        person.getLocalID(),
        customApp.getId());

    RelPersonApplication relPersonApplication = null;
    relPersonApplication = new RelPersonApplication();
    relPersonApplication.setApplication(customApp);
    relPersonApplication.setPerson(person);
    relPersonApplication.setToken(token);
    relPersonApplication.setValid(null);
    relPersonApplication.setLast(true);
    relPersonApplication.setCustom(true);
    relPersonApplicationRepository.save(relPersonApplication);

    ApplicationMinDTO appMinAdded = ApplicationMapper.from(customApp, true, null);
    response.setApp(appMinAdded);

    return response;
  }
  @RequestMapping(value = "/oauth/{TOKEN}", method = RequestMethod.GET)
  @Timed
  public void oauthUser(
      @PathVariable("TOKEN") String ott, HttpServletRequest request, HttpServletResponse response)
      throws IOException, JAXBException, TokenNotFoundException, TokenAlreadyUsedException {
    log.debug("REST OAUTH START. token [{}]", ott);

    Token token = tokenRepository.findOneByOtt(ott);
    if (token == null) {
      throw new TokenNotFoundException(ott);
    }
    // if( token.getDateUsed() !=null){
    //	throw new TokenAlreadyUsedException(ott);
    // }

    Person person = token.getPerson();
    Application application = token.getApplication();

    // qual รจ l'organizzazione dell'utente?
    String orgUnit = null;
    if (application.getAllOrg()) orgUnit = token.getOrgUnit();
    else orgUnit = application.getOrgUnit();

    List<Application> applicationForUser =
        applicationRepository.findAllByOrgUnitOrAllOrgIsTrue(orgUnit);
    Map<Long, Application> applicationForUserMap = new HashMap<Long, Application>();
    for (Application i : applicationForUser) applicationForUserMap.put(i.getId(), i);

    List<RelPersonApplication> listApplicationAuth =
        relPersonApplicationRepository.findAllByPersonIsAndLastIsTrue(person);
    Map<Long, RelPersonApplication> mapRelOld = new HashMap<Long, RelPersonApplication>();
    // Set old application access key invalid
    for (int i = 0; i < listApplicationAuth.size(); i++) {
      RelPersonApplication applicationAuthorize = listApplicationAuth.get(i);
      applicationAuthorize.setValid(false);
      applicationAuthorize.setLast(false);
      relPersonApplicationRepository.save(applicationAuthorize);
      mapRelOld.put(applicationAuthorize.getApplication().getId(), applicationAuthorize);
      if ((applicationAuthorize.getCustom() == true)
          && (applicationForUserMap.get(applicationAuthorize.getApplication().getId()) == null)) {
        applicationForUser.add(applicationAuthorize.getApplication());
      }
    }

    // token.setDateUsed(DateTime.now());
    // tokenRepository.save(token);

    Application applicationAuthorize = null;
    RelPersonApplication relPersonApplication = null;

    // Create new access key record
    for (int i = 0; i < applicationForUser.size(); i++) {
      applicationAuthorize = applicationForUser.get(i);
      relPersonApplication = new RelPersonApplication();
      relPersonApplication.setApplication(applicationAuthorize);
      relPersonApplication.setPerson(person);
      relPersonApplication.setToken(token);
      if (mapRelOld.get(applicationAuthorize.getId()) != null) {
        RelPersonApplication relOld = mapRelOld.get(applicationAuthorize.getId());
        relPersonApplication.setDateReleased(relOld.getDateReleased());
        relPersonApplication.setOauthAccessToken(relOld.getOauthAccessToken());
        relPersonApplication.setCustom(relOld.getCustom());
      } else {
        relPersonApplication.setCustom(false);
      }
      relPersonApplication.setValid(null);
      relPersonApplication.setLast(true);

      relPersonApplicationRepository.save(relPersonApplication);
    }

    String urlToRedirect = getLandingPageURL(request, ott);

    log.info(
        "REST OAUTH REDIRECT TO APP. listApp [{}], appId [{}], token [{}], urlRedirect [{}]",
        applicationForUser.size(),
        applicationAuthorize.getApplicationID(),
        ott,
        urlToRedirect);
    log.debug("REST OAUTH FINISH. token [{}], urlToRedirect [{}]", ott, urlToRedirect);

    response.sendRedirect(urlToRedirect);
    return;
  }