WeatherForecast.java

package sk.iway.iwcm.components.weather;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import sk.iway.iwcm.Cache;
import sk.iway.iwcm.components.enumerations.EnumerationDataDB;
import sk.iway.iwcm.components.enumerations.model.EnumerationDataBean;
import sk.iway.iwcm.database.SimpleQuery;

/**
 * WeatherForecast.java
 *
 * Class WeatherForecast is used for
 *
 *
 * Title        webjet8
 * Company      Interway a.s. (www.interway.sk)
 * Copyright    Interway a.s. (c) 2001-2018
 * @author      $Author: mhruby $
 * @version     $Revision: 1.0 $
 * created      15.8.2018 13:12
 * modified     15.8.2018 13:12
 */

public class WeatherForecast {

    private List<DayForecastBean> dayForecastBeanList;
    private List<HourForecastBean> hourForecastBeanList;    // zoradene 2-hodinove predpovede pocasia (na dnesok a zajtrasok) kedze o polnoci vyprsi tato predpoved z cache
    private EnumerationDataBean city;

    private static final String WEATHER_CACHE_PREFIX = "WEATHER_";
    private static final String HOUR = "HOUR_";

    /**
     * Konstruktor, pocas ktoreho sa inicializuje objekt z cache pamate alebo nanovo z xml suboru ktory nasledne ulozi do cache.
     * @param id dat ciselnika ktore reprezentuju mesto s GPS suradnicami
     */
    public WeatherForecast(int id) {
        // ak nenajde ziaden setting pouzi toto mesto
        EnumerationDataBean cityBean = EnumerationDataDB.getInstance().getById(id);
        if (cityBean == null) {
            cityBean = EnumerationDataDB.getInstance().getById(new SimpleQuery().forInt("SELECT enumeration_data_id FROM enumeration_data WHERE string1 LIKE 'Bratislava'"));
        }

        initialize(cityBean);
    }

    public WeatherForecast(String cityName, BigDecimal lat, BigDecimal lon)
    {
        EnumerationDataBean cityBean = new EnumerationDataBean();
        cityBean.setString1(cityName);
        cityBean.setDecimal1(lat);
        cityBean.setDecimal2(lon);

        initialize(cityBean);
    }

    @SuppressWarnings("unchecked")
    private void initialize(EnumerationDataBean city)
    {
        this.city = city;
        if (this.city == null) return;

        Cache c = Cache.getInstance();

        BigDecimal lat = city.getDecimal1();
        BigDecimal lon = city.getDecimal2();

        String CACHE_KEY_SUFFIX = lat.toString()+","+lon.toString();

        this.dayForecastBeanList = (List<DayForecastBean>)c.getObject(WEATHER_CACHE_PREFIX + CACHE_KEY_SUFFIX);
        this.hourForecastBeanList = (List<HourForecastBean>)c.getObject(WEATHER_CACHE_PREFIX + HOUR + CACHE_KEY_SUFFIX);

        if (this.dayForecastBeanList == null || this.hourForecastBeanList == null) {
            ImportWeather importWeather = new ImportWeather();
            this.dayForecastBeanList = importWeather.readWeather(city.getDecimal1(), city.getDecimal2());// lat, lon
            c.setObjectByExpiry(WEATHER_CACHE_PREFIX + CACHE_KEY_SUFFIX, dayForecastBeanList, dayForecastBeanList.get(1).getDate().getTime(),false);
            this.hourForecastBeanList = importWeather.getHourForecastBeanList();
            c.setObjectByExpiry(WEATHER_CACHE_PREFIX + HOUR + CACHE_KEY_SUFFIX, hourForecastBeanList, dayForecastBeanList.get(1).getDate().getTime(),false);
        }
    }


    public List<DayForecastBean> getDayForecastBeanList() {
        return dayForecastBeanList;
    }

    public List<HourForecastBean> getHourForecastBeanList() {
        return hourForecastBeanList;
    }

    public EnumerationDataBean getCity() {
        return city;
    }

    public void setCity(EnumerationDataBean city) {
        this.city = city;
    }

    /**
     * Vrati 8 dvojhodinovych predpovedi podla aktualneho casu.
     * @return
     */
    public List<HourForecastBean> getCurrentHourForecast() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR_OF_DAY,3);
        HourForecastBean start = null;
        for (HourForecastBean item : this.hourForecastBeanList) {
            if (cal.getTime().after(item.getDateFrom())) { // cas sedi
                start = item;
                break;
            }
        }
        int i = this.hourForecastBeanList.indexOf(start);
        if (i+8<this.hourForecastBeanList.size())
            return this.hourForecastBeanList.subList(i, i+8);
        else
            return this.hourForecastBeanList.subList(i, this.hourForecastBeanList.size()-1);
    }
}