]> git.basschouten.com Git - openhab-addons.git/blob
06e1f0aa59cbefa14ac8476684418bd8e5a9fe39
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.astro.internal.calc;
14
15 import java.util.ArrayList;
16 import java.util.Calendar;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Optional;
21
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;
26
27 /**
28  * Calculates the sign and range of the current zodiac.
29  *
30  * @author Gerhard Riegler - Initial contribution
31  */
32 @NonNullByDefault
33 public class SunZodiacCalc {
34     private Map<Integer, List<SunZodiac>> zodiacsByYear = new HashMap<>();
35
36     /**
37      * Returns the zodiac for the specified calendar.
38      */
39     public Optional<SunZodiac> getZodiac(Calendar calendar) {
40
41         int year = calendar.get(Calendar.YEAR);
42         List<SunZodiac> zodiacs;
43
44         if (zodiacsByYear.containsKey(year)) {
45             zodiacs = zodiacsByYear.get(year);
46         } else {
47             zodiacs = calculateZodiacs(year);
48             zodiacsByYear.clear();
49             zodiacsByYear.put(year, zodiacs);
50         }
51
52         return zodiacs != null ? zodiacs.stream().filter(z -> z.isValid(calendar)).findFirst() : Optional.empty();
53     }
54
55     /**
56      * Calculates the zodiacs for the current year.
57      */
58     private List<SunZodiac> calculateZodiacs(int year) {
59         List<SunZodiac> zodiacs = new ArrayList<>();
60
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)));
87
88         return zodiacs;
89     }
90 }