001    package net.sf.cpsolver.exam.reports;
002    
003    import java.util.Enumeration;
004    import java.util.Iterator;
005    import java.util.Vector;
006    
007    import net.sf.cpsolver.exam.model.Exam;
008    import net.sf.cpsolver.exam.model.ExamModel;
009    import net.sf.cpsolver.exam.model.ExamPlacement;
010    import net.sf.cpsolver.exam.model.ExamRoomPlacement;
011    import net.sf.cpsolver.ifs.util.CSVFile;
012    import net.sf.cpsolver.ifs.util.CSVFile.CSVField;
013    
014    /**
015     * Export exam time and room assignments into a CSV file.
016     * <br><br>
017     * Usage:<br>
018     * <code>
019     * &nbsp;&nbsp;&nbsp;&nbsp;new ExamAssignments(model).report().save(file);
020     * </code>
021     * <br><br>
022     * 
023     * @version
024     * ExamTT 1.1 (Examination Timetabling)<br>
025     * Copyright (C) 2008 Tomáš Müller<br>
026     * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
027     * Lazenska 391, 76314 Zlin, Czech Republic<br>
028     * <br>
029     * This library is free software; you can redistribute it and/or
030     * modify it under the terms of the GNU Lesser General Public
031     * License as published by the Free Software Foundation; either
032     * version 2.1 of the License, or (at your option) any later version.
033     * <br><br>
034     * This library is distributed in the hope that it will be useful,
035     * but 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.
038     * <br><br>
039     * You should have received a copy of the GNU Lesser General Public
040     * License along with this library; if not, write to the Free Software
041     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
042     */
043    public class ExamAssignments {
044        private ExamModel iModel = null;
045    
046        /**
047         * Constructor
048         * @param model examination timetabling model
049         */
050        public ExamAssignments(ExamModel model) {
051            iModel = model;
052        }
053        
054        /**
055         * generate report
056         */
057        public CSVFile report() {
058            CSVFile csv = new CSVFile();
059            csv.setHeader(new CSVField[] {
060                    new CSVField("Exam"),
061                    new CSVField("Enrl"),
062                    new CSVField("Alt"),
063                    new CSVField("Period"),
064                    new CSVField("Date"),
065                    new CSVField("Time"),
066                    new CSVField("Room"),
067                    new CSVField("Cap")
068            });
069            for (Enumeration e=iModel.variables().elements();e.hasMoreElements();) {
070                Exam exam = (Exam)e.nextElement();
071                ExamPlacement placement = (ExamPlacement)exam.getAssignment();
072                Vector fields = new Vector();
073                fields.addElement(new CSVField(exam.getName()));
074                fields.addElement(new CSVField(exam.getStudents().size()));
075                fields.addElement(new CSVField(exam.hasAltSeating()?"Yes":"No"));
076                if (placement==null) {
077                    fields.addElement(new CSVField(""));
078                    fields.addElement(new CSVField(""));
079                    fields.addElement(new CSVField(""));
080                    fields.addElement(new CSVField(""));
081                    fields.addElement(new CSVField(""));
082                } else {
083                    fields.addElement(new CSVField(placement.getPeriod().getIndex()+1));
084                    fields.addElement(new CSVField(placement.getPeriod().getDayStr()));
085                    fields.addElement(new CSVField(placement.getPeriod().getTimeStr()));
086                    String rooms = "";
087                    String roomSizes = "";
088                    for (Iterator i=placement.getRoomPlacements().iterator();i.hasNext();) {
089                        ExamRoomPlacement room = (ExamRoomPlacement)i.next();
090                        rooms += room.getRoom().getName();
091                        roomSizes += room.getSize(exam.hasAltSeating());
092                        if (i.hasNext()) {
093                            rooms+=", ";
094                            roomSizes+=", ";
095                        }
096                    }
097                    fields.addElement(new CSVField(rooms));
098                    fields.addElement(new CSVField(roomSizes));
099                }
100                csv.addLine(fields);
101            }
102            return csv;
103        }
104    }