Package cn.edu.zju.acm.onlinejudge.action

Source Code of cn.edu.zju.acm.onlinejudge.action.ShowProblemsAction

/*
* Copyright 2007 Zhang, Zheng <oldbig@gmail.com>
*
* This file is part of ZOJ.
*
* ZOJ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either revision 3 of the License, or (at your option) any later revision.
*
* ZOJ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with ZOJ. if not, see
* <http://www.gnu.org/licenses/>.
*/

package cn.edu.zju.acm.onlinejudge.action;

import java.util.ArrayList;
import java.util.List;
import java.util.*;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cn.edu.zju.acm.onlinejudge.bean.AbstractContest;
import cn.edu.zju.acm.onlinejudge.bean.Problem;
import cn.edu.zju.acm.onlinejudge.bean.Reference;
import cn.edu.zju.acm.onlinejudge.bean.enumeration.ReferenceType;
import cn.edu.zju.acm.onlinejudge.persistence.ReferencePersistence;
import cn.edu.zju.acm.onlinejudge.util.ContestManager;
import cn.edu.zju.acm.onlinejudge.util.ContestStatistics;
import cn.edu.zju.acm.onlinejudge.util.PersistenceManager;
import cn.edu.zju.acm.onlinejudge.util.StatisticsManager;
import cn.edu.zju.acm.onlinejudge.util.UserStatistics;
import cn.edu.zju.acm.onlinejudge.util.Utility;

/**
* <p>
* ShowProblemsAction
* </p>
*
*
* @author Zhang, Zheng
* @version 2.0
*/
public class ShowProblemsAction extends BaseAction {

    /**
     * <p>
     * Default constructor.
     * </p>
     */
    public ShowProblemsAction() {
    // empty
    }

