use std::any::Any;
use std::sync::Arc;
use crate::engine::TemplateModel;
use crate::util::Utf16String;
use super::{
AbstractCacheManager, ExpressionCacheKey, ICache, ICacheEntryValidityChecker, ICacheManager,
StandardCache, StandardParsedTemplateEntryValidator, TemplateCacheKey,
};
pub struct StandardCacheManager {
cache_manager: AbstractCacheManager,
template_cache_name: Utf16String,
template_cache_initial_size: i32,
template_cache_max_size: i32,
template_cache_enable_counters: bool,
template_cache_use_soft_references: bool,
template_cache_logger_name: Option<Utf16String>,
template_cache_validity_checker:
Option<Arc<dyn ICacheEntryValidityChecker<TemplateCacheKey, TemplateModel>>>,
expression_cache_name: Utf16String,
expression_cache_initial_size: i32,
expression_cache_max_size: i32,
expression_cache_enable_counters: bool,
expression_cache_use_soft_references: bool,
expression_cache_logger_name: Option<Utf16String>,
expression_cache_validity_checker:
Option<Arc<dyn ICacheEntryValidityChecker<ExpressionCacheKey, dyn Any + Send + Sync>>>,
}
impl StandardCacheManager {
pub const DEFAULT_TEMPLATE_CACHE_NAME: &'static str = "TEMPLATE_CACHE";
pub const DEFAULT_TEMPLATE_CACHE_INITIAL_SIZE: i32 = 20;
pub const DEFAULT_TEMPLATE_CACHE_MAX_SIZE: i32 = 200;
pub const DEFAULT_TEMPLATE_CACHE_ENABLE_COUNTERS: bool = false;
pub const DEFAULT_TEMPLATE_CACHE_USE_SOFT_REFERENCES: bool = true;
pub const DEFAULT_EXPRESSION_CACHE_NAME: &'static str = "EXPRESSION_CACHE";
pub const DEFAULT_EXPRESSION_CACHE_INITIAL_SIZE: i32 = 100;
pub const DEFAULT_EXPRESSION_CACHE_MAX_SIZE: i32 = 500;
pub const DEFAULT_EXPRESSION_CACHE_ENABLE_COUNTERS: bool = false;
pub const DEFAULT_EXPRESSION_CACHE_USE_SOFT_REFERENCES: bool = true;
#[must_use]
pub fn new() -> Self {
Self {
cache_manager: AbstractCacheManager::new(),
template_cache_name: Utf16String::from_rust_str(Self::DEFAULT_TEMPLATE_CACHE_NAME),
template_cache_initial_size: Self::DEFAULT_TEMPLATE_CACHE_INITIAL_SIZE,
template_cache_max_size: Self::DEFAULT_TEMPLATE_CACHE_MAX_SIZE,
template_cache_enable_counters: Self::DEFAULT_TEMPLATE_CACHE_ENABLE_COUNTERS,
template_cache_use_soft_references: Self::DEFAULT_TEMPLATE_CACHE_USE_SOFT_REFERENCES,
template_cache_logger_name: None,
template_cache_validity_checker: Some(Arc::new(
StandardParsedTemplateEntryValidator::new(),
)),
expression_cache_name: Utf16String::from_rust_str(Self::DEFAULT_EXPRESSION_CACHE_NAME),
expression_cache_initial_size: Self::DEFAULT_EXPRESSION_CACHE_INITIAL_SIZE,
expression_cache_max_size: Self::DEFAULT_EXPRESSION_CACHE_MAX_SIZE,
expression_cache_enable_counters: Self::DEFAULT_EXPRESSION_CACHE_ENABLE_COUNTERS,
expression_cache_use_soft_references:
Self::DEFAULT_EXPRESSION_CACHE_USE_SOFT_REFERENCES,
expression_cache_logger_name: None,
expression_cache_validity_checker: None,
}
}
#[must_use]
pub fn get_template_cache_name(&self) -> &Utf16String {
&self.template_cache_name
}
#[must_use]
pub const fn get_template_cache_use_soft_references(&self) -> bool {
self.template_cache_use_soft_references
}
#[must_use]
pub const fn get_template_cache_initial_size(&self) -> i32 {
self.template_cache_initial_size
}
#[must_use]
pub const fn get_template_cache_max_size(&self) -> i32 {
self.template_cache_max_size
}
#[must_use]
pub fn get_template_cache_logger_name(&self) -> Option<&Utf16String> {
self.template_cache_logger_name.as_ref()
}
#[must_use]
pub fn get_template_cache_validity_checker(
&self,
) -> Option<&dyn ICacheEntryValidityChecker<TemplateCacheKey, TemplateModel>> {
self.template_cache_validity_checker.as_deref()
}
#[must_use]
pub fn get_expression_cache_name(&self) -> &Utf16String {
&self.expression_cache_name
}
#[must_use]
pub const fn get_expression_cache_use_soft_references(&self) -> bool {
self.expression_cache_use_soft_references
}
#[must_use]
pub const fn get_expression_cache_initial_size(&self) -> i32 {
self.expression_cache_initial_size
}
#[must_use]
pub const fn get_expression_cache_max_size(&self) -> i32 {
self.expression_cache_max_size
}
#[must_use]
pub fn get_expression_cache_logger_name(&self) -> Option<&Utf16String> {
self.expression_cache_logger_name.as_ref()
}
#[must_use]
pub fn get_expression_cache_validity_checker(
&self,
) -> Option<&dyn ICacheEntryValidityChecker<ExpressionCacheKey, dyn Any + Send + Sync>> {
self.expression_cache_validity_checker.as_deref()
}
pub fn set_template_cache_name(&mut self, template_cache_name: Utf16String) {
self.template_cache_name = template_cache_name;
}
pub const fn set_template_cache_initial_size(&mut self, template_cache_initial_size: i32) {
self.template_cache_initial_size = template_cache_initial_size;
}
pub const fn set_template_cache_max_size(&mut self, template_cache_max_size: i32) {
self.template_cache_max_size = template_cache_max_size;
}
pub const fn set_template_cache_use_soft_references(
&mut self,
template_cache_use_soft_references: bool,
) {
self.template_cache_use_soft_references = template_cache_use_soft_references;
}
pub fn set_template_cache_logger_name(
&mut self,
template_cache_logger_name: Option<Utf16String>,
) {
self.template_cache_logger_name = template_cache_logger_name;
}
pub fn set_template_cache_validity_checker(
&mut self,
template_cache_validity_checker: Option<
Arc<dyn ICacheEntryValidityChecker<TemplateCacheKey, TemplateModel>>,
>,
) {
self.template_cache_validity_checker = template_cache_validity_checker;
}
pub const fn set_template_cache_enable_counters(
&mut self,
template_cache_enable_counters: bool,
) {
self.template_cache_enable_counters = template_cache_enable_counters;
}
pub fn set_expression_cache_name(&mut self, expression_cache_name: Utf16String) {
self.expression_cache_name = expression_cache_name;
}
pub const fn set_expression_cache_initial_size(&mut self, expression_cache_initial_size: i32) {
self.expression_cache_initial_size = expression_cache_initial_size;
}
pub const fn set_expression_cache_max_size(&mut self, expression_cache_max_size: i32) {
self.expression_cache_max_size = expression_cache_max_size;
}
pub const fn set_expression_cache_use_soft_references(
&mut self,
expression_cache_use_soft_references: bool,
) {
self.expression_cache_use_soft_references = expression_cache_use_soft_references;
}
pub fn set_expression_cache_logger_name(
&mut self,
expression_cache_logger_name: Option<Utf16String>,
) {
self.expression_cache_logger_name = expression_cache_logger_name;
}
pub fn set_expression_cache_validity_checker(
&mut self,
expression_cache_validity_checker: Option<
Arc<dyn ICacheEntryValidityChecker<ExpressionCacheKey, dyn Any + Send + Sync>>,
>,
) {
self.expression_cache_validity_checker = expression_cache_validity_checker;
}
pub const fn set_expression_cache_enable_counters(
&mut self,
expression_cache_enable_counters: bool,
) {
self.expression_cache_enable_counters = expression_cache_enable_counters;
}
fn initialize_template_cache(
&self,
) -> Option<Arc<dyn ICache<TemplateCacheKey, TemplateModel>>> {
if self.template_cache_max_size == 0 {
return None;
}
let cache = StandardCache::with_options(
Some(&self.template_cache_name.to_string_lossy()),
self.template_cache_use_soft_references,
self.template_cache_initial_size,
self.template_cache_max_size,
self.template_cache_validity_checker.clone(),
self.template_cache_enable_counters,
false,
)
.expect("Invalid template cache configuration");
Some(Arc::new(cache))
}
fn initialize_expression_cache(
&self,
) -> Option<Arc<dyn ICache<ExpressionCacheKey, dyn Any + Send + Sync>>> {
if self.expression_cache_max_size == 0 {
return None;
}
let cache: StandardCache<ExpressionCacheKey, dyn Any + Send + Sync> =
StandardCache::with_options(
Some(&self.expression_cache_name.to_string_lossy()),
self.expression_cache_use_soft_references,
self.expression_cache_initial_size,
self.expression_cache_max_size,
self.expression_cache_validity_checker.clone(),
self.expression_cache_enable_counters,
false,
)
.expect("Invalid expression cache configuration");
Some(Arc::new(cache))
}
}
impl Default for StandardCacheManager {
fn default() -> Self {
Self::new()
}
}
impl ICacheManager for StandardCacheManager {
fn class_name(&self) -> &'static str {
"org.thymeleaf.cache.StandardCacheManager"
}
fn get_template_cache(&self) -> Option<&dyn ICache<TemplateCacheKey, TemplateModel>> {
self.cache_manager
.get_template_cache(|| self.initialize_template_cache())
}
fn get_expression_cache(
&self,
) -> Option<&dyn ICache<ExpressionCacheKey, dyn Any + Send + Sync>> {
self.cache_manager
.get_expression_cache(|| self.initialize_expression_cache())
}
fn get_specific_cache<K, V>(&self, _name: &Utf16String) -> Option<&dyn ICache<K, V>>
where
Self: Sized,
K: Clone + Eq + std::hash::Hash + Send + Sync,
V: Send + Sync,
{
None
}
fn get_all_specific_cache_names(&self) -> Option<Vec<Utf16String>> {
Some(Vec::new())
}
fn clear_all_caches(&self) {
if let Some(cache) = self.get_template_cache() {
cache.clear();
}
if let Some(cache) = self.get_expression_cache() {
cache.clear();
}
}
}