org.devdom.commons.Feriados.java Source code

Java tutorial

Introduction

Here is the source code for org.devdom.commons.Feriados.java

Source

/*
 * The MIT License
 *
 * Copyright 2014 Developers Dominicanos.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

package org.devdom.commons;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import org.devdom.commons.dto.Feriado;
import org.devdom.commons.exceptions.MalformedJSONException;
import org.devdom.commons.exceptions.RequesterInformationException;
import org.devdom.commons.type.FormatType;
import org.devdom.commons.util.Configuration;
import org.devdom.commons.util.Utils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Clase utilizada para manejar los das feriados en la Repblica Dominicana
 * para el ao en curso.
 * 
 * @author Carlos Vsquez Polanco
 * @see Feriado
 * @since 0.5.1
 */
public class Feriados extends Listable<Feriado> {

    public Feriados() {
        super(Configuration.DATA_FERIADOS_URL, "UTF-8");
    }

    /**
     * 
     * Listado de das feriados segn el Ministerio de Trabajo de la Repblica Dominicana
     * 
     * @return ArrayList de objetos Feriado
     * @see Feriado
     * @throws RequesterInformationException si hubo error en la recepcin de informacin
     * @throws MalformedJSONException si hubo error en el formato o validacin del JSON
     * @throws ParseException si hubo error de parseo
     */
    @Override
    public List<Feriado> getList() throws RequesterInformationException, ParseException {

        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);

        return getList(year);
    }

    /**
     * 
     * <p>Listado de das feriados segn el Ministerio de Trabajo de la Repblica Dominicana.
     * El mtodo recibe el ao que se desea evaluar.
     * 
     * <p>Este mtodo aun funciona con el ao en curso, de intentar ver un ao pasado ser 
     * lanzada una excepcin. El mtodo fue pensado para cuando esta restriccin del 
     * servicio sea liberada.
     * 
     * @param year ao a ser evaluado
     * @return ArrayList de objetos Feriado
     * @see Feriado
     * @throws RequesterInformationException si hubo error en la recepcin de informacin
     * @throws MalformedJSONException si hubo error en el formato o validacin del JSON
     * @throws ParseException si hubo error de parseo 
     */
    public List<Feriado> getList(int year) throws RequesterInformationException, ParseException {

        String json = getResponse(buildURL(FormatType.JSON, String.valueOf(year)));
        List<Feriado> list = new ArrayList<Feriado>();

        //Verificar el formato de la informacin retornada para parsearla
        JSONArray jsonArray = parseJSONArray(json);
        int len = jsonArray.length();

        /*
        Extraer todos los objetos y convertirlos a entidades de tipo feriado
        para aadirlos a la lista.
        */
        for (int i = 0; i < len; i++) {
            try {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                list.add(getFeriadoObject(jsonObject));
            } catch (JSONException ex) {
                throw new MalformedJSONException(ex.getMessage(), ex);
            }
        }

        return list;
    }

    /**
     * 
     * <p>Mtodo utilizado para saber si el da en curso es feriado.
     * 
     * <p>Primero es verificada la fecha a la que fue movida por disposicin
     * de la ley Dominicana. Si la fecha festiva no es movida se revisa su fecha
     * original.
     * 
     * @return boolean que determina si el da actual es feriado
     * @throws RequesterInformationException si hubo error en la recepcin de informacin
     * @throws MalformedJSONException si hubo error en el formato o validacin del JSON
     * @throws ParseException si hubo error de parseo
     */
    public boolean isTodayHoliday() throws RequesterInformationException, ParseException {

        TimeZone timeZone = TimeZone.getTimeZone(Configuration.DR_TIME_ZONE);
        Calendar calendar = Calendar.getInstance(timeZone);
        int currentDayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
        int year = calendar.get(Calendar.YEAR);

        List<Feriado> list = getList(year);

        for (Feriado feriado : list) {
            Date holiday = feriado.getFechaMovido();

            if (holiday == null) {
                holiday = feriado.getFechaOriginal();
            }

            Calendar holidayCalendar = Calendar.getInstance();
            holidayCalendar.setTime(holiday);
            int holidayDayOfYear = holidayCalendar.get(Calendar.DAY_OF_YEAR);

            if (currentDayOfYear == holidayDayOfYear) {
                return true;
            }

        }
        return false;

    }

    /**
     * 
     * Obtener la definicin de un da feriado segn el Objeto JSON suplido
     * 
     * @param json RAW del JSON recibido para ser formateado
     * @return Objeto Feriado
     * @see Feriado
     * @throws MalformedJSONException si hubo error en el formato o validacin del JSON
     */
    private static Feriado getFeriadoObject(JSONObject json) throws MalformedJSONException, ParseException {

        try {
            int id = json.getInt("id");
            Date fechaOriginal = json.isNull("fecha_original") ? null
                    : Utils.convertStringToDate(json.getString("fecha_original"));
            Date fechaMovido = json.isNull("fecha_movido") ? null
                    : Utils.convertStringToDate(json.getString("fecha_movido"));
            String motivo = json.getString("motivo");

            return new Feriado(id, fechaOriginal, fechaMovido, motivo);
        } catch (JSONException ex) {
            throw new MalformedJSONException(ex.getMessage(), ex);
        }
    }

    /**
     * Obtener objeto Feriado segn la posicin solicitada
     * 
     * @param id posicin de da feriado
     * @return Objeto Feriado
     * @see Feriado
     * @throws RequesterInformationException si hubo error en la recepcin de informacin
     * @throws ParseException si hubo error de parseo
     */
    public Feriado get(int id) throws RequesterInformationException, ParseException {

        Calendar calendar = Calendar.getInstance();

        return this.get(id, calendar.get(Calendar.YEAR));
    }

    /**
     * Obtener objeto Feriado segn la posicin solicitada
     * 
     * @param id posicin de da feriado
     * @param year ao deseado
     * @return Objeto Feriado
     * @see Feriado
     * @throws RequesterInformationException si hubo error en la recepcin de informacin
     * @throws ParseException si hubo error de parseo
     */
    public Feriado get(int id, int year) throws RequesterInformationException, ParseException {

        for (Feriado feriado : this.getList(year)) {
            if (feriado.getId() == id) {
                return feriado;
            }
        }
        return null;
    }

    /**
     * Obtener objeto Feriado segn la posicin solicitada
     * 
     * @param id posicin de da feriado
     * @return Objeto Feriado
     * @see Feriado
     * @throws RequesterInformationException si hubo error en la recepcin de informacin
     * @throws ParseException si hubo error de parseo
     * @throws NumberFormatException si hubo un intento de pasar caracteres por valores numricos
     */
    @Override
    public Feriado get(String id) throws RequesterInformationException, ParseException, NumberFormatException {

        if (!Utils.hasOnlyDigits(id)) {
            throw new NumberFormatException("Solo se permiten dgitos");
        }

        return get(Integer.parseInt(id));
    }

}