    /**
     * ShowProblemsAction.
     *
     * @param mapping
     *            action mapping
     * @param form
     *            action form
     * @param request
     *            http servlet request
     * @param response
     *            http servlet response
     *
     * @return action forward instance
     *
     * @throws Exception
     *             any errors happened
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, ContextAdapter context) throws Exception {
        // check contest

        //System.out.println("in show problems");
        boolean isProblemset = context.getRequest().getRequestURI().endsWith("showProblems.do");
        //boolean isCourse=context.getRequest().getRequestURI().endsWith("showCourseProblems.do");
        ActionForward forward = this.checkContestViewPermission(mapping, context, isProblemset, true);
        if (forward != null) {
            return forward;
        }
        AbstractContest contest = context.getContest();
        //System.out.println("" + contest.getId());
        long problemsCount = ContestManager.getInstance().getProblemsCount(contest.getId());

        long pageNumber = Utility.parseLong(context.getRequest().getParameter("pageNumber"));
        if (pageNumber < 1) {
            pageNumber = 1;
        }
        long problemsPerPage = 100;
        if (problemsCount <= (pageNumber - 1) * problemsPerPage) {
            pageNumber = 1;
        }
        long totalPages = 1;
        if (problemsCount > 0) {
            totalPages = (problemsCount - 1) / problemsPerPage + 1;
        }

        List<Problem> oproblems =
                ContestManager.getInstance().getContestProblems(contest.getId(),
                                                                (int) ((pageNumber - 1) * problemsPerPage),
                                                                (int) problemsPerPage);
        List<Problem> problems=new ArrayList<Problem>();
        problems.addAll(oproblems);


        ContestStatistics contestStatistics = null;
        contestStatistics =
                StatisticsManager.getInstance().getContestStatistics(contest.getId(),
                                                                     (int) ((pageNumber - 1) * problemsPerPage),
                                                                     (int) problemsPerPage);
        for(int i=0;i<problems.size();++i)
        {
            Problem p = (Problem)problems.get(i);
            int ac = contestStatistics.getCount(i, 0);
            int total = contestStatistics.getProblemCount(i);
            p.setTotal(total);
            p.setAC(ac);
            if(total==0)
            {
                p.setRatio(0);
            }
            else
            {
                p.setRatio((double)ac/(double)total);
            }
        }
        String order=context.getRequest().getParameter("order");
        if(order!=null)
        {
            if(order.equalsIgnoreCase("ratio"))
            {
        Collections.sort(problems, new Comparator() {
          public int compare(Object o1, Object o2) {
            return (((Problem)o2).getRatio() - ((Problem)o1).getRatio())>0? 1 : -1;
          }}
          );
      } else if(order.equalsIgnoreCase("ac"))
            {
        Collections.sort(problems, new Comparator() {
          public int compare(Object o1, Object o2) {
            return ((Problem)o2).getAC() - ((Problem)o1).getAC();
          }}
          );
      } else if(order.equalsIgnoreCase("all"))
            {
        Collections.sort(problems, new Comparator() {
          public int compare(Object o1, Object o2) {
            return ((Problem)o2).getTotal() - ((Problem)o1).getTotal();
          }}
          );
      }
    }
     
        UserStatistics userStatistics = null;
        if (context.getUserProfile() != null && problems.size() > 0) {
            userStatistics =
                    StatisticsManager.getInstance()
                                     .getUserStatistics(contest.getId(), context.getUserProfile().getId());
        }

        context.setAttribute("problems", problems);
        context.setAttribute("pageNumber", (new Long(pageNumber)).toString());
        context.setAttribute("ContestStatistics", contestStatistics);
        context.setAttribute("UserStatistics", userStatistics);
        context.setAttribute("totalPages", new Long(totalPages));
        context.setAttribute("currentPage", new Long(pageNumber));
        if (this.checkContestAdminPermission(mapping, context, isProblemset, true) == null &&
            "true".equalsIgnoreCase(context.getRequest().getParameter("check"))) {
            List<String> checkMessages = new ArrayList<String>();
            for (Object obj : problems) {
                Problem p = (Problem) obj;
                this.checkExists("Text", this.getReferenceLength(p, ReferenceType.DESCRIPTION), "ERROR", checkMessages,
                                 p);
                this.checkExists("Input", this.getReferenceLength(p, ReferenceType.INPUT), "ERROR", checkMessages, p);
                if (p.isChecker()) {
                    this.checkExists("Output", this.getReferenceLength(p, ReferenceType.OUTPUT), "WARNING",
                                     checkMessages, p);
                    // checkExists("Checker", getReferenceLength(p, ReferenceType.CHECKER), "WARNING", checkMessages,
                    // p);
                    this.checkExists("Checker source", this.getReferenceLength(p, ReferenceType.CHECKER_SOURCE),
                                     "ERROR", checkMessages, p);
                } else {
                    this.checkExists("Output", this.getReferenceLength(p, ReferenceType.OUTPUT), "ERROR",
                                     checkMessages, p);
                }
                this.checkExists("Judge solution", this.getReferenceLength(p, ReferenceType.JUDGE_SOLUTION), "WARNING",
                                 checkMessages, p);
            }
            context.setAttribute("CheckMessages", checkMessages);
        }

        return this.handleSuccess(mapping, context, "success");

    }

    private void checkExists(String name, long length, String level, List<String> checkMessages, Problem p) {
        if (length == -1) {
            checkMessages.add(level + "[ " + p.getCode() + "] - " + name + " is missing.");
        } else if (length == 0) {
            checkMessages.add(level + "[ " + p.getCode() + "] - " + name + " is empty.");
        }
    }

    private long getReferenceLength(Problem p, ReferenceType type) throws Exception {
        ReferencePersistence referencePersistence = PersistenceManager.getInstance().getReferencePersistence();
        List<Reference> refs = referencePersistence.getProblemReferenceInfo(p.getId(), type);

        if (refs.size() == 0) {
            return -1;
        }
        Reference ref = refs.get(0);
        return ref.getSize();
    }

}
TOP

Related Classes of cn.edu.zju.acm.onlinejudge.action.ShowProblemsAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.