use crate::audit::{AuditLogger, AuditLoggerFactory, DefaultAuditLoggerFactory};
use crate::config::Config;
#[cfg(feature = "enhanced")]
use crate::enhanced_impl::EnhancedComponentFactory;
use crate::neutralizer::{create_neutralizer, ThreatNeutralizer};
#[cfg(feature = "enhanced")]
use crate::permissions::EnhancedPermissionManager;
use crate::permissions::{
default_tool_definitions, ClientPermissions, PermissionRules, StandardPermissionManager,
ThreatLevel, ToolPermissionManager,
};
use crate::plugins::{DefaultPluginManagerFactory, PluginManagerFactory, PluginManagerTrait};
use crate::resilience::{
create_bulkhead, create_circuit_breaker, create_retry_strategy, DynBulkhead,
};
use crate::standard_impl::StandardFactory;
use crate::storage::{DefaultStorageFactory, StorageProvider, StorageProviderFactory};
#[cfg(feature = "enhanced")]
use crate::telemetry::enhanced::EnhancedTelemetryFactory;
use crate::telemetry::{
standard::StandardTelemetryFactory, TelemetryProvider, TelemetryProviderFactory,
};
use crate::traits::{
CorrelationEngine, EnhancedScanner, RateLimiter, SecurityComponentFactory,
SecurityEventProcessor,
};
use crate::traits::{DynCircuitBreaker, DynRetryStrategy};
use anyhow::Result;
use std::sync::Arc;
pub struct ComponentSelector {
factory: Box<dyn SecurityComponentFactory>,
}
impl ComponentSelector {
pub fn new(config: &Config) -> Self {
#[cfg(feature = "enhanced")]
let factory: Box<dyn SecurityComponentFactory> = if config.is_event_processor_enabled() {
tracing::info!("Performance mode: ENABLED");
tracing::debug!("Advanced analytics active");
Box::new(EnhancedComponentFactory)
} else {
tracing::info!("Performance mode: STANDARD");
Box::new(StandardFactory)
};
#[cfg(not(feature = "enhanced"))]
let factory: Box<dyn SecurityComponentFactory> = {
if config.is_event_processor_enabled() {
tracing::warn!("Enhanced mode requested but not available - using standard mode");
}
tracing::info!("Performance mode: STANDARD");
Box::new(StandardFactory)
};
Self { factory }
}
pub fn create_event_processor(
&self,
config: &Config,
storage: Arc<dyn StorageProvider>,
) -> Result<Arc<dyn SecurityEventProcessor>> {
self.factory.create_event_processor(config, storage)
}
pub fn create_scanner(&self, config: &Config) -> Result<Arc<dyn EnhancedScanner>> {
self.factory.create_scanner(config)
}
pub fn create_correlation_engine(
&self,
config: &Config,
storage: Arc<dyn StorageProvider>,
) -> Result<Arc<dyn CorrelationEngine>> {
self.factory.create_correlation_engine(config, storage)
}
pub fn create_rate_limiter(
&self,
config: &Config,
storage: Arc<dyn StorageProvider>,
) -> Result<Arc<dyn RateLimiter>> {
self.factory.create_rate_limiter(config, storage)
}
pub const fn is_enhanced_mode(&self, config: &Config) -> bool {
config.is_event_processor_enabled()
}
}
pub struct ComponentManager {
event_processor: Arc<dyn SecurityEventProcessor>,
scanner: Arc<dyn EnhancedScanner>,
correlation_engine: Arc<dyn CorrelationEngine>,
rate_limiter: Arc<dyn RateLimiter>,
permission_manager: Arc<dyn ToolPermissionManager>,
telemetry_provider: Arc<dyn TelemetryProvider>,
storage_provider: Arc<dyn StorageProvider>,
plugin_manager: Arc<dyn PluginManagerTrait>,
audit_logger: Arc<dyn AuditLogger>,
threat_neutralizer: Arc<dyn ThreatNeutralizer>,
circuit_breaker: Arc<dyn DynCircuitBreaker>,
retry_strategy: Arc<dyn DynRetryStrategy>,
bulkhead: Arc<dyn DynBulkhead>,
enhanced_mode: bool,
}
impl ComponentManager {
pub fn new(config: &Config) -> Result<Self> {
let selector = ComponentSelector::new(config);
let permission_rules = PermissionRules {
default_permissions: ClientPermissions {
max_threat_level: ThreatLevel::Medium,
..Default::default()
},
tools: default_tool_definitions(),
category_rules: Default::default(),
global_deny_list: Default::default(),
};
#[cfg(feature = "enhanced")]
let permission_manager: Arc<dyn ToolPermissionManager> =
if config.is_event_processor_enabled() {
Arc::new(EnhancedPermissionManager::new(permission_rules))
} else {
Arc::new(StandardPermissionManager::new(permission_rules))
};
#[cfg(not(feature = "enhanced"))]
let permission_manager: Arc<dyn ToolPermissionManager> =
Arc::new(StandardPermissionManager::new(permission_rules));
let storage_factory = DefaultStorageFactory;
let storage_provider = storage_factory.create(&config.storage)?;
let event_processor = selector.create_event_processor(config, storage_provider.clone())?;
#[cfg(feature = "enhanced")]
let telemetry_factory: Box<dyn TelemetryProviderFactory> =
if config.is_event_processor_enabled() {
Box::new(EnhancedTelemetryFactory::new(event_processor.clone()))
} else {
Box::new(StandardTelemetryFactory)
};
#[cfg(not(feature = "enhanced"))]
let telemetry_factory: Box<dyn TelemetryProviderFactory> =
Box::new(StandardTelemetryFactory);
let telemetry_provider = telemetry_factory.create(&config.telemetry)?;
let plugin_factory = DefaultPluginManagerFactory;
let plugin_manager = plugin_factory.create(&config.plugins)?;
let audit_factory = DefaultAuditLoggerFactory;
let audit_logger = audit_factory.create(&config.audit)?;
let rate_limiter = selector.create_rate_limiter(config, storage_provider.clone())?;
let threat_neutralizer =
create_neutralizer(&config.neutralization, Some(rate_limiter.clone()));
let circuit_breaker = create_circuit_breaker(config)?;
let retry_strategy = create_retry_strategy(config)?;
let bulkhead = create_bulkhead(config)?;
Ok(Self {
event_processor,
scanner: selector.create_scanner(config)?,
correlation_engine: selector
.create_correlation_engine(config, storage_provider.clone())?,
rate_limiter,
permission_manager,
telemetry_provider,
storage_provider,
plugin_manager,
audit_logger,
threat_neutralizer,
circuit_breaker,
retry_strategy,
bulkhead,
enhanced_mode: selector.is_enhanced_mode(config),
})
}
pub fn event_processor(&self) -> &Arc<dyn SecurityEventProcessor> {
&self.event_processor
}
pub fn scanner(&self) -> &Arc<dyn EnhancedScanner> {
&self.scanner
}
pub fn correlation_engine(&self) -> &Arc<dyn CorrelationEngine> {
&self.correlation_engine
}
pub fn rate_limiter(&self) -> &Arc<dyn RateLimiter> {
&self.rate_limiter
}
pub fn permission_manager(&self) -> &Arc<dyn ToolPermissionManager> {
&self.permission_manager
}
pub fn telemetry_provider(&self) -> &Arc<dyn TelemetryProvider> {
&self.telemetry_provider
}
pub fn storage_provider(&self) -> &Arc<dyn StorageProvider> {
&self.storage_provider
}
pub fn plugin_manager(&self) -> &Arc<dyn PluginManagerTrait> {
&self.plugin_manager
}
pub fn audit_logger(&self) -> &Arc<dyn AuditLogger> {
&self.audit_logger
}
pub fn threat_neutralizer(&self) -> &Arc<dyn ThreatNeutralizer> {
&self.threat_neutralizer
}
pub fn circuit_breaker(&self) -> &Arc<dyn DynCircuitBreaker> {
&self.circuit_breaker
}
pub fn retry_strategy(&self) -> &Arc<dyn DynRetryStrategy> {
&self.retry_strategy
}
pub fn bulkhead(&self) -> &Arc<dyn DynBulkhead> {
&self.bulkhead
}
pub const fn is_enhanced_mode(&self) -> bool {
self.enhanced_mode
}
pub const fn performance_description(&self) -> &'static str {
if self.enhanced_mode {
"optimized performance mode"
} else {
"standard performance mode"
}
}
}