From 3bb0423167a79c80de5b24023a39cc5d4924d991 Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Thu, 13 Nov 2025 04:43:05 -0300 Subject: [PATCH] Enhance `DatabaseManager` with logging, validation, and cleanup - Added detailed logging for database initialization and connection handling. - Implemented configuration validation and sanity checks during initialization. - Introduced `close()` method to properly release database resources. - Updated `MediaManagerApplication` to invoke `DatabaseManager.close()` on shutdown. - Updated `.gitignore` to exclude sensitive configuration files while allowing example files. --- .gitignore | 8 +++ .../mediamanager/MediaManagerApplication.java | 4 +- .../service/database/DatabaseManager.java | 68 ++++++++++++++++++- ...g.properties => config.properties.example} | 1 + 4 files changed, 79 insertions(+), 2 deletions(-) rename src/main/resources/{config.properties => config.properties.example} (99%) diff --git a/.gitignore b/.gitignore index 51b319c..30116b9 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,11 @@ config-local.properties pipes/ *.log /.idea/ + + Configuration files with sensitive credentials +# These files contain database passwords and API keys and should never be committed +src/main/resources/config.properties +src/main/resources/application.properties + +# Allow example configuration files to be committed +!src/main/resources/*.properties.example \ No newline at end of file diff --git a/src/main/java/com/mediamanager/MediaManagerApplication.java b/src/main/java/com/mediamanager/MediaManagerApplication.java index b3dbada..e09b9fa 100644 --- a/src/main/java/com/mediamanager/MediaManagerApplication.java +++ b/src/main/java/com/mediamanager/MediaManagerApplication.java @@ -33,7 +33,9 @@ public class MediaManagerApplication { // Keep application running Runtime.getRuntime().addShutdownHook(new Thread(() -> { logger.info("Shutting down MediaManager Core..."); - // TODO: Cleanup resources + if (databaseManager != null) { + databaseManager.close(); + } })); } catch (Exception e) { diff --git a/src/main/java/com/mediamanager/service/database/DatabaseManager.java b/src/main/java/com/mediamanager/service/database/DatabaseManager.java index e71a18e..0f43fa9 100644 --- a/src/main/java/com/mediamanager/service/database/DatabaseManager.java +++ b/src/main/java/com/mediamanager/service/database/DatabaseManager.java @@ -1,18 +1,28 @@ package com.mediamanager.service.database; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import java.sql.Connection; import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Properties; public class DatabaseManager { private final Properties configuration; private Connection connection; + private static final Logger logger = LogManager.getLogger(DatabaseManager.class); public DatabaseManager(Properties config) { this.configuration = config; + logger.debug("DatabaseManager created with configuration:"); } public void init() throws Exception { + logger.info("Initializing database connection..."); + validateConfiguration(); + String databaseType = configuration.getProperty("database.type"); String databaseUrl = configuration.getProperty("database.url"); String databaseUsername = configuration.getProperty("database.username"); @@ -22,11 +32,67 @@ public class DatabaseManager { String connectionString = String.format("jdbc:postgresql://%s:%s/%s", databaseUrl, databasePort, databaseName); - connection = DriverManager.getConnection(connectionString, databaseUsername, databasePassword); + logger.debug("Attempting to connect to: {}", connectionString); + try { + connection = DriverManager.getConnection(connectionString, databaseUsername, databasePassword); + logger.info("Database connection established successfully"); + + performSanityChecks(); + logger.info("Database sanity checks passed successfully"); + + + } catch (SQLException e) { + logger.error("Failed to connect to database", e); + throw new Exception("Database connection failed: " + e.getMessage(), e); + } + + } + private void performSanityChecks() throws SQLException { + logger.debug("Performing sanity checks..."); + try (Statement stmt = connection.createStatement()) { + stmt.execute("SELECT 1"); + + } + String databaseProductName = connection.getMetaData().getDatabaseProductName(); + String databaseProductVersion = connection.getMetaData().getDatabaseProductVersion(); + logger.info("Connected to database: {} v{}", databaseProductName, databaseProductVersion); + } + private void validateConfiguration() throws Exception { + String[] requiredProperties = { + "database.url", + "database.username", + "database.password", + "database.port", + "database.name" + }; + + for (String property : requiredProperties) { + if (configuration.getProperty(property) == null || + configuration.getProperty(property).trim().isEmpty()) { + throw new Exception("Required database configuration missing: " + property); + } + } + + logger.debug("Database configuration validated successfully"); + + } + + + public Connection getConnection() { return connection; } + public void close() { + if (connection != null) { + try { + connection.close(); + logger.info("Database connection closed successfully"); + } catch (SQLException e) { + logger.error("Failed to close database connection", e); + } + } + } } diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties.example similarity index 99% rename from src/main/resources/config.properties rename to src/main/resources/config.properties.example index fbef11a..8840823 100644 --- a/src/main/resources/config.properties +++ b/src/main/resources/config.properties.example @@ -21,3 +21,4 @@ hibernate.format_sql=true ipc.pipe.name=mediamanager-pipe ipc.pipe.path=/tmp/mediamanager ipc.buffer.size=8192 +