@Override
  protected Object doProcessRequest(ActionParam inParam)
      throws InvalidParameterException, NoSuchProductException {

    final int skip = inParam.getInt(GetPressClip.SKIP_PARAM, 0);
    final int count = inParam.getInt(GetPressClip.COUNT_PARAM, 10);
    final String theLangCode = inParam.getString(GetPressClip.LANGUAGE_PARAM, true);
    final String theProductName = inParam.getString(GetPressClip.PRODUCT_PARAM, true);

    final ProductData theProductData = ProductData.findByName(theProductName);
    final SiteLangData theLang = SiteLangData.getByISOCode(theLangCode);
    final Product theProduct = theProductData.getReference();

    if (theProduct == null) {
      throw new NoSuchProductException(APIErrorMessage.NO_SUCH_PRODUCT, theProductName);
    }

    final List<PressInformationMap> pressFromProductAndLanguage =
        new LinkedList<PressInformationMap>();

    for (final PressData aPressData :
        PressData.findByLangAndProduct(theLang.getReference(), theProduct, skip, count)) {
      pressFromProductAndLanguage.add(new PressInformationMap(inParam.getCaller(), aPressData));
    }

    return pressFromProductAndLanguage;
  }
  @Override
  protected Object doProcessRequest(ActionParam inParam)
      throws InvalidParameterException, NoSuchPersonException {

    final UserData theUser = getRequestedUser(inParam, null);
    return new PersonInformationMap(inParam.getCaller(), theUser, false);
  }
  @Override
  protected Object doProcessRequest(ActionParam inParam)
      throws InvalidParameterException, ForbiddenException, InvalidSessionException {

    final UserData theSessionUser = SessionManager.getUserFromSessionParam(inParam);
    final Boolean activate = inParam.getBoolean(ManageToken.ACTIVATE);

    // just returns the token value if it exists
    if (activate == null) {
      if (theSessionUser.hasToken()) {
        return String.valueOf(theSessionUser.getToken());
      }

    } else {
      if (!theSessionUser.hasToken() && activate) {
        return String.valueOf(theSessionUser.generateToken());
      }

      if (theSessionUser.hasToken() && !activate) {
        theSessionUser.clearToken();
      }
    }

    return null;
  }
  @Override
  protected Object doProcessRequest(ActionParam inParam)
      throws InvalidParameterException, NoSuchPersonException, ForbiddenException,
          InvalidSessionException, BadCredentialsException {

    final UserData theUser = getRequestedUser(inParam, null);

    // Check Session
    AbstractUserAction.doesSessionBelongToUser(theUser, inParam);

    final String old_password = inParam.getString("old_password", true);
    final String new_password = inParam.getString("new_password", true);
    if (old_password.equals(StringShop.EMPTY_STRING)) {
      throw new InvalidParameterException(
          APIErrorMessage.PASSWORD_CANNOT_BE_EMPTY, StringShop.EMPTY_STRING);
    }
    if (new_password.equals(StringShop.EMPTY_STRING)) {
      throw new InvalidParameterException(
          APIErrorMessage.PASSWORD_CANNOT_BE_EMPTY, StringShop.EMPTY_STRING);
    }

    if (!theUser.checkPasswordPlain(old_password)) {
      throw new BadCredentialsException(APIErrorMessage.INVALID_PASSWORD);
    }

    theUser.setPassword(new_password);

    return null;
  }
  @Override
  protected Object doProcessRequest(ActionParam inParam) throws InvalidParameterException {

    final String startWith = inParam.getMainParamAsString();
    final String language = inParam.getString(GetApplications.LANGUAGE_PARAM, true);

    final List<ApplicationInformationMap> appInfoMaps = new ArrayList<ApplicationInformationMap>();

    final SiteLangData theLangData = SiteLangData.getByISOCode(language);

    if (!startWith.matches("net.violet.(rss|podcast|webradio|js|external).")) {
      throw new InvalidParameterException(APIErrorMessage.BAD_FORMAT, startWith);
    }

    final List<ApplicationData> appList =
        ApplicationData.findByLangAndApplicationNameStartingWith(theLangData, startWith);
    for (final ApplicationData appData : appList) {
      appInfoMaps.add(new ApplicationInformationMap(inParam.getCaller(), appData));
    }

    return appInfoMaps;
  }