| 
      
      
      From: <be...@us...> - 2006-09-06 12:29:07
      
     | 
| Revision: 119
          http://svn.sourceforge.net/objectlabkit/?rev=119&view=rev
Author:   benoitx
Date:     2006-09-06 05:28:21 -0700 (Wed, 06 Sep 2006)
Log Message:
-----------
Separated the IMM calculator from the main DateCalendar, as suggested by Marcin (not everyone would use this).
It is implemented in similar fashion to the PeriodCountCalculator.
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/AbstractDateCalculatorFactory.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/DateCalculatorFactory.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/PeriodCountCalculator.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/StandardTenor.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/TenorCode.java
    trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractIMMDateTest.java
    trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/TenorTest.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkDateCalculatorFactory.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarBaseDateCalculator.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkDateBaseDateCalculator.java
    trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/DefaultLocalDateCalculatorFactory.java
    trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/DefaultYearMonthDayCalculatorFactory.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/datecalc-joda/src/test/java/net/objectlab/kit/datecalc/joda/LocalDateIMMDateTest.java
    trunk/datecalc-joda/src/test/java/net/objectlab/kit/datecalc/joda/YearMonthDayIMMDateTest.java
Added Paths:
-----------
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractIMMDateCalculator.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/IMMDateCalculator.java
    trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Version.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkCalendarCalculatorFactory.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarCalculator.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarCalculatorFactory.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarIMMDateCalculator.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarPeriodCountCalculator.java
    trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkDateIMMDateCalculator.java
    trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/JdkCalendarIMMDateTest.java
    trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/JdkDateIMMDateTest.java
    trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/LocalDateIMMDateCalculator.java
    trunk/datecalc-joda/src/main/java/net/objectlab/kit/datecalc/joda/YearMonthDayIMMDateCalculator.java
Removed Paths:
-------------
    trunk/datecalc-jdk/src/test/java/net/objectlab/kit/datecalc/jdk/IMMDateTest.java
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	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculator.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -19,7 +19,6 @@
 
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -36,9 +35,9 @@
  */
 public abstract class AbstractDateCalculator<E> implements DateCalculator<E> {
 
-    protected static final int MONTHS_IN_QUARTER = 3;
+//    protected static final int MONTHS_IN_QUARTER = 3;
 
-    protected static final int MONTH_IN_YEAR = 12;
+//    protected static final int MONTH_IN_YEAR = 12;
 
     protected static final int DAYS_IN_WEEK = 7;
 
@@ -111,9 +110,6 @@
             return moveByDays(tenor.getUnits());
         case WEEK:
             return moveByDays(tenor.getUnits() * DAYS_IN_WEEK);
-        case IMM:
-            setCurrentBusinessDate(getNextIMMDate());
-            return this;
         default:
             throw new UnsupportedOperationException("Sorry not yet...");
         }
@@ -212,57 +208,6 @@
         return cal;
     }
 
-    /**
-     * @return the next IMMDate based on current date.
-     */
-    public E getNextIMMDate() {
-        return getNextIMMDate(true, currentBusinessDate, IMMPeriod.QUARTERLY);
-    }
-
-    /**
-     * @param period
-     *            specify when the "next" IMM is, if quarterly then it is the
-     *            conventional algorithm.
-     * @return the next IMMDate based on current date.
-     */
-    public E getNextIMMDate(final IMMPeriod period) {
-        return getNextIMMDate(true, currentBusinessDate, period);
-    }
-
-    /**
-     * @return the previous IMMDate based on current date.
-     */
-    public E getPreviousIMMDate() {
-        return getNextIMMDate(false, currentBusinessDate, IMMPeriod.QUARTERLY);
-    }
-
-    /**
-     * @param period
-     *            specify when the "previous" IMM is, if quarterly then it is
-     *            the conventional algorithm.
-     * @return the previous IMMDate based on current date.
-     */
-    public E getPreviousIMMDate(final IMMPeriod period) {
-        return getNextIMMDate(false, currentBusinessDate, period);
-    }
-
-    /**
-     * Returns a list of IMM dates between 2 dates, it will exclude the start
-     * date if it is an IMM date but would include the end date if it is an IMM
-     * (same as IMMPeriod.QUARTERLY).
-     * 
-     * @param start
-     *            start of the interval, excluded
-     * @param end
-     *            end of the interval, may be included.
-     * @return list of IMM dates
-     */
-    public List<E> getIMMDates(final E start, final E end) {
-        return getIMMDates(start, end, IMMPeriod.QUARTERLY);
-    }
-
-    protected abstract E getNextIMMDate(final boolean requestNextIMM, final E theStartDate, final IMMPeriod period);
-
     protected abstract DateCalculator<E> createNewCalcultaor(String calcName, E theStartDate, Set<E> holidays,
             HolidayHandler<E> handler);
 }
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculatorFactory.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculatorFactory.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractDateCalculatorFactory.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -33,9 +33,9 @@
 
     protected final ConcurrentMap<String, Set<E>> holidays = new ConcurrentHashMap<String, Set<E>>();
 
