2 * Copyright (c) 2010-2022 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.astro.internal.calc;
15 import java.util.ArrayList;
16 import java.util.Calendar;
17 import java.util.HashMap;
18 import java.util.List;
20 import java.util.Optional;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.openhab.binding.astro.internal.model.SunZodiac;
24 import org.openhab.binding.astro.internal.model.ZodiacSign;
25 import org.openhab.binding.astro.internal.util.DateTimeUtils;
28 * Calculates the sign and range of the current zodiac.
30 * @author Gerhard Riegler - Initial contribution
33 public class SunZodiacCalc {
34 private Map<Integer, List<SunZodiac>> zodiacsByYear = new HashMap<>();
37 * Returns the zodiac for the specified calendar.
39 public Optional<SunZodiac> getZodiac(Calendar calendar) {
41 int year = calendar.get(Calendar.YEAR);
42 List<SunZodiac> zodiacs;
44 if (zodiacsByYear.containsKey(year)) {
45 zodiacs = zodiacsByYear.get(year);
47 zodiacs = calculateZodiacs(year);
48 zodiacsByYear.clear();
49 zodiacsByYear.put(year, zodiacs);
52 return zodiacs != null ? zodiacs.stream().filter(z -> z.isValid(calendar)).findFirst() : Optional.empty();
56 * Calculates the zodiacs for the current year.
58 private List<SunZodiac> calculateZodiacs(int year) {
59 List<SunZodiac> zodiacs = new ArrayList<>();
61 zodiacs.add(new SunZodiac(ZodiacSign.ARIES,
62 DateTimeUtils.getRange(year, Calendar.MARCH, 21, year, Calendar.APRIL, 19)));
63 zodiacs.add(new SunZodiac(ZodiacSign.TAURUS,
64 DateTimeUtils.getRange(year, Calendar.APRIL, 20, year, Calendar.MAY, 20)));
65 zodiacs.add(new SunZodiac(ZodiacSign.GEMINI,
66 DateTimeUtils.getRange(year, Calendar.MAY, 21, year, Calendar.JUNE, 20)));
67 zodiacs.add(new SunZodiac(ZodiacSign.CANCER,
68 DateTimeUtils.getRange(year, Calendar.JUNE, 21, year, Calendar.JULY, 22)));
69 zodiacs.add(new SunZodiac(ZodiacSign.LEO,
70 DateTimeUtils.getRange(year, Calendar.JULY, 23, year, Calendar.AUGUST, 22)));
71 zodiacs.add(new SunZodiac(ZodiacSign.VIRGO,
72 DateTimeUtils.getRange(year, Calendar.AUGUST, 23, year, Calendar.SEPTEMBER, 22)));
73 zodiacs.add(new SunZodiac(ZodiacSign.LIBRA,
74 DateTimeUtils.getRange(year, Calendar.SEPTEMBER, 23, year, Calendar.OCTOBER, 22)));
75 zodiacs.add(new SunZodiac(ZodiacSign.SCORPIO,
76 DateTimeUtils.getRange(year, Calendar.OCTOBER, 23, year, Calendar.NOVEMBER, 21)));
77 zodiacs.add(new SunZodiac(ZodiacSign.SAGITTARIUS,
78 DateTimeUtils.getRange(year, Calendar.NOVEMBER, 22, year, Calendar.DECEMBER, 21)));
79 zodiacs.add(new SunZodiac(ZodiacSign.CAPRICORN,
80 DateTimeUtils.getRange(year, Calendar.DECEMBER, 22, year + 1, Calendar.JANUARY, 19)));
81 zodiacs.add(new SunZodiac(ZodiacSign.CAPRICORN,
82 DateTimeUtils.getRange(year - 1, Calendar.DECEMBER, 22, year, Calendar.JANUARY, 19)));
83 zodiacs.add(new SunZodiac(ZodiacSign.AQUARIUS,
84 DateTimeUtils.getRange(year, Calendar.JANUARY, 20, year, Calendar.FEBRUARY, 18)));
85 zodiacs.add(new SunZodiac(ZodiacSign.PISCES,
86 DateTimeUtils.getRange(year, Calendar.FEBRUARY, 19, year, Calendar.MARCH, 20)));