| 
      
      
      From: <be...@us...> - 2007-01-05 20:45:34
      
     | 
| Revision: 238
          http://svn.sourceforge.net/objectlabkit/?rev=238&view=rev
Author:   benoitx
Date:     2007-01-05 12:45:33 -0800 (Fri, 05 Jan 2007)
Log Message:
-----------
- Added method calculateTenorDates with/without a spot lag to enable calculation of a series of Tenor dates without changing the current business date in the calculator.
- Added method moveByTenor without a spot lag to allow tenor calculation based on the CURRENT date and not the spot lag.
Modified Paths:
--------------
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculator.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculator.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/StandardTenor.java
    trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractDateTestCase.java
    trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractForwardDateCalculatorTest.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarDateCalculator.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DateDateCalculator.java
    trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/LocalDateCalculator.java
    trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/YearMonthDayDateCalculator.java
    trunk/src/site/changes.xml
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculator.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculator.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculator.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -32,8 +32,10 @@
  */
 package net.objectlab.kit.datecalc.common;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -158,7 +160,7 @@
         }
 
         TenorCode tenorCode = tenor.getCode();
-        if (tenorCode != TenorCode.OVERNIGHT) {
+        if (tenorCode != TenorCode.OVERNIGHT && spotLag != 0) {
             // get to the Spot date first:
             moveByBusinessDays(spotLag);
         }
@@ -196,6 +198,52 @@
         return calc;
     }
 
+    /**
+     * Move the current date by a given tenor, please note that all tenors are
+     * relative to the CURRENT day (and NOT from spot).
+     * 
+     * @param tenor
+     *            the Tenor to reach.
+     * @return the current DateCalculator
+     * @since 1.1.0
+     */
+    public DateCalculator<E> moveByTenor(final Tenor tenor) {
+        return moveByTenor(tenor, 0);
+    }
+
+    /**
+     * Calculate a series of Tenor codes in one go based on current day, 
+     * this does NOT change the current business date.
+     * 
+     * @return list of dates in same order as tenors.
+     * @since 1.1.0
+     */
+    public List<E> calculateTenorDates(final List<Tenor> tenors) {
+        return calculateTenorDates(tenors, 0);
+    }
+
+    /**
+     * Calculate a series of Tenor codes in one go based on SPOT day (calculated
+     * with the spot lag), this does NOT change the current business date.
+     * 
+     * @return list of dates in same order as tenors.
+     * @since 1.1.0
+     */
+    public List<E> calculateTenorDates(final List<Tenor> tenors, final int spotLag) {
+        List<E> list = new ArrayList<E>();
+
+        if (tenors != null) {
+            final E date = clone(getCurrentBusinessDate());
+            for (Tenor tenor : tenors) {
+                moveByTenor(tenor, spotLag);
+                list.add(getCurrentBusinessDate());
+                setCurrentBusinessDate(date);
+            }
+        }
+
+        return list;
+    }
+
     // -----------------------------------------------------------------------
     //
     //    ObjectLab, world leaders in the design and development of bespoke 
@@ -357,6 +405,8 @@
     public HolidayCalendar<E> getHolidayCalendar() {
         return holidayCalendar;
     }
+    
+    protected abstract E clone(final E date);
 }
 
 /*
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculator.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculator.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculator.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -32,6 +32,7 @@
  */
 package net.objectlab.kit.datecalc.common;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -247,12 +248,42 @@
      *            the Tenor to reach.
      * @param spotLag
      *            number of days to "spot" days, this can vary from one market
-     *            to the other. It is sometimes called "settlement interval".
+     *            to the other. It is sometimes called "settlement interval"
+     *            or "offset".
      * @return the current DateCalculator
      */
     DateCalculator<E> moveByTenor(final Tenor tenor, final int spotLag);