-    public abstract DateCalculator<E> getDateCalculator(String name, String holidayHandlerType);
+//    public abstract DateCalculator<E> getDateCalculator(String name, String holidayHandlerType);
 
-    public abstract PeriodCountCalculator<E> getPeriodCountCalculator();
+//    public abstract PeriodCountCalculator<E> getPeriodCountCalculator();
 
     /**
      * Use this method to register a set of holidays for a given calendar, it
@@ -51,5 +51,4 @@
     public void registerHolidays(final String name, final Set<E> holidaysSet) {
         this.holidays.put(name, holidaysSet);
     }
-
 }
Added: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractIMMDateCalculator.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractIMMDateCalculator.java	                        (rev 0)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/AbstractIMMDateCalculator.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -0,0 +1,96 @@
+/*
+ * $Id: AbstractDateCalculator.java 108 2006-09-05 10:13:01Z benoitx $
+ * 
+ * Copyright 2006 the original author or authors.
+ *
+ * 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.
+ */
+package net.objectlab.kit.datecalc.common;
+
+import java.util.List;
+
+/**
+ * Abstract implementation in order to encapsulate all the common functionality
+ * between Jdk and Joda implementations. It is parametrized on <code><E></code>
+ * but basically <code>Date</code> and <code>LocalDate</code> are the only
+ * viable values for it for now.
+ * 
+ * @author Marcin Jekot
+ * @author $LastChangedBy: benoitx $
+ * @version $Revision: 108 $ $Date: 2006-09-05 11:13:01 +0100 (Tue, 05 Sep 2006) $
+ * 
+ * @param <E>
+ */
+public abstract class AbstractIMMDateCalculator<E> implements IMMDateCalculator<E> {
+
+    protected static final int MONTHS_IN_QUARTER = 3;
+
+    protected static final int MONTH_IN_YEAR = 12;
+
+    protected static final int DAYS_IN_WEEK = 7;
+
+    /**
+     * @param startDate
+     * @return the next IMMDate based on current date.
+     */
+    public E getNextIMMDate(final E startDate) {
+        return getNextIMMDate(true, startDate, IMMPeriod.QUARTERLY);
+    }
+
+    /**
+     * @param startDate
+     * @param period
+     *            specify when the "next" IMM is, if quarterly then it is the
+     *            conventional algorithm.
+     * @return the next IMMDate based on current date.
+     */
+    public E getNextIMMDate(final E startDate, final IMMPeriod period) {
+        return getNextIMMDate(true, startDate, period);
+    }
+
+    /**
+     * @param startDate
+     * @return the previous IMMDate based on current date.
+     */
+    public E getPreviousIMMDate(final E startDate) {
+        return getNextIMMDate(false, startDate, IMMPeriod.QUARTERLY);
+    }
+
+    /**
+     * @param startDate
+     * @param period
+     *            specify when the "previous" IMM is, if quarterly then it is
+     *            the conventional algorithm.
+     * @return the previous IMMDate based on current date.
+     */
+    public E getPreviousIMMDate(final E startDate, final IMMPeriod period) {
+        return getNextIMMDate(false, startDate, period);
+    }
+
+    /**
+     * Returns a list of IMM dates between 2 dates, it will exclude the start
+     * date if it is an IMM date but would include the end date if it is an IMM
+     * (same as IMMPeriod.QUARTERLY).
+     * 
+     * @param start
+     *            start of the interval, excluded
+     * @param end
+     *            end of the interval, may be included.
+     * @return list of IMM dates
+     */
+    public List<E> getIMMDates(final E start, final E end) {
+        return getIMMDates(start, end, IMMPeriod.QUARTERLY);
+    }
+
+    protected abstract E getNextIMMDate(final boolean requestNextIMM, final E theStartDate, final IMMPeriod period);
+}
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	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculator.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -17,7 +17,6 @@
  */
 package net.objectlab.kit.datecalc.common;
 
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -193,81 +192,4 @@
      *         calendar.moveByTenor(StandardTenor.T_2M).getCurrentBusinessDate();)
      */
     DateCalculator<E> moveByTenor(final Tenor tenor);
