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 * 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}