@Override
 public void shutdown() {
   super.shutdown();
   if (csp != null) {
     csp.shutdown();
   }
 }
  @Override
  public void process(
      ContentSpecConfiguration cspConfig,
      RESTManager restManager,
      ErrorLoggerManager elm,
      UserV1 user) {
    // If files is empty then we must be using a csprocessor.cfg file
    if (files.size() == 0 && cspConfig.getContentSpecId() != null) {
      TopicV1 contentSpec =
          restManager.getReader().getContentSpecById(cspConfig.getContentSpecId(), null);
      String fileName =
          StringUtilities.escapeTitle(contentSpec.getTitle())
              + "-post."
              + Constants.FILENAME_EXTENSION;
      File file = new File(fileName);
      if (!file.exists()) {
        // Backwards compatibility check for files ending with .txt
        file = new File(StringUtilities.escapeTitle(contentSpec.getTitle()) + "-post.txt");
        if (!file.exists()) {
          printError(String.format(Constants.NO_FILE_FOUND_FOR_CONFIG, fileName), false);
          shutdown(Constants.EXIT_FAILURE);
        }
      }
      files.add(file);
    }

    // Check that the parameters are valid
    if (!isValid()) {
      printError(Constants.ERROR_NO_FILE_MSG, true);
      shutdown(Constants.EXIT_FAILURE);
    }

    // Good point to check for a shutdown
    if (isAppShuttingDown()) {
      shutdown.set(true);
      return;
    }

    boolean success = false;

    // Read in the file contents
    String contentSpec = FileUtilities.readFileContents(files.get(0));

    if (contentSpec == null || contentSpec.equals("")) {
      printError(Constants.ERROR_EMPTY_FILE_MSG, false);
      shutdown(Constants.EXIT_FAILURE);
    }

    // Good point to check for a shutdown
    if (isAppShuttingDown()) {
      shutdown.set(true);
      return;
    }

    // Process the content spec to see if its valid
    csp = new ContentSpecProcessor(restManager, elm, permissive, true);
    try {
      success = csp.processContentSpec(contentSpec, user, ContentSpecParser.ParsingMode.EITHER);
    } catch (Exception e) {
      printError(Constants.ERROR_INTERNAL_ERROR, false);
      shutdown(Constants.EXIT_INTERNAL_SERVER_ERROR);
    }

    // Good point to check for a shutdown
    if (isAppShuttingDown()) {
      shutdown.set(true);
      return;
    }

    // Print the logs
    if (success) {
      JCommander.getConsole().println("VALID");
    } else {
      JCommander.getConsole().println(elm.generateLogs());
      JCommander.getConsole().println("INVALID");
      JCommander.getConsole().println("");
      shutdown(Constants.EXIT_TOPIC_INVALID);
    }
  }