-
-    /**
-     * Checks if a given date is an official IMM Date (3rd Wednesdays of
-     * March/June/Sept/Dec.
-     * 
-     * @param date
-     * @return true if that date is an IMM date.
-     */
-    boolean isIMMDate(E date);
-
-    /**
-     * Starting from the current business date, it will return the next IMM
-     * Date, even if the current business date is an IMM date (same as calling
-     * getNextIMMDate(IMMPeriod.QUARTERLY)).
-     * 
-     * @return the next IMMDate based on current business date.
-     */
-    E getNextIMMDate();
-
-    /**
-     * Starting from the current business date, it will return the next IMM Date
-     * based on the IMMPeriod, even if the current business date is an IMM date.
-     * 
-     * @param period
-     *            specify when the "next" IMM is, if quarterly then it is the
-     *            conventional algorithm.
-     * @return the next IMMDate based on current date.
-     */
-    E getNextIMMDate(IMMPeriod period);
-
-    /**
-     * Starting from the current business date, it will return the previous IMM
-     * Date, even if the current business date is an IMM date.
-     * 
-     * @return the previous IMMDate based on current date.
-     */
-    E getPreviousIMMDate();
-
-    /**
-     * Starting from the current business date, it will return the previous IMM
-     * Date based on the IMMPeriod, even if the current business date is an IMM
-     * date.
-     * 
-     * @param period
-     *            specify when the "previous" IMM is, if quarterly then it is
-     *            the conventional algorithm.
-     * @return the previous IMMDate based on current date.
-     */
-    E getPreviousIMMDate(IMMPeriod period);
-
-    /**
-     * Returns a list of IMM dates between 2 dates, it will exclude the start
-     * date if it is an IMM date but would include the end date if it is an IMM
-     * (same as as calling getIMMDates(start,end,IMMPeriod.QUARTERLY)).
-     * 
-     * @param start
-     *            start of the interval, excluded
-     * @param end
-     *            end of the interval, may be included.
-     * @return list of IMM dates
-     */
-    List<E> getIMMDates(final E start, final E end);
-
-    /**
-     * Returns a list of IMM dates between 2 dates, it will exclude the start
-     * date if it is an IMM date but would include the end date if it is an IMM.
-     * 
-     * @param start
-     *            start of the interval, excluded
-     * @param end
-     *            end of the interval, may be included.
-     * @param period
-     *            specify when the "next" IMM is, if quarterly then it is the
-     *            conventional algorithm.
-     * @return list of IMM dates
-     */
-    List<E> getIMMDates(final E start, final E end, final IMMPeriod period);
 }
\ No newline at end of file
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculatorFactory.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculatorFactory.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/DateCalculatorFactory.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -60,4 +60,9 @@
      * @return a PeriodCountCalculator
      */
     PeriodCountCalculator<E> getPeriodCountCalculator();
+    
+    /**
+     * @return an IMMDateCalculator
+     */
+    IMMDateCalculator<E> getIMMDateCalculator();
 }
