/*
 * Copyright (c) 1997, 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 myapp;

import java.io.*;
import java.lang.reflect.Constructor;
import java.net.*;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import javax.sql.DataSource;
import java.util.Map;
import jakarta.annotation.Resource;
import myapp.test.SimpleTest;
import myapp.util.HtmlUtil;

public class MyServlet extends HttpServlet {

    @Resource(name = "jdbc/__default", mappedName = "jdbc/__default")
    DataSource ds1;

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        Boolean pass = false;
        SimpleTest[] tests = null;
        StringBuffer buf = null;
        Boolean  notestcase = false;
        String testcase = request.getParameter("testcase");
        System.out.println("testcase="+testcase);
        if (testcase != null) {

          out.println("<html>");
          out.println("<head>");
          out.println("<title>Servlet MyServlet</title>");
          out.println("</head>");
          out.println("<body>");
          out.println("<h1>Servlet MyServlet at " + request.getContextPath() + "</h1>");

          buf = new StringBuffer();

          try {
        if ("usertx".equals(testcase)) {
                 tests = initializeUserTxTest();
        } else if ("noleak".equals(testcase)) {
                 tests = initializeLeakTest();
        }
          } catch (Exception e) {
               HtmlUtil.printException(e, out);
          }

          try {
               buf.append("Test Name:Pass<br>");
               for (SimpleTest test : tests) {
                  Map<String, Boolean> map = test.runTest(ds1, out);
                   for (Map.Entry entry : map.entrySet()) {
                      buf.append(entry.getKey());
                      buf.append(":");
                      buf.append(entry.getValue());
                      buf.append("<br>");
                  }
               }
               out.println(buf.toString());
            } catch (Throwable e) {
               out.println("got outer excpetion");
               out.println(e);
               e.printStackTrace();
            } finally {
               out.println("</body>");
               out.println("</html>");
               out.close();
               out.flush();
           }
    }
    }

    private SimpleTest[] initializeUserTxTest() throws Exception {
        String[] tests = {
            "myapp.test.UserTxTest"
        };

        SimpleTest[] testInstances = new SimpleTest[tests.length];
        for (int i = 0; i < tests.length; i++) {
            Class testClass = Class.forName(tests[i]);
            Constructor c = testClass.getConstructor();
            testInstances[i] = (SimpleTest) c.newInstance();
        }
        return testInstances;
    }

    private SimpleTest[] initializeLeakTest() throws Exception {
        String[] tests = {
            "myapp.test.LeakTest"
        };

        SimpleTest[] testInstances = new SimpleTest[tests.length];
        for (int i = 0; i < tests.length; i++) {
            Class testClass = Class.forName(tests[i]);
            Constructor c = testClass.getConstructor();
            testInstances[i] = (SimpleTest) c.newInstance();
        }
        return testInstances;
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    // </editor-fold>
}
