/*
 * 

jFin, open source derivatives trade processing

* *

Copyright (C) 2005, 2006, 2007 Morgan Brown Consultancy Ltd.

* *

This file is part of jFin.

* *

jFin is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version.

* *

jFin is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public * License for more details.

* *

You should have received a copy of the GNU General Public License along * with jFin; if not, write to the Free Software Foundation, Inc., 51 Franklin * St, Fifth Floor, Boston, MA 02110-1301 USA.

*/ package org.jfin.date.daycount; import java.util.logging.Level; import java.util.logging.Logger; import org.jfin.date.holiday.HolidayCalendar; /** * Factory class for providing a layer of abstraction from the actual * implementation of the DaycountCalculator. * * The default DaycountCalculator is being designed to be an authoratative * reference implementation. * * You may, however, wish to use your own implementation if you need to * replicate a different implementation for testing. * * Use -Djfin.DaycountCalculatorFactory=ImplementationClass to use a different * implementation from the default. * * If you wish to use more than one concrete implementation of the * DaycountCalculatorFactory within the same JVM use the static * newInstance(String daycountCalculatorFactoryClassName) method. */ public abstract class DaycountCalculatorFactory { private static Logger logger = Logger .getLogger("org.jfin.date.daycount.DaycountCalculatorFactory"); public static String daycountCalculatorFactoryClassNameParameter = "jfin.DaycountCalculatorFactory"; public static String defaultDaycountCalculatorFactoryClassName = "org.jfin.date.daycount.defaultimpl.DaycountCalculatorFactoryImpl"; /** * Get a new instance of the concrete implementation of the * DaycountCalculatorFactory based upon the System parameter * jfin.DaycountCalculatorFactory. * * If this parameter does not exist then it returns the default concrete * implementation * org.jfin.date.daycount.defaultimpl.DaycountCalculatorFactoryImpl. * * @return The new DaycountCalculatorFactory instance */ public static DaycountCalculatorFactory newInstance() { String daycountCalculatorFactoryClassName = System .getProperty(daycountCalculatorFactoryClassNameParameter); if (daycountCalculatorFactoryClassName == null) { logger.info("No system property " + daycountCalculatorFactoryClassNameParameter + " provided, using " + defaultDaycountCalculatorFactoryClassName); daycountCalculatorFactoryClassName = defaultDaycountCalculatorFactoryClassName; } else { logger.info("Found system property " + daycountCalculatorFactoryClassNameParameter + ": " + defaultDaycountCalculatorFactoryClassName); } return newInstance(daycountCalculatorFactoryClassName); } /** * Get a new instance of the concrete implementation of the * DaycountCalculatorFactory based upon the * daycountCalculatorFactoryClassName parameter. * * @param daycountCalculatorFactoryClassName * the class name of the DaycountCalculatorFactory to instantiate * @return The new DaycountCalculatorFactory instance */ public static DaycountCalculatorFactory newInstance( String daycountCalculatorFactoryClassName) { logger .fine("Constructing new instance of day count calculator factory."); DaycountCalculatorFactory factory = null; try { logger.fine("Attempting to instantiate " + daycountCalculatorFactoryClassName); Class daycountCalculatorFactoryClass = Class .forName(daycountCalculatorFactoryClassName); factory = (DaycountCalculatorFactory) daycountCalculatorFactoryClass .newInstance(); } catch (ClassNotFoundException e) { logger .log( Level.SEVERE, "Cannot create a DaycountCalculatorFactory with class " + daycountCalculatorFactoryClassName + ". Check that this class exists within the classpath.", e); throw new DaycountException(e); } catch (InstantiationException e) { logger .log( Level.SEVERE, "Cannot create a DaycountCalculatorFactory with class " + daycountCalculatorFactoryClassName + ". Check that this class implements a default constructor.", e); throw new DaycountException(e); } catch (IllegalAccessException e) { logger .log( Level.SEVERE, "Cannot create a DaycountCalculatorFactory with class " + daycountCalculatorFactoryClassName + ". Check that this class implements a public default constructor.", e); throw new DaycountException(e); } catch (ClassCastException e) { logger .log( Level.SEVERE, "Cannot create a DaycountCalculatorFactory with class " + daycountCalculatorFactoryClassName + ". Check that this class extends DaycountCalculatorFactory.", e); throw new DaycountException(e); } return factory; } /** * Retrieve an instance of an ISDA Actual/Actual daycount calculator. * * Also known as Actual/Actual Historical. * * @return The DaycountCalculator */ public abstract DaycountCalculator getISDAActualActual(); /** * Retrieve an instance of an ISMA Actual/Actual daycount calculator. * * Usually used for Euro denominated bonds and US Treasury bonds hence also * known as Actual/Actual Bond. * * @return The DaycountCalculator */ public abstract DaycountCalculator getISMAActualActual(); /** * Retrieve an instance of an AFB Actual/Actual daycount calculator. * * Also known as the AFB Method. * * @return The DaycountCalculator */ public abstract DaycountCalculator getAFBActualActual(); /** * Retrieve an instance of an US 30/360 daycount calculator. * * Also known as 30/360. * * @return The DaycountCalculator */ public abstract DaycountCalculator getUS30360(); /** * Retrieve an instance of an European 30/360 daycount calculator. * * Also known as 30E/360 * * @return The DaycountCalculator */ public abstract DaycountCalculator getEU30360(); /** * Retrieve an instance of an Italian 30/360 daycount calculator. * * @return The DaycountCalculator */ public abstract DaycountCalculator getIT30360(); /** * Retrieve an instance of an Actual/360 daycount calculator. * * @return The DaycountCalculator */ public abstract DaycountCalculator getActual360(); /** * Retrieve an instance of an Actual/365 Fixed daycount calculator. * * Also known just as Actual/365. * * @return The DaycountCalculator */ public abstract DaycountCalculator getActual365Fixed(); /** * Retrieve an instance of an Actual/366 Fixed daycount calculator. * * Also known just as Actual/365. * * @return The DaycountCalculator */ public abstract DaycountCalculator getActual366(); /** * Retrieve an instance of an Business/252 daycount calculator for the * provided HolidayCalendar. * * Also sometimes referred to as Brazilian. * * @return The DaycountCalculator */ public abstract DaycountCalculator getBusiness252( HolidayCalendar holidayCalendar); public DaycountCalculator getDaycountCalculator(String name) { if(name.equals("ISDAActualActual")) { return getISDAActualActual(); } else if(name.equals("ISMAActualActual")) { return getISMAActualActual(); } else if(name.equals("AFBActualActual")) { return getAFBActualActual(); } else if(name.equals("US30360")) { return getUS30360(); } else if(name.equals("EU30360")) { return getEU30360(); } else if(name.equals("IT30360")) { return getIT30360(); } else if(name.equals("Actual360")) { return getActual360(); } else if(name.equals("Actual365Fixed")) { return getActual365Fixed(); } else if(name.equals("Actual366")) { return getActual366(); } else { throw new DaycountException("Unknown day count calculator \""+name+"\""); } } public abstract String[] getAvailableDaycountCalculators(); }

Ads help maintain this website.