/* * 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.config.service; import net.rrm.ehour.appconfig.EhourHomeUtil; import net.rrm.ehour.audit.annot.Auditable; import net.rrm.ehour.audit.annot.NonAuditable; import net.rrm.ehour.config.*; import net.rrm.ehour.domain.AuditActionType; import net.rrm.ehour.domain.AuditType; import net.rrm.ehour.domain.BinaryConfiguration; import net.rrm.ehour.domain.Configuration; import net.rrm.ehour.persistence.config.dao.BinaryConfigurationDao; import net.rrm.ehour.persistence.config.dao.ConfigurationDao; import net.rrm.ehour.persistence.value.ImageLogo; import net.rrm.ehour.user.service.UserService; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; /** * Configuration service */ @Service("configurationService") public class ConfigurationServiceImpl implements ConfigurationService { private static final String EXCEL_DEFAULT_LOGO = "excel_default_logo.png"; private static final long serialVersionUID = -8862725896852558151L; @Autowired private ConfigurationDao configDao; @Autowired private BinaryConfigurationDao binConfigDAO; @Autowired private TranslationDiscovery translationDiscovery; @Autowired private UserService userService; private static final Logger LOGGER = Logger.getLogger(ConfigurationServiceImpl.class); @Transactional @Auditable(actionType = AuditActionType.UPDATE) public void persistExcelLogo(ImageLogo logo) { persistLogo("excelHeader", logo); } private void persistLogo(String prefix, ImageLogo logo) { BinaryConfiguration logoDomObj = new BinaryConfiguration(); logoDomObj.setConfigValue(logo.getImageData()); logoDomObj.setConfigKey(prefix + "Logo"); binConfigDAO.persist(logoDomObj); Configuration logoType = new Configuration(prefix + "LogoType", logo.getImageType()); Configuration logoWidth = new Configuration(prefix + "LogoWidth", Integer.toString(logo.getWidth())); Configuration logoHeight = new Configuration(prefix + "LogoHeight", Integer.toString(logo.getHeight())); configDao.persist(logoType); configDao.persist(logoWidth); configDao.persist(logoHeight); } @NonAuditable @Transactional public ImageLogo getExcelLogo() { ImageLogo logo = getPersistedLogo("excelHeader"); if (logo == null) { LOGGER.debug("No logo found in database, using default logo."); logo = getDefaultExcelLogo(); } return logo; } private ImageLogo getPersistedLogo(String prefix) { BinaryConfiguration logoDomObj = binConfigDAO.findById(prefix + "Logo"); ImageLogo logo = null; if (isLogoNotEmpty(logoDomObj)) { logo = new ImageLogo(); logo.setImageData(logoDomObj.getConfigValue()); Configuration logoType = configDao.findById(prefix + "LogoType"); logo.setImageType(logoType.getConfigValue()); Configuration logoWidth = configDao.findById(prefix + "LogoWidth"); logo.setWidth(Integer.parseInt(logoWidth.getConfigValue())); Configuration logoHeight = configDao.findById(prefix + "LogoHeight"); logo.setHeight(Integer.parseInt(logoHeight.getConfigValue())); } return logo; } private boolean isLogoNotEmpty(BinaryConfiguration logoDomObj) { return (logoDomObj != null && logoDomObj.getConfigValue() != null && logoDomObj.getConfigValue().length > 0); } private ImageLogo getDefaultExcelLogo() { byte[] bytes = getDefaultExcelLogoBytes(); ImageLogo logo = new ImageLogo(); logo.setImageData(bytes); logo.setImageType("png"); logo.setWidth(499); logo.setHeight(120); return logo; } private byte[] getDefaultExcelLogoBytes() { byte[] bytes; final File file = EhourHomeUtil.getFileInConfDir(EXCEL_DEFAULT_LOGO); if (!file.exists()) { LOGGER.error("default logo not found"); } try (FileInputStream is = new FileInputStream(file)) { bytes = new byte[(int) file.length()]; int offset = 0; int numRead; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } } catch (IOException e) { LOGGER.error("Could not fetch default logo", e); bytes = new byte[0]; } return bytes; } @Transactional @NonAuditable public EhourConfigStub getConfiguration() { List<Configuration> configs = configDao.findAll(); EhourConfigStub config = new EhourConfigStub(); List<String> translations = translationDiscovery.getTranslations(); if (translations != null) { config.setAvailableTranslations(translations.toArray(new String[translations.size()])); } for (Configuration configuration : configs) { String key = configuration.getConfigKey(); String value = configuration.getConfigValue(); if (key.equalsIgnoreCase(ConfigurationItem.COMPLETE_DAY_HOURS.getDbField())) { config.setCompleteDayHours(Float.parseFloat(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.LOCALE_CURRENCY.getDbField())) { config.setCurrency(LocaleUtil.forLanguageTag(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.LOCALE_LANGUAGE.getDbField())) { config.setLocaleLanguage(LocaleUtil.forLanguageTag(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.LOCALE_COUNTRY.getDbField())) { config.setLocaleFormatting(LocaleUtil.forLanguageTag(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.SHOW_TURNOVER.getDbField())) { config.setShowTurnover(Boolean.parseBoolean(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.TIMEZONE.getDbField())) { config.setTimeZone(value); } else if (key.equalsIgnoreCase(ConfigurationItem.MAIL_FROM.getDbField())) { config.setMailFrom(value); } else if (key.equalsIgnoreCase(ConfigurationItem.MAIL_SMTP.getDbField())) { config.setMailSmtp(value); } else if (key.equalsIgnoreCase(ConfigurationItem.MAIL_SMTP_USERNAME.getDbField())) { config.setSmtpUsername(value); } else if (key.equalsIgnoreCase(ConfigurationItem.MAIL_SMTP_PASSWORD.getDbField())) { config.setSmtpPassword(value); } else if (key.equalsIgnoreCase(ConfigurationItem.MAIL_SMTP_PORT.getDbField())) { config.setSmtpPort(value); } else if (key.equalsIgnoreCase(ConfigurationItem.DEMO_MODE.getDbField())) { config.setDemoMode(Boolean.parseBoolean(value)); } else if (key.equalsIgnoreCase((ConfigurationItem.INITIALIZED.getDbField()))) { config.setInitialized(Boolean.parseBoolean(value)); } else if (key.equalsIgnoreCase((ConfigurationItem.FIRST_DAY_OF_WEEK.getDbField()))) { config.setFirstDayOfWeek((int) (Float.parseFloat(value))); } else if (key.equalsIgnoreCase((ConfigurationItem.AUDIT_TYPE.getDbField()))) { config.setAuditType(AuditType.fromString(value)); } else if (key.equalsIgnoreCase((ConfigurationItem.VERSION.getDbField()))) { config.setVersion(value); } else if (key.equalsIgnoreCase(ConfigurationItem.PM_PRIVILEGE.getDbField())) { config.setPmPrivilege(PmPrivilege.valueOf(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.SPLIT_ADMIN_ROLE.getDbField())) { config.setSplitAdminRole(Boolean.parseBoolean(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.REMINDER_ENABLED.getDbField())) { config.setReminderEnabled(Boolean.parseBoolean(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.REMINDER_CC.getDbField())) { config.setReminderCC(value); } else if (key.equalsIgnoreCase(ConfigurationItem.REMINDER_BODY.getDbField())) { config.setReminderBody(value); } else if (key.equalsIgnoreCase(ConfigurationItem.REMINDER_MIN_HOURS.getDbField())) { config.setReminderMinimalHours((int) Float.parseFloat(value)); } else if (key.equalsIgnoreCase(ConfigurationItem.REMINDER_SUBJECT.getDbField())) { config.setReminderSubject(value); } else if (key.equalsIgnoreCase(ConfigurationItem.REMINDER_TIME.getDbField())) { config.setReminderTime(value); } } return config; } @Override public List<Configuration> findAllConfiguration() { return configDao.findAll(); } @Transactional @Auditable(actionType = AuditActionType.UPDATE) public void persistConfiguration(EhourConfig config) { LOGGER.debug("Persisting config"); persistConfig(ConfigurationItem.LOCALE_CURRENCY.getDbField(), LocaleUtil.toLanguageTag((config.getCurrency()))); if (config.getCompleteDayHours() != 0) { persistConfig(ConfigurationItem.COMPLETE_DAY_HOURS.getDbField(), config.getCompleteDayHours()); } persistConfig(ConfigurationItem.LOCALE_COUNTRY.getDbField(), LocaleUtil.toLanguageTag(config.getFormattingLocale())); persistConfig(ConfigurationItem.LOCALE_LANGUAGE.getDbField(), LocaleUtil.toLanguageTag(config.getLanguageLocale())); persistConfig(ConfigurationItem.DONT_FORCE_LANGUAGE.getDbField(), config.isDontForceLanguage()); persistConfig(ConfigurationItem.SHOW_TURNOVER.getDbField(), config.isShowTurnover()); persistConfig(ConfigurationItem.MAIL_FROM.getDbField(), config.getMailFrom()); persistConfig(ConfigurationItem.MAIL_SMTP.getDbField(), config.getMailSmtp()); persistConfig(ConfigurationItem.MAIL_SMTP_USERNAME.getDbField(), config.getSmtpUsername()); persistConfig(ConfigurationItem.MAIL_SMTP_PASSWORD.getDbField(), config.getSmtpPassword()); persistConfig(ConfigurationItem.MAIL_SMTP_PORT.getDbField(), config.getSmtpPort()); persistConfig(ConfigurationItem.INITIALIZED.getDbField(), config.isInitialized()); persistConfig(ConfigurationItem.FIRST_DAY_OF_WEEK.getDbField(), config.getFirstDayOfWeek()); persistConfig(ConfigurationItem.AUDIT_TYPE.getDbField(), getAuditType(config).getValue()); persistConfig(ConfigurationItem.PM_PRIVILEGE.getDbField(), getPmPrivilege(config).name()); persistConfig(ConfigurationItem.SPLIT_ADMIN_ROLE.getDbField(), config.isSplitAdminRole()); persistConfig(ConfigurationItem.REMINDER_BODY.getDbField(), config.getReminderBody()); persistConfig(ConfigurationItem.REMINDER_CC.getDbField(), config.getReminderCC()); persistConfig(ConfigurationItem.REMINDER_ENABLED.getDbField(), config.isReminderEnabled()); persistConfig(ConfigurationItem.REMINDER_MIN_HOURS.getDbField(), config.getReminderMinimalHours()); persistConfig(ConfigurationItem.REMINDER_SUBJECT.getDbField(), config.getReminderSubject()); persistConfig(ConfigurationItem.REMINDER_TIME.getDbField(), config.getReminderTime()); persistConfig(ConfigurationItem.TIMEZONE.getDbField(), config.getTimeZone()); } private AuditType getAuditType(EhourConfig config) { if (config.getAuditType() == null) { return AuditType.WRITE; } else { return config.getAuditType(); } } private PmPrivilege getPmPrivilege(EhourConfig config) { if (config.getPmPrivilege() == null) { return PmPrivilege.FULL; } else { return config.getPmPrivilege(); } } private void persistConfig(String key, String value) { Configuration config = new Configuration(); config.setConfigKey(key); config.setConfigValue(value == null ? "" : value); configDao.persist(config); } private void persistConfig(String key, boolean value) { persistConfig(key, Boolean.toString(value)); } private void persistConfig(String key, float value) { persistConfig(key, Float.toString(value)); } public void setConfigDao(ConfigurationDao configDao) { this.configDao = configDao; } public void setBinConfigDAO(BinaryConfigurationDao binaryConfigDAO) { this.binConfigDAO = binaryConfigDAO; } public void setTranslationDiscovery(TranslationDiscovery translationDiscovery) { this.translationDiscovery = translationDiscovery; } }