/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package net.rrm.ehour.ui.admin.config; import com.google.common.collect.Lists; import net.rrm.ehour.config.EhourConfig; import net.rrm.ehour.config.EhourConfigStub; import net.rrm.ehour.domain.UserRole; import net.rrm.ehour.ui.common.sort.LocaleComparator; import net.rrm.ehour.util.DateUtil; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import java.io.Serializable; import java.util.*; /** * Configuration backing bean * Created on Apr 21, 2009, 3:13:25 PM * * @author Thies Edeling (thies@te-con.nl) */ public class MainConfigBackingBean implements Serializable { private static final long serialVersionUID = -682573285773646807L; private static final Logger LOGGER = Logger.getLogger(MainConfigBackingBean.class); public static final List<String> VALID_REMINDER_DAYS = Lists.newArrayList("SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"); private boolean translationsOnly = false; private boolean smtpAuthentication = false; private EhourConfigStub config; private Date firstWeekStart; private UserRole convertManagersTo = UserRole.ADMIN; private Integer reminderMinute; private Integer reminderHour; private String reminderDay; public MainConfigBackingBean(EhourConfigStub config) { this.config = config; smtpAuthentication = StringUtils.isNotBlank(config.getSmtpUsername()) && StringUtils.isNotBlank(config.getSmtpPassword()); Calendar cal = new GregorianCalendar(); DateUtil.dayOfWeekFix(cal); cal.set(Calendar.DAY_OF_WEEK, config.getFirstDayOfWeek()); firstWeekStart = cal.getTime(); splitCronExpression(config.getReminderTime()); updateReminderCronExpression(); } private void splitCronExpression(String cron) { if (StringUtils.isBlank(cron)) { resetReminderTimeToDefault(); return; } String[] splittedCron = cron.split(" "); if (splittedCron.length != 6) { LOGGER.error(cron + " is not a valid cron expression, expecting 6 elements. Defaulting to FRI 17:30"); resetReminderTimeToDefault(); return; } try { reminderMinute = Integer.valueOf(splittedCron[1]); reminderHour = Integer.valueOf(splittedCron[2]); reminderDay = splittedCron[5]; if (reminderMinute >= 60 || reminderHour >= 24 || !VALID_REMINDER_DAYS.contains(reminderDay)) { LOGGER.error(cron + " contains illegal time elements."); resetReminderTimeToDefault(); } } catch (NumberFormatException nfe) { LOGGER.error(cron + " contains items that can not be parsed for the UI (although it may be a legal cron expression)."); resetReminderTimeToDefault(); } } private void resetReminderTimeToDefault() { LOGGER.info("Defaulting reminder time to FRI 17:30"); reminderMinute = 30; reminderHour = 17; reminderDay = "FRI"; } @SuppressWarnings("UnusedDeclaration") public List<Locale> getAvailableLanguages() { Locale[] locales = Locale.getAvailableLocales(); Map<String, Locale> localeMap = new HashMap<>(); // remove all variants for (Locale locale : locales) { if (isTranslationsOnly() && !ArrayUtils.contains(config.getAvailableTranslations(), locale.getLanguage())) { continue; } if (localeMap.containsKey(locale.getLanguage()) && locale.getDisplayName().indexOf('(') != -1) { continue; } localeMap.put(locale.getLanguage(), locale); } SortedSet<Locale> localeSet = new TreeSet<>(new LocaleComparator(LocaleComparator.CompareType.LANGUAGE)); for (Locale locale : localeMap.values()) { localeSet.add(locale); } return new ArrayList<>(localeSet); } public boolean isTranslationsOnly() { return translationsOnly; } public void setTranslationsOnly(boolean translationsOnly) { this.translationsOnly = translationsOnly; } public static List<Locale> getAvailableLocales() { List<Locale> locales = new ArrayList<>(); for (Locale locale : Locale.getAvailableLocales()) { if (!StringUtils.isBlank(locale.getDisplayCountry())) { locales.add(locale); } } Collections.sort(locales, new LocaleComparator(LocaleComparator.CompareType.COUNTRY)); return locales; } public static List<Locale> getAvailableCurrencies() { List<Locale> locales = getAvailableLocales(); SortedSet<Locale> currencyLocales = new TreeSet<>(new Comparator<Locale>() { public int compare(Locale o1, Locale o2) { Currency curr1 = Currency.getInstance(o1); Currency curr2 = Currency.getInstance(o2); return (o1.getDisplayCountry() + ": " + curr1.getSymbol(o1)) .compareTo(o2.getDisplayCountry() + ": " + curr2.getSymbol(o2)); } } ); for (Locale locale : locales) { if (!StringUtils.isBlank(locale.getCountry())) { currencyLocales.add(locale); } } return new ArrayList<>(currencyLocales); } public Locale getLocaleLanguage() { return config.getLanguageLocale(); } public void setLocaleLanguage(Locale localeLanguage) { config.setLocaleLanguage(localeLanguage); } public Locale getLocaleCountry() { return config.getFormattingLocale(); } public void setLocaleCountry(Locale localeCountry) { config.setLocaleFormatting(localeCountry); } public void setCurrency(Locale currencySymbol) { this.config.setCurrency(currencySymbol); } public EhourConfig getConfig() { return config; } public boolean isSmtpAuthentication() { return smtpAuthentication; } public void setSmtpAuthentication(boolean smtpAuthentication) { this.smtpAuthentication = smtpAuthentication; } public Date getFirstWeekStart() { return firstWeekStart; } public void setFirstWeekStart(Date firstWeekStart) { this.firstWeekStart = firstWeekStart; Calendar cal = new GregorianCalendar(); cal.setTime(firstWeekStart); config.setFirstDayOfWeek(cal.get(Calendar.DAY_OF_WEEK)); } public UserRole getConvertManagersTo() { return convertManagersTo; } public void setConvertManagersTo(UserRole convertManagersTo) { this.convertManagersTo = convertManagersTo; } public Integer getReminderMinute() { return reminderMinute; } public void setReminderMinute(Integer reminderMinute) { this.reminderMinute = reminderMinute; updateReminderCronExpression(); } public Integer getReminderHour() { return reminderHour; } public void setReminderHour(Integer reminderHour) { this.reminderHour = reminderHour; updateReminderCronExpression(); } public String getReminderDay() { return reminderDay; } public void setReminderDay(String reminderDay) { this.reminderDay = reminderDay; updateReminderCronExpression(); } private void updateReminderCronExpression() { String cron = String.format("0 %d %d * * %s", reminderMinute, reminderHour, reminderDay); config.setReminderTime(cron); } }