/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.application.meeting.business;
import org.mifos.application.master.MessageLookup;
import org.mifos.application.meeting.exceptions.MeetingException;
import org.mifos.application.meeting.util.helpers.MeetingConstants;
import org.mifos.application.meeting.util.helpers.RankOfDay;
import org.mifos.application.meeting.util.helpers.WeekDay;
import org.mifos.dto.domain.MeetingRecurrenceDto;
import org.mifos.framework.business.AbstractEntity;
/**
* This class encapsulate the MeetingRecurrence details
*/
public class MeetingRecurrenceEntity extends AbstractEntity {
private final Integer detailsId;
private WeekDay weekDay;
private RankOfDay rankOfDay;
private Short dayNumber;
private final MeetingDetailsEntity meetingDetails;
private int versionNo;
/**
* default constructor for hibernate
*/
protected MeetingRecurrenceEntity() {
detailsId = null;
meetingDetails = null;
}
/**
* minimal legal constructor
*/
public MeetingRecurrenceEntity(final WeekDay weekDay, final MeetingDetailsEntity meetingDetails) {
validateWeekDay(weekDay);
this.weekDay = weekDay;
this.meetingDetails = meetingDetails;
this.detailsId = null;
}
public MeetingRecurrenceEntity(final MeetingDetailsEntity meetingDetails) {
this.meetingDetails = meetingDetails;
this.weekDay = null;
this.rankOfDay = null;
this.dayNumber = null;
this.detailsId = null;
}
public MeetingRecurrenceEntity(final Short dayNumber, final WeekDay weekDay, final RankOfDay rank, final MeetingDetailsEntity meetingDetails)
throws MeetingException {
validateFields(dayNumber, weekDay, rank);
if (dayNumber != null) {
this.dayNumber = dayNumber;
} else {
this.weekDay = weekDay;
this.rankOfDay = rank;
}
this.meetingDetails = meetingDetails;
this.detailsId = null;
}
public Short getDayNumber() {
return dayNumber;
}
public void setDayNumber(final Short dayNumber) {
this.dayNumber = dayNumber;
}
public Integer getDetailsId() {
return detailsId;
}
public MeetingDetailsEntity getMeetingDetails() {
return meetingDetails;
}
public RankOfDay getRankOfDays() {
return rankOfDay;
}
public void setRankOfDays(final RankOfDay rankOfDay) {
this.rankOfDay = rankOfDay;
}
/**
* This method is deprecated and intended to be replaced with
* {@link #getWeekDayValue()}. If you need to look up a message, see
* {@link MessageLookup}; if you need to look up something else, we plan to
* make similar methods available.
*/
public WeekDay getWeekDay() {
return weekDay;
}
public void setWeekDay(final WeekDay weekDay) {
this.weekDay = weekDay;
}
public boolean isOnDate() {
return getDayNumber() != null;
}
public WeekDay getWeekDayValue() {
return weekDay;
}
public RankOfDay getWeekRank() {
return rankOfDay;
}
public void updateDayNumber(final Short dayNumber) throws MeetingException {
validateDayNumber(dayNumber);
this.dayNumber = dayNumber;
}
public void updateWeekDay(final WeekDay weekDay) {
validateWeekDay(weekDay);
this.weekDay = weekDay;
}
public void update(final WeekDay weekDay, final RankOfDay rank) throws MeetingException {
if (weekDay == null || rank == null) {
throw new MeetingException(MeetingConstants.INVALID_WEEKDAY_OR_WEEKRANK);
}
this.weekDay = weekDay;
this.rankOfDay = rank;
}
private void validateWeekDay(final WeekDay weekDay) {
if (weekDay == null) {
throw new IllegalStateException(MeetingConstants.INVALID_WEEKDAY);
}
}
private void validateFields(final Short dayNumber, final WeekDay weekDay, final RankOfDay rank) throws MeetingException {
validateDayNumber(dayNumber);
if (dayNumber == null && weekDay == null && rank == null) {
throw new MeetingException(MeetingConstants.INVALID_DAYNUMBER_OR_WEEK);
}
if (dayNumber == null && (weekDay == null || rank == null)) {
throw new MeetingException(MeetingConstants.INVALID_WEEKDAY_OR_WEEKRANK);
}
}
private void validateDayNumber(final Short dayNumber) throws MeetingException {
if (dayNumber != null && (dayNumber < 1 || dayNumber > 31)) {
throw new MeetingException(MeetingConstants.INVALID_DAYNUMBER);
}
}
public void setVersionNo(int versionNo) {
this.versionNo = versionNo;
}
public int getVersionNo() {
return versionNo;
}
public MeetingRecurrenceDto toDto() {
Integer dayNum = Integer.valueOf(1);
if (this.dayNumber != null) {
dayNum = this.dayNumber.intValue();
}
Integer weekOfMonth = Integer.valueOf(0);
if (this.rankOfDay != null) {
weekOfMonth = this.rankOfDay.getValue().intValue();
}
Integer dayOfWeek = Integer.valueOf(0);
if (weekDay != null) {
dayOfWeek = this.weekDay.getValue().intValue();
}
return new MeetingRecurrenceDto(dayNum, weekOfMonth, dayOfWeek);
}
}