    001package org.cpsolver.exam.reports;
    002
    003import java.util.ArrayList;
    004import java.util.List;
    005import java.util.TreeSet;
    006
    007import org.cpsolver.exam.model.Exam;
    008import org.cpsolver.exam.model.ExamModel;
    009import org.cpsolver.exam.model.ExamPlacement;
    010import org.cpsolver.exam.model.ExamRoomPlacement;
    011import org.cpsolver.ifs.assignment.Assignment;
    012import org.cpsolver.ifs.util.CSVFile;
    013import org.cpsolver.ifs.util.CSVFile.CSVField;
    014
    015
    016/**
    017 * Export room splitting into a CSV file. <br>
    018 * <br>
    019 * Usage:
    020 * <pre><code>
    021 * &nbsp;&nbsp;&nbsp;&nbsp;new ExamRoomSplit(model).report().save(file);
    022 * </code></pre>
    023 * <br>
    024 *
    025 * @version ExamTT 1.3 (Examination Timetabling)<br>
    026 *          Copyright (C) 2007 - 2014 Tomáš Müller<br>
    027 *          <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
    028 *          <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
    029 * <br>
    030 *          This library is free software; you can redistribute it and/or modify
    031 *          it under the terms of the GNU Lesser General Public License as
    032 *          published by the Free Software Foundation; either version 3 of the
    033 *          License, or (at your option) any later version. <br>
    034 * <br>
    035 *          This library is distributed in the hope that it will be useful, but
    036 *          WITHOUT ANY WARRANTY; without even the implied warranty of
    037 *          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    038 *          Lesser General Public License for more details. <br>
    039 * <br>
    040 *          You should have received a copy of the GNU Lesser General Public
    041 *          License along with this library; if not see
    042 *          <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
    043 */
    044public class ExamRoomSplit {
    045    private ExamModel iModel = null;
    046
    047    /**
    048     * Constructor
    049     *
    050     * @param model
    051     *            examination timetabling model
    052     */
    053    public ExamRoomSplit(ExamModel model) {
    054        iModel = model;
    055    }
    056
    057    /**
    058     * generate report
    059     * @param assignment current assignment
    060     * @return resultant report
    061     */
    062    public CSVFile report(Assignment<Exam, ExamPlacement> assignment) {
    063        CSVFile csv = new CSVFile();
    064        csv.setHeader(new CSVField[] { new CSVField("Exam"), new CSVField("Enrl"), new CSVField("Period"),
    065                new CSVField("Date"), new CSVField("Time"), new CSVField("Room 1"), new CSVField("Cap 1"),
    066                new CSVField("Room 2"), new CSVField("Cap 2"), new CSVField("Room 3"), new CSVField("Cap 3"),
    067                new CSVField("Room 4"), new CSVField("Cap 4") });
    068        for (Exam exam : iModel.variables()) {
    069            ExamPlacement placement = assignment.getValue(exam);
    070            if (placement == null || placement.getRoomPlacements().size() <= 1)
    071                continue;
    072            List<CSVField> fields = new ArrayList<CSVField>();
    073            fields.add(new CSVField(exam.getName()));
    074            fields.add(new CSVField(exam.getStudents().size()));
    075            fields.add(new CSVField(placement.getPeriod().getIndex() + 1));
    076            fields.add(new CSVField(placement.getPeriod().getDayStr()));
    077            fields.add(new CSVField(placement.getPeriod().getTimeStr()));
    078            TreeSet<ExamRoomPlacement> rooms = new TreeSet<ExamRoomPlacement>(new ExamRoomComparator(exam, false));
    079            rooms.addAll(placement.getRoomPlacements());
    080            for (ExamRoomPlacement room : rooms) {
    081                fields.add(new CSVField(room.getName()));
    082                fields.add(new CSVField(room.getSize(exam.hasAltSeating())));
    083            }
    084            csv.addLine(fields);
    085        }
    086        return csv;
    087    }
    088}