From 22476abb27d95e88ae0439d97ef97467b6a4f985 Mon Sep 17 00:00:00 2001 From: Gustavo Henrique Santos Souza de Miranda Date: Thu, 13 Nov 2025 03:59:31 -0300 Subject: [PATCH 1/2] Add `DatabaseManager` class and initialize database connection - Introduced `DatabaseManager` class to manage database connections. - Updated `MediaManagerApplication` to initialize `DatabaseManager` using configuration properties. --- .../mediamanager/MediaManagerApplication.java | 5 +++ .../service/database/DatabaseManager.java | 32 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/main/java/com/mediamanager/service/database/DatabaseManager.java diff --git a/src/main/java/com/mediamanager/MediaManagerApplication.java b/src/main/java/com/mediamanager/MediaManagerApplication.java index fcaaa65..b3dbada 100644 --- a/src/main/java/com/mediamanager/MediaManagerApplication.java +++ b/src/main/java/com/mediamanager/MediaManagerApplication.java @@ -7,9 +7,12 @@ import java.io.IOException; import java.io.InputStream; import java.util.Properties; +import com.mediamanager.service.database.DatabaseManager; + public class MediaManagerApplication { private static final Logger logger = LogManager.getLogger(MediaManagerApplication.class); private static Properties config; + private static DatabaseManager databaseManager; public static void main(String[] args) { logger.info("Starting MediaManager Core Application..."); @@ -17,6 +20,8 @@ public class MediaManagerApplication { try { // Load configuration loadConfiguration(); + databaseManager = new DatabaseManager(config); + databaseManager.init(); // TODO: Initialize database connection // TODO: Initialize IPC server with named pipes diff --git a/src/main/java/com/mediamanager/service/database/DatabaseManager.java b/src/main/java/com/mediamanager/service/database/DatabaseManager.java new file mode 100644 index 0000000..e71a18e --- /dev/null +++ b/src/main/java/com/mediamanager/service/database/DatabaseManager.java @@ -0,0 +1,32 @@ +package com.mediamanager.service.database; +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Properties; + + +public class DatabaseManager { + private final Properties configuration; + private Connection connection; + public DatabaseManager(Properties config) { + this.configuration = config; + + } + + public void init() throws Exception { + String databaseType = configuration.getProperty("database.type"); + String databaseUrl = configuration.getProperty("database.url"); + String databaseUsername = configuration.getProperty("database.username"); + String databasePassword = configuration.getProperty("database.password"); + String databasePort = configuration.getProperty("database.port"); + String databaseName = configuration.getProperty("database.name"); + + + String connectionString = String.format("jdbc:postgresql://%s:%s/%s", databaseUrl, databasePort, databaseName); + connection = DriverManager.getConnection(connectionString, databaseUsername, databasePassword); + + } + public Connection getConnection() { + return connection; + } + +} 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 2/2] 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 +