Changeset 1277

Show
Ignore:
Timestamp:
02/04/07 22:10:52
Author:
douglm
Message:

Changes to fix timezone problems and also allow limiting recurrences.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • releases/external/ical4j-1.0-beta1-bedework-3.3/net/fortuna/ical4j/model/Recur.java

    r1275 r1277  
    134134    private Map experimentalValues = new HashMap(); 
    135135 
     136    // Calendar field we increment based on frequency. 
     137    private int calIncField; 
     138 
    136139    /** 
    137140     * Constructs a new instance from the specified string value. 
     
    464467    public final DateList getDates(final Date periodStart, 
    465468            final Date periodEnd, final Value value) { 
    466         return getDates(periodStart, periodStart, periodEnd, value); 
     469        return getDates(periodStart, periodStart, periodEnd, value, -1); 
    467470    } 
    468471 
     
    475478    public final DateList getDates(final Date seed, final Period period, 
    476479            final Value value) { 
    477         return getDates(seed, period.getStart(), period.getEnd(), value); 
     480        return getDates(seed, period.getStart(), period.getEnd(), value, -1); 
    478481    } 
    479482 
     
    492495    public final DateList getDates(final Date seed, final Date periodStart, 
    493496            final Date periodEnd, final Value value) { 
     497         return getDates(seed, periodStart, periodEnd, value, -1); 
     498    } 
     499 
     500    /** 
     501     * Returns a list of start dates in the specified period represented by this recur. This method includes a base date 
     502     * argument, which indicates the start of the fist occurrence of this recurrence. The base date is used to inject 
     503     * default values to return a set of dates in the correct format. For example, if the search start date (start) is 
     504     * Wed, Mar 23, 12:19PM, but the recurrence is Mon - Fri, 9:00AM - 5:00PM, the start dates returned should all be at 
     505     * 9:00AM, and not 12:19PM. 
     506     * @return a list of dates represented by this recur instance 
     507     * @param seed the start date of this Recurrence's first instance 
     508     * @param periodStart the start of the period 
     509     * @param periodEnd the end of the period 
     510     * @param value the type of dates to generate (i.e. date/date-time) 
     511     * @param maxCount limits the number of instances returned. Up to one years 
     512     *       worth extra may be returned. Less than 0 means no limit 
     513     */ 
     514    public final DateList getDates(final Date seed, final Date periodStart, 
     515                                   final Date periodEnd, final Value value, 
     516                                   final int maxCount) { 
    494517 
    495518        DateList dates = new DateList(value); 
     
    517540        int invalidCandidateCount = 0; 
    518541        Date candidate = null; 
    519         while (true) { 
     542        while ((maxCount < 0) || (dates.size() < maxCount)) { 
    520543            Date candidateSeed = Dates.getInstance(cal.getTime(), value); 
    521544 
     
    581604        // initialise interval.. 
    582605        int calInterval = (getInterval() >= 1) ? getInterval() : 1; 
    583         if (SECONDLY.equals(getFrequency())) { 
    584             cal.add(Calendar.SECOND, calInterval); 
    585         } 
    586         else if (MINUTELY.equals(getFrequency())) { 
    587             cal.add(Calendar.MINUTE, calInterval); 
    588         } 
    589         else if (HOURLY.equals(getFrequency())) { 
    590             cal.add(Calendar.HOUR_OF_DAY, calInterval); 
    591         } 
    592         else if (DAILY.equals(getFrequency())) { 
    593             cal.add(Calendar.DAY_OF_YEAR, calInterval); 
    594         } 
    595         else if (WEEKLY.equals(getFrequency())) { 
    596             cal.add(Calendar.WEEK_OF_YEAR, calInterval); 
    597         } 
    598         else if (MONTHLY.equals(getFrequency())) { 
    599             cal.add(Calendar.MONTH, calInterval); 
    600         } 
    601         else if (YEARLY.equals(getFrequency())) { 
    602             cal.add(Calendar.YEAR, calInterval); 
    603         } 
     606        cal.add(calIncField, calInterval); 
    604607    } 
    605608 
     
    10171020                    "A recurrence rule MUST contain a FREQ rule part."); 
    10181021        } 
    1019         else if (!frequency.equals(SECONDLY) && !frequency.equals(MINUTELY) 
    1020                 && !frequency.equals(HOURLY) && !frequency.equals(DAILY) 
    1021                 && !frequency.equals(WEEKLY) && !frequency.equals(MONTHLY) 
    1022                 && !frequency.equals(YEARLY)) { 
     1022        if (SECONDLY.equals(getFrequency())) { 
     1023            calIncField = Calendar.SECOND; 
     1024        } 
     1025        else if (MINUTELY.equals(getFrequency())) { 
     1026            calIncField = Calendar.MINUTE; 
     1027        } 
     1028        else if (HOURLY.equals(getFrequency())) { 
     1029            calIncField = Calendar.HOUR_OF_DAY; 
     1030        } 
     1031        else if (DAILY.equals(getFrequency())) { 
     1032            calIncField = Calendar.DAY_OF_YEAR; 
     1033        } 
     1034        else if (WEEKLY.equals(getFrequency())) { 
     1035            calIncField = Calendar.WEEK_OF_YEAR; 
     1036        } 
     1037        else if (MONTHLY.equals(getFrequency())) { 
     1038            calIncField = Calendar.MONTH; 
     1039        } 
     1040        else if (YEARLY.equals(getFrequency())) { 
     1041            calIncField = Calendar.YEAR; 
     1042        } 
     1043        else { 
    10231044            throw new IllegalArgumentException("Invalid FREQ rule part '" 
    10241045                    + frequency + "' in recurrence rule"); 
  • releases/external/ical4j-1.0-beta1-bedework-3.3/net/fortuna/ical4j/model/component/Observance.java

    r1275 r1277  
    7979    private Map onsets = new TreeMap(); 
    8080 
     81    /* If this is set we have rrules. If we get a date after this rebuild onsets */ 
     82    private Date onsetLimit; 
     83 
    8184    private boolean rdatesCached = false; 
    8285 
     
    146149 
    147150        long start = System.currentTimeMillis(); 
     151 
     152        if ((onsetLimit != null) && (date.after(onsetLimit))) { 
     153            onsets.clear(); 
     154            rdatesCached = false; 
     155        } 
    148156 
    149157        Date onset = getCachedOnset(date); 
     
    195203                Calendar cal = Dates.getCalendarInstance(date); 
    196204                cal.setTime(date); 
    197                 cal.add(Calendar.YEAR, 1); 
    198                 Date endRecur = Dates.getInstance(cal.getTime(), dateType); 
     205                cal.add(Calendar.YEAR, 10); 
     206                onsetLimit = Dates.getInstance(cal.getTime(), dateType); 
    199207                DateList recurrenceDates = rrule.getRecur().getDates(onset, 
    200                         endRecur, dateType); 
     208                        onsetLimit, dateType); 
    201209                for (Iterator j = recurrenceDates.iterator(); j.hasNext();) { 
    202210                    Date rruleOnset = (Date) j.next();