@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;
  }
public class AirHandler extends DefaultHandler {

  private static final Pattern AIR_SOURCE = Pattern.compile("^air\\..+$");

  private static final ApplicationData AIR_APPLICATION =
      ApplicationData.getData(NativeApplication.AIR.getApplication());

  public static final String SOURCE_SETTING = "source";
  public static final String LANGUAGE_SETTING = "language";

  protected AirHandler() {
    super(AirHandler.AIR_APPLICATION);
  }

  @Override
  public void checkSettings(VObjectData object, Map<String, Object> settings)
      throws InvalidSettingException, MissingSettingException {
    final Object source = settings.get(AirHandler.SOURCE_SETTING);
    final Object language = settings.get(AirHandler.LANGUAGE_SETTING);

    if ((source == null) || (language == null)) {
      throw new MissingSettingException(
          source == null ? AirHandler.SOURCE_SETTING : AirHandler.LANGUAGE_SETTING);
    }

    if (Factories.LANG.findByIsoCode(language.toString()) == null) {
      throw new InvalidSettingException(AirHandler.LANGUAGE_SETTING, language.toString());
    }

    if (!AirHandler.AIR_SOURCE.matcher(source.toString()).matches()
        || (Factories.SOURCE.findByPath(source.toString()) == null)) {
      throw new InvalidSettingException(AirHandler.SOURCE_SETTING, source.toString());
    }
  }

  // used by My
  public static SubscriptionData createOrUpdateSubscription(
      SubscriptionData inSubscription,
      VObjectData inObject,
      boolean isAmbiant,
      String isoCode,
      String inSrc,
      List<String> inTimeList)
      throws InvalidParameterException, InvalidSettingException, InvalidSchedulingsException,
          MissingSettingException {

    final Map<String, Object> theSettings = new HashMap<String, Object>();
    theSettings.put(AirHandler.LANGUAGE_SETTING, isoCode);
    theSettings.put(AirHandler.SOURCE_SETTING, inSrc);

    final List<Map<String, Object>> theSchedulings = new ArrayList<Map<String, Object>>();

    if (isAmbiant) {
      final Map<String, Object> scheduling = new HashMap<String, Object>();
      scheduling.put(SchedulingType.TYPE_KEY, SchedulingType.SCHEDULING_TYPE.Ambiant.getLabel());
      theSchedulings.add(scheduling);
    }

    final Map<String, Object> scheduling = new HashMap<String, Object>();
    scheduling.put(SchedulingType.TYPE_KEY, SchedulingType.SCHEDULING_TYPE.VoiceTrigger.getLabel());
    scheduling.put(KeywordHandler.KEYWORD, AbstractRecoService.SMOG);
    theSchedulings.add(scheduling);

    theSchedulings.addAll(
        ApplicationHandlerHelper.generateDailySchedulings(
            inTimeList, inObject.getReference().getTimeZone().getJavaTimeZone(), true));

    if (inSubscription == null) {
      return SubscriptionManager.createSubscription(
          AirHandler.AIR_APPLICATION, inObject, theSettings, theSchedulings, null);
    }

    SubscriptionManager.updateSubscription(inSubscription, theSettings, theSchedulings, null);
    return inSubscription;
  }
}