001package net.sf.cpsolver.exam.reports; 002 003import java.util.ArrayList; 004import java.util.Collections; 005import java.util.Comparator; 006import java.util.List; 007 008import net.sf.cpsolver.exam.model.Exam; 009import net.sf.cpsolver.exam.model.ExamModel; 010import net.sf.cpsolver.exam.model.ExamPeriod; 011import net.sf.cpsolver.exam.model.ExamPlacement; 012import net.sf.cpsolver.exam.model.ExamRoom; 013import net.sf.cpsolver.ifs.util.CSVFile; 014import net.sf.cpsolver.ifs.util.CSVFile.CSVField; 015 016/** 017 * Export schedule for each room into a CSV file. <br> 018 * <br> 019 * Usage:<br> 020 * <code> 021 * new ExamRoomSchedule(model).report().save(file); 022 * </code> <br> 023 * <br> 024 * 025 * @version ExamTT 1.2 (Examination Timetabling)<br> 026 * Copyright (C) 2008 - 2010 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 ExamRoomSchedule { 045 ExamModel iModel = null; 046 047 /** 048 * Constructor 049 * 050 * @param model 051 * examination timetabling model 052 */ 053 public ExamRoomSchedule(ExamModel model) { 054 iModel = model; 055 } 056 057 public CSVFile report() { 058 CSVFile csv = new CSVFile(); 059 csv.setHeader(new CSVField[] { new CSVField("Room"), new CSVField("Cap"), new CSVField("AltCap"), 060 new CSVField("Period"), new CSVField("Date"), new CSVField("Time"), new CSVField("Exam"), 061 new CSVField("Enrl") }); 062 List<ExamRoom> rooms = new ArrayList<ExamRoom>(iModel.getRooms()); 063 Collections.sort(rooms, new Comparator<ExamRoom>() { 064 @Override 065 public int compare(ExamRoom r1, ExamRoom r2) { 066 int cmp = -Double.compare(r1.getSize(), r2.getSize()); 067 if (cmp != 0) 068 return cmp; 069 cmp = -Double.compare(r1.getAltSize(), r2.getAltSize()); 070 if (cmp != 0) 071 return cmp; 072 return r1.compareTo(r2); 073 } 074 }); 075 for (ExamRoom room : rooms) { 076 boolean first = true; 077 int day = -1; 078 for (ExamPeriod period : iModel.getPeriods()) { 079 for (ExamPlacement placement: room.getPlacements(period)) { 080 Exam exam = placement.variable(); 081 csv.addLine(new CSVField[] { new CSVField(first ? room.getName() : ""), 082 new CSVField(first ? "" + room.getSize() : ""), 083 new CSVField(first ? "" + room.getAltSize() : ""), new CSVField(period.getIndex() + 1), 084 new CSVField(day == period.getDay() ? "" : period.getDayStr()), 085 new CSVField(period.getTimeStr()), new CSVField(exam.getName()), 086 new CSVField(exam.getStudents().size()) }); 087 first = false; 088 day = period.getDay(); 089 } 090 } 091 } 092 return csv; 093 } 094}