Back
ARCHITECTURE.md
markdownARCHITECTURE.md
# Framework Architecture
## Overview
FrameworkPlugin is a production-grade, modular plugin framework for Minecraft Paper servers. It follows Clean Architecture principles with strict separation of concerns.
## Architecture Layers
```
┌─────────────────────────────────────────┐
│ Presentation Layer │
│ (Commands, Events, GUI) │
├─────────────────────────────────────────┤
│ Application Layer │
│ (Use Cases, Business Logic) │
├─────────────────────────────────────────┤
│ Domain Layer (API) │
│ (Interfaces, Entities, Value Objects) │
├─────────────────────────────────────────┤
│ Infrastructure Layer (Core) │
│ (Implementations, External Services) │
└─────────────────────────────────────────┘
```
## Core Components
### 1. Dependency Injection Container
**Location**: `core/di/Container.java`
**Purpose**: Lightweight DI container for service management
**Features**:
- Singleton registration
- Factory registration
- Thread-safe (double-checked locking)
- Type-safe resolution
**Usage**:
```java
Container container = Container.getInstance();
container.registerSingleton(EventBus.class, new EventBusImpl());
EventBus eventBus = container.resolve(EventBus.class).orElseThrow();
```
### 2. Module System
**Location**: `api/module/`, `core/module/`
**Purpose**: Dynamic module loading with dependency resolution
**Features**:
- Topological sorting for load order
- Dependency validation
- Hot reload support
- Lifecycle management (load → enable → disable → unload)
**Module Lifecycle**:
```
┌──────┐ ┌────────┐ ┌─────────┐ ┌──────────┐
│ Load │ -> │ Enable │ -> │ Running │ -> │ Disable │
└──────┘ └────────┘ └─────────┘ └──────────┘
↓ ↓
┌────────┐ ┌────────┐
│ Reload │ │ Unload │
└────────┘ └────────┘
```
### 3. Event Bus
**Location**: `api/event/`, `core/event/`
**Purpose**: Custom event system for cross-module communication
**Features**:
- Priority-based event handling
- Cancellable events
- Async event posting
- Type-safe subscriptions
**Event Flow**:
```
Publisher -> EventBus -> [Priority Queue] -> Subscribers
↓
[LOWEST → LOW → NORMAL → HIGH → HIGHEST → MONITOR]
```
### 4. Script Engine
**Location**: `api/script/`, `core/script/`
**Purpose**: Sandboxed JavaScript execution using GraalVM
**Features**:
- ECMAScript 2022 support
- Sandboxing (no file I/O, restricted class access)
- Hot reload
- Error isolation
- Execution tracking
**Security Model**:
```
JavaScript Code
↓
Sandbox Layer (GraalVM Context)
↓
API Layer (ScriptAPIImpl)
↓
Plugin Services
```
### 5. Item System
**Location**: `api/item/`, `core/item/`
**Purpose**: Custom items with abilities and NBT data
**Features**:
- Immutable item definitions
- Ability system with cooldowns
- NBT persistence
- Rarity system
- Builder pattern for creation
**Item Structure**:
```
CustomItem
├── ID (unique identifier)
├── Material (base Bukkit material)
├── Display Name
├── Lore
├── Custom Model Data
├── NBT Data (key-value pairs)
├── Abilities (list of ItemAbility)
├── Rarity (COMMON → MYTHIC)
└── Unbreakable flag
```
### 6. Task Scheduler
**Location**: `api/scheduler/`, `core/scheduler/`
**Purpose**: Wrapper around BukkitScheduler with better API
**Features**:
- CompletableFuture support
- TimeUnit-based delays
- Task tracking
- Owner-based cancellation
## Design Patterns
### 1. Dependency Injection
- **Where**: Throughout the framework
- **Why**: Loose coupling, testability, flexibility
### 2. Repository Pattern
- **Where**: Storage layer
- **Why**: Abstract data access, swappable backends
### 3. Observer Pattern
- **Where**: Event bus
- **Why**: Decoupled communication
### 4. Strategy Pattern
- **Where**: Storage providers
- **Why**: Pluggable storage backends
### 5. Builder Pattern
- **Where**: Item creation, GUI building
- **Why**: Fluent API, immutability
### 6. Factory Pattern
- **Where**: Module creation
- **Why**: Encapsulate object creation
### 7. Singleton Pattern
- **Where**: DI container, managers
- **Why**: Single instance, global access (thread-safe)
## Thread Safety
### Concurrency Strategy
1. **Immutable Objects**: All API entities are immutable (records)
2. **Concurrent Collections**: ConcurrentHashMap for all registries
3. **Atomic Operations**: AtomicBoolean, AtomicInteger for state
4. **CompletableFuture**: All async operations return futures
5. **No Shared Mutable State**: Each module has isolated state
### Thread Model
```
Main Thread (Bukkit)
├── Event Handling
├── Command Execution
└── Synchronous Tasks
Async Thread Pool
├── Module Loading
├── Script Execution
├── Storage Operations
└── Heavy Computations
```
## Performance Optimizations
### 1. Lazy Loading
- Modules load on-demand
- Configs load when first accessed
- Scripts compile once, execute many times
### 2. Caching
- Module descriptors cached
- Item definitions cached
- Script contexts reused
### 3. Batch Operations
- Storage batch saves
- Event batch processing
- Cooldown cleanup batching
### 4. Async I/O
- All file operations async
- Database operations async
- Network operations async
### 5. Object Pooling
- Reuse expensive objects
- Minimize allocations
- Reduce GC pressure
## Error Handling
### Strategy
1. **Fail Fast**: Validate early, throw exceptions
2. **Graceful Degradation**: Continue on non-critical errors
3. **Error Isolation**: Module errors don't crash plugin
4. **Detailed Logging**: All errors logged with context
5. **Recovery**: Auto-recovery where possible
### Error Flow
```
Error Occurs
↓
Log Error (with context)
↓
Notify Affected Components
↓
Attempt Recovery
↓
If Recovery Fails → Disable Component
↓
Continue Plugin Operation
```
## Extension Points
### 1. Custom Modules
Implement `Module` interface or extend `BaseModule`
### 2. Custom Storage Providers
Implement `StorageProvider` interface
### 3. Custom Item Abilities
Implement `ItemAbility` interface
### 4. Custom Events
Implement `PluginEvent` interface
### 5. Script API Extensions
Add methods to `ScriptAPIImpl`
## Testing Strategy
### Unit Tests
- Test individual components in isolation
- Mock dependencies
- Fast execution
### Integration Tests
- Test component interactions
- Use test containers
- Realistic scenarios
### Performance Tests
- Load testing
- Stress testing
- Memory profiling
## Deployment
### Development
```
mvn clean package
→ Copy to test server
→ Reload plugin
→ Test changes
```
### Production
```
mvn clean package -P production
→ Run tests
→ Security scan
→ Deploy to server
→ Monitor logs
```
## Monitoring
### Metrics to Track
- Module load times
- Script execution times
- Event processing times
- Memory usage
- Active tasks count
- Error rates
### Logging Levels
- **SEVERE**: Critical errors
- **WARNING**: Non-critical issues
- **INFO**: Important events
- **FINE**: Debug information
- **FINER**: Detailed debug
- **FINEST**: Trace level
## Future Enhancements
1. **Web Dashboard**: Real-time monitoring and control
2. **Database Integration**: MySQL, PostgreSQL support
3. **Metrics System**: Prometheus integration
4. **Hot Code Reload**: Reload Java code without restart
5. **Distributed Modules**: Load modules from remote sources
6. **API Gateway**: REST API for external integrations
7. **Plugin Marketplace**: Download modules from repository
## Best Practices
### For Module Developers
1. **Use DI Container**: Don't create services manually
2. **Async Operations**: Use CompletableFuture for I/O
3. **Error Handling**: Catch and log all exceptions
4. **Resource Cleanup**: Unregister everything in onDisable
5. **Thread Safety**: Use concurrent collections
6. **Documentation**: Document all public APIs
### For Script Developers
1. **Keep Scripts Small**: One responsibility per script
2. **Error Handling**: Use try-catch in scripts
3. **Avoid Blocking**: Don't block the main thread
4. **Use API**: Don't access Bukkit directly
5. **Test Thoroughly**: Test scripts before deployment
## Troubleshooting
### Common Issues
1. **Module Won't Load**
- Check dependencies in module.yml
- Verify module.yml syntax
- Check logs for errors
2. **Script Errors**
- Check script syntax
- Verify API usage
- Enable debug logging
3. **Performance Issues**
- Profile with JProfiler
- Check for memory leaks
- Review async operations
4. **Thread Deadlocks**
- Use thread dumps
- Review synchronization
- Check for circular waits
## Resources
- [Paper API Documentation](https://docs.papermc.io/)
- [GraalVM Documentation](https://www.graalvm.org/latest/docs/)
- [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
- [SOLID Principles](https://en.wikipedia.org/wiki/SOLID)