function BackupManager(config) { var Response = com.hivext.api.Response, Transport = com.hivext.api.core.utils.Transport, Logger = org.slf4j.LoggerFactory.getLogger("backup-addon:" + config.envName); var me = this; var BACKUP_TYPES = { CORE: "core", MEDIA: "media", DATABASE: "db" }; me.invoke = function(action) { var actions = { "backup": me.backup, "restore": me.restore }; return actions[action] ? actions[action].call(me) : { result: Response.ERROR_UNKNOWN, error: "Unknown action: " + action }; }; me.backup = function() { // Sequentially perform all backups me.backupCoreFiles(); me.backupMediaFiles(); me.backupDatabase(); Logger.info("All backups completed successfully."); }; me.backupCoreFiles = function() { var backupName = me.getBackupName(BACKUP_TYPES.CORE); // Placeholder for core files backup logic Logger.info("Core files backup completed: " + backupName); }; me.backupMediaFiles = function() { var backupName = me.getBackupName(BACKUP_TYPES.MEDIA); // Placeholder for media files backup logic Logger.info("Media files backup completed: " + backupName); }; me.backupDatabase = function() { var backupName = me.getBackupName(BACKUP_TYPES.DATABASE); // Placeholder for database backup logic Logger.info("Database backup completed: " + backupName); }; me.restore = function(backupName) { // Determine type from backupName and call the respective restore function var type = backupName.split("_")[1]; // Assumes naming convention is used switch(type) { case BACKUP_TYPES.CORE: me.restoreCoreFiles(backupName); break; case BACKUP_TYPES.MEDIA: me.restoreMediaFiles(backupName); break; case BACKUP_TYPES.DATABASE: me.restoreDatabase(backupName); break; default: Logger.error("Unknown backup type for restoration: " + backupName); } }; me.restoreCoreFiles = function(backupName) { // Placeholder for core files restore logic Logger.info("Core files restoration completed: " + backupName); }; me.restoreMediaFiles = function(backupName) { // Placeholder for media files restore logic Logger.info("Media files restoration completed: " + backupName); }; me.restoreDatabase = function(backupName) { // Placeholder for database restore logic Logger.info("Database restoration completed: " + backupName); }; me.getBackupName = function(type) { var dateFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss"); var dateStr = dateFormat.format(new java.util.Date()); return config.envName + "_" + type + "_" + dateStr; }; } // Note: This code assumes the existence of several placeholders where actual backup and restore logic should be implemented. // Depending on the storage and execution environment, this could involve executing shell commands, interacting with APIs, // or using tools like Restic for actual data handling.