Code Quality Review: framework/server Module
Executive Summary
The framework/server module provides a well-architected RMI server implementation for Codion’s entity framework. This module demonstrates solid distributed systems engineering with intelligent connection pooling, comprehensive connection lifecycle management, sophisticated logging, and robust error handling. While positioned as a reference implementation, the code shows thoughtful design decisions and production-ready patterns for multi-tenant entity server deployments.
Architecture Overview
This module serves as the RMI server-side infrastructure that:
- Multi-Domain Server: Hosts multiple domain models in a single server instance
- Connection Pool Management: Provides intelligent database connection pooling with per-user pools
- Client Session Management: Handles remote client connections with timeout and lifecycle management
- Comprehensive Logging: Offers detailed method call logging and client activity tracking
- Administrative Interface: Provides server administration and monitoring capabilities
- Performance Monitoring: Includes request-per-second counters and connection statistics
Key Architectural Strengths
1. Sophisticated Connection Management ✅
Intelligent Connection Pooling Strategy:
// LocalConnectionHandler - Smart pool vs direct connection handling
private EntityConnection connection() {
if (connectionPool != null) {
return pooledEntityConnection(); // Use pool when available
}
return localEntityConnection(); // Direct connection fallback
}
private EntityConnection pooledEntityConnection() {
if (poolEntityConnection.transactionOpen()) {
return poolEntityConnection; // Keep connection during transaction
}
// Fetch fresh connection from pool for each operation
poolEntityConnection.databaseConnection().setConnection(connectionPool.connection(remoteClient.databaseUser()));
}
Transaction-Aware Connection Return:
private void returnConnection() {
if (poolEntityConnection == null || poolEntityConnection.transactionOpen()) {
return; // Don't return connection during active transaction
}
// Return to pool immediately after operation
returnConnectionToPool();
}
2. Comprehensive Client Lifecycle Management ✅
Connection Timeout and Maintenance:
@Override
protected final void maintainConnections(Collection<ClientConnection<AbstractRemoteEntityConnection>> connections) {
for (ClientConnection<AbstractRemoteEntityConnection> client : connections) {
AbstractRemoteEntityConnection connection = client.connection();
if (!connection.active()) {
boolean connected = connection.connected();
boolean timedOut = hasConnectionTimedOut(connection);
if (!connected || timedOut) {
LOG.debug("Removing connection {}, connected: {}, timeout: {}", client, connected, timedOut);
disconnect(client.remoteClient().id());
}
}
}
}
private boolean hasConnectionTimedOut(AbstractRemoteEntityConnection connection) {
Integer timeout = clientTypeIdleConnectionTimeouts.get(connection.remoteClient().type());
if (timeout == null) {
timeout = idleConnectionTimeout; // Fallback to default timeout
}
return connection.hasBeenInactive(timeout);
}
Graceful Connection Cleanup:
private void cleanupLocalConnections() {
if (poolEntityConnection != null) {
rollbackIfRequired(poolEntityConnection); // Rollback open transactions
returnConnectionToPool();
poolEntityConnection = null;
}
if (localEntityConnection != null) {
rollbackIfRequired(localEntityConnection);
localEntityConnection.close();
localEntityConnection = null;
}
}
3. Multi-Domain Server Architecture ✅
Domain Model Loading and Management:
private static Map<DomainType, Domain> loadDomainModels(Collection<String> domainModelClassNames) throws Throwable {
Map<DomainType, Domain> domains = new HashMap<>();
try {
// Load domains via ServiceLoader
for (Domain domain : Domain.domains()) {
LOG.info("Server loading domain model '{}' as a service", domain.type());
domains.put(domain.type(), domain);
}
// Load domains from classpath
for (String className : domainModelClassNames) {
LOG.info("Server loading domain model '{}' from classpath", className);
Domain domain = (Domain) Class.forName(className).getDeclaredConstructor().newInstance();
domains.put(domain.type(), domain);
}
return unmodifiableMap(domains);
}
catch (Exception e) {
LOG.error("Exception while loading and registering domain model", e);
throw e;
}
}
Client-Specific Domain Resolution:
private Domain clientDomainModel(RemoteClient remoteClient) {
String domainTypeName = (String) remoteClient.parameters().get(RemoteEntityConnectionProvider.REMOTE_CLIENT_DOMAIN_TYPE);
if (domainTypeName == null) {
throw new IllegalArgumentException("'" + RemoteEntityConnectionProvider.REMOTE_CLIENT_DOMAIN_TYPE + "' parameter not specified");
}
return domainModels.get(DomainType.domainTypeByName(domainTypeName));
}
4. Sophisticated Logging and Monitoring ✅
Comprehensive Method Call Logging:
// LocalConnectionHandler - Detailed method call tracking
@Override
public synchronized Object invoke(Object proxy, Method method, Object[] args) throws Exception {
active.set(true);
lastAccessTime = System.currentTimeMillis();
String methodName = method.getName();
Exception exception = null;
try {
logEntry(methodName, args); // Log method entry with arguments
return method.invoke(connection(), args);
}
catch (InvocationTargetException e) {
throw e.getCause() instanceof Exception ? (Exception) e.getCause() : e;
}
finally {
returnConnection();
logExit(methodName, exception); // Log method exit with timing
active.set(false);
}
}
Smart Entity Argument Formatting:
private static final class EntityArgumentToString extends MethodLogger.DefaultArgumentFormatter {
@Override
protected String toString(Object object) {
if (object instanceof Entity) {
return entityToString((Entity) object);
}
else if (object instanceof Entity.Key) {
return entityKeyToString((Entity.Key) object);
}
return super.toString(object);
}
private static String entityToString(Entity entity) {
StringBuilder builder = new StringBuilder(entity.type().name()).append(" {");
for (ColumnDefinition<?> columnDefinition : entity.definition().columns().definitions()) {
boolean modified = entity.modified(columnDefinition.attribute());
if (columnDefinition.primaryKey() || modified) {
// Show original->new values for modified fields
if (modified) {
valueString.append(entity.original(columnDefinition.attribute())).append("->");
}
valueString.append(entity.string(columnDefinition.attribute()));
}
}
return builder.append("}").toString();
}
}
5. Performance Monitoring Excellence ✅
Real-Time Request Tracking:
static final class RequestCounter {
private final AtomicInteger requestsPerSecond = new AtomicInteger();
private final AtomicInteger requestsPerSecondCounter = new AtomicInteger();
private void updateRequestsPerSecond() {
long current = System.currentTimeMillis();
double seconds = (current - requestsPerSecondTime.getAndSet(current)) / THOUSAND;
if (seconds > 0) {
requestsPerSecond.set((int) (requestsPerSecondCounter.getAndSet(0) / seconds));
}
}
}
Database Statistics Integration:
final Database.Statistics databaseStatistics() {
return database.statistics(); // Exposes database-level performance metrics
}
6. Robust Administration Interface ✅
Server Administration and Control:
@Override
public final EntityServerAdmin admin(User user) throws ServerAuthenticationException {
validateUserCredentials(user, configuration.adminUser());
return getAdmin();
}
// Administrative operations
final void disconnectClients(boolean timedOutOnly) {
List<RemoteClient> clients = new ArrayList<>(connections().keySet());
for (RemoteClient client : clients) {
AbstractRemoteEntityConnection connection = connection(client.id());
if (timedOutOnly) {
boolean active = connection.active();
if (!active && hasConnectionTimedOut(connection)) {
disconnect(client.id());
}
}
else {
disconnect(client.id());
}
}
}
Domain Introspection APIs:
final Map<DomainType, Collection<DomainEntityDefinition>> domainEntityDefinitions() {
// Provides domain metadata for administration tools
}
final Map<DomainType, Collection<DomainReport>> domainReports() {
// Exposes available reports per domain
}
final Map<DomainType, Collection<DomainOperation>> domainOperations() {
// Lists functions and procedures per domain
}
Code Quality Assessment
1. Error Handling Excellence ✅
Comprehensive Exception Management:
@Override
protected final AbstractRemoteEntityConnection connect(RemoteClient remoteClient) throws RemoteException, LoginException {
try {
AbstractRemoteEntityConnection connection = createRemoteConnection(database(), remoteClient, /*...*/);
connection.setLoggingEnabled(clientLogging);
connection.closedObserver().addConsumer(this::removeConnection);
LOG.debug("{} connected", remoteClient);
return connection;
}
catch (AuthenticationException e) {
throw new ServerAuthenticationException(e.getMessage());
}
catch (RemoteException e) {
throw e;
}
catch (Exception e) {
LOG.debug("{} unable to connect", remoteClient, e);
throw new LoginException(e.getMessage());
}
}
Transaction Rollback Safety:
private void rollbackIfRequired(LocalEntityConnection entityConnection) {
if (entityConnection.transactionOpen()) {
LOG.info("Rollback open transaction on disconnect: {}", remoteClient);
try {
entityConnection.rollbackTransaction();
}
catch (DatabaseException e) {
LOG.error("Rollback on disconnect failed: " + remoteClient, e);
}
}
}
2. Resource Management Excellence ✅
Proper Shutdown Procedures:
private final class ShutdownListener implements Runnable {
@Override
public void run() {
database.closeConnectionPools(); // Clean shutdown of all connection pools
}
}
Connection Pool Management:
private static void createConnectionPools(Database database, String connectionPoolFactoryClassName,
Collection<User> connectionPoolUsers) {
if (!connectionPoolUsers.isEmpty()) {
ConnectionPoolFactory poolFactory;
if (nullOrEmpty(connectionPoolFactoryClassName)) {
poolFactory = ConnectionPoolFactory.instance();
}
else {
poolFactory = ConnectionPoolFactory.instance(connectionPoolFactoryClassName);
}
for (User user : connectionPoolUsers) {
database.createConnectionPool(poolFactory, user);
}
}
}
3. Threading and Concurrency ✅
Thread-Safe Connection Access:
// All remote method calls synchronized on connectionProxy
@Override
public void startTransaction() {
synchronized (connectionProxy) {
connectionProxy.startTransaction();
}
}
Daemon Thread Management:
private static final class DaemonThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable);
thread.setDaemon(true); // Proper daemon thread handling
return thread;
}
}
4. Configuration Management ✅
System Properties Integration:
// Comprehensive configuration through PropertyValue system
public static final PropertyValue<Integer> CONNECTION_LIMIT =
integerValue("codion.server.connectionLimit", -1);
public static final PropertyValue<String> CONNECTION_POOL_FACTORY_CLASS =
stringValue("codion.server.pooling.poolFactoryClass");
public static final PropertyValue<Boolean> CLIENT_LOGGING =
booleanValue("codion.server.clientLogging", false);
Flexible Client Timeout Configuration:
// Per-client-type timeout configuration
final void setClientTypeIdleConnectionTimeouts(Map<String, Integer> clientTypeIdleConnectionTimeouts) {
this.clientTypeIdleConnectionTimeouts.putAll(clientTypeIdleConnectionTimeouts);
}
5. Security Integration ✅
SSL/TLS Support:
// Keystore and truststore in src/main/config/
- keystore.jks
- truststore.jks
// RMI socket factory support for SSL
protected AbstractRemoteEntityConnection createRemoteConnection(Database database,
RemoteClient remoteClient, int port,
RMIClientSocketFactory clientSocketFactory,
RMIServerSocketFactory serverSocketFactory)
Design Pattern Assessment
1. Proxy Pattern ✅
Excellent use of dynamic proxies for method call interception and logging.
2. Factory Pattern ✅
Connection pool factory pattern with pluggable implementations.
3. Observer Pattern ✅
Connection closed events and lifecycle management.
4. Template Method Pattern ✅
Extensible server configuration and connection creation.
5. Strategy Pattern ✅
Pluggable connection pool strategies and domain loading approaches.
Performance Characteristics
1. Connection Pooling Efficiency ✅
- Pool-per-user design enables efficient multi-tenant operations
- Transaction-aware connection handling prevents pool thrashing
- Configurable pool factories allow optimization for specific use cases
2. Monitoring and Metrics ✅
- Real-time request counting with configurable update intervals
- Per-client activity tracking with detailed method call logs
- Database statistics integration for comprehensive performance monitoring
3. Memory Management ✅
- Automatic connection cleanup on client disconnect
- Transaction rollback safety prevents resource leaks
- Daemon thread pools for background processing
Minor Areas for Enhancement
1. Connection Pool Configuration (Enhancement)
Consider exposing more connection pool configuration options (min/max pool sizes, validation queries) through the server configuration.
2. Metrics Aggregation (Enhancement)
Consider adding optional metrics export (JMX, Prometheus) for monitoring integration.
3. Health Checks (Enhancement)
Consider adding health check endpoints for load balancer integration.
Overall Assessment: EXCELLENT DISTRIBUTED SYSTEM DESIGN ✅
This module demonstrates sophisticated distributed systems engineering:
Architectural Excellence:
- ✅ Multi-tenant design - Efficient support for multiple domains and users
- ✅ Connection pool mastery - Intelligent pooling with transaction awareness
- ✅ Client lifecycle management - Comprehensive session handling with timeouts
- ✅ Performance monitoring - Real-time metrics and detailed logging
- ✅ Administrative interface - Complete server management capabilities
Code Quality Excellence:
- ✅ Error handling mastery - Comprehensive exception management with proper error translation
- ✅ Resource management - Proper cleanup, transaction safety, and pool management
- ✅ Thread safety - Synchronized access patterns and proper concurrency handling
- ✅ Configuration flexibility - Extensive customization through system properties
- ✅ Security integration - SSL/TLS support and authentication handling
Engineering Sophistication:
- ✅ Proxy pattern excellence - Method call interception with comprehensive logging
- ✅ Connection optimization - Smart pool vs direct connection strategies
- ✅ Domain model management - Dynamic loading via ServiceLoader and classpath
- ✅ Performance awareness - Request tracking and database statistics integration
- ✅ Production readiness - Proper shutdown hooks, cleanup, and error recovery
Distributed Systems Best Practices:
- ✅ Session management - Proper client session lifecycle with automatic cleanup
- ✅ Connection pooling - Per-user pools with transaction-aware connection handling
- ✅ Timeout handling - Configurable per-client-type timeout strategies
- ✅ Monitoring integration - Comprehensive logging and performance metrics
- ✅ Administrative capabilities - Complete server management and introspection
Recommendation: PRODUCTION-READY REFERENCE IMPLEMENTATION ✅
While positioned as a “reference implementation,” this module demonstrates:
- Enterprise-grade distributed systems engineering
- Sophisticated understanding of RMI server architecture and challenges
- Production-ready patterns for connection pooling, session management, and monitoring
- Comprehensive feature set suitable for real-world deployments
- Clean architecture that supports customization and extension
The module successfully provides:
- Complete RMI server infrastructure for entity-based applications
- Intelligent resource management with connection pooling and lifecycle handling
- Comprehensive monitoring with detailed logging and performance metrics
- Administrative capabilities for server management and troubleshooting
- Security integration with SSL/TLS and authentication support
Key Achievement: Successfully implements a complete, production-ready RMI server that effectively manages multi-tenant entity operations with sophisticated connection pooling, comprehensive logging, and robust error handling.
Note: This module represents an excellent example of how to build distributed entity servers with proper attention to performance, monitoring, and operational concerns. The connection pooling strategy and client lifecycle management are particularly well-designed for real-world deployment scenarios.