Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ClearCache.cpp 5.57 KiB
#include "MantidAlgorithms/ClearCache.h"
#include "MantidAPI/AnalysisDataService.h"
#include "MantidAPI/AlgorithmManager.h"
#include "MantidAPI/InstrumentDataService.h"
#include "MantidKernel/UsageService.h"
#include <Poco/Path.h>
#include <Poco/File.h>
#include <Poco/Glob.h>

namespace Mantid {
namespace Algorithms {

using namespace Mantid::Kernel;
using namespace Mantid::API;

// Register the algorithm into the AlgorithmFactory
DECLARE_ALGORITHM(ClearCache)

//----------------------------------------------------------------------------------------------

/// Algorithms name for identification. @see Algorithm::name
const std::string ClearCache::name() const { return "ClearCache"; }

/// Algorithm's version for identification. @see Algorithm::version
int ClearCache::version() const { return 1; }

/// Algorithm's category for identification. @see Algorithm::category
const std::string ClearCache::category() const { return "Utility"; }

/// Algorithm's summary for use in the GUI and help. @see Algorithm::summary
const std::string ClearCache::summary() const {
  return "Clears out selected cached information held by Mantidplot.";
}

//----------------------------------------------------------------------------------------------
/** Initialize the algorithm's properties.
 */
void ClearCache::init() {
  declareProperty(
      "AlgorithmCache", false,
      "Clears the memory cache of the last used algorithm parameters.");
  declareProperty(
      "InstrumentCache", false,
      "Clears the memory cache of the loaded instrument definitions.");
  declareProperty("DownloadedInstrumentFileCache", false,
                  "Clears the file cache of the downloaded instrument "
                  "definitions.  This can be repopulated using "
                  "DownloadInstrument.");
  declareProperty(
      "GeometryFileCache", false,
      "Clears the file cache of the triangulated detector geometries.");
  declareProperty("WorkspaceCache", false,
                  "Clears the memory cache of any workspaces.");
  declareProperty("UsageServiceCache", false,
                  "Clears the memory cache of usage data.");
  declareProperty(
      "FilesRemoved", 0,
      "The number of files removed. Memory clearance do not add to this.",
      Direction::Output);
}

//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
 */
void ClearCache::exec() {
  int filesRemoved = 0;
  bool clearAlgCache = getProperty("AlgorithmCache");
  bool clearInstService = getProperty("InstrumentCache");
  bool clearInstFileCache = getProperty("DownloadedInstrumentFileCache");
  bool clearGeometryFileCache = getProperty("GeometryFileCache");
  bool clearUsageService = getProperty("UsageServiceCache");
  bool clearAnalysisService = getProperty("WorkspaceCache");

  bool isAnythingSelected = clearAlgCache || clearInstService ||
                            clearInstFileCache || clearGeometryFileCache ||
                            clearUsageService || clearAnalysisService;
  if (!isAnythingSelected) {
    g_log.warning("Nothing caches to clear.  Nothing done.");
    return;
  }

  // get the instrument directories
  auto instrumentDirs =
      Mantid::Kernel::ConfigService::Instance().getInstrumentDirectories();
  Poco::Path localPath(instrumentDirs[0]);
  localPath.makeDirectory();

  if (clearAlgCache) {
    g_log.debug("Emptying the Algorithm cache (AlgorithmCache).");
    AlgorithmManager::Instance().clear();
  }
  if (clearAnalysisService) {
    g_log.debug("Emptying the Analysis data service (WorkspaceCache).");
    AnalysisDataService::Instance().clear();
  }
  if (clearInstService) {
    g_log.debug("Emptying the Instrument data service (InstrumentCache).");
    InstrumentDataService::Instance().clear();
  }
  if (clearInstFileCache) {
    g_log.debug("Removing files from the Downloaded Instrument file cache "
                "(DownloadedInstrumentFileCache).");
    int filecount = deleteFiles(localPath.toString(), "*.xml");
    filecount += deleteFiles(localPath.toString(), "github.json");
    g_log.information() << filecount << " files deleted\n";
    filesRemoved += filecount;
  }
  if (clearGeometryFileCache) {
    g_log.debug("Removing files from the triangulated detector geometry file "
                "cache (GeometryFileCache).");
    Poco::Path GeomPath(localPath);
    GeomPath.append("geometryCache").makeDirectory();
    int filecount = deleteFiles(GeomPath.toString(), "*.vtp");
    g_log.information() << filecount << " files deleted\n";
    filesRemoved += filecount;
  }
  if (clearUsageService) {
    g_log.debug("Emptying the Usage data service (UsageServiceCache).");
    UsageService::Instance().clear();
  }
  setProperty("FilesRemoved", filesRemoved);
}

/** Deletes files on the path that match the pattern provided
 *  @param path The path for the deletion
 *  @param pattern The pattern to match filenames * and ? are wildcards
 *  @returns The number of files deleted
 */
int ClearCache::deleteFiles(const std::string &path,
                            const std::string &pattern) const {
  int filesDeleted = 0;

  Poco::Path pathPattern(path);
  pathPattern.makeDirectory();
  pathPattern.append(pattern);
  std::set<std::string> files;
  Poco::Glob::glob(pathPattern, files, Poco::Glob::GLOB_CASELESS);

  for (auto filepath : files) {
    Poco::File file(filepath);
    g_log.debug("Deleting file " + filepath);
    try {
      file.remove();
      filesDeleted++;
    } catch (Poco::FileException &ex) {
      g_log.warning("Cannot delete file " + filepath + ": " + ex.what());
    }
  }
  return filesDeleted;
}

} // namespace Algorithms
} // namespace Mantid