/*
 * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.s1asdev.jdbc.statementwrapper.ejb;

import jakarta.ejb.*;
import javax.naming.*;
import javax.sql.*;
import java.sql.*;

public class SimpleBMPBean
        implements EntityBean {

    protected DataSource ds;
    protected DataSource compareDs;

    public void setEntityContext(EntityContext entityContext) {
        Context context = null;
        try {
            context = new InitialContext();
            ds = (DataSource) context.lookup("java:comp/env/DataSource");
            compareDs = (DataSource) context.lookup("java:comp/env/CompareDataSource");
        } catch (NamingException e) {
            throw new EJBException("cant find datasource");
        }
        System.out.println("[**SimpleBMPBean**] Done with setEntityContext....");
    }

    public Integer ejbCreate() throws CreateException {
        return new Integer(1);
    }

    public boolean statementTest() {
        boolean result = true;
        Connection conFromDS = null;
        Connection conFromStatement = null;
        Connection conFromCompareDS = null;
        Statement stmt = null;
        PreparedStatement stmt1 = null;
        try {
            conFromDS = ds.getConnection();
            conFromCompareDS = compareDs.getConnection();
            stmt = conFromDS.createStatement();
            stmt1 = conFromCompareDS.prepareStatement("INSERT INTO COMPARE_RECORDS VALUES (?,?)");

            System.out.println("Statement Test : stmt hashCode : " + stmt.hashCode());
            stmt1.setString(1, "S");
            stmt1.setInt(2, stmt.hashCode());
            stmt1.executeUpdate();

        } catch (SQLException sqe) {
            sqe.printStackTrace();
            result = false;
        } finally {
            try {
                if (stmt1 != null) {
                    stmt1.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (conFromDS != null) {
                    conFromDS.close();
                }
            } catch (SQLException sqe) {
            }
            try {
                if (conFromCompareDS != null) {
                    conFromCompareDS.close();
                }
            } catch (SQLException sqe) {
            }
        }
        return result;
    }

    public boolean preparedStatementTest() {
        boolean result = true;
        Connection conFromDS = null;
        Connection conFromCompareDS = null;
        Connection conFromStatement = null;
        PreparedStatement stmt = null;
        PreparedStatement stmt1 = null;
        try {
            conFromDS = ds.getConnection();
            conFromCompareDS = compareDs.getConnection();
            stmt = conFromDS.prepareStatement("select * from customer_stmt_wrapper");
            stmt1 = conFromCompareDS.prepareStatement("INSERT INTO COMPARE_RECORDS VALUES (?,?)");

            System.out.println("Prepared statement Test : stmt hasCode : " + stmt.hashCode());
            stmt1.setString(1, "PS");
            stmt1.setInt(2, stmt.hashCode());
            stmt1.executeUpdate();

        } catch (SQLException sqe) {
            result = false;
        } finally {
            try {
                if (stmt1 != null) {
                    stmt1.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (conFromDS != null) {
                    conFromDS.close();
                }
            } catch (SQLException sqe) {
            }
            try {
                if (conFromCompareDS != null) {
                    conFromCompareDS.close();
                }
            } catch (SQLException sqe) {
            }
        }
        return result;
    }

    public boolean callableStatementTest() {
        boolean result = true;
        Connection conFromDS = null;
        Connection conFromCompareDS = null;
        CallableStatement stmt = null;
	PreparedStatement stmt1 = null;
        try {
            conFromDS = ds.getConnection();
            conFromCompareDS = compareDs.getConnection();
            stmt = conFromDS.prepareCall("select * from customer_stmt_wrapper");
            stmt1 = conFromCompareDS.prepareStatement("INSERT INTO COMPARE_RECORDS VALUES (?,?)");

            System.out.println("Callable statement Test : stmt hashCode : " + stmt.hashCode());
            stmt1.setString(1, "CS");
            stmt1.setInt(2, stmt.hashCode());
            stmt1.executeUpdate();

        } catch (SQLException sqe) {
	    result = false;
        } finally {
            try {
                if (stmt1 != null) {
                    stmt1.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (conFromDS != null) {
                    conFromDS.close();
                }
            } catch (SQLException sqe) {
            }
            try {
                if (conFromCompareDS != null) {
                    conFromCompareDS.close();
                }
            } catch (SQLException sqe) {
            }
        }
        return result;
    }

    public boolean metaDataTest() {
        boolean result = false;
        Connection conFromDS = null;
        Connection conFromMetaData = null;
        DatabaseMetaData dbmd = null;
        try {
            conFromDS = ds.getConnection();
            dbmd = conFromDS.getMetaData();
            conFromMetaData = dbmd.getConnection();

            System.out.println("statementTest : conFromDS : " + conFromDS);
            System.out.println("statementTest : conFromDbMetadata : " + conFromMetaData);
            if (conFromDS == conFromMetaData || conFromDS.equals(conFromMetaData)) {
                result = true;
            }

        } catch (SQLException sqe) {
        } finally {
            try {
                if (conFromDS != null) {
                    conFromDS.close();
                }
            } catch (SQLException sqe) {
            }
        }
        return result;
    }

    public boolean resultSetTest() {
        boolean result = false;
        Connection conFromDS = null;
        Connection conFromResultSet = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            conFromDS = ds.getConnection();
            stmt = conFromDS.createStatement();
            rs = stmt.executeQuery("select * from customer_stmt_wrapper");
            conFromResultSet = rs.getStatement().getConnection();

            System.out.println("ResultSet test : conFromDS : " + conFromDS);
            System.out.println("ResultSet test : conFromResultSet: " + conFromResultSet);
            if (conFromDS == conFromResultSet || conFromDS.equals(conFromResultSet)) {
                result = true;
            }
        } catch (SQLException sqe) {
        } finally {

            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (conFromDS != null) {
                    conFromDS.close();
                }
            } catch (SQLException sqe) {
            }
        }
        return result;
    }

    public boolean compareRecords(String stmtType) {
        boolean result = false;
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        int firstCon = 0;
        int secondCon = 0;
        try {
            con = compareDs.getConnection();
            stmt = con.createStatement();
            rs = stmt.executeQuery("select * from COMPARE_RECORDS where REC_STMT_TYPE='" + stmtType + "'");
            if (rs.next()) {
                firstCon = rs.getInt(2);
                System.out.println(">> first connection : " + firstCon);
            }
            if (rs.next()) {
                secondCon = rs.getInt(2);
                System.out.println(">> second connection : " + secondCon);
            }
            if (firstCon != 0 && secondCon != 0 && firstCon != secondCon) {
                result = true;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException sqe) {
            }

            try {
                if (con != null) {
                    con.close();
                }
            } catch (SQLException sqe) {
            }
        }
        return result;
    }

    public void ejbLoad() {
    }

    public void ejbStore() {
    }

    public void ejbRemove() {
    }

    public void ejbActivate() {
    }

    public void ejbPassivate() {
    }

    public void unsetEntityContext() {
    }

    public void ejbPostCreate() {
    }
}
