/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.astro.internal.calc; import java.util.ArrayList; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import org.openhab.binding.astro.internal.model.SunZodiac; import org.openhab.binding.astro.internal.model.ZodiacSign; import org.openhab.binding.astro.internal.util.DateTimeUtils; /** * Calculates the sign and range of the current zodiac. * * @author Gerhard Riegler * @since 1.6.0 */ public class SunZodiacCalc { private Map<Integer, List<SunZodiac>> zodiacsByYear = new HashMap<Integer, List<SunZodiac>>(); /** * Returns the zodiac for the specified calendar. */ public SunZodiac getZodiac(Calendar calendar) { int year = calendar.get(Calendar.YEAR); List<SunZodiac> zodiacs = zodiacsByYear.get(year); if (zodiacs == null) { zodiacs = calculateZodiacs(year); zodiacsByYear.clear(); zodiacsByYear.put(year, zodiacs); } for (SunZodiac zodiac : zodiacs) { if (zodiac.isValid(calendar)) { return zodiac; } } return null; } /** * Calculates the zodiacs for the current year. */ private List<SunZodiac> calculateZodiacs(int year) { List<SunZodiac> zodiacs = new ArrayList<SunZodiac>(); zodiacs.add(new SunZodiac(ZodiacSign.ARIES, DateTimeUtils.getRange(year, Calendar.MARCH, 21, year, Calendar.APRIL, 19))); zodiacs.add(new SunZodiac(ZodiacSign.TAURUS, DateTimeUtils.getRange(year, Calendar.APRIL, 20, year, Calendar.MAY, 20))); zodiacs.add(new SunZodiac(ZodiacSign.GEMINI, DateTimeUtils.getRange(year, Calendar.MAY, 21, year, Calendar.JUNE, 20))); zodiacs.add(new SunZodiac(ZodiacSign.CANCER, DateTimeUtils.getRange(year, Calendar.JUNE, 21, year, Calendar.JULY, 22))); zodiacs.add(new SunZodiac(ZodiacSign.LEO, DateTimeUtils.getRange(year, Calendar.JULY, 23, year, Calendar.AUGUST, 22))); zodiacs.add(new SunZodiac(ZodiacSign.VIRGO, DateTimeUtils.getRange(year, Calendar.AUGUST, 23, year, Calendar.SEPTEMBER, 22))); zodiacs.add(new SunZodiac(ZodiacSign.LIBRA, DateTimeUtils.getRange(year, Calendar.SEPTEMBER, 23, year, Calendar.OCTOBER, 22))); zodiacs.add(new SunZodiac(ZodiacSign.SCORPIO, DateTimeUtils.getRange(year, Calendar.OCTOBER, 23, year, Calendar.NOVEMBER, 21))); zodiacs.add(new SunZodiac(ZodiacSign.SAGITTARIUS, DateTimeUtils.getRange(year, Calendar.NOVEMBER, 22, year, Calendar.DECEMBER, 21))); zodiacs.add(new SunZodiac(ZodiacSign.CAPRICORN, DateTimeUtils.getRange(year, Calendar.DECEMBER, 22, year + 1, Calendar.JANUARY, 19))); zodiacs.add(new SunZodiac(ZodiacSign.CAPRICORN, DateTimeUtils.getRange(year - 1, Calendar.DECEMBER, 22, year, Calendar.JANUARY, 19))); zodiacs.add(new SunZodiac(ZodiacSign.AQUARIUS, DateTimeUtils.getRange(year, Calendar.JANUARY, 20, year, Calendar.FEBRUARY, 18))); zodiacs.add(new SunZodiac(ZodiacSign.PISCES, DateTimeUtils.getRange(year, Calendar.FEBRUARY, 19, year, Calendar.MARCH, 20))); return zodiacs; } }