From 96452f3ff4eec4f4f5188ff31ce7e2c9777ec464 Mon Sep 17 00:00:00 2001 From: nnatarajan Date: Sun, 17 May 2020 19:22:29 -0600 Subject: [PATCH] Fineract-955 - Upgrade ical4j from ancient version 1.0.7 to current 3.0.18 --- fineract-provider/build.gradle | 2 +- .../core/data/DataValidatorBuilder.java | 2 +- ...WritePlatformServiceJpaRepositoryImpl.java | 2 +- .../calendar/service/CalendarUtils.java | 122 ++++++++++++------ 4 files changed, 82 insertions(+), 46 deletions(-) diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle index 4361564c4..c733f9223 100644 --- a/fineract-provider/build.gradle +++ b/fineract-provider/build.gradle @@ -89,7 +89,7 @@ dependencyManagement { dependency 'org.drizzle.jdbc:drizzle-jdbc:1.4' dependency 'com.lowagie:itext:2.1.7' dependency 'com.lowagie:itext-rtf:2.1.7' - dependency 'org.mnode.ical4j:ical4j:1.0.7' + dependency 'org.mnode.ical4j:ical4j:3.0.18' dependency 'org.flywaydb:flyway-core:6.4.1' dependency 'org.quartz-scheduler:quartz:+' dependency 'com.amazonaws:aws-java-sdk-s3:1.11.779' diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java index 7135a01ae..9fd67d842 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/data/DataValidatorBuilder.java @@ -25,8 +25,8 @@ import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import net.fortuna.ical4j.model.ValidationException; import net.fortuna.ical4j.model.property.RRule; +import net.fortuna.ical4j.validate.ValidationException; import org.apache.commons.lang3.StringUtils; import org.joda.time.LocalDate; import org.quartz.CronExpression; diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysWritePlatformServiceJpaRepositoryImpl.java index 4521e3092..a50fac2fe 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/service/WorkingDaysWritePlatformServiceJpaRepositoryImpl.java @@ -20,8 +20,8 @@ package org.apache.fineract.organisation.workingdays.service; import java.text.ParseException; import java.util.Map; -import net.fortuna.ical4j.model.ValidationException; import net.fortuna.ical4j.model.property.RRule; +import net.fortuna.ical4j.validate.ValidationException; import org.apache.fineract.infrastructure.core.api.JsonCommand; import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java index f37d2c310..caf13a6f7 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/calendar/service/CalendarUtils.java @@ -32,11 +32,11 @@ import net.fortuna.ical4j.model.DateList; import net.fortuna.ical4j.model.DateTime; import net.fortuna.ical4j.model.NumberList; import net.fortuna.ical4j.model.Recur; -import net.fortuna.ical4j.model.ValidationException; import net.fortuna.ical4j.model.WeekDay; import net.fortuna.ical4j.model.WeekDayList; import net.fortuna.ical4j.model.parameter.Value; import net.fortuna.ical4j.model.property.RRule; +import net.fortuna.ical4j.validate.ValidationException; import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; @@ -242,13 +242,13 @@ public class CalendarUtils { if (recur == null) { return humanReadable; } - if (recur.getFrequency().equals(Recur.DAILY)) { + if (recur.getFrequency().equals(Recur.Frequency.DAILY)) { if (recur.getInterval() == 1) { humanReadable = "Daily"; } else { humanReadable = "Every " + recur.getInterval() + " days"; } - } else if (recur.getFrequency().equals(Recur.WEEKLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.WEEKLY)) { if (recur.getInterval() == 1 || recur.getInterval() == -1) { humanReadable = "Weekly"; } else { @@ -261,26 +261,26 @@ public class CalendarUtils { for (@SuppressWarnings("rawtypes") final Iterator iterator = weekDayList.iterator(); iterator.hasNext();) { final WeekDay weekDay = (WeekDay) iterator.next(); - humanReadable += DayNameEnum.from(weekDay.getDay()).getCode(); + humanReadable += DayNameEnum.from(weekDay.getDay().name()).getCode(); } - } else if (recur.getFrequency().equals(Recur.MONTHLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.MONTHLY)) { NumberList nthDays = recur.getSetPosList(); Integer nthDay = null; if (!nthDays.isEmpty()) - nthDay = (Integer) nthDays.get(0); + nthDay = nthDays.get(0); NumberList monthDays = recur.getMonthDayList(); Integer monthDay = null; if (!monthDays.isEmpty()) - monthDay = (Integer) monthDays.get(0); + monthDay = monthDays.get(0); WeekDayList weekdays = recur.getDayList(); WeekDay weekDay = null; if (!weekdays.isEmpty()) - weekDay = (WeekDay) weekdays.get(0); + weekDay = weekdays.get(0); if (nthDay != null && weekDay != null) { NthDayType nthDayType = NthDayType.fromInt(nthDay); NthDayNameEnum nthDayName = NthDayNameEnum.from(nthDayType.toString()); - DayNameEnum weekdayType = DayNameEnum.from(weekDay.getDay()); + DayNameEnum weekdayType = DayNameEnum.from(weekDay.getDay().name()); if (recur.getInterval() == 1 || recur.getInterval() == -1) { humanReadable = "Monthly on " + nthDayName.getCode().toLowerCase() + " " + weekdayType.getCode().toLowerCase(); } else { @@ -308,7 +308,7 @@ public class CalendarUtils { humanReadable = "Every " + recur.getInterval() + " months on day " + startDate.getDayOfMonth(); } } - } else if (recur.getFrequency().equals(Recur.YEARLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.YEARLY)) { if (recur.getInterval() == 1) { humanReadable = "Annually on " + startDate.toString("MMM") + " " + startDate.getDayOfMonth(); } else { @@ -420,13 +420,13 @@ public class CalendarUtils { private static PeriodFrequencyType getMeetingPeriodFrequencyType(final Recur recur) { PeriodFrequencyType meetingFrequencyType = PeriodFrequencyType.INVALID; - if (recur.getFrequency().equals(Recur.DAILY)) { + if (recur.getFrequency().equals(Recur.Frequency.DAILY)) { meetingFrequencyType = PeriodFrequencyType.DAYS; - } else if (recur.getFrequency().equals(Recur.WEEKLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.WEEKLY)) { meetingFrequencyType = PeriodFrequencyType.WEEKS; - } else if (recur.getFrequency().equals(Recur.MONTHLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.MONTHLY)) { meetingFrequencyType = PeriodFrequencyType.MONTHS; - } else if (recur.getFrequency().equals(Recur.YEARLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.YEARLY)) { meetingFrequencyType = PeriodFrequencyType.YEARS; } return meetingFrequencyType; @@ -435,13 +435,13 @@ public class CalendarUtils { public static String getMeetingFrequencyFromPeriodFrequencyType(final PeriodFrequencyType periodFrequency) { String frequency = null; if (periodFrequency.equals(PeriodFrequencyType.DAYS)) { - frequency = Recur.DAILY; + frequency = Recur.Frequency.DAILY.name(); } else if (periodFrequency.equals(PeriodFrequencyType.WEEKS)) { - frequency = Recur.WEEKLY; + frequency = Recur.Frequency.WEEKLY.name(); } else if (periodFrequency.equals(PeriodFrequencyType.MONTHS)) { - frequency = Recur.MONTHLY; + frequency = Recur.Frequency.MONTHLY.name(); } else if (periodFrequency.equals(PeriodFrequencyType.YEARS)) { - frequency = Recur.YEARLY; + frequency = Recur.Frequency.YEARLY.name(); } return frequency; } @@ -453,7 +453,7 @@ public class CalendarUtils { public static CalendarFrequencyType getFrequency(final String recurringRule) { final Recur recur = CalendarUtils.getICalRecur(recurringRule); - return CalendarFrequencyType.fromString(recur.getFrequency()); + return CalendarFrequencyType.fromString(recur.getFrequency().name()); } public static CalendarWeekDaysType getRepeatsOnDay(final String recurringRule) { @@ -461,8 +461,8 @@ public class CalendarUtils { final WeekDayList weekDays = recur.getDayList(); if (weekDays.isEmpty()) return CalendarWeekDaysType.INVALID; // supports only one day - WeekDay weekDay = (WeekDay) weekDays.get(0); - return CalendarWeekDaysType.fromString(weekDay.getDay()); + WeekDay weekDay = weekDays.get(0); + return CalendarWeekDaysType.fromString(weekDay.getDay().name()); } public static NthDayType getRepeatsOnNthDayOfMonth(final String recurringRule) { final Recur recur = CalendarUtils.getICalRecur(recurringRule); @@ -473,7 +473,7 @@ public class CalendarUtils { monthDays = recur.getSetPosList(); if (monthDays.isEmpty()) return NthDayType.INVALID; if (!recur.getMonthDayList().isEmpty() && recur.getSetPosList().isEmpty()) return NthDayType.ONDAY; - Integer monthDay = (Integer) monthDays.get(0); + Integer monthDay = monthDays.get(0); return NthDayType.fromInt(monthDay); } @@ -484,7 +484,7 @@ public class CalendarUtils { if (recur == null) { return null; } LocalDate startDate = disbursementDate; final LocalDate seedDate = calendar.getStartDateLocalDate(); - if (isValidRedurringDate(calendar.getRecurrence(), seedDate, startDate, isSkipRepaymentOnFirstDayOfMonth, numberOfDays) && !frequency.equals(Recur.DAILY)) { + if (isValidRedurringDate(calendar.getRecurrence(), seedDate, startDate, isSkipRepaymentOnFirstDayOfMonth, numberOfDays) && !frequency.equals(Recur.Frequency.DAILY.name())) { startDate = startDate.plusDays(1); } // Recurring dates should follow loanRepaymentInterval. @@ -493,7 +493,9 @@ public class CalendarUtils { // where as for loan product with fortnightly frequency interval is 2 // to generate currect set of meeting dates reset interval same as loan // repayment interval. - recur.setInterval(loanRepaymentInterval); + + Recur.Builder recurBuilder = getRecurBuilder(recur); + recurBuilder = recurBuilder.interval(loanRepaymentInterval); // Recurring dates should follow loanRepayment frequency. // e.g. @@ -501,11 +503,13 @@ public class CalendarUtils { // frequency type. // to generate currect set of meeting dates reset frequency same as loan // repayment frequency. - if (recur.getFrequency().equals(Recur.DAILY)) { - recur.setFrequency(frequency); + + if (recur.getFrequency().equals(Recur.Frequency.DAILY)) { + recurBuilder = recurBuilder.frequency(Recur.Frequency.valueOf(frequency)); } - final LocalDate firstRepaymentDate = getNextRecurringDate(recur, seedDate, startDate); + Recur modifiedRecur = recurBuilder.build(); + final LocalDate firstRepaymentDate = getNextRecurringDate(modifiedRecur, seedDate, startDate); if (isSkipRepaymentOnFirstDayOfMonth && firstRepaymentDate.getDayOfMonth() == 1) { return adjustRecurringDate(firstRepaymentDate, numberOfDays); } @@ -518,10 +522,10 @@ public class CalendarUtils { final Recur recur = CalendarUtils.getICalRecur(recurringRule); if (recur == null) { return null; } if (isValidRecurringDate(recur, seedDate, oldRepaymentDate, isSkipRepaymentOnFirstDayOfMonth, numberOfDays)) { return oldRepaymentDate; } - LocalDate nextRapaymentDate = getNextRepaymentMeetingDate(recurringRule, seedDate, oldRepaymentDate, loanRepaymentInterval, + LocalDate nextRepaymentDate = getNextRepaymentMeetingDate(recurringRule, seedDate, oldRepaymentDate, loanRepaymentInterval, frequency, workingDays, isSkipRepaymentOnFirstDayOfMonth, numberOfDays); - return nextRapaymentDate; + return nextRepaymentDate; } public static LocalDate getNextRepaymentMeetingDate(final String recurringRule, final LocalDate seedDate, @@ -541,7 +545,11 @@ public class CalendarUtils { * with fortnightly frequency will have interval of 2, to generate right * set of meeting dates reset interval same as loan repayment interval. */ - recur.setInterval(loanRepaymentInterval); + + Recur.Builder recurBuilder = getRecurBuilder(recur); + + recurBuilder = recurBuilder.interval(loanRepaymentInterval); + /* * Recurring dates should follow loanRepayment frequency. //e.g. daily @@ -549,12 +557,16 @@ public class CalendarUtils { * frequency. to generate right set of meeting dates reset frequency * same as loan repayment frequency. */ - if (recur.getFrequency().equals(Recur.DAILY)) { - recur.setFrequency(frequency); + + + if (recur.getFrequency().equals(Recur.Frequency.DAILY)) { + recurBuilder = recurBuilder.frequency(Recur.Frequency.valueOf(frequency)); } - LocalDate newRepaymentDate = getNextRecurringDate(recur, seedDate, tmpDate); - final LocalDate nextRepaymentDate = getNextRecurringDate(recur, seedDate, newRepaymentDate); + Recur modifiedRecur = recurBuilder.build(); + + LocalDate newRepaymentDate = getNextRecurringDate(modifiedRecur, seedDate, tmpDate); + final LocalDate nextRepaymentDate = getNextRecurringDate(modifiedRecur, seedDate, newRepaymentDate); newRepaymentDate = WorkingDaysUtil.getOffSetDateIfNonWorkingDay(newRepaymentDate, nextRepaymentDate, workingDays); if (isSkipRepaymentOnFirstDayOfMonth) { @@ -639,13 +651,13 @@ public class CalendarUtils { if (isValidRecurringDate(recur, seedDate, currentDate, isSkipMeetingOnFirstDay, numberOfDays)) { return currentDate; } - if (recur.getFrequency().equals(Recur.DAILY)) { + if (recur.getFrequency().equals(Recur.Frequency.DAILY)) { currentDate = currentDate.plusDays(recur.getInterval()); - } else if (recur.getFrequency().equals(Recur.WEEKLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.WEEKLY)) { currentDate = currentDate.plusWeeks(recur.getInterval()); - } else if (recur.getFrequency().equals(Recur.MONTHLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.MONTHLY)) { currentDate = currentDate.plusMonths(recur.getInterval()); - } else if (recur.getFrequency().equals(Recur.YEARLY)) { + } else if (recur.getFrequency().equals(Recur.Frequency.YEARLY)) { currentDate = currentDate.plusYears(recur.getInterval()); } @@ -694,7 +706,7 @@ public class CalendarUtils { if (getMeetingPeriodFrequencyType(recur).isMonthly()) { monthDayList = recur.getMonthDayList(); if (!monthDayList.isEmpty()) { - monthOnDay = (Integer) monthDayList.get(0); + monthOnDay = monthDayList.get(0); } } return monthOnDay; @@ -746,17 +758,22 @@ public class CalendarUtils { * frequency. to generate right set of meeting dates reset frequency * same as loan repayment frequency. */ - if (recur.getFrequency().equals(Recur.DAILY)) { - recur.setFrequency(frequency); + + Recur.Builder recurBuilder = getRecurBuilder(recur); + + if (recur.getFrequency().equals(Recur.Frequency.DAILY)) { + recurBuilder = recurBuilder.frequency(Recur.Frequency.valueOf(frequency)); } + Recur modifiedRecur = recurBuilder.build(); + /** * Below code modified as discussed with Pramod N */ LocalDate newRepaymentDate = tmpDate; int newRepayment = rep; while (newRepayment > 0) { - newRepaymentDate = getNextRecurringDate(recur, seedDate, newRepaymentDate); + newRepaymentDate = getNextRecurringDate(modifiedRecur, seedDate, newRepaymentDate); newRepayment--; } @@ -802,9 +819,28 @@ public class CalendarUtils { * monthly and meeting frequency is weekly, then generate repayments * schedule as every 4 weeks */ - if (frequency.equals(Recur.MONTHLY) && recur.getFrequency().equals(Recur.WEEKLY)) { + if (frequency.equals(Recur.Frequency.MONTHLY.name()) && recur.getFrequency().equals(Recur.Frequency.WEEKLY)) { repaymentInterval = loanRepaymentInterval*interval; } return repaymentInterval; } + + private static Recur.Builder getRecurBuilder(Recur recur) { + Recur.Builder recurBuilder = new Recur.Builder(); + recurBuilder = recurBuilder.frequency(recur.getFrequency()) + .until(recur.getUntil()) + .count(recur.getCount()) + .interval(recur.getInterval()) + .secondList(recur.getSecondList()) + .minuteList(recur.getMinuteList()) + .hourList(recur.getHourList()) + .dayList(recur.getDayList()) + .monthDayList(recur.getMonthDayList()) + .yearDayList(recur.getYearDayList()) + .weekNoList(recur.getWeekNoList()) + .monthList(recur.getMonthList()) + .setPosList(recur.getSetPosList()) + .weekStartDay(recur.getWeekStartDay()); + return recurBuilder; + } }