Added: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/IMMDateCalculator.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/IMMDateCalculator.java	                        (rev 0)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/IMMDateCalculator.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -0,0 +1,109 @@
+/*
+ * $Id: DateCalculator.java 109 2006-09-05 11:16:39Z benoitx $
+ * 
+ * Copyright 2006 the original author or authors.
+ *
+ * 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.
+ */
+package net.objectlab.kit.datecalc.common;
+
+import java.util.List;
+
+/**
+ * The IMMDates are defined 
+ * 
+ * @author Benoit Xhenseval
+ * @author $LastChangedBy: benoitx $
+ * @version $Revision: 109 $ $Date: 2006-09-05 12:16:39 +0100 (Tue, 05 Sep 2006) $
+ */
+public interface IMMDateCalculator<E> {
+    /**
+     * Checks if a given date is an official IMM Date (3rd Wednesdays of
+     * March/June/Sept/Dec.
+     * 
+     * @param date
+     * @return true if that date is an IMM date.
+     */
+    boolean isIMMDate(final E date);
+
+    /**
+     * Starting from the current business date, it will return the next IMM
+     * Date, even if the current business date is an IMM date (same as calling
+     * getNextIMMDate(IMMPeriod.QUARTERLY)).
+     * 
+     * @param startDate
+     * @return the next IMMDate based on current business date.
+     */
+    E getNextIMMDate(final E startDate);
+
+    /**
+     * Starting from the current business date, it will return the next IMM Date
+     * based on the IMMPeriod, even if the current business date is an IMM date.
+     * 
+     * @param startDate
+     * @param period
+     *            specify when the "next" IMM is, if quarterly then it is the
+     *            conventional algorithm.
+     * @return the next IMMDate based on current date.
+     */
+    E getNextIMMDate(final E startDate, final IMMPeriod period);
+
+    /**
+     * Starting from the current business date, it will return the previous IMM
+     * Date, even if the current business date is an IMM date.
+     * 
+     * @param startDate
+     * @return the previous IMMDate based on current date.
+     */
+    E getPreviousIMMDate(final E startDate);
+
+    /**
+     * Starting from the current business date, it will return the previous IMM
+     * Date based on the IMMPeriod, even if the current business date is an IMM
+     * date.
+     * 
+     * @param period
+     *            specify when the "previous" IMM is, if quarterly then it is
+     *            the conventional algorithm.
+     * @return the previous IMMDate based on current date.
+     */
+    E getPreviousIMMDate(final E startDate, final IMMPeriod period);
+
+    /**
+     * Returns a list of IMM dates between 2 dates, it will exclude the start
+     * date if it is an IMM date but would include the end date if it is an IMM
+     * (same as as calling getIMMDates(start,end,IMMPeriod.QUARTERLY)).
+     * 
+     * @param start
+     *            start of the interval, excluded
+     * @param end
+     *            end of the interval, may be included.
+     * @return list of IMM dates
+     */
+    List<E> getIMMDates(final E start, final E end);
+
+    /**
+     * Returns a list of IMM dates between 2 dates, it will exclude the start
+     * date if it is an IMM date but would include the end date if it is an IMM.
+     * 
+     * @param start
+     *            start of the interval, excluded
+     * @param end
+     *            end of the interval, may be included.
+     * @param period
+     *            specify when the "next" IMM is, if quarterly then it is the
+     *            conventional algorithm.
+     * @return list of IMM dates
+     */
+    List<E> getIMMDates(final E start, final E end, final IMMPeriod period);
+}
\ No newline at end of file
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/PeriodCountCalculator.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/PeriodCountCalculator.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/PeriodCountCalculator.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -28,17 +28,17 @@
  */
 public interface PeriodCountCalculator<E> {
 
-    final int YEAR_360 = 360;
+    int YEAR_360 = 360;
 
-    final int MONTHS_IN_YEAR = 12;
+    int MONTHS_IN_YEAR = 12;
 
-    final double YEAR_365_0 = 365.0;
+    double YEAR_365_0 = 365.0;
 
-    final double YEAR_360_0 = 360.0;
+    double YEAR_360_0 = 360.0;
 
-    final int MONTH_31_DAYS = 31;
+    int MONTH_31_DAYS = 31;
 
-    final int MONTH_30_DAYS = 30;
+    int MONTH_30_DAYS = 30;
 
     int dayDiff(final E start, final E end, PeriodCountBasis basis);
 
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	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/StandardTenor.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -69,6 +69,4 @@
     public static final Tenor T_30Y = new Tenor(30, TenorCode.YEAR);
 
     public static final Tenor T_50Y = new Tenor(50, TenorCode.YEAR);
-
-    public static final Tenor IMM = new Tenor(0, TenorCode.IMM);
 }
Modified: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/TenorCode.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/TenorCode.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/TenorCode.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -17,7 +17,7 @@
 
 public enum TenorCode {
     OVERNIGHT("ON", false), TOMNEXT("TN", false), SPOT("SP", false), SPOTNEXT("SN", false), SPOTWEEK("SW", false), DAY("D", true), WEEK(
-            "W", true), MONTH("M", true), YEAR("Y", true), IMM("IMM", false);
+            "W", true), MONTH("M", true), YEAR("Y", true);
 
     private final String code;
 
