/*
 * 文 件 名:  CloseUtils.java
 * 版    权:  中兴通讯股份有限公司
 * 描    述:  <描述>
 * 修 改 人:  learshaw
 * 修改时间:  2016年4月26日
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.huashe.common.utils;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 关闭工具类 <功能详细描述>
 *
 * @author learshaw
 * @version [版本号, 2016年4月26日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class CloseUtils {
    private static final Logger log = LoggerFactory.getLogger(CloseUtils.class);

    /**
     * $关闭结果集
     *
     * @param rs 结果集
     * @see [类、类#方法、类#成员]
     */
    public static void close(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            }
            catch (SQLException e) {
                log.error("close ResultSet failed.", e);
            }
        }
    }

    /**
     * $关闭执行列表
     *
     * @param stmt 执行列表
     * @see [类、类#方法、类#成员]
     */
    public static void close(Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            }
            catch (SQLException e) {
                log.error("close Statement failed.", e);
            }
        }
    }

    /**
     * $关闭PreparedStatement
     *
     * @param stmt 预编译的SQL执行列表
     * @see [类、类#方法、类#成员]
     */
    public static void close(PreparedStatement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            }
            catch (SQLException e) {
                log.error("close PreparedStatement failed.", e);
            }
        }
    }

    /**
     * $关闭连接
     *
     * @param connection 连接
     * @see [类、类#方法、类#成员]
     */
    public static void close(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            }
            catch (SQLException e) {
                log.error("close Connection failed.", e);
            }
        }
    }

    /**
     * $关闭数据域或者目标 <功能详细描述>
     *
     * @param closes 数据源或者目标
     * @see [类、类#方法、类#成员]
     */
    public static void close(AutoCloseable... closes) {
        for (AutoCloseable closeable : closes) {
            if (closeable != null) {
                try {
                    closeable.close();
                }
                catch (Exception e) {
                    log.error("close closeable failed.", e);
                }
            }
        }
    }

    /**
     * $关闭套接字连接
     *
     * @param psocket 套接字连接
     * @see [类、类#方法、类#成员]
     */
    public static void close(Socket psocket) {
        if (psocket != null) {
            try {
                psocket.close();
            }
            catch (IOException e) {
                log.error("close socket failed.", e);
            }
        }
    }

    /**
     * $关闭服务器套接字
     *
     * @param psocket 服务器套接字连接
     * @see [类、类#方法、类#成员]
     */
    public static void close(ServerSocket psocket) {
        if (psocket != null) {
            try {
                psocket.close();
            }
            catch (IOException e) {
                log.error("close socket failed.", e);
            }
        }
    }

    /**
     * $关闭连接
     *
     * @param httpResponse http响应
     * @see [类、类#方法、类#成员]
     */
    public static void close(CloseableHttpResponse httpResponse) {
        if (httpResponse != null) {
            try {
                httpResponse.close();
            }
            catch (IOException e) {
                log.error("close httpResponse failed.", e);
            }
        }
    }

    /**
     * $关闭连接
     *
     * @param httpClient http连接
     * @see [类、类#方法、类#成员]
     */
    public static void close(CloseableHttpClient httpClient) {
        if (httpClient != null) {
            try {
                httpClient.close();
            }
            catch (IOException e) {
                log.error("close httpClient failed.", e);
            }
        }
    }

    /**
     * $万能关闭方法 <br>
     * $关闭带close方法的对象
     *
     * @param objs 对象
     * @see [类、类#方法、类#成员]
     */
    public static void close(Object... objs) {
        for (Object obj : objs) {
            if (obj != null) {
                try {
                    Class<?> objClass = obj.getClass();
                    Method meyhod = objClass.getMethod("close", new Class[0]);
                    meyhod.invoke(obj, new Object[0]);
                }
                catch (Exception e) {
                    log.error("close Object failed.", e);
                }
            }
        }
    }
}
