/* * Aipo is a groupware program developed by TOWN, Inc. * Copyright (C) 2004-2015 TOWN, Inc. * http://www.aipo.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.aimluck.eip.common; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; /** * 祝日を保持するシングルトンクラスです。 <br /> * この実装は同期化されない点に注意してください。 * */ public class ALEipHolidaysManager { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ALEipHolidaysManager.class.getName()); /** デフォルトエンコーディングを表わすシステムプロパティのキー */ protected static final String KEY_ENCODING = "content.defaultencoding"; private static ALEipHolidaysManager manager = new ALEipHolidaysManager(); /** デフォルトの祝日が書かれたファイルへのパス */ private final String FILE_HOLI_DAYS_DEFAULT = (JetspeedResources.getString( "aipo.home", "").equals("")) ? "" : JetspeedResources.getString("aipo.home", "") + File.separator + "conf" + File.separator + "holidays_default.properties"; /** ユーザ定義の祝日が書かれたファイルへのパス */ private final String FILE_HOLI_DAYS_USER = (JetspeedResources.getString( "aipo.home", "").equals("")) ? "" : JetspeedResources.getString("aipo.home", "") + File.separator + "conf" + File.separator + "holidays_user.properties"; /** デフォルトの祝日一覧 */ private Map<String, ALHoliday> defaultHolidays = null; /** ユーザ定義の祝日一覧 */ private Map<String, ALHoliday> userHolidays = null; /** * コンストラクタ */ private ALEipHolidaysManager() { defaultHolidays = new HashMap<String, ALHoliday>(); userHolidays = new HashMap<String, ALHoliday>(); loadHolidays(); } /** * クラス ALEipHolidaysManager のインスタンスを取得する. * * @return クラス ALEipHolidaysManager のインスタンス */ public static ALEipHolidaysManager getInstance() { return manager; } /** * 指定した日付が祝日であるかを検証する. * * @param date * 検証する日付 * @return 指定した日付の祝日情報.指定した日付が祝日ではない場合は,null. */ public ALHoliday isHoliday(Date date) { if (date == null) { return null; } ALHoliday holiDay = null; holiDay = isHoliday(userHolidays, date); if (holiDay == null) { holiDay = isHoliday(defaultHolidays, date); } return holiDay; } /** * 指定した日付が祝日であるかを検証する. * * @param list * @param year * @param month * @param day * @return */ private ALHoliday isHoliday(Map<String, ALHoliday> list, Date date) { String key = new SimpleDateFormat("yyyy-MM-dd").format(date); return list.get(key); } /** * 祝日情報をテキストファイルから読み込む. <br> * 祝日情報のフォーマット:祝日名,祝日日時 <br> * 例)文化の日,2004-11-03 */ private void loadHolidays() { File defaultFile = new File(FILE_HOLI_DAYS_DEFAULT); File userFile = new File(FILE_HOLI_DAYS_USER); defaultHolidays.clear(); userHolidays.clear(); BufferedReader reader = null; try { if (defaultFile.exists()) { // デフォルトの祝日を読み込む. reader = new BufferedReader(new InputStreamReader(new FileInputStream( defaultFile), ALEipConstants.DEF_CONTENT_ENCODING)); loadHoliday(reader, defaultHolidays); } if (userFile.exists()) { // ユーザ定義の祝日を読み込む. reader = new BufferedReader(new InputStreamReader( new FileInputStream(userFile), ALEipConstants.DEF_CONTENT_ENCODING)); loadHoliday(reader, userHolidays); } /*- Comparator<ALHoliday> comp = getHolidaysComparator(); if (comp != null) { Collections.sort(defaultHolidays, comp); Collections.sort(userHolidays, comp); } */ } catch (Exception ex) { logger.error("ALEipHolidaysManager.loadHolidays", ex); return; } } /** * 祝日情報をテキストファイルから読み込む. * * @param reader * @param list * @throws Exception */ private void loadHoliday(BufferedReader reader, Map<String, ALHoliday> list) throws Exception { if (reader == null) { return; } List<String> dummyList = new ArrayList<String>(); StringTokenizer st = null; ALHoliday holiDay = null; String line = null; while ((line = reader.readLine()) != null) { if (line.startsWith("#")) { continue; } st = new StringTokenizer(line, ","); if (st.countTokens() == 2) { String nameStr = st.nextToken(); String dayStr = st.nextToken(); holiDay = new ALHoliday(nameStr, dayStr); if (holiDay.getDay().validate(dummyList)) { String key = new SimpleDateFormat("yyyy-MM-dd").format(holiDay .getDay() .getValue() .getDate()); list.put(key, holiDay); } } } } /** * 祝日情報を日付で昇順に並び替える比較関数を取得する. * * @return 祝日情報を日付で昇順に並び替える比較関数 */ protected Comparator<ALHoliday> getHolidaysComparator() { Comparator<ALHoliday> com = new Comparator<ALHoliday>() { @Override public int compare(ALHoliday obj0, ALHoliday obj1) { int ret = 0; try { Date day0 = obj0.getDay().getValue().getDate(); Date day1 = obj1.getDay().getValue().getDate(); // 日付の昇順 if ((ret = day0.compareTo(day1)) == 0) { // 日付が同じ場合,祝日名の昇順 String name0 = (obj0).getName().getValue(); String name1 = (obj1).getName().getValue(); ret = name0.compareTo(name1); } } catch (RuntimeException ex) { // RuntimeException logger.error("ALEipHolidaysManager.getHolidaysComparator", ex); return -1; } catch (Exception ex) { logger.error("ALEipHolidaysManager.getHolidaysComparator", ex); return -1; } return ret; } }; return com; } }