/* * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. * If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2014, MPL CodeInside http://codeinside.ru */ package ru.codeinside.adm.parser; import ru.codeinside.adm.database.BusinessCalendarDate; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Разбор файла с датами дополнительных выходных и рабочих дней */ public class BusinessCalendarParser { private static Pattern LINE_PATTERN = Pattern.compile("(0[1-9]|[12][0-9]|3[01])\\.(0[1-9]|1[012])\\.(21|20)(\\d\\d);(0|1)"); /** * Разбор файла с датами дополнительных выходных и рабочих дней * * @param is поток из файла с датами. Каждая строка должна содержать данные о доп выходном в формате дата;0 или 1 * дата должна быть представлена в формате dd.MM.yyyy * второе поле должно содержать 0 или 1. 0 - если дата дополнительный рабочий день, 1 - если дата дополнительный выходной день * @return даты дополнительных выходных и рабочих дней */ public List<BusinessCalendarDate> parseBusinessCalendarDate(InputStream is) throws IOException, ParseException { final BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); Map<Date, BusinessCalendarDate> dates = new HashMap<Date, BusinessCalendarDate>(); String line; SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy"); while ((line = reader.readLine()) != null) { Matcher matcher = LINE_PATTERN.matcher(line); if (matcher.matches()) { String day = matcher.group(1); String month = matcher.group(2); String century = matcher.group(3); String year = matcher.group(4); String isHoliday = matcher.group(5); BusinessCalendarDate businessDate = new BusinessCalendarDate(); Date date = df.parse(day + "." + month + "." + century + year); businessDate.setDate(date); businessDate.setWorkedDay("0".equals(isHoliday)); dates.put(date, businessDate); } } return new ArrayList<BusinessCalendarDate>(dates.values()); } }