

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.jdbc.driver.OracleDriver;

public class GenPaperServlet extends HttpServlet
{

    Connection conn;
    Statement stmt;
    ResultSet rs;
    int total_question_num;
    int total_question_in_paper;
    int total_paper_num;
    String curr_classid;

    public GenPaperServlet()
    {
        conn = null;
        stmt = null;
        rs = null;
        total_question_num = 0;
        total_question_in_paper = 0;
        total_paper_num = 0;
        curr_classid = "";
    }

    public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
        throws ServletException, IOException
    {
        httpservletresponse.setContentType("text/html;charset=GBK");
        PrintWriter printwriter = httpservletresponse.getWriter();
        printwriter.println("<html><head></head><body><center>");
        printwriter.println("请以POST方式提交");
        printwriter.println("</center></body></html>");
        printwriter.close();
    }

    public void doPost(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
        throws ServletException, IOException
    {
        httpservletresponse.setContentType("text/html;charset=GBK");
        PrintWriter printwriter = httpservletresponse.getWriter();
        String s = httpservletrequest.getParameter("classid");  //"20"
        String s1 = httpservletrequest.getParameter("paper_num");  //"1"
        if(s == null || s1 == null)
        {
            printwriter.println("<center>");
            printwriter.println("请按照正常方式提交数据<br>");
            printwriter.println("<a href=/test/admin/genpaper.jsp>单击这里设置生成试卷的参数</a>");
            printwriter.println("</center>");
        }
        total_paper_num = Integer.parseInt(s1);
        curr_classid = s;
        int i = 0;
        if(!open_db(curr_classid))
        {
            printwriter.println("打开数据库错误！");
            return;
        }
        if(!setParams(curr_classid))
        {
            System.out.println("设置系统参数错误！");
            return;
        }
        if(!verify_QuertionLib())
        {
            printwriter.println("试题库中试卷不足，请增加新的试题！");
            printwriter.println("班级代号：" + curr_classid);
            printwriter.println("该班级一套试卷中的试题数：" + total_question_in_paper);
            printwriter.println("目前题库中该班级的试题总数：" + total_question_num);
            return;
        }
        i = genPaper(total_paper_num, curr_classid);
        if(i == 0)
        {
            printwriter.println("生成试卷操作失败！");
            return;
        }
        if(!updateOtherTable(i, curr_classid))
        {
            printwriter.println("更新相关表操作失败！");
            return;
        } else
        {
            printwriter.println("<center>");
            printwriter.println("动态组卷成功！<br>");
            printwriter.println("共生成了 " + i + " 套试卷<br>");
            printwriter.println("<a href=/test/admin/genpaper.jsp>单击这里设置生成试卷的参数</a>");
            printwriter.println("</center>");
            return;
        }
    }

    public boolean open_db(String s)
    {
        try
        {
            new OracleDriver();
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora9", "scott", "tiger");
            stmt = conn.createStatement();
        }
        catch(Exception exception)
        {
            return false;
        }
        return true;
    }

    public boolean setParams(String s)
    {
        String s1 = "";
        try
        {
            String s2 = "select count(questionid) as countquestionid  from test_question_lib ";
            s2 = s2 + "where classid='" + s + "'";
            rs = stmt.executeQuery(s2);
            rs.next();
            total_question_num = rs.getInt("countquestionid");
            s2 = "select totalques from test_classinfo ";
            s2 = s2 + "where classid='" + s + "'";
            rs = stmt.executeQuery(s2);
            rs.next();
            total_question_in_paper = rs.getInt("totalques");
        }
        catch(Exception exception)
        {
            return false;
        }
        return true;
    }

    public boolean verify_QuertionLib()
    {
        return total_question_num >=   total_question_in_paper;
    }

    public boolean updateOtherTable(int i, String s)
    {
        int j = 0;
        String s1 = "update test_classinfo set totalpaper=totalpaper+";
        s1 = s1 + i + " where classid='" + s + "'";
        try
        {
            j = stmt.executeUpdate(s1);
        }
        catch(Exception exception)
        {
            return false;
        }
        return j == 1;
    }

    public int genPaper(int i, String s)
    {
        boolean flag = false;
        boolean flag1 = false;
        boolean flag2 = false;
        boolean flag3 = false;
        String s1 = "";
        try
        {  
            int ai[] = new int[total_question_num];
            int i1 = 0;
            boolean flag4 = false;
            String s2 = "select max(paper_id) as max_paper_id from test_paper_lib";
            rs = stmt.executeQuery(s2);
            rs.next();
            int j = rs.getInt("max_paper_id") + 1;
            s2 = "select questionid from test_question_lib where classid='" + s + "'";
            
            for(rs = stmt.executeQuery(s2); rs.next();)
                ai[i1++] = rs.getInt("questionid");

            for(int k1 = 0; k1 < i; k1++)
            {
                int k = ai.length; //8
                for(int l1 = 0; l1 < total_question_in_paper; l1++)
                {
                	// int ai[] ={1 ,3 , 5 ,9 , 56,30 96 ,25};
                    int j1 = (int)Math.floor(Math.random() * (double)k); // 4
                    String s3 = "insert into test_paper_lib values(";
                    s3 = s3 + "test_seq_paper.nextval," + j + "," + ai[j1] + ")";
                    stmt.executeUpdate(s3);
                    
                    int l = ai[k - 1];
                    ai[k - 1] = ai[j1];
                    ai[j1] = l;
                    k--;
                }

                j++;
            }

        }
        catch(Exception exception)
        {
            return 0;
        }
        return i;
    }
}