Added: trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Version.java
===================================================================
--- trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Version.java	                        (rev 0)
+++ trunk/datecalc-common/src/main/java/net/objectlab/kit/datecalc/common/Version.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -0,0 +1,68 @@
+/*
+ * $Id: org.eclipse.jdt.ui.prefs 99 2006-09-04 20:30:25Z marchy $
+ * 
+ * Copyright 2006 the original author or authors.
+ *
+ * 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.
+ */
+package net.objectlab.kit.datecalc.common;
+
+
+import java.io.*;
+
+/**
+ * 
+ * @author xhensevb
+ * @author $LastChangedBy: marchy $
+ * @version $Revision: 99 $ $Date: 2006-09-04 21:30:25 +0100 (Mon, 04 Sep 2006) $
+ * 
+ */
+public class Version {
+    public static void main(String[] args) throws Exception {
+        if (args.length != 1) {
+            System.err.println("Usage: java version <.class file>");
+            System.exit(1);
+        }
+
+        if (!new File(args[0]).exists()) {
+            System.err.println(args[0] + " does not exist!");
+            System.exit(2);
+        }
+
+        DataInputStream dis = new DataInputStream(new FileInputStream(args[0]));
+        int magic = dis.readInt();
+        if (magic != 0xcafebabe) {
+            System.err.println(args[0] + " is not a .class file");
+            System.exit(3);
+        }
+
+        int minor = dis.readShort();
+        int major = dis.readShort();
+        System.out.println("class file version is " + major + "." + minor);
+
+        String version = null;
+
+        if (major < 48) {
+            version = "1.3.1";
+        } else if (major == 48) {
+            version = "1.4.2";
+        } else if (major == 49) {
+            version = "1.5";
+        } else if (major == 50) {
+            version = "6";
+        } else {
+            version = "7";
+        }
+        System.out.println("You need to use JDK " + version + " or above");
+    }
+}
\ No newline at end of file
Modified: trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractIMMDateTest.java
===================================================================
--- trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractIMMDateTest.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/AbstractIMMDateTest.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -7,145 +7,135 @@
 
 public abstract class AbstractIMMDateTest<E> extends TestCase {
 
-    private DateCalculator<E> cal;
+    private IMMDateCalculator<E> cal;
 
     public void setUp() {
         cal = getDateCalculator("bla");
     }
 
-    protected abstract DateCalculator<E> getDateCalculator(String name);
+    protected abstract IMMDateCalculator<E> getDateCalculator(String name);
 
     protected abstract E parseDate(String string);
 
-    private void checkImm(final DateCalculator<E> cal, final E date, final boolean expected) {
+    private void checkImm(final IMMDateCalculator<E> cal, final E date, final boolean expected) {
         assertEquals("check " + date, expected, cal.isIMMDate(date));
     }
 
-    public void testSanityCheck() {
-        Assert.assertEquals("Name", "bla", cal.getName());
-        Assert.assertEquals("Holidays size", 0, cal.getNonWorkingDays().size());
-    }
-
     public void testNextIMM() {
-        final E startDate = parseDate("2006-08-01");
-        cal.setStartDate(startDate);
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
+        E startDate = parseDate("2006-08-01");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-01-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-02-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-03-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getNextIMMDate());
+        startDate = parseDate("2006-01-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-02-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-03-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-04-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-05-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-06-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
+        startDate = parseDate("2006-04-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-05-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-06-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-07-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-08-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-09-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
+        startDate = parseDate("2006-07-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-08-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-09-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-10-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-11-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-12-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getNextIMMDate());
+        startDate = parseDate("2006-10-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-11-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-12-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-03-14"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-03-15"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-03-16"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
+        startDate = parseDate("2006-03-14");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-03-15");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-03-16");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-06-20"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-06-21"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-06-22"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
+        startDate = parseDate("2006-06-20");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-06-21");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-06-22");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-09-19"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-09-20"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-09-21"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getNextIMMDate());
+        startDate = parseDate("2006-09-19");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-09-20");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-09-21");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-12-19"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-12-20"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2007-03-21"), cal.getNextIMMDate());
-        cal.setStartDate(parseDate("2006-12-21"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2007-03-21"), cal.getNextIMMDate());
+        startDate = parseDate("2006-12-19");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-12-20");
+        Assert.assertEquals("From " + startDate, parseDate("2007-03-21"), cal.getNextIMMDate(startDate));
+        startDate = parseDate("2006-12-21");
+        Assert.assertEquals("From " + startDate, parseDate("2007-03-21"), cal.getNextIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-03-15"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getNextIMMDate());
+        startDate = parseDate("2006-03-15");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getNextIMMDate(startDate));
     }
 
     public void testNextIMMWithPeriod() {
-        final E startDate = parseDate("2006-08-01");
-        cal.setStartDate(startDate);
+        E startDate = parseDate("2006-08-01");
 
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getNextIMMDate());
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getNextIMMDate(startDate));
 
         IMMPeriod period = IMMPeriod.QUARTERLY;
 
-        cal.setStartDate(parseDate("2006-01-09"));
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-03-15"), cal
-                .getNextIMMDate(period));
+        startDate = parseDate("2006-01-09");
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-03-15"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.BI_ANNUALY_JUN_DEC;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-06-21"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-06-21"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.BI_ANNUALY_MAR_SEP;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-03-15"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-03-15"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.ANNUALLY;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2007-03-21"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2007-03-21"), cal.getNextIMMDate(startDate,
+                period));
 
-        cal.setStartDate(parseDate("2006-03-20"));
+        startDate = parseDate("2006-03-20");
         period = IMMPeriod.QUARTERLY;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-06-21"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-06-21"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.BI_ANNUALY_JUN_DEC;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-06-21"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-06-21"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.BI_ANNUALY_MAR_SEP;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-09-20"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-09-20"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.ANNUALLY;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2007-06-20"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2007-06-20"), cal.getNextIMMDate(startDate,
+                period));
 
-        cal.setStartDate(parseDate("2006-03-15"));
+        startDate = parseDate("2006-03-15");
         period = IMMPeriod.QUARTERLY;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-06-21"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-06-21"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.BI_ANNUALY_JUN_DEC;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-06-21"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-06-21"), cal.getNextIMMDate(startDate,
+                period));
         period = IMMPeriod.BI_ANNUALY_MAR_SEP;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2006-09-20"), cal
-                .getNextIMMDate(period));
-        cal.setStartDate(parseDate("2006-03-15"));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2006-09-20"), cal.getNextIMMDate(startDate,
+                period));
+        startDate = parseDate("2006-03-15");
         period = IMMPeriod.ANNUALLY;
