org.wise.portal.dao.peerreview.impl.HibernatePeerReviewGateDao.java Source code

Java tutorial

Introduction

Here is the source code for org.wise.portal.dao.peerreview.impl.HibernatePeerReviewGateDao.java

Source

/**
 * Copyright (c) 2008-2015 Regents of the University of California (Regents).
 * Created by WISE, Graduate School of Education, University of California, Berkeley.
 * 
 * This software is distributed under the GNU General Public License, v3,
 * or (at your option) any later version.
 * 
 * Permission is hereby granted, without written agreement and without license
 * or royalty fees, to use, copy, modify, and distribute this software and its
 * documentation for any purpose, provided that the above copyright notice and
 * the following two paragraphs appear in all copies of this software.
 * 
 * REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
 * HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
 * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 * 
 * IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
 * SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
 * REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.wise.portal.dao.peerreview.impl;

import java.util.List;

import org.hibernate.NonUniqueResultException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.wise.portal.dao.ObjectNotFoundException;
import org.wise.portal.dao.impl.AbstractHibernateDao;
import org.wise.portal.dao.peerreview.PeerReviewGateDao;
import org.wise.vle.domain.node.Node;
import org.wise.vle.domain.peerreview.PeerReviewGate;
import org.wise.vle.domain.peerreview.PeerReviewWork;

@Repository
public class HibernatePeerReviewGateDao extends AbstractHibernateDao<PeerReviewGate>
        implements PeerReviewGateDao<PeerReviewGate> {

    @Override
    protected String getFindAllQuery() {
        return null;
    }

    @Override
    protected Class<? extends PeerReviewGate> getDataObjectClass() {
        return null;
    }

    public PeerReviewGate getPeerReviewGateById(Long id) {
        PeerReviewGate peerReviewGate = null;

        try {
            peerReviewGate = getById(id);
        } catch (ObjectNotFoundException e) {
            e.printStackTrace();
        }

        return peerReviewGate;
    }

    @Transactional
    public void savePeerReviewGate(PeerReviewGate peerReviewGate) {
        save(peerReviewGate);
    }

    @Transactional(readOnly = true)
    public PeerReviewGate getPeerReviewGateByRunIdPeriodIdNodeId(Long runId, Long periodId, Node node) {
        try {
            Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
            PeerReviewGate result = (PeerReviewGate) session.createCriteria(PeerReviewGate.class)
                    .add(Restrictions.eq("runId", runId)).add(Restrictions.eq("periodId", periodId))
                    .add(Restrictions.eq("node", node)).uniqueResult();
            return result;
        } catch (NonUniqueResultException e) {
            //System.err.println("workgroupId: " + id);
            throw e;
        }
    }

    @Transactional
    public PeerReviewGate getOrCreatePeerReviewGateByRunIdPeriodIdNodeId(Long runId, Long periodId, Node node) {
        PeerReviewGate peerReviewGate = getPeerReviewGateByRunIdPeriodIdNodeId(runId, periodId, node);
        if (peerReviewGate == null) {
            peerReviewGate = new PeerReviewGate();
            peerReviewGate.setRunId(runId);
            peerReviewGate.setPeriodId(periodId);
            peerReviewGate.setNode(node);
            savePeerReviewGate(peerReviewGate);
        }
        return peerReviewGate;
    }

    @Transactional
    public boolean calculatePeerReviewOpen(Long runId, Long periodId, Node node, int numWorkgroups,
            int openPercentageTrigger, int openNumberTrigger) {
        PeerReviewGate peerReviewGate = getPeerReviewGateByRunIdPeriodIdNodeId(runId, periodId, node);

        if (peerReviewGate == null) {
            return false;
        } else if (!peerReviewGate.isOpen()) {
            List<PeerReviewWork> peerReviewWorkForRunPeriodNode = getPeerReviewWorkByRunPeriodNode(runId, periodId,
                    node);

            int numWorkgroupsSubmitted = peerReviewWorkForRunPeriodNode.size();

            if (peerReviewGateOpenPercentageTriggerSatisfied(numWorkgroupsSubmitted, numWorkgroups,
                    openPercentageTrigger)
                    && peerReviewGateOpenNumberTriggerSatisfied(numWorkgroupsSubmitted, openNumberTrigger)) {
                peerReviewGate.setOpen(true);
                savePeerReviewGate(peerReviewGate);
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }

    public boolean peerReviewGateOpenPercentageTriggerSatisfied(int numWorkgroupsSubmitted, int numWorkgroups,
            int openPercentageTrigger) {
        if (openPercentageTrigger == 0) {
            return true;
        }

        if (numWorkgroups != 0) {
            double percentageSubmitted = numWorkgroupsSubmitted * 100f / numWorkgroups;

            if (percentageSubmitted >= openPercentageTrigger) {
                return true;
            } else {
                return false;
            }
        } else {
            //this case can technically never occur
            return false;
        }
    }

    public boolean peerReviewGateOpenNumberTriggerSatisfied(int numWorkgroupsSubmitted, int openNumberTrigger) {
        if (openNumberTrigger == 0) {
            return true;
        }

        if (numWorkgroupsSubmitted >= openNumberTrigger) {
            return true;
        } else {
            return false;
        }
    }

    @Transactional(readOnly = true)
    private List<PeerReviewWork> getPeerReviewWorkByRunPeriodNode(Long runId, Long periodId, Node node) {
        Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
        List<PeerReviewWork> result = session.createCriteria(PeerReviewWork.class)
                .add(Restrictions.eq("runId", runId)).add(Restrictions.eq("periodId", periodId))
                .add(Restrictions.eq("node", node)).add(Restrictions.isNotNull("stepWork")).list();
        return result;
    }
}