You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by vo...@apache.org on 2020/05/21 22:07:45 UTC

[fineract] branch develop updated: Fineract-955 - Upgrade ical4j from ancient version 1.0.7 to current 3.0.18

This is an automated email from the ASF dual-hosted git repository.

vorburger pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 96452f3  Fineract-955 - Upgrade ical4j from ancient version 1.0.7 to current 3.0.18
96452f3 is described below

commit 96452f3ff4eec4f4f5188ff31ce7e2c9777ec464
Author: nnatarajan <na...@gmail.com>
AuthorDate: Sun May 17 19:22:29 2020 -0600

    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 +-
 ...gDaysWritePlatformServiceJpaRepositoryImpl.java |   2 +-
 .../portfolio/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 4361564..c733f92 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 7135a01..9fd67d8 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 4521e30..a50fac2 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 f37d2c3..caf13a6 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;
+    }
 }