/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.schedule; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.List; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.eip.common.ALData; import com.aimluck.eip.schedule.util.ScheduleUtils; /** * 週間スケジュールのコンテナです。 * */ public class ScheduleListContainer implements ALData { public static final int SCHEDULE_LIST_DATE_LIMIT = 7; private ALDateTimeField viewStartDate; private List<ScheduleResultData> scheduleList; private boolean isSort = false; public void setViewStartDate(Calendar cal) { viewStartDate.setValue(cal.getTime()); } @Override public void initField() { viewStartDate = new ALDateTimeField("yyyy-MM-dd-HH-mm"); // スケジュールリスト scheduleList = new ArrayList<ScheduleResultData>(); } public boolean addResultData(ScheduleSearchResultData rd) { isSort = false; Calendar startDate = Calendar.getInstance(); startDate.setTime(viewStartDate.getValue()); Calendar endDate = Calendar.getInstance(); endDate.setTime(startDate.getTime()); endDate.add(Calendar.DATE, SCHEDULE_LIST_DATE_LIMIT); while (startDate.before(endDate)) { ALDateTimeField field = new ALDateTimeField("yyyy-MM-dd-HH-mm"); ScheduleSearchResultData addRd = new ScheduleSearchResultData(); field.setValue(startDate.getTime()); if (!rd.getPattern().equals("N")) { // 繰り返しスケジュール boolean isClone = false; boolean isSpan = false; if (rd.getPattern().equals("S") && !field.getValue().before(rd.getStartDate().getValue()) && !field.getValue().after(rd.getEndDate().getValue())) { isClone = true; isSpan = true; } if (!rd.getPattern().equals("S") && ScheduleUtils.isView(field, rd.getPattern(), rd .getStartDate() .getValue(), rd.getEndDate().getValue())) { isClone = true; } if (isClone) { Calendar temp = Calendar.getInstance(); temp.setTime(field.getValue()); temp .set(Calendar.HOUR, Integer.parseInt(rd.getStartDate().getHour())); temp.set(Calendar.MINUTE, Integer.parseInt(rd .getStartDate() .getMinute())); temp.set(Calendar.SECOND, 0); temp.set(Calendar.MILLISECOND, 0); Calendar temp2 = Calendar.getInstance(); temp2.setTime(field.getValue()); temp2.set(Calendar.HOUR, Integer.parseInt(rd.getEndDate().getHour())); temp2.set(Calendar.MINUTE, Integer.parseInt(rd .getEndDate() .getMinute())); temp2.set(Calendar.SECOND, 0); temp2.set(Calendar.MILLISECOND, 0); addRd.initField(); addRd.setScheduleId((int) rd.getScheduleId().getValue()); addRd.setParentId((int) rd.getParentId().getValue()); addRd.setName(rd.getName().getValue()); // 開始日を設定し直す addRd.setStartDate(temp.getTime()); // 終了日を設定し直す addRd.setEndDate(temp2.getTime()); addRd.setTmpreserve(rd.isTmpreserve()); addRd.setPublic(rd.isPublic()); addRd.setHidden(rd.isHidden()); addRd.setDummy(rd.isDummy()); addRd.setLoginuser(rd.isLoginuser()); addRd.setOwner(rd.isOwner()); addRd.setMember(rd.isMember()); addRd.setType(rd.getType()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); if (!sdf.format(rd.getStartDate().getValue()).equals( sdf.format(rd.getEndDate().getValue()))) { addRd.setTerm(true); } // 繰り返しはON addRd.setRepeat(!isSpan); addRd.setPattern(rd.getPattern()); addRd.setCreateUser(rd.getCreateUser()); addResultDataInternal(addRd); } } else { addResultDataInternal(rd); return true; } startDate.add(Calendar.DATE, 1); } return false; } protected void addResultDataInternal(ScheduleResultData rd) { int size = scheduleList.size(); boolean canAdd = true; boolean repeat_del = false; for (int i = 0; i < size; i++) { repeat_del = false; ScheduleResultData rd2 = scheduleList.get(i); if (rd.isRepeat() && rd2.isDummy() && rd.getScheduleId().getValue() == rd2.getParentId().getValue() && ScheduleUtils.equalsToDate(rd.getStartDate().getValue(), rd2 .getStartDate() .getValue(), false)) { // [繰り返しスケジュール] 親の ID を検索 canAdd = false; break; } if (rd2.isRepeat() && rd.isDummy() && rd2.getScheduleId().getValue() == rd.getParentId().getValue() && ScheduleUtils.equalsToDate(rd.getStartDate().getValue(), rd2 .getStartDate() .getValue(), false)) { // [繰り返しスケジュール] 親の ID を検索 scheduleList.remove(rd2); canAdd = true; repeat_del = true; } if (!repeat_del) { // 繰り返しスケジュールの変更/削除が無い場合 if (!rd.isDummy() && !rd2.isDummy() && !rd.getPattern().equals("S") && !rd2.getPattern().equals("S")) { // 終日スケジュール・期間スケジュールではなく、 // ダミースケジュールでもないときに // 重複スケジュールを検出する。 // 時間が重なっている場合重複スケジュールとする。 if ((rd.getStartDate().getValue().before( rd2.getStartDate().getValue()) && rd2 .getStartDate() .getValue() .before(rd.getEndDate().getValue())) || (rd2.getStartDate().getValue().before( rd.getStartDate().getValue()) && rd .getStartDate() .getValue() .before(rd2.getEndDate().getValue())) || (rd .getStartDate() .getValue() .before(rd2.getEndDate().getValue()) && rd2 .getEndDate() .getValue() .before(rd.getEndDate().getValue())) || (rd2 .getStartDate() .getValue() .before(rd.getEndDate().getValue()) && rd .getEndDate() .getValue() .before(rd2.getEndDate().getValue())) || (rd.getEndDate().getValue().equals(rd2.getEndDate().getValue()) && rd .getStartDate() .getValue() .equals(rd2.getStartDate().getValue()))) { rd2.setDuplicate(true); rd.setDuplicate(true); } } } } if (canAdd) { scheduleList.add(rd); } } public List<ScheduleResultData> getScheduleList() { if (!isSort) { // ソート Collections.sort(scheduleList, new Comparator<ScheduleResultData>() { @Override public int compare(ScheduleResultData a, ScheduleResultData b) { Calendar cal = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal.setTime(a.getStartDate().getValue()); cal2.setTime(b.getStartDate().getValue()); if ((cal.getTime()).compareTo(cal2.getTime()) != 0) { return (cal.getTime()).compareTo(cal2.getTime()); } else { if (!a.getPattern().equals("S") && !b.getPattern().equals("S")) { cal.setTime(a.getEndDate().getValue()); cal2.setTime(b.getEndDate().getValue()); return (cal.getTime()).compareTo(cal2.getTime()); } else if (a.getPattern().equals("S") && b.getPattern().equals("S")) { if (a.isTerm()) { return -1; } else if (b.isTerm()) { return 1; } else { return 0; } } else { if (a.getPattern().equals("S")) { return -1; } else { return 1; } } } } }); isSort = true; } List<ScheduleResultData> results = new ArrayList<ScheduleResultData>(); for (ScheduleResultData rd : scheduleList) { if (!rd.isDummy()) { results.add(rd); } } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String date = ""; for (ScheduleResultData rd : scheduleList) { if (!rd.isDummy() && !date.equals(sdf.format(rd.getStartDate().getValue()))) { date = sdf.format(rd.getStartDate().getValue()); rd.setDayStart(true); } else { rd.setDayStart(false); } } return results; } }