/**
   * Aggiorna la visibilità delle schede con l'id passato e restituisce l'esito al client
   *
   * @return la serializzazione json dell'esito della richiesta
   */
  protected String bulkUpdateVisibility(
      UpdateVisibilityParameters updateVisibilityParameters,
      SPODEngine engine,
      Publisher publisher) {

    boolean updateToPublic = updateVisibilityParameters.isToPublic();

    try {
      // Si aggiorna la visibilità della scheda (tramite SP su DB site)
      // SPOD ha sia visibilità che approvazione, nella API CKAN si considerano i 2 aspetti
      // equivalenti
      // e sempre modificati contemporaneamente.
      engine.updateStatusVisibility(
          updateVisibilityParameters
              .getDatasets()
              .toArray(new String[updateVisibilityParameters.getDatasets().size()]),
          updateToPublic,
          updateToPublic);
    } catch (Exception e2) {
      SpodLogger.log(LogType.ERROR, e2);
      return Utils.toJson(
          Utils.buildActionApiResponseError(help, e2.getMessage(), "Generic Error"));
    }

    // Help generico sull'utilizzo del metodo
    String customGenericHelp = genericHelp;
    String successMessage =
        "Bulk Update " + ((updateToPublic) ? "Public" : "Private") + " successfully executed";
    SpodLogger.log(LogType.INFO, successMessage);
    return Utils.toJson(Utils.buildActionApiResponseSuccess(customGenericHelp, successMessage));
  }
  @SuppressWarnings({})
  public static void main(String[] args) {
    try {
      try {
        String logConfigFile = ConfigReader.readConfig("logConfigFile", "StatPortalOpenData");
        SpodLogger.configureLogger(logConfigFile);
      } catch (Exception ex) {
        // si perde il logging ma l'applicazione continua a funzionare
      }

      String configDir = ConfigReader.getConfigDir();
      String appContextFile = "file:" + configDir + "applicationContext.xml";
      FileSystemXmlApplicationContext cpac;
      try {
        cpac = new FileSystemXmlApplicationContext(appContextFile);
      } catch (Exception ex) {
        SpodLogger.log(LogType.FATAL, ex);
        SpodLogger.log(LogType.FATAL, "Il file " + appContextFile + " non esiste.");
        throw new ServiceConfigurationError("Non riesco a trovare " + appContextFile);
      }

      String urlRegex =
          "(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))";
      String endpointUri = ConfigReader.readConfig("url", "StatPortalOpenData");
      if (endpointUri == null) {
        throw new Exception("Manca il parametro url");
      }
      if (!endpointUri.matches(urlRegex)) {
        throw new Exception("Chiave url non valida");
      }
      String namespace = "StatPortal";

      final StatPortalJPAProducer jpaProducer = new StatPortalJPAProducer(namespace, 50, cpac);
      String numDistinctValuesStr =
          ConfigReader.readConfig("numDistinctValues", "StatPortalOpenData");
      int numDistinctValues = 20;
      if (numDistinctValuesStr != null && !"".equalsIgnoreCase(numDistinctValuesStr)) {
        try {
          numDistinctValues = Integer.parseInt(numDistinctValuesStr);
        } catch (Exception e) {
          SpodLogger.log(LogType.WARNING, "Valore di numDistinctValues non valido", e);
        }
      }

      final it.sister.statportal.odata.StatPortalProducer producer =
          new it.sister.statportal.odata.StatPortalProducer(jpaProducer, numDistinctValues);

      // register the producer as the static instance, then launch the
      // http server
      ODataProducerProvider.setInstance(producer);
      SpodLogger.log(LogType.INFO, "Starting service");
      ProducerUtil.hostODataServer(endpointUri);
    } catch (Exception ex) {
      SpodLogger.log(LogType.FATAL, ex);
    }
  }