/*
 * 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 client;

import jakarta.annotation.Resource;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import javax.naming.InitialContext;
import jakarta.transaction.UserTransaction;
import jakarta.transaction.Status;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.sql.DataSource;

import jakarta.xml.ws.*;
import endpoint.ejb.*;

public class Client extends HttpServlet {

       @WebServiceRef(name="sun-web.serviceref/HelloEJBService")
       HelloEJBService service;
       @Resource(mappedName="jdbc/__default") private DataSource ds;

       public void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws jakarta.servlet.ServletException {
           doPost(req, resp);
       }

       public void doPost(HttpServletRequest req, HttpServletResponse resp)
              throws jakarta.servlet.ServletException {
            UserTransaction ut = null;
            // Create Table with name CUSTOMER_rb1. This name will be used in the EJB
            String tableName = "CUSTOMER_rb1";
            String[] names = {"Vikas", "VikasAwasthi"};
            String[] emails= {"vikas@sun.com", "VikasA@sun.com"};
            try {
                Connection con = ds.getConnection();
                createTable(con, tableName);
                ut = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
                ut.begin();

                updateTable(con, tableName, names[1], emails[1]);
                System.out.println(" Service is :" + service);
                Hello port = service.getHelloEJBPort();

                String ret = port.sayHello("Appserver Tester !");
                System.out.println("Return value from webservice:"+ret);
                System.out.println("**** rollbacking transaction");
                ut.rollback();

                if(isDataPresent(con, tableName)) {
                    ret += "FAILED";
                }

                PrintWriter out = resp.getWriter();
                resp.setContentType("text/html");
                out.println("<html>");
                out.println("<head>");
                out.println("<title>TestServlet</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<p>");
                out.println("So the RESULT OF EJB webservice IS :");
                out.println("</p>");
                out.println("[" + ret + "]");
                out.println("</body>");
                out.println("</html>");
                dropTable(con, tableName);
            } catch(Exception e) {
                e.printStackTrace();
            }
       }

       // use this table in the EJB webservice
       private void createTable(Connection con, String tableName) throws Exception {
            // autocommit is made true so that the table is created immediately
            boolean autoCommit = con.getAutoCommit();
            con.setAutoCommit(true);
            System.out.println("**** auto commit = " + con.getAutoCommit());
            PreparedStatement pStmt =
            con.prepareStatement("CREATE TABLE "+tableName+" (NAME VARCHAR(30) NOT NULL PRIMARY KEY, EMAIL VARCHAR(30))");
            pStmt.executeUpdate();
            con.setAutoCommit(autoCommit);
       }

       private void dropTable(Connection con, String tableName) throws Exception {
            boolean autoCommit = con.getAutoCommit();
            con.setAutoCommit(true);
            PreparedStatement pStmt = con.prepareStatement("DROP TABLE "+tableName);
            pStmt.executeUpdate();
            con.setAutoCommit(autoCommit);
       }

       // Check whether the EJB webservice has updated the data in the table.
       private boolean isDataPresent(Connection con, String tableName) throws Exception {
            PreparedStatement pStmt = con.prepareStatement("SELECT NAME, EMAIL FROM "+tableName);
            ResultSet rs = pStmt.executeQuery();
            while(rs.next()) {
                String db_Name  = rs.getString(1);
                String db_Email = rs.getString(2);
                System.out.println("NAME="+db_Name+", EMAIL="+db_Email);
                rs.close();
                return true;
            }
            return false;
       }

       private void updateTable(Connection con, String tableName, String name, String email)
                throws Exception {
           PreparedStatement pStmt =
                con.prepareStatement("INSERT INTO "+ tableName +" (NAME, EMAIL) VALUES(?,?)");
           pStmt.setString(1, name);
           pStmt.setString(2, email);
           pStmt.executeUpdate();
       }
}
