001    package net.sf.cpsolver.studentsct.check;
002    
003    import java.util.HashMap;
004    
005    import net.sf.cpsolver.coursett.model.TimeLocation;
006    import net.sf.cpsolver.studentsct.StudentSectioningModel;
007    import net.sf.cpsolver.studentsct.model.Assignment;
008    import net.sf.cpsolver.studentsct.model.Enrollment;
009    import net.sf.cpsolver.studentsct.model.Request;
010    import net.sf.cpsolver.studentsct.model.Student;
011    
012    /**
013     * This class looks and reports cases when a student is enrolled into two
014     * sections that are overlapping in time.
015     * 
016     * <br>
017     * <br>
018     * 
019     * Usage: if (new OverlapCheck(model).check()) ...
020     * 
021     * <br>
022     * <br>
023     * 
024     * @version StudentSct 1.2 (Student Sectioning)<br>
025     *          Copyright (C) 2007 - 2010 Tomas Muller<br>
026     *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
027     *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
028     * <br>
029     *          This library is free software; you can redistribute it and/or modify
030     *          it under the terms of the GNU Lesser General Public License as
031     *          published by the Free Software Foundation; either version 3 of the
032     *          License, or (at your option) any later version. <br>
033     * <br>
034     *          This library is distributed in the hope that it will be useful, but
035     *          WITHOUT ANY WARRANTY; without even the implied warranty of
036     *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
037     *          Lesser General Public License for more details. <br>
038     * <br>
039     *          You should have received a copy of the GNU Lesser General Public
040     *          License along with this library; if not see
041     *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
042     */
043    public class OverlapCheck {
044        private static org.apache.log4j.Logger sLog = org.apache.log4j.Logger.getLogger(OverlapCheck.class);
045        private StudentSectioningModel iModel;
046    
047        /**
048         * Constructor
049         * 
050         * @param model
051         *            student sectioning model
052         */
053        public OverlapCheck(StudentSectioningModel model) {
054            iModel = model;
055        }
056    
057        /** Return student sectioning model */
058        public StudentSectioningModel getModel() {
059            return iModel;
060        }
061    
062        /**
063         * Check for overlapping sections that are attended by the same student
064         * 
065         * @return false, if there is such a case
066         */
067        public boolean check() {
068            sLog.info("Checking for overlaps...");
069            boolean ret = true;
070            for (Student student : getModel().getStudents()) {
071                HashMap<TimeLocation, Assignment> times = new HashMap<TimeLocation, Assignment>();
072                for (Request request : student.getRequests()) {
073                    Enrollment enrollment = request.getAssignment();
074                    if (enrollment == null)
075                        continue;
076                    for (Assignment assignment : enrollment.getAssignments()) {
077                        if (assignment.getTime() == null)
078                            continue;
079                        for (TimeLocation time: times.keySet()) {
080                            if (time.hasIntersection(assignment.getTime())) {
081                                sLog.error("Student " + student + " assignment " + assignment + " overlaps with "
082                                        + times.get(time));
083                                ret = false;
084                            }
085                        }
086                        times.put(assignment.getTime(), assignment);
087                    }
088                }
089            }
090            return ret;
091        }
092    
093    }