-        Assert.assertEquals("From " + cal.getStartDate() + " period:" + period, parseDate("2007-06-20"), cal
-                .getNextIMMDate(period));
+        Assert.assertEquals("From " + startDate + " period:" + period, parseDate("2007-06-20"), cal.getNextIMMDate(startDate,
+                period));
     }
 
     public void testIfIMMDate() {
-        final E startDate = parseDate("2006-08-01");
-        cal.setStartDate(startDate);
-
         checkImm(cal, parseDate("2006-08-01"), false);
 
         checkImm(cal, parseDate("2006-03-14"), false);
@@ -165,89 +155,69 @@
         checkImm(cal, parseDate("2006-12-21"), false);
     }
 
-    public void testMoveByIMMTenor() {
-        final E startDate = parseDate("2006-04-01");
-        cal.setStartDate(startDate);
 
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.moveByTenor(StandardTenor.IMM)
-                .getCurrentBusinessDate());
-    }
-
-    public void testMoveByNullTenor() {
-        final E startDate = parseDate("2006-04-01");
-        cal.setStartDate(startDate);
-
-        try {
-            cal.moveByTenor(null);
-            Assert.fail("Should have thrown IllegalArgumentException");
-        } catch (final IllegalArgumentException e) {
-            // ok
-        }
-    }
-
     public void testPreviousIMM() {
-        final E startDate = parseDate("2006-08-01");
-        cal.setStartDate(startDate);
+        E startDate = parseDate("2006-08-01");
 
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-01-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2005-12-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-02-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2005-12-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-03-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2005-12-21"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-01-09");
+        Assert.assertEquals("From " + startDate, parseDate("2005-12-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-02-09");
+        Assert.assertEquals("From " + startDate, parseDate("2005-12-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-03-09");
+        Assert.assertEquals("From " + startDate, parseDate("2005-12-21"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-04-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-05-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-06-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-04-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-05-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-06-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-07-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-08-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-09-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-07-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-08-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-09-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-10-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-11-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-12-09"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-10-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-11-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-12-09");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getPreviousIMMDate(startDate));
 
         // close to dates
 
-        cal.setStartDate(parseDate("2006-03-14"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2005-12-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-03-15"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2005-12-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-03-16"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-03-14");
+        Assert.assertEquals("From " + startDate, parseDate("2005-12-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-03-15");
+        Assert.assertEquals("From " + startDate, parseDate("2005-12-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-03-16");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-06-20"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-06-21"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-03-15"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-06-22"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-06-20");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-06-21");
+        Assert.assertEquals("From " + startDate, parseDate("2006-03-15"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-06-22");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-09-19"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-09-20"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-06-21"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-09-21"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-09-19");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-09-20");
+        Assert.assertEquals("From " + startDate, parseDate("2006-06-21"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-09-21");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getPreviousIMMDate(startDate));
 
-        cal.setStartDate(parseDate("2006-12-19"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-12-20"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-09-20"), cal.getPreviousIMMDate());
-        cal.setStartDate(parseDate("2006-12-21"));
-        Assert.assertEquals("From " + cal.getStartDate(), parseDate("2006-12-20"), cal.getPreviousIMMDate());
+        startDate = parseDate("2006-12-19");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-12-20");
+        Assert.assertEquals("From " + startDate, parseDate("2006-09-20"), cal.getPreviousIMMDate(startDate));
+        startDate = parseDate("2006-12-21");
+        Assert.assertEquals("From " + startDate, parseDate("2006-12-20"), cal.getPreviousIMMDate(startDate));
     }
 
     public void testIMMLists() {
Modified: trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/TenorTest.java
===================================================================
--- trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/TenorTest.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-common/src/test/java/net/objectlab/kit/datecalc/common/TenorTest.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -50,7 +50,6 @@
         checkValidTenor("ON", false, TenorCode.OVERNIGHT, 0);
         checkValidTenor("SW", false, TenorCode.SPOTWEEK, 0);
         checkValidTenor("SN", false, TenorCode.SPOTNEXT, 0);
-        checkValidTenor("IMM", false, TenorCode.IMM, 0);
         checkValidTenor("TN", false, TenorCode.TOMNEXT, 0);
 
         checkValidTenor("1D", true, TenorCode.DAY, 1);
@@ -79,7 +78,6 @@
         checkToString("ON");
         checkToString("SW");
         checkToString("SN");
-        checkToString("IMM");
         checkToString("TN");
         checkToString("1D");
         checkToString("1W");
Added: trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkCalendarCalculatorFactory.java
===================================================================
--- trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkCalendarCalculatorFactory.java	                        (rev 0)
+++ trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkCalendarCalculatorFactory.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -0,0 +1,89 @@
+/*
+ * $Id: DefaultJdkDateCalculatorFactory.java 96 2006-09-04 15:01:20Z benoitx $
+ * 
+ * Copyright 2006 the original author or authors.
+ *
+ * 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.
+ */
+package net.objectlab.kit.datecalc.jdk;
+
+import java.util.Calendar;
+
+import net.objectlab.kit.datecalc.common.AbstractDateCalculatorFactory;
+import net.objectlab.kit.datecalc.common.HolidayHandlerType;
+import net.objectlab.kit.datecalc.common.IMMDateCalculator;
+
+/**
+ * TODO add javadoc
+ * 
+ * @author Benoit Xhenseval
+ * @author $LastChangedBy: benoitx $
+ * @version $Revision: 96 $ $Date: 2006-09-04 16:01:20 +0100 (Mon, 04 Sep 2006) $
+ * 
+ */
+public class DefaultJdkCalendarCalculatorFactory extends AbstractDateCalculatorFactory<Calendar> implements JdkCalendarCalculatorFactory {
+
+    private static final DefaultJdkCalendarCalculatorFactory DEFAULT = new DefaultJdkCalendarCalculatorFactory();
+
+    private static final CalendarPeriodCountCalculator PCC = new CalendarPeriodCountCalculator();
+
+    private static final JdkCalendarIMMDateCalculator IMMDC = new JdkCalendarIMMDateCalculator();
+
+    public static JdkCalendarCalculatorFactory getDefaultInstance() {
+        return DEFAULT;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.objectlab.kit.datecalc.jdk.JdkDateCalculatorFactory#getDateCalculator(java.lang.String,
+     *      java.lang.String)
+     */
+    public JdkCalendarDateCalculator getDateCalculator(final String name, final String holidayHandlerType) {
+        final JdkCalendarBaseDateCalculator cal = new JdkCalendarBaseDateCalculator();
+        cal.setName(name);
+        if (holidays.containsKey(name)) {
+            cal.setNonWorkingDays(holidays.get(name));
+        }
+
+        if (holidayHandlerType == null) {
+            return cal;
+        } else if (HolidayHandlerType.FORWARD.equals(holidayHandlerType)) {
+            cal.setHolidayHandler(new ForwardHandler());
+        } else if (HolidayHandlerType.BACKWARD.equals(holidayHandlerType)) {
+            cal.setHolidayHandler(new BackwardHandler());
+        } else if (HolidayHandlerType.MODIFIED_FOLLLOWING.equals(holidayHandlerType)) {
+            cal.setHolidayHandler(new ModifiedFollowingHandler());
+        } else if (HolidayHandlerType.MODIFIED_PRECEEDING.equals(holidayHandlerType)) {
+            cal.setHolidayHandler(new ModifiedPreceedingHandler());
+        } else {
+            throw new UnsupportedOperationException("Unsupported HolidayHandler: " + holidayHandlerType);
+        }
+
+        return cal;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see net.objectlab.kit.datecalc.jdk.JdkDateCalculatorFactory#getPeriodCountCalculator()
+     */
+    public CalendarPeriodCountCalculator getPeriodCountCalculator() {
+        return PCC;
+    }
+
+    public IMMDateCalculator<Calendar> getIMMDateCalculator() {
+        return IMMDC;
+    }
+
+}
Modified: trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkDateCalculatorFactory.java
===================================================================
--- trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkDateCalculatorFactory.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/DefaultJdkDateCalculatorFactory.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -21,6 +21,7 @@
 
 import net.objectlab.kit.datecalc.common.AbstractDateCalculatorFactory;
 import net.objectlab.kit.datecalc.common.HolidayHandlerType;
+import net.objectlab.kit.datecalc.common.IMMDateCalculator;
 
 /**
  * TODO add javadoc
@@ -36,6 +37,8 @@
 
     private static final JdkDatePeriodCountCalculator PCC = new DatePeriodCountCalculator();
 
+    private static final JdkDateIMMDateCalculator IMMDC = new JdkDateIMMDateCalculator();
+
     public static JdkDateCalculatorFactory getDefaultInstance() {
         return DEFAULT;
     }
@@ -46,7 +49,6 @@
      * @see net.objectlab.kit.datecalc.jdk.JdkDateCalculatorFactory#getDateCalculator(java.lang.String,
      *      java.lang.String)
      */
-    @Override
     public JdkDateCalculator getDateCalculator(final String name, final String holidayHandlerType) {
         final JdkDateBaseDateCalculator cal = new JdkDateBaseDateCalculator();
         cal.setName(name);
@@ -76,9 +78,12 @@
      * 
      * @see net.objectlab.kit.datecalc.jdk.JdkDateCalculatorFactory#getPeriodCountCalculator()
      */
-    @Override
     public JdkDatePeriodCountCalculator getPeriodCountCalculator() {
         return PCC;
     }
 
+    public IMMDateCalculator<Date> getIMMDateCalculator() {
+        return IMMDC;
+    }
+
 }
Modified: trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarBaseDateCalculator.java
===================================================================
--- trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarBaseDateCalculator.java	2006-09-06 09:58:04 UTC (rev 118)
+++ trunk/datecalc-jdk/src/main/java/net/objectlab/kit/datecalc/jdk/JdkCalendarBaseDateCalculator.java	2006-09-06 12:28:21 UTC (rev 119)
@@ -17,16 +17,13 @@
  */
 package net.objectlab.kit.datecalc.jdk;
 
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Collections;
-import java.util.List;
 import java.util.Set;
 
 import net.objectlab.kit.datecalc.common.AbstractDateCalculator;
 import net.objectlab.kit.datecalc.common.DateCalculator;
 import net.objectlab.kit.datecalc.common.HolidayHandler;
-import net.objectlab.kit.datecalc.common.IMMPeriod;
 import net.objectlab.kit.datecalc.common.Tenor;
 import net.objectlab.kit.datecalc.common.WorkingWeek;
 
@@ -93,123 +90,7 @@
         return new JdkCalendarBaseDateCalculator(name, startDate, holidays, handler);
     }
 
-    /**
-     * Returns a list of IMM dates between 2 dates, it will exclude the start
-     * date if it is an IMM date but would include the end date if it is an IMM.
-     * 
-     * @param start
-     *            start of the interval, excluded
-     * @param end
-     *            end of the interval, may be included.
-     * @param period
-     *            specify when the "next" IMM is, if quarterly then it is the
-     *            conventional algorithm.
-     * @return list of IMM dates
-     */
-    public List<Calendar> getIMMDates(final Calendar start, final Calendar end, final IMMPeriod period) {
-
-        final List<Calendar> dates = new ArrayList<Calendar>();
-        Calendar cal = (Calendar) start.clone();
-        while (true) {
-            cal = getNextIMMDate(true, cal, period);
-            if (!cal.after(end)) {
-                dates.add(cal);
-            } else {
-                break;
-            }
-        }
-
-        return dates;
-    }
-
     @Override
-    protected Calendar getNextIMMDate(final boolean requestNextIMM, final Calendar startDate, final IMMPeriod period) {
-
-        Calendar cal = (Calendar) startDate.clone();
-        
-        if (isIMMMonth(cal)) {
-            moveToIMMDay(cal);
-            // TODO simplify this if condition
-// if (forward ^ cal.getTime().before(startDate) ||
-// cal.getTime().equals(startDate)) {
-            if ((requestNextIMM && cal.after(startDate)) || (!requestNextIMM && cal.before(startDate))) {
-                return cal;
-            }
-        }
-
-        final int delta = (requestNextIMM ? 1 : -1);
-        do {
-            cal.add(Calendar.MONTH, delta);
-        } while (!isIMMMonth(cal));
-
-        moveToIMMDay(cal);
-        
-        final int month = cal.get(Calendar.MONTH); 
-        if ( (period == IMMPeriod.BI_ANNUALY_JUN_DEC 
-                && (Calendar.MARCH == month || Calendar.SEPTEMBER==month) ) 
-                || 
-                ( period == IMMPeriod.BI_ANNUALY_MAR_SEP 
-                        && (Calendar.JUNE == month || Calendar.DECEMBER==month) ) ) { 
-                // need to move to the next one.
-                cal = getNextIMMDate(requestNextIMM, cal, period);
-        } else if (period == IMMPeriod.ANNUALLY) {
-            // second jump
-            cal = getNextIMMDate(requestNextIMM, cal, IMMPeriod.QUARTERLY);
-            // third jump
-            cal = getNextIMMDate(requestNextIMM, cal, IMMPeriod.QUARTERLY);
-            // fourth jump
-            cal = getNextIMMDate(requestNextIMM, cal, IMMPeriod.QUARTERLY);
-            // fifth jump
-            cal = getNextIMMDate(requestNextIMM, cal, IMMPeriod.QUARTERLY);
-            }
-        
-        
-        return cal;
-    }
-
-    private boolean isIMMMonth(final Calendar cal) {
-        final int month = cal.get(Calendar.MONTH);
-        
-        switch (month) {
-        case Calendar.MARCH:
-        case Calendar.JUNE:
-        case Calendar.SEPTEMBER:
-        case Calendar.DECEMBER:
-            return true;
-        }
-        
-        return false;
-    }
-
-    /**
-     * Assumes that the month is correct, get the day for the 3rd wednesday.
-     * 
-     * @param first
-     * @return
-     */
-    private void moveToIMMDay(final Calendar cal) {
-        cal.set(Calendar.DAY_OF_MONTH, 1);
-
-        // go to 1st wed
-        final int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
-        if (dayOfWeek < Calendar.WEDNESDAY) {
-            cal.add(Calendar.DA...
 
[truncated message content] |