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