package com.easyagents.scheduler.quartz;

import org.quartz.utils.ConnectionProvider;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Objects;

/**
 * 将调用方管理的 {@link DataSource} 暴露给 Quartz，且不接管其生命周期。
 */
final class DataSourceConnectionProvider implements ConnectionProvider {

    private volatile DataSource dataSource;

    /**
     * 创建外部 DataSource 连接提供器。
     *
     * @param dataSource 调用方管理的 DataSource
     */
    DataSourceConnectionProvider(DataSource dataSource) {
        this.dataSource = Objects.requireNonNull(dataSource, "dataSource must not be null");
    }

    /**
     * 从调用方 DataSource 获取连接。
     *
     * @return JDBC 连接
     * @throws SQLException 获取连接失败时抛出
     */
    @Override
    public Connection getConnection() throws SQLException {
        DataSource currentDataSource = dataSource;
        if (currentDataSource == null) {
            throw new SQLException("Quartz DataSource provider is already shut down");
        }
        return currentDataSource.getConnection();
    }

    /**
     * 外部 DataSource 不需要由 Quartz 初始化。
     */
    @Override
    public void initialize() {
        // DataSource 的创建和初始化由调用方负责。
    }

    /**
     * 外部 DataSource 不由 Quartz 关闭。
     */
    @Override
    public void shutdown() {
        // Quartz 的全局注册表没有公开移除方法；解除引用以免长期持有调用方连接池。
        dataSource = null;
    }
}
