diff --git a/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java b/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java index c72599c..6dfdab8 100644 --- a/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java +++ b/account/src/main/java/de/muehlencord/shared/account/business/config/boundary/ConfigService.java @@ -1,171 +1,193 @@ -package de.muehlencord.shared.account.business.config.boundary; - -import de.muehlencord.shared.account.business.account.entity.AccountEntity; -import de.muehlencord.shared.account.business.config.entity.ConfigEntity; -import de.muehlencord.shared.account.business.config.entity.ConfigEntityPK; -import de.muehlencord.shared.account.business.config.entity.ConfigException; -import java.io.Serializable; -import java.util.List; -import java.util.Optional; -import javax.annotation.PostConstruct; -import javax.ejb.Lock; -import javax.ejb.LockType; -import javax.ejb.Singleton; -import javax.ejb.Startup; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.Query; -import javax.transaction.Transactional; - -/** - * - * @author joern.muehlencord - */ -@Singleton -@Startup -public class ConfigService implements Serializable { - - private static final long serialVersionUID = -3195224653632853003L; - - @Inject - EntityManager em; - -// private String storagePath = null; -// private int maxFailedLogins = 5; - @PostConstruct - public void init() { -// ConfigEntity configEntity = em.find(ConfigEntity.class, "storage.path"); -// if (configEntity != null) { -// this.storagePath = configEntity.getConfigValue(); -// } -// configEntity = em.find(ConfigEntity.class, "account.maxFailedLogins"); -// if (configEntity != null) { -// this.maxFailedLogins = Integer.parseInt(configEntity.getConfigValue()); -// } - } - - /** - * returns global config key which is not assigned to any. If more than one - * value is defined for the given key, the key assigned to system is - * returned. If more than one key is defined but system key is not defined, - * an exception is thrown. - * - * @param configKey the key to return - * @return the configValue belonging to the given configKey - * @throws - * de.muehlencord.shared.account.business.config.entity.ConfigException if - * more than one value is defined for the given key but none of the values - * is defined for the system user - */ - public String getConfigValue(String configKey) throws ConfigException { - Query query = em.createNamedQuery("ConfigEntity.findByConfigKey"); - query.setParameter("configKey", configKey); - List configList = query.getResultList(); - if ((configList == null) || (configList.isEmpty())) { - // key is not found in the database at all - return null; - } else if (configList.size() == 1) { - // exact one element found, return this one - return configList.get(0).getConfigValue(); - } else { - // if more than one result found, return the one which is assigned to system if present - // if not present, throw exception - Optional firstItem = configList.stream() - .filter(config -> config.getConfigPK().getConfigKeyAccount().getUsername().equals("system")) - .findFirst(); - if (firstItem.isPresent()) { - return firstItem.get().getConfigValue(); - } else { - throw new ConfigException("ConfigKey " + configKey + " not unique and system value not defined"); - } - } - } - - public String getConfigValue(String configKey, AccountEntity account) throws ConfigException { - Query query = em.createNamedQuery("ConfigEntity.findByConfigKeyAndAccount"); - query.setParameter("configKey", configKey); - query.setParameter("configKeyAccount", account); - List configList = query.getResultList(); - if ((configList == null) || (configList.isEmpty())) { - // key is not found in the database at all - return null; - } else if (configList.size() == 1) { - // exact one element found, return this one - return configList.get(0).getConfigValue(); - } else { - // more than one value must not happen - this is not possible per the defintion of the datamodel - throw new ConfigException("Cannot have more than one value for the the given key " + configKey + " and the given account " + account.getUsername()); - } - } - - @Transactional - @Lock(LockType.WRITE) - public boolean updateConfigValue(String configKey, String accountName, String configValue) { - if ((configKey == null) || (configKey.equals ("")) || (configValue == null) || (configValue.equals (""))) { - // null or empty key / values are not possible - return false; - } - AccountEntity account; - if (accountName == null) { - account = getAccount("system"); - } else { - account = getAccount(accountName); - } - - if (account == null) { - // must not happen we have no account - if accountName is null, then the system account has to be used - return false; - } - - ConfigEntityPK pk = new ConfigEntityPK(configKey, account); - ConfigEntity currentEntity = em.find(ConfigEntity.class, pk); - if (currentEntity == null) { - currentEntity = new ConfigEntity(pk); - currentEntity.setConfigValue(configValue); - em.persist(currentEntity); - return true; // config item created - udpate performed - } else { - if ((currentEntity.getConfigValue() != null) && (currentEntity.getConfigValue().equals(configValue))) { - // value is the same - no update - return false; - } else { - currentEntity.setConfigValue(configValue); - em.merge(currentEntity); - return true; - } - } - } - - private AccountEntity getAccount(String accountName) { - Query query = em.createNamedQuery("AccountEntity.findByUsername"); - query.setParameter("username", accountName); - List accountList = query.getResultList(); - if ((accountList == null) || (accountList.isEmpty())) { - return null; - } else { - return accountList.get(0); - } - } - - /* *** getter *** */ - /** - * FIXME remove, this is application specific - * - * @return - * @deprecated replace by getConfigValue ("storage.path") - */ -// @Deprecated -// public String getStoragePath() { -// return storagePath; -// } - /** - * // TODO move to accountControl - * - * @return - * @deprecated replace by getConfigValue ("account.maxFailedLogins") - */ -// @Deprecated -// public int getMaxFailedLogins() { -// return maxFailedLogins; -// } -} +package de.muehlencord.shared.account.business.config.boundary; + +import de.muehlencord.shared.account.business.account.entity.AccountEntity; +import de.muehlencord.shared.account.business.config.entity.ConfigEntity; +import de.muehlencord.shared.account.business.config.entity.ConfigEntityPK; +import de.muehlencord.shared.account.business.config.entity.ConfigException; +import java.io.Serializable; +import java.util.List; +import java.util.Optional; +import javax.annotation.PostConstruct; +import javax.ejb.Lock; +import javax.ejb.LockType; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.Query; +import javax.transaction.Transactional; + +/** + * + * @author joern.muehlencord + */ +@Singleton +@Startup +public class ConfigService implements Serializable { + + private static final long serialVersionUID = -3195224653632853003L; + + @Inject + EntityManager em; + +// private String storagePath = null; +// private int maxFailedLogins = 5; + @PostConstruct + public void init() { +// ConfigEntity configEntity = em.find(ConfigEntity.class, "storage.path"); +// if (configEntity != null) { +// this.storagePath = configEntity.getConfigValue(); +// } +// configEntity = em.find(ConfigEntity.class, "account.maxFailedLogins"); +// if (configEntity != null) { +// this.maxFailedLogins = Integer.parseInt(configEntity.getConfigValue()); +// } + } + + /** + * returns global config key which is not assigned to any. If more than one + * value is defined for the given key, the key assigned to system is + * returned. If more than one key is defined but system key is not defined, + * an exception is thrown. + * + * @param configKey the key to return + * @return the configValue belonging to the given configKey + * @throws + * de.muehlencord.shared.account.business.config.entity.ConfigException if + * more than one value is defined for the given key but none of the values + * is defined for the system user + */ + public String getConfigValue(String configKey) throws ConfigException { + Query query = em.createNamedQuery("ConfigEntity.findByConfigKey"); + query.setParameter("configKey", configKey); + List configList = query.getResultList(); + if ((configList == null) || (configList.isEmpty())) { + // key is not found in the database at all + return null; + } else if (configList.size() == 1) { + // exact one element found, return this one + return configList.get(0).getConfigValue(); + } else { + // if more than one result found, return the one which is assigned to system if present + // if not present, throw exception + Optional firstItem = configList.stream() + .filter(config -> config.getConfigPK().getConfigKeyAccount().getUsername().equals("system")) + .findFirst(); + if (firstItem.isPresent()) { + return firstItem.get().getConfigValue(); + } else { + throw new ConfigException("ConfigKey " + configKey + " not unique and system value not defined"); + } + } + } + + public String getConfigValue(String configKey, String defaultValue) throws ConfigException { + return getConfigValue(configKey, defaultValue, false); + } + + public String getConfigValue(String configKey, String defaultValue, boolean storeDefaultValue) throws ConfigException { + // get configValue as usual + String configValue = getConfigValue(configKey); + + // if config value is not found null has been returned + // in this case the value to return is the defaultValue + if (configValue == null) { + configValue = defaultValue; + } + + // check if the default value should be stored in the database + if (storeDefaultValue) { + updateConfigValue(configKey, null, configValue); + } + + return defaultValue; + } + + public String getConfigValue(String configKey, AccountEntity account) throws ConfigException { + Query query = em.createNamedQuery("ConfigEntity.findByConfigKeyAndAccount"); + query.setParameter("configKey", configKey); + query.setParameter("configKeyAccount", account); + List configList = query.getResultList(); + if ((configList == null) || (configList.isEmpty())) { + // key is not found in the database at all + return null; + } else if (configList.size() == 1) { + // exact one element found, return this one + return configList.get(0).getConfigValue(); + } else { + // more than one value must not happen - this is not possible per the defintion of the datamodel + throw new ConfigException("Cannot have more than one value for the the given key " + configKey + " and the given account " + account.getUsername()); + } + } + + @Transactional + @Lock(LockType.WRITE) + public boolean updateConfigValue(String configKey, String accountName, String configValue) { + if ((configKey == null) || (configKey.equals("")) || (configValue == null) || (configValue.equals(""))) { + // null or empty key / values are not possible + return false; + } + AccountEntity account; + if (accountName == null) { + account = getAccount("system"); + } else { + account = getAccount(accountName); + } + + if (account == null) { + // must not happen we have no account - if accountName is null, then the system account has to be used + return false; + } + + ConfigEntityPK pk = new ConfigEntityPK(configKey, account); + ConfigEntity currentEntity = em.find(ConfigEntity.class, pk); + if (currentEntity == null) { + currentEntity = new ConfigEntity(pk); + currentEntity.setConfigValue(configValue); + em.persist(currentEntity); + return true; // config item created - udpate performed + } else { + if ((currentEntity.getConfigValue() != null) && (currentEntity.getConfigValue().equals(configValue))) { + // value is the same - no update + return false; + } else { + currentEntity.setConfigValue(configValue); + em.merge(currentEntity); + return true; + } + } + } + + private AccountEntity getAccount(String accountName) { + Query query = em.createNamedQuery("AccountEntity.findByUsername"); + query.setParameter("username", accountName); + List accountList = query.getResultList(); + if ((accountList == null) || (accountList.isEmpty())) { + return null; + } else { + return accountList.get(0); + } + } + + /* *** getter *** */ + /** + * FIXME remove, this is application specific + * + * @return + * @deprecated replace by getConfigValue ("storage.path") + */ +// @Deprecated +// public String getStoragePath() { +// return storagePath; +// } + /** + * // TODO move to accountControl + * + * @return + * @deprecated replace by getConfigValue ("account.maxFailedLogins") + */ +// @Deprecated +// public int getMaxFailedLogins() { +// return maxFailedLogins; +// } +}