Skip to content

Commit

Permalink
Meeting scheduling: save initialized schedule in xlsx file
Browse files Browse the repository at this point in the history
  • Loading branch information
ge0ffrey committed Oct 5, 2018
1 parent cd91ede commit 89a044f
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 7 deletions.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Expand Up @@ -40,7 +40,11 @@ public void setDayOfYear(int dayOfYear) {
}

public String getDateString() {
return DAY_FORMATTER.format(LocalDate.ofYearDay(LocalDate.now().getYear(), dayOfYear));
return DAY_FORMATTER.format(toDate());
}

public LocalDate toDate() {
return LocalDate.ofYearDay(LocalDate.now().getYear(), dayOfYear);
}

@Override
Expand Down
Expand Up @@ -33,7 +33,7 @@ public class MeetingParametrization extends AbstractPersistable {
public static final String ONE_TIME_GRAIN_BREAK_BETWEEN_TWO_CONSECUTIVE_MEETINGS = "One TimeGrain break between two consecutive meetings";
public static final String OVERLAPPING_MEETINGS = "Overlapping meetings";
public static final String ASSIGN_LARGER_ROOMS_FIRST = "Assign larger rooms first";
public static final String ROOM_STABILITY = "Room Stability";
public static final String ROOM_STABILITY = "Room stability";

private int roomConflict = 1;
private int dontGoInOvertime = 1;
Expand Down
Expand Up @@ -16,6 +16,11 @@

package org.optaplanner.examples.meetingscheduling.domain;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.TemporalAccessor;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.optaplanner.examples.common.domain.AbstractPersistable;
import org.optaplanner.examples.common.swingui.components.Labeled;
Expand Down Expand Up @@ -57,6 +62,18 @@ public void setStartingMinuteOfDay(int startingMinuteOfDay) {
this.startingMinuteOfDay = startingMinuteOfDay;
}

public LocalDate getDate() {
return day.toDate();
}

public LocalTime getTime() {
return LocalTime.of(startingMinuteOfDay / 60, startingMinuteOfDay % 60);
}

public LocalDateTime getDateTime() {
return LocalDateTime.of(getDate(), getTime());
}

public String getTimeString() {
int hourOfDay = startingMinuteOfDay / 60;
int minuteOfHour = startingMinuteOfDay % 60;
Expand Down
Expand Up @@ -10,6 +10,7 @@
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Year;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
Expand All @@ -19,8 +20,10 @@
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Workbook;
Expand All @@ -33,6 +36,7 @@
import org.optaplanner.core.api.score.constraint.ConstraintMatch;
import org.optaplanner.core.api.score.constraint.Indictment;
import org.optaplanner.examples.common.persistence.AbstractXlsxSolutionFileIO;
import org.optaplanner.examples.conferencescheduling.domain.Talk;
import org.optaplanner.examples.meetingscheduling.app.MeetingSchedulingApp;
import org.optaplanner.examples.meetingscheduling.domain.Attendance;
import org.optaplanner.examples.meetingscheduling.domain.Day;
Expand Down Expand Up @@ -71,10 +75,10 @@ private static class MeetingSchedulingXlsxReader extends AbstractXlsxReader<Meet
public MeetingSchedule read() {
solution = new MeetingSchedule();
readConfiguration();
readPersonList();
readMeetingList();
readDayList();
readRoomList();
readPersonList();
readMeetingList();

return solution;
}
Expand Down Expand Up @@ -140,11 +144,18 @@ private void readMeetingList() {
readHeaderCell("Content");
readHeaderCell("Required attendance list");
readHeaderCell("Preferred attendance list");
readHeaderCell("Day");
readHeaderCell("Starting time");
readHeaderCell("Room");

List<Meeting> meetingList = new ArrayList<>(currentSheet.getLastRowNum() - 1);
List<MeetingAssignment> meetingAssignmentList = new ArrayList<>(currentSheet.getLastRowNum() - 1);
List<Attendance> attendanceList = new ArrayList<>(currentSheet.getLastRowNum() - 1);
long meetingId = 0L, meetingAssignmentId = 0L, attendanceId = 0L;
Map<LocalDateTime, TimeGrain> timeGrainMap = solution.getTimeGrainList().stream().collect(
Collectors.toMap(TimeGrain::getDateTime, Function.identity()));
Map<String, Room> roomMap = solution.getRoomList().stream().collect(
Collectors.toMap(Room::getName, Function.identity()));

while (nextRow()) {
Meeting meeting = new Meeting();
Expand Down Expand Up @@ -182,7 +193,8 @@ private void readMeetingList() {
attendanceId += meetingAttendanceList.size();
attendanceList.addAll(meetingAttendanceList);
}

meetingAssignment.setStartingTimeGrain(extractTimeGrain(meeting, timeGrainMap));
meetingAssignment.setRoom(extractRoom(meeting, roomMap));
meetingList.add(meeting);
meetingAssignment.setMeeting(meeting);
meetingAssignmentList.add(meetingAssignment);
Expand Down Expand Up @@ -317,6 +329,45 @@ private List<PreferredAttendance> getPreferredAttendanceList(Meeting meeting, Ma
.collect(toList());
}

private TimeGrain extractTimeGrain(Meeting meeting, Map<LocalDateTime, TimeGrain> timeGrainMap) {
String dateString = nextStringCell().getStringCellValue();
String startTimeString = nextStringCell().getStringCellValue();
if (!dateString.isEmpty() || !startTimeString.isEmpty()) {
LocalDateTime dateTime;
try {
dateTime = LocalDateTime.of(LocalDate.parse(dateString, DAY_FORMATTER),
LocalTime.parse(startTimeString, TIME_FORMATTER));
} catch (DateTimeParseException e) {
throw new IllegalStateException(currentPosition() + ": The meeting with id (" + meeting.getId()
+ ") has a timeGrain date (" + dateString + ") and startTime (" + startTimeString
+ ") that doesn't parse as a date or time.", e);
}

TimeGrain timeGrain = timeGrainMap.get(dateTime);
if (timeGrain == null) {
throw new IllegalStateException(currentPosition() + ": The meeting with id (" + meeting.getId()
+ ") has a timeGrain date (" + dateString + ") and startTime (" + startTimeString
+ ") that doesn't exist in the other sheet (Day).");
}
return timeGrain;
}
return null;
}

private Room extractRoom(Meeting meeting, Map<String, Room> roomMap) {
String roomName = nextStringCell().getStringCellValue();
if (!roomName.isEmpty()) {
Room room = roomMap.get(roomName);
if (room == null) {
throw new IllegalStateException(currentPosition() + ": The meeting with id (" + meeting.getId()
+ ") has a roomName (" + roomName
+ ") that doesn't exist in the other sheet (Rooms).");
}
return room;
}
return null;
}

private void readDayList() {
nextSheet("Days");
nextRow(false);
Expand Down Expand Up @@ -406,10 +457,10 @@ public Workbook write() {
creationHelper = workbook.getCreationHelper();
createStyles();
writeConfiguration();
writePersons();
writeMeetings();
writeDays();
writeRooms();
writePersons();
writeMeetings();
writeRoomsView();
writePersonsView();
writePrintedFormView();
Expand Down Expand Up @@ -468,6 +519,11 @@ private void writeMeetings() {
nextHeaderCell("Content");
nextHeaderCell("Required attendance list");
nextHeaderCell("Preferred attendance list");
nextHeaderCell("Day");
nextHeaderCell("Starting time");
nextHeaderCell("Room");
Map<Meeting, List<MeetingAssignment>> meetingAssignmentMap = solution.getMeetingAssignmentList().stream()
.collect(groupingBy(MeetingAssignment::getMeeting, toList()));
for (Meeting meeting : solution.getMeetingList()) {
nextRow();
nextCell().setCellValue(meeting.getTopic());
Expand All @@ -486,6 +542,15 @@ private void writeMeetings() {
meeting.getPreferredAttendanceList().stream()
.map(preferredAttendance -> preferredAttendance.getPerson().getFullName())
.collect(joining(", ")));
List<MeetingAssignment> meetingAssignmentList = meetingAssignmentMap.get(meeting);
if (meetingAssignmentList.size() != 1) {
throw new IllegalStateException("Impossible state");
}
MeetingAssignment meetingAssignment = meetingAssignmentList.get(0);
TimeGrain startingTimeGrain = meetingAssignment.getStartingTimeGrain();
nextCell().setCellValue(startingTimeGrain == null ? "" : DAY_FORMATTER.format(startingTimeGrain.getDate()));
nextCell().setCellValue(startingTimeGrain == null ? "" : TIME_FORMATTER.format(startingTimeGrain.getTime()));
nextCell().setCellValue(meetingAssignment.getRoom() == null ? "" : meetingAssignment.getRoom().getName());
}
setSizeColumnsWithHeader(5000);
}
Expand Down

0 comments on commit 89a044f

Please sign in to comment.