+
+    /**
+     * Move the current date by a given tenor, please note that all tenors are
+     * relative to the CURRENT day (and NOT from spot).
+     * 
+     * @param tenor
+     *            the Tenor to reach.
+     * @return the current DateCalculator
+     * @since 1.1.0
+     */
+    DateCalculator<E> moveByTenor(final Tenor tenor);
     
     /**
+     * Calculate a series of Tenor codes in one go based on current day, 
+     * this does NOT change the current business date.
+     * 
+     * @return list of dates in same order as tenors.
+     * @since 1.1.0
+     */
+    List<E> calculateTenorDates(final List<Tenor> tenors);
+    
+    /**
+     * Calculate a series of Tenor codes in one go based on SPOT day (calculated
+     * with the spot lag), this does NOT change the current business date.
+     * 
+     * @return list of dates in same order as tenors.
+     * @since 1.1.0
+     */
+    List<E> calculateTenorDates(final List<Tenor> tenors, final int spotLag);
+    
+    /**
      * return the current increment in the calculator, this is used by the 
      * handler.
      */
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/StandardTenor.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/StandardTenor.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/StandardTenor.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -32,6 +32,10 @@
  */
 package net.objectlab.kit.datecalc.common;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * A series of Standard Tenors used by the financial industry.
  * 
@@ -43,7 +47,9 @@
 public final class StandardTenor {
     private StandardTenor() {
     }
-
+    
+    private static final List<Tenor> ALL;
+    
     public static final Tenor SPOT = new Tenor(0, TenorCode.SPOT);
 
     public static final Tenor OVERNIGHT = new Tenor(0, TenorCode.OVERNIGHT);
@@ -93,6 +99,36 @@
     public static final Tenor T_30Y = new Tenor(30, TenorCode.YEAR);
 
     public static final Tenor T_50Y = new Tenor(50, TenorCode.YEAR);
+    
+    public static List<Tenor> getAll() {
+        return ALL;
+    }
+
+    static {
+        List<Tenor> list = new ArrayList<Tenor>();
+        list.add(OVERNIGHT);
+        list.add(SPOT);
+        list.add(T_1D);
+        list.add(T_2D);
+        list.add(T_1W);
+        list.add(T_1M);
+        list.add(T_2M);
+        list.add(T_3M);
+        list.add(T_6M);
+        list.add(T_6M);
+        list.add(T_9M);
+        list.add(T_1Y);
+        list.add(T_2Y);
+        list.add(T_3Y);
+        list.add(T_4Y);
+        list.add(T_5Y);
+        list.add(T_7Y);
+        list.add(T_10Y);
+        list.add(T_20Y);
+        list.add(T_30Y);
+        list.add(T_50Y);
+        ALL = Collections.unmodifiableList(list);
+    }
 }
 
 /*
Modified: trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractDateTestCase.java
===================================================================
--- trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractDateTestCase.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractDateTestCase.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -129,6 +129,23 @@
         checkDate("Move start:" + startDate + " tenor:" + tenor + " daysToSpot:" + spotLag, cal.moveByTenor(tenor, spotLag),
                 expectedDate);
     }
+
+    /**
+     * Based on UK Holidays for Aug 2006.
+     * 
+     * @param startDate
+     * @param tenor
+     * @param spotLag
+     * @param expectedDate
+     * @param holidayHandlerType
+     */
+    protected void checkMoveByTenor(final String startDate, final Tenor tenor, final String expectedDate,
+            final String holidayHandlerType) {
+        final DateCalculator<E> cal = newDateCalculator("bla", holidayHandlerType);
+        cal.setHolidayCalendar(createUKHolidayCalendar());
+        cal.setStartDate(newDate(startDate));
+        checkDate("Move start:" + startDate + " tenor:" + tenor, cal.moveByTenor(tenor), expectedDate);
+    }
 }
 
 /*
Modified: trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractForwardDateCalculatorTest.java
===================================================================
--- trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractForwardDateCalculatorTest.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractForwardDateCalculatorTest.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -32,7 +32,10 @@
  */
 package net.objectlab.kit.datecalc.common;
 
+import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
 
 import junit.framework.Assert;
 
@@ -231,7 +234,7 @@
 
     }
 
-    public void testMoveByTenorDays() {
+    public void testMoveByTenorDaysZeroDayToSpot() {
         checkMoveByTenor("2006-08-08", StandardTenor.T_1D, 0, "2006-08-09", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(2, TenorCode.DAY), 0, "2006-08-10", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(10, TenorCode.DAY), 0, "2006-08-18", HolidayHandlerType.FORWARD);
@@ -239,6 +242,14 @@
         checkMoveByTenor("2006-08-08", new Tenor(12, TenorCode.DAY), 0, "2006-08-21", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(13, TenorCode.DAY), 0, "2006-08-21", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-09-26", new Tenor(4, TenorCode.DAY), 0, "2006-10-02", HolidayHandlerType.FORWARD);
+
+        checkMoveByTenor("2006-08-08", StandardTenor.T_1D, 0, "2006-08-09", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(2, TenorCode.DAY), "2006-08-10", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(10, TenorCode.DAY), "2006-08-18", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(11, TenorCode.DAY), "2006-08-21", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(12, TenorCode.DAY), "2006-08-21", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(13, TenorCode.DAY), "2006-08-21", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-09-26", new Tenor(4, TenorCode.DAY), "2006-10-02", HolidayHandlerType.FORWARD);
     }
 
     public void testMoveByTenorDaysOneDayToSpot() {
@@ -259,10 +270,14 @@
         checkMoveByTenor("2006-08-07", new Tenor(13, TenorCode.DAY), 2, "2006-08-22", HolidayHandlerType.FORWARD);
     }
 
-    public void testMoveByTenorWeek() {
+    public void testMoveByTenorWeekZeroDayToSpot() {
         checkMoveByTenor("2006-08-08", StandardTenor.T_1W, 0, "2006-08-15", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(2, TenorCode.WEEK), 0, "2006-08-22", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(4, TenorCode.WEEK), 0, "2006-09-05", HolidayHandlerType.FORWARD);
+
+        checkMoveByTenor("2006-08-08", StandardTenor.T_1W, "2006-08-15", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(2, TenorCode.WEEK), "2006-08-22", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(4, TenorCode.WEEK), "2006-09-05", HolidayHandlerType.FORWARD);
     }
 
     public void testMoveByTenorWeekOneDayToSpot() {
@@ -277,7 +292,7 @@
         checkMoveByTenor("2006-08-08", new Tenor(4, TenorCode.WEEK), 2, "2006-09-07", HolidayHandlerType.FORWARD);
     }
 
-    public void testMoveByTenorMonth() {
+    public void testMoveByTenorMonthZeroDayToSpot() {
         checkMoveByTenor("2006-08-31", StandardTenor.T_1M, 0, "2006-10-02", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-31", StandardTenor.T_2M, 0, "2006-10-31", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-01-31", StandardTenor.T_1M, 0, "2006-02-28", HolidayHandlerType.FORWARD);
@@ -287,6 +302,16 @@
         checkMoveByTenor("2006-08-09", StandardTenor.T_1M, 0, "2006-09-11", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(2, TenorCode.MONTH), 0, "2006-10-09", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-08", new Tenor(5, TenorCode.MONTH), 0, "2007-01-08", HolidayHandlerType.FORWARD);
+
+        checkMoveByTenor("2006-08-31", StandardTenor.T_1M, "2006-10-02", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-31", StandardTenor.T_2M, "2006-10-31", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-01-31", StandardTenor.T_1M, "2006-02-28", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2008-01-31", StandardTenor.T_1M, "2008-02-29", HolidayHandlerType.FORWARD);
+
+        checkMoveByTenor("2006-08-08", StandardTenor.T_1M, "2006-09-08", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-09", StandardTenor.T_1M, "2006-09-11", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(2, TenorCode.MONTH), "2006-10-09", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-08", new Tenor(5, TenorCode.MONTH), "2007-01-08", HolidayHandlerType.FORWARD);
     }
 
     public void testMoveByTenorMonthOneDayToSpot() {
@@ -313,11 +338,16 @@
         checkMoveByTenor("2006-08-08", new Tenor(5, TenorCode.MONTH), 2, "2007-01-10", HolidayHandlerType.FORWARD);
     }
 
-    public void testMoveByTenorYear() {
+    public void testMoveByTenorYearZeroDayToSpot() {
         checkMoveByTenor("2006-08-31", StandardTenor.T_1Y, 0, "2007-08-31", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-31", StandardTenor.T_2Y, 0, "2008-09-01", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2008-02-29", StandardTenor.T_1Y, 0, "2009-03-02", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2008-02-29", StandardTenor.T_4Y, 0, "2012-02-29", HolidayHandlerType.FORWARD);
+
+        checkMoveByTenor("2006-08-31", StandardTenor.T_1Y, "2007-08-31", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-31", StandardTenor.T_2Y, "2008-09-01", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2008-02-29", StandardTenor.T_1Y, "2009-03-02", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2008-02-29", StandardTenor.T_4Y, "2012-02-29", HolidayHandlerType.FORWARD);
     }
 
     public void testMoveByTenorYearOneDayToSpot() {
@@ -334,10 +364,14 @@
         checkMoveByTenor("2008-02-29", StandardTenor.T_4Y, 2, "2012-03-05", HolidayHandlerType.FORWARD);
     }
 
-    public void testMoveByTenorSpot() {
+    public void testMoveByTenorSpotZeroDayToSpot() {
         checkMoveByTenor("2006-08-31", StandardTenor.SPOT, 0, "2006-08-31", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-28", StandardTenor.SPOT, 0, "2006-08-29", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-25", StandardTenor.SPOT, 0, "2006-08-25", HolidayHandlerType.FORWARD);
+
+        checkMoveByTenor("2006-08-31", StandardTenor.SPOT, "2006-08-31", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-28", StandardTenor.SPOT, "2006-08-29", HolidayHandlerType.FORWARD);
+        checkMoveByTenor("2006-08-25", StandardTenor.SPOT, "2006-08-25", HolidayHandlerType.FORWARD);
     }
 
     public void testMoveByTenorSpotOneDayToSpot() {
@@ -372,6 +406,86 @@
         checkMoveByTenor("2006-08-31", StandardTenor.OVERNIGHT, 2, "2006-09-01", HolidayHandlerType.FORWARD);
         checkMoveByTenor("2006-08-28", StandardTenor.OVERNIGHT, 2, "2006-08-30", HolidayHandlerType.FORWARD);
     }
+
+    public void testCalculateTenorsZeroDaysToSpot() {
+        List<Tenor> list = new ArrayList<Tenor>();
+        list.add(StandardTenor.OVERNIGHT);
+        list.add(StandardTenor.SPOT);
+        list.add(StandardTenor.T_1D);
+        list.add(StandardTenor.T_2D);
+        list.add(StandardTenor.T_1W);
+        list.add(StandardTenor.T_1M);
+        list.add(StandardTenor.T_2M);
+        list.add(StandardTenor.T_3M);
+        list.add(StandardTenor.T_6M);
+        list.add(StandardTenor.T_9M);
+        list.add(StandardTenor.T_1Y);
+
+        final DateCalculator<E> cal = newDateCalculator("bla", HolidayHandlerType.FORWARD);
+        cal.setHolidayCalendar(createUKHolidayCalendar());
+        String startDate = "2006-08-24";
+        cal.setStartDate(newDate(startDate));
+        List<E> expectedResults = new ArrayList<E>();
+        expectedResults.add(newDate("2006-08-25")); // ON
+        expectedResults.add(newDate("2006-08-24")); // SPOT
+        expectedResults.add(newDate("2006-08-25")); // 1D
+        expectedResults.add(newDate("2006-08-29")); // 2D
+        expectedResults.add(newDate("2006-08-31")); // 1W
+        expectedResults.add(newDate("2006-09-25")); // 1M
+        expectedResults.add(newDate("2006-10-24")); // 2M
+        expectedResults.add(newDate("2006-11-24")); // 3M
+        expectedResults.add(newDate("2007-02-26")); // 6M
+        expectedResults.add(newDate("2007-05-24")); // 9M
+        expectedResults.add(newDate("2007-08-24")); // 1Y
+
+        List<E> results = cal.calculateTenorDates(list);
+        assertEquals("Same size as tenor", list.size(), results.size());
+        Iterator<E> it = results.iterator();
+        Iterator<E> expected = expectedResults.iterator();
+        for (Tenor tenor : list) {
+            assertEquals("Move start:" + startDate + " tenor:" + tenor, expected.next(), it.next());
+        }
+    }
+
+    public void testCalculateTenorsTwoDaysToSpot() {
+        List<Tenor> list = new ArrayList<Tenor>();
+        list.add(StandardTenor.OVERNIGHT);
+        list.add(StandardTenor.SPOT);
+        list.add(StandardTenor.T_1D);
+        list.add(StandardTenor.T_2D);
+        list.add(StandardTenor.T_1W);
+        list.add(StandardTenor.T_1M);
+        list.add(StandardTenor.T_2M);
+        list.add(StandardTenor.T_3M);
+        list.add(StandardTenor.T_6M);
+        list.add(StandardTenor.T_9M);
+        list.add(StandardTenor.T_1Y);
+
+        final DateCalculator<E> cal = newDateCalculator("bla", HolidayHandlerType.FORWARD);
+        cal.setHolidayCalendar(createUKHolidayCalendar());
+        String startDate = "2006-08-24";
+        cal.setStartDate(newDate(startDate));
+        List<E> expectedResults = new ArrayList<E>();
+        expectedResults.add(newDate("2006-08-25")); // ON
+        expectedResults.add(newDate("2006-08-29")); // SPOT
+        expectedResults.add(newDate("2006-08-30")); // 1D
+        expectedResults.add(newDate("2006-08-31")); // 2D
+        expectedResults.add(newDate("2006-09-05")); // 1W
+        expectedResults.add(newDate("2006-09-29")); // 1M
+        expectedResults.add(newDate("2006-10-30")); // 2M
+        expectedResults.add(newDate("2006-11-29")); // 3M
+        expectedResults.add(newDate("2007-02-28")); // 6M - is this correct?
+        expectedResults.add(newDate("2007-05-29")); // 9M
+        expectedResults.add(newDate("2007-08-29")); // 1Y
+
+        List<E> results = cal.calculateTenorDates(list, 2);
+        assertEquals("Same size as tenor", list.size(), results.size());
+        Iterator<E> it = results.iterator();
+        Iterator<E> expected = expectedResults.iterator();
+        for (Tenor tenor : list) {
+            assertEquals("Move start:" + startDate + " tenor:" + tenor, expected.next(), it.next());
+        }
+    }
 }
 
 /*
Modified: trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarDateCalculator.java
===================================================================
--- trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarDateCalculator.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/CalendarDateCalculator.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -166,6 +166,13 @@
             throw new IndexOutOfBoundsException(date + " is after the late boundary " + late);
         }
     }
+
+    @Override
+    protected Calendar clone(Calendar date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date.getTime());
+        return cal;
+    }
 }
 
 /*
Modified: trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DateDateCalculator.java
===================================================================
--- trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DateDateCalculator.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DateDateCalculator.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -175,6 +175,11 @@
             throw new IndexOutOfBoundsException(date + " is after the late boundary " + late);
         }
     }
+
+    @Override
+    protected Date clone(Date date) {
+        return new Date(date.getTime());
+    }
 }
 
 /*
Modified: trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/LocalDateCalculator.java
===================================================================
--- trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/LocalDateCalculator.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/LocalDateCalculator.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -171,6 +171,11 @@
             throw new IndexOutOfBoundsException(date + " is after the late boundary " + late);
         }
     }
+
+    @Override
+    protected LocalDate clone(LocalDate date) {
+        return date;
+    }
 }
 
 /*
Modified: trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/YearMonthDayDateCalculator.java
===================================================================
--- trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/YearMonthDayDateCalculator.java	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/YearMonthDayDateCalculator.java	2007-01-05 20:45:33 UTC (rev 238)
@@ -181,6 +181,11 @@
             throw new IndexOutOfBoundsException(date + " is after the late boundary " + late);
         }
     }
+
+    @Override
+    protected YearMonthDay clone(YearMonthDay date) {
+        return date;
+    }
 }
 
 /*
Modified: trunk/src/site/changes.xml
===================================================================
--- trunk/src/site/changes.xml	2007-01-05 13:59:28 UTC (rev 237)
+++ trunk/src/site/changes.xml	2007-01-05 20:45:33 UTC (rev 238)
@@ -9,6 +9,8 @@
   </properties>
   <body>
     <release version="1.1.0" date="in SVN" description="Maintenance">
+      <action dev="benoitx" type="add">Added method calculateTenorDates with/without a spot lag to enable calculation of a series of Tenor dates without changing the current business date in the calculator.</action>
+      <action dev="benoitx" type="add">Added method moveByTenor without a spot lag to allow tenor calculation based on the CURRENT date and not the spot lag.</action>
       <action dev="benoitx" type="add" issue="1575498" due-to="Paul Hill">Valid Range via HolidayCalendar.  HolidayCalendar should replace the simple Set<E> of dates
       for holidays.  A HolidayCalendar MAY contain an eraly and late boundary, if the calculation break a boundary, an exception is thrown, if there are no
       boundaries no exception would be thrown. This would ensure that calculations are not going outside the valid set of holidays.</action>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |