This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 7dd673f73869f5a724b4c2b4a6c259bde5d91372 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 14:15:19 2015 +0200 Modélisation des configuration de base et chargement au démarrage de l'application web (See #7494) --- observe-application-web/pom.xml | 6 +- .../web/ObserveWebApplicationContext.java | 13 +- .../ObserveWebApplicationContextInitException.java | 16 ++ .../web/ObserveWebApplicationListener.java | 6 +- .../ObserveWebApplicationConfiguration.java | 63 +++++- .../db/InvalidObserveWebDatabaseException.java | 15 ++ .../db/InvalidObserveWebDatabaseRoleException.java | 15 ++ .../db/InvalidObserveWebDatabasesException.java | 15 ++ .../web/configuration/db/ObserveWebDatabase.java | 24 +++ .../configuration/db/ObserveWebDatabaseRole.java | 14 ++ .../web/configuration/db/ObserveWebDatabases.java | 20 ++ .../db/ObserveWebDatabasesHelper.java | 162 ++++++++++++++ .../db/impl/ObserveWebDatabaseBean.java | 74 +++++++ .../db/impl/ObserveWebDatabaseImmutable.java | 68 ++++++ .../db/impl/ObserveWebDatabaseRoleBean.java | 37 ++++ .../db/impl/ObserveWebDatabaseRoleImmutable.java | 31 +++ .../db/impl/ObserveWebDatabasesBean.java | 49 +++++ .../db/impl/ObserveWebDatabasesImmutable.java | 58 ++++++ .../db/ObserveWebDatabasesHelperTest.java | 232 +++++++++++++++++++++ pom.xml | 7 + 20 files changed, 915 insertions(+), 10 deletions(-) diff --git a/observe-application-web/pom.xml b/observe-application-web/pom.xml index ed03924..2e1e1e8 100644 --- a/observe-application-web/pom.xml +++ b/observe-application-web/pom.xml @@ -110,7 +110,11 @@ <artifactId>paranamer</artifactId> </dependency> - + <!-- Yaml --> + <dependency> + <groupId>com.esotericsoftware.yamlbeans</groupId> + <artifactId>yamlbeans</artifactId> + </dependency> <!-- Logging --> <dependency> diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java index f6fd20c..ae5990b 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContext.java @@ -2,6 +2,11 @@ package fr.ird.observe.application.web; import com.google.common.base.Preconditions; import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; +import fr.ird.observe.application.web.configuration.db.InvalidObserveWebDatabaseException; +import fr.ird.observe.application.web.configuration.db.InvalidObserveWebDatabaseRoleException; +import fr.ird.observe.application.web.configuration.db.InvalidObserveWebDatabasesException; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabases; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabasesHelper; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; @@ -30,6 +35,8 @@ public class ObserveWebApplicationContext implements Closeable { protected ObserveServiceApplicationContext serviceApplicationContext; + private ObserveWebDatabases databases; + public static ObserveWebApplicationContext getApplicationContext(HttpContext context) { ServletContext servletContext = context.getServletContext(); @@ -43,14 +50,16 @@ public class ObserveWebApplicationContext implements Closeable { } - public void init() { + public void init() throws InvalidObserveWebDatabaseException, InvalidObserveWebDatabasesException, InvalidObserveWebDatabaseRoleException { // init configuration applicationConfiguration = new ObserveWebApplicationConfiguration(); applicationConfiguration.init(); // init databases - //TODO + + ObserveWebDatabasesHelper databasesHelper = new ObserveWebDatabasesHelper(); + databases = databasesHelper.load(applicationConfiguration.getDatabasesConfigurationFile()); // init users //TODO diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInitException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInitException.java new file mode 100644 index 0000000..bb1d7d8 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInitException.java @@ -0,0 +1,16 @@ +package fr.ird.observe.application.web; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class + ObserveWebApplicationContextInitException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public ObserveWebApplicationContextInitException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java index 10b1c3a..1f87b1c 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationListener.java @@ -23,7 +23,11 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { } applicationContext = new ObserveWebApplicationContext(); - applicationContext.init(); + try { + applicationContext.init(); + } catch (Exception e) { + throw new ObserveWebApplicationContextInitException("Impossible d'initialiser le context applicatif", e); + } context.getServletContext().setAttribute( ObserveWebApplicationContext.APPLICATION_CONTEXT_PARAMETER, applicationContext); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java index 315596d..8f7d723 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java @@ -35,15 +35,12 @@ public class ObserveWebApplicationConfiguration { /** Logger. */ private static Log log = LogFactory.getLog(ObserveWebApplicationConfiguration.class); - protected static final String DEFAULT_OBSERVE_WEB_CONF = "observeweb.conf"; + protected static final String DEFAULT_OBSERVE_WEB_CONFIGURATION_FILENAME = "observeweb.conf"; private final ApplicationConfig applicationConfig; - private File baseDirectory; - - public ObserveWebApplicationConfiguration() { - this(DEFAULT_OBSERVE_WEB_CONF); + this(DEFAULT_OBSERVE_WEB_CONFIGURATION_FILENAME); } public ObserveWebApplicationConfiguration(String confFileName) { @@ -127,7 +124,43 @@ public class ObserveWebApplicationConfiguration { throw new ObserveWebApplicationConfigurationInitException("Impossible de créer le répertoire temporaire de l'application (" + temporaryDirectory + ")", e); } - if (!isDevMode()) { + boolean devMode = isDevMode(); + + File databasesConfigurationFile = getDatabasesConfigurationFile(); + File usersConfigurationFile = getUsersConfigurationFile(); + + if (devMode) { + + if (!databasesConfigurationFile.exists()) { + + // Generate a default databasesConfigurationFile + try { + Files.write(databasesConfigurationFile.toPath(), DEV_DATABASES_CONFIGURATION_FILE_CONTENT.getBytes()); + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("Impossible de créer un fichier de configuration des bases pour développement", e); + } + } + + if (!usersConfigurationFile.exists()) { + + // Generate a default usersConfigurationFile + try { + Files.write(usersConfigurationFile.toPath(), DEV_USERS_CONFIGURATION_FILE_CONTENT.getBytes()); + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("Impossible de créer un fichier de configuration des utilisateurs pour développement", e); + } + } + } + + if (!databasesConfigurationFile.exists()) { + throw new ObserveWebApplicationConfigurationInitException("Le fichier de configuration des bases n'existe pas : " + databasesConfigurationFile); + } + + if (!usersConfigurationFile.exists()) { + throw new ObserveWebApplicationConfigurationInitException("Le fichier de configuration des utilisateurs n'existe pas : " + usersConfigurationFile); + } + + if (!devMode) { initLog(); } @@ -205,4 +238,22 @@ public class ObserveWebApplicationConfiguration { } } + + private static final String DEV_DATABASES_CONFIGURATION_FILE_CONTENT = + "databases: \n" + + "- name: production\n" + + " defaultDatabase: true\n" + + " roles: \n" + + " - login: admin\n" + + " password: a\n" + + " url: jdbc:postgresql://localhost:5432/obstuna"; + + private static final String DEV_USERS_CONFIGURATION_FILE_CONTENT = + "databases: \n" + + "- name: production\n" + + " defaultDatabase: true\n" + + " roles: \n" + + " - login: admin\n" + + " password: a\n" + + " url: jdbc:postgresql://localhost:5432/obstuna"; } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseException.java new file mode 100644 index 0000000..1486f23 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseException.java @@ -0,0 +1,15 @@ +package fr.ird.observe.application.web.configuration.db; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidObserveWebDatabaseException extends Exception { + + private static final long serialVersionUID = 1L; + + public InvalidObserveWebDatabaseException(String message) { + super(message); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseRoleException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseRoleException.java new file mode 100644 index 0000000..28ca585 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseRoleException.java @@ -0,0 +1,15 @@ +package fr.ird.observe.application.web.configuration.db; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidObserveWebDatabaseRoleException extends Exception { + + private static final long serialVersionUID = 1L; + + public InvalidObserveWebDatabaseRoleException(String message) { + super(message); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabasesException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabasesException.java new file mode 100644 index 0000000..6976160 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabasesException.java @@ -0,0 +1,15 @@ +package fr.ird.observe.application.web.configuration.db; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidObserveWebDatabasesException extends Exception { + + private static final long serialVersionUID = 1L; + + public InvalidObserveWebDatabasesException(String message) { + super(message); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabase.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabase.java new file mode 100644 index 0000000..76cf54e --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabase.java @@ -0,0 +1,24 @@ +package fr.ird.observe.application.web.configuration.db; + +import com.google.common.base.Optional; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveWebDatabase<R extends ObserveWebDatabaseRole> { + + String getName(); + + boolean isDefaultDatabase(); + + String getUrl(); + + Collection<R> getRoles(); + + Optional<R> getDatabaseRoleByLogin(String login); + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabaseRole.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabaseRole.java new file mode 100644 index 0000000..9e6f891 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabaseRole.java @@ -0,0 +1,14 @@ +package fr.ird.observe.application.web.configuration.db; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveWebDatabaseRole { + + String getLogin(); + + String getPassword(); + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabases.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabases.java new file mode 100644 index 0000000..7008542 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabases.java @@ -0,0 +1,20 @@ +package fr.ird.observe.application.web.configuration.db; + +import com.google.common.base.Optional; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveWebDatabases<D extends ObserveWebDatabase> { + + Collection<D> getDatabases(); + + D getDefaultDatabase(); + + Optional<D> getDatabaseByName(String databaseName); + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java new file mode 100644 index 0000000..60dfb6c --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java @@ -0,0 +1,162 @@ +package fr.ird.observe.application.web.configuration.db; + +import com.esotericsoftware.yamlbeans.YamlConfig; +import com.esotericsoftware.yamlbeans.YamlReader; +import com.esotericsoftware.yamlbeans.YamlWriter; +import com.google.common.base.Charsets; +import com.google.common.io.Files; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseBean; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseRoleBean; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesBean; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesImmutable; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.Reader; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabasesHelper { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveWebDatabasesHelper.class); + + public ObserveWebDatabasesImmutable load(File file) throws InvalidObserveWebDatabaseException, InvalidObserveWebDatabasesException, InvalidObserveWebDatabaseRoleException { + + ObserveWebDatabasesBean observeWebDatabasesBean = loadBean(file); + validateObserveWebDatabasesBean(observeWebDatabasesBean); + ObserveWebDatabasesImmutable observeWebDatabasesImmutable = observeWebDatabasesBean.toImmutable(); + return observeWebDatabasesImmutable; + + } + + public ObserveWebDatabasesBean loadBean(File file) { + ObserveWebDatabasesBean result; + try (Reader fileReader = Files.newReader(file, Charsets.UTF_8)) { + YamlReader reader = new YamlReader(fileReader, createConfig()); + result = reader.read(ObserveWebDatabasesBean.class); + fileReader.close(); + + } catch (Exception e) { + throw new RuntimeException("Could not read databases from file: " + file, e); + } + + return result; + } + + public void validateObserveWebDatabasesBean(ObserveWebDatabasesBean observeWebDatabasesBean) throws InvalidObserveWebDatabaseException, InvalidObserveWebDatabaseRoleException, InvalidObserveWebDatabasesException { + + if (CollectionUtils.isEmpty(observeWebDatabasesBean.getDatabases())) { + throw new InvalidObserveWebDatabaseException("No database defined"); + } + + // need extacly one default database + ObserveWebDatabaseBean defaultDatabase = null; + + // unique database name + Set<String> databaseNames = new LinkedHashSet<>(); + + for (ObserveWebDatabaseBean observeWebDatabaseBean : observeWebDatabasesBean.getDatabases()) { + + validateObserveWebDatabaseBean(observeWebDatabaseBean); + boolean added = databaseNames.add(observeWebDatabaseBean.getName()); + if (!added) { + throw new InvalidObserveWebDatabasesException("Not unique database name found: " + observeWebDatabaseBean.getName()); + } + if (observeWebDatabaseBean.isDefaultDatabase()) { + + if (defaultDatabase != null) { + throw new InvalidObserveWebDatabasesException("Found two default databases: " + defaultDatabase.getName() + " and " + observeWebDatabaseBean.getName()); + } + defaultDatabase = observeWebDatabaseBean; + } + + } + + if (defaultDatabase == null) { + throw new InvalidObserveWebDatabasesException("No default databases defined"); + } + + } + + public void validateObserveWebDatabaseBean(ObserveWebDatabaseBean observeWebDatabaseBean) throws InvalidObserveWebDatabaseRoleException, InvalidObserveWebDatabaseException { + + String databaseName = observeWebDatabaseBean.getName(); + if (StringUtils.isBlank(databaseName)) { + throw new InvalidObserveWebDatabaseException("Found a database with no name defined"); + } + + if (StringUtils.isBlank(observeWebDatabaseBean.getUrl())) { + throw new InvalidObserveWebDatabaseException("Database " + databaseName + " has no url defined"); + } + + if (CollectionUtils.isEmpty(observeWebDatabaseBean.getRoles())) { + throw new InvalidObserveWebDatabaseException("Database " + databaseName + " has no roles defined"); + } + + // unique login name + Set<String> logins = new LinkedHashSet<>(); + + for (ObserveWebDatabaseRoleBean observeWebDatabaseRoleBean : observeWebDatabaseBean.getRoles()) { + + validateObserveWebDatabaseRoleBean(observeWebDatabaseBean, observeWebDatabaseRoleBean); + boolean added = logins.add(observeWebDatabaseRoleBean.getLogin()); + if (!added) { + throw new InvalidObserveWebDatabaseException("Database " + databaseName + " contains a doublon login: " + observeWebDatabaseRoleBean.getLogin()); + } + + } + + } + + public void validateObserveWebDatabaseRoleBean(ObserveWebDatabaseBean observeWebDatabaseBean, ObserveWebDatabaseRoleBean observeWebDatabaseRoleBean) throws InvalidObserveWebDatabaseRoleException { + + String databaseName = observeWebDatabaseBean.getName(); + + if (StringUtils.isBlank(observeWebDatabaseRoleBean.getLogin())) { + throw new InvalidObserveWebDatabaseRoleException("In database " + databaseName + ", found a role with no login defined"); + } + if (StringUtils.isBlank(observeWebDatabaseRoleBean.getPassword())) { + throw new InvalidObserveWebDatabaseRoleException("In database " + databaseName + ", found a role " + observeWebDatabaseRoleBean.getLogin() + " with no password defined"); + } + + } + + public void storeBean(ObserveWebDatabasesBean databases, File file) { + + if (log.isInfoEnabled()) { + log.info("Store databases to " + file); + } + + try (BufferedWriter fileWriter = Files.newWriter(file, Charsets.UTF_8)) { + YamlWriter writer = new YamlWriter(fileWriter, createConfig()); + writer.write(databases); + writer.close(); + } catch (Exception e) { + throw new RuntimeException("Could not write databases to file: " + file, e); + } + + } + + protected YamlConfig createConfig() { + + YamlConfig yamlConfig = new YamlConfig(); +// yamlConfig.setClassTag("db", ObserveWebDatabase.class); +// yamlConfig.setClassTag("role", ObserveWebDatabaseRole.class); + yamlConfig.writeConfig.setIndentSize(2); + yamlConfig.writeConfig.setWriteRootTags(false); + yamlConfig.setPropertyElementType(ObserveWebDatabasesBean.class, "databases", ObserveWebDatabaseBean.class); + yamlConfig.setPropertyElementType(ObserveWebDatabaseBean.class, "roles", ObserveWebDatabaseRoleBean.class); + return yamlConfig; + + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseBean.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseBean.java new file mode 100644 index 0000000..caac90d --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseBean.java @@ -0,0 +1,74 @@ +package fr.ird.observe.application.web.configuration.db.impl; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabase; + +import java.util.LinkedHashSet; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabaseBean implements ObserveWebDatabase<ObserveWebDatabaseRoleBean> { + + protected String name; + + protected String url; + + protected boolean defaultDatabase; + + protected LinkedHashSet<ObserveWebDatabaseRoleBean> roles; + + @Override + public String getName() { + return name; + } + + @Override + public boolean isDefaultDatabase() { + return defaultDatabase; + } + + @Override + public String getUrl() { + return url; + } + + public Optional<ObserveWebDatabaseRoleBean> getDatabaseRoleByLogin(String login) { + throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); + } + + @Override + public LinkedHashSet<ObserveWebDatabaseRoleBean> getRoles() { + return roles; + } + + public void setName(String name) { + this.name = name; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setDefaultDatabase(boolean defaultDatabase) { + this.defaultDatabase = defaultDatabase; + } + + public void setRoles(LinkedHashSet<ObserveWebDatabaseRoleBean> roles) { + this.roles = roles; + } + + public ObserveWebDatabaseImmutable toImmutable() { + return new ObserveWebDatabaseImmutable(name, defaultDatabase, url, Iterables.transform(roles, new Function<ObserveWebDatabaseRoleBean, ObserveWebDatabaseRoleImmutable>() { + + @Override + public ObserveWebDatabaseRoleImmutable apply(ObserveWebDatabaseRoleBean input) { + return input.toImmutable(); + } + })); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseImmutable.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseImmutable.java new file mode 100644 index 0000000..6d5b8b4 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseImmutable.java @@ -0,0 +1,68 @@ +package fr.ird.observe.application.web.configuration.db.impl; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabase; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabaseImmutable implements ObserveWebDatabase<ObserveWebDatabaseRoleImmutable> { + + private final String name; + + private final boolean defaultDatabase; + + private final String url; + + private final ImmutableMap<String, ObserveWebDatabaseRoleImmutable> roles; + + public ObserveWebDatabaseImmutable(String name, + boolean defaultDatabase, + String url, + Iterable<ObserveWebDatabaseRoleImmutable> roles) { + this.name = name; + this.defaultDatabase = defaultDatabase; + this.url = url; + this.roles = Maps.uniqueIndex(roles, new Function<ObserveWebDatabaseRoleImmutable, String>() { + + @Override + public String apply(ObserveWebDatabaseRoleImmutable input) { + return input.getLogin(); + } + }); + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean isDefaultDatabase() { + return defaultDatabase; + } + + @Override + public String getUrl() { + return url; + } + + @Override + public Collection<ObserveWebDatabaseRoleImmutable> getRoles() { + return roles.values(); + } + + @Override + public Optional<ObserveWebDatabaseRoleImmutable> getDatabaseRoleByLogin(String login) { + ObserveWebDatabaseRoleImmutable observeWebDatabaseRole = roles.get(login); + return Optional.fromNullable(observeWebDatabaseRole); + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleBean.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleBean.java new file mode 100644 index 0000000..cd16dd1 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleBean.java @@ -0,0 +1,37 @@ +package fr.ird.observe.application.web.configuration.db.impl; + +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabaseRole; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabaseRoleBean implements ObserveWebDatabaseRole { + + protected String login; + + protected String password; + + @Override + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + @Override + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public ObserveWebDatabaseRoleImmutable toImmutable() { + return new ObserveWebDatabaseRoleImmutable(login, password); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleImmutable.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleImmutable.java new file mode 100644 index 0000000..2f67745 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleImmutable.java @@ -0,0 +1,31 @@ +package fr.ird.observe.application.web.configuration.db.impl; + +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabaseRole; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabaseRoleImmutable implements ObserveWebDatabaseRole { + + private final String login; + + private final String password; + + public ObserveWebDatabaseRoleImmutable(String login, String password) { + this.login = login; + this.password = password; + } + + @Override + public String getLogin() { + return login; + } + + @Override + public String getPassword() { + return password; + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesBean.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesBean.java new file mode 100644 index 0000000..646c9b3 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesBean.java @@ -0,0 +1,49 @@ +package fr.ird.observe.application.web.configuration.db.impl; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabases; + +import java.util.LinkedHashSet; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabasesBean implements ObserveWebDatabases<ObserveWebDatabaseBean> { + + protected LinkedHashSet<ObserveWebDatabaseBean> databases; + + @Override + public Optional<ObserveWebDatabaseBean> getDatabaseByName(String databaseName) { + throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); + } + + @Override + public LinkedHashSet<ObserveWebDatabaseBean> getDatabases() { + return databases; + } + + @Override + public ObserveWebDatabaseBean getDefaultDatabase() { + throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); + } + + public ObserveWebDatabasesImmutable toImmutable() { + + return new ObserveWebDatabasesImmutable(Iterables.transform(databases, new Function<ObserveWebDatabaseBean, ObserveWebDatabaseImmutable>() { + + @Override + public ObserveWebDatabaseImmutable apply(ObserveWebDatabaseBean input) { + return input.toImmutable(); + } + })); + } + + public void setDatabases(LinkedHashSet<ObserveWebDatabaseBean> databases) { + this.databases = databases; + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesImmutable.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesImmutable.java new file mode 100644 index 0000000..cd5aad1 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesImmutable.java @@ -0,0 +1,58 @@ +package fr.ird.observe.application.web.configuration.db.impl; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabases; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabasesImmutable implements ObserveWebDatabases<ObserveWebDatabaseImmutable> { + + private final ImmutableMap<String, ObserveWebDatabaseImmutable> databases; + + private final ObserveWebDatabaseImmutable defaultDatabase; + + public ObserveWebDatabasesImmutable(Iterable<ObserveWebDatabaseImmutable> databases) { + this.databases = Maps.uniqueIndex(databases, new Function<ObserveWebDatabaseImmutable, String>() { + + @Override + public String apply(ObserveWebDatabaseImmutable input) { + return input.getName(); + } + }); + + ObserveWebDatabaseImmutable defaultDb = null; + for (ObserveWebDatabaseImmutable database : databases) { + if (database.isDefaultDatabase()) { + defaultDb = database; + break; + + } + } + this.defaultDatabase = defaultDb; + } + + @Override + public Collection<ObserveWebDatabaseImmutable> getDatabases() { + return databases.values(); + } + + @Override + public ObserveWebDatabaseImmutable getDefaultDatabase() { + return defaultDatabase; + } + + @Override + public Optional<ObserveWebDatabaseImmutable> getDatabaseByName(String databaseName) { + ObserveWebDatabaseImmutable database = databases.get(databaseName); + return Optional.fromNullable(database); + } + +} diff --git a/observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelperTest.java b/observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelperTest.java new file mode 100644 index 0000000..3ed490d --- /dev/null +++ b/observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelperTest.java @@ -0,0 +1,232 @@ +package fr.ird.observe.application.web.configuration.db; + +import com.google.common.base.Charsets; +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; +import com.google.common.io.Files; +import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseBean; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseImmutable; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseRoleBean; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabaseRoleImmutable; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesBean; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesImmutable; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebDatabasesHelperTest { + + protected ObserveWebApplicationConfiguration configuration; + + protected ObserveWebDatabasesHelper observeWebDatabasesHelper; + + public static final String FILE_CONTENT = "databases: \n" + + "- name: production\n" + + " defaultDatabase: true\n" + + " roles: \n" + + " - login: admin\n" + + " password: passwordAdmin\n" + + " - login: technicien\n" + + " password: passwordTechnicien\n" + + " - login: utilisateur\n" + + " password: passwordUtilisateur\n" + + " - login: referentiel\n" + + " password: passwordReferentiel\n" + + " url: jdbc:postgresql://localhost:5432/production\n" + + "- name: test\n" + + " roles: \n" + + " - login: admin\n" + + " password: passwordAdmin\n" + + " - login: technicien\n" + + " password: passwordTechnicien\n" + + " - login: utilisateur\n" + + " password: passwordUtilisateur\n" + + " - login: referentiel\n" + + " password: passwordReferentiel\n" + + " url: jdbc:postgresql://localhost:5432/test\n"; + + @Before + public void setUp() { + configuration = new ObserveWebApplicationConfiguration(); + configuration.init(); + observeWebDatabasesHelper = new ObserveWebDatabasesHelper(); + } + + @Test + public void testLoadBean() throws Exception { + + File databasesFile = configuration.getDatabasesConfigurationFile(); + + Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + + ObserveWebDatabasesBean databases = observeWebDatabasesHelper.loadBean(databasesFile); + Assert.assertNotNull(databases); + Set<ObserveWebDatabaseBean> databasesSet = databases.getDatabases(); + Assert.assertNotNull(databasesSet); + Assert.assertEquals(2, databasesSet.size()); + + { + ObserveWebDatabase database = Iterables.get(databasesSet, 0); + Assert.assertNotNull(database); + Assert.assertEquals("production", database.getName()); + Assert.assertNotNull(database.getRoles()); + Assert.assertEquals(4, database.getRoles().size()); + } + { + ObserveWebDatabase database = Iterables.get(databasesSet, 1); + Assert.assertNotNull(database); + Assert.assertEquals("test", database.getName()); + Assert.assertNotNull(database.getRoles()); + Assert.assertEquals(4, database.getRoles().size()); + } + + } + + @Test + public void testLoad() throws Exception { + + File databasesFile = configuration.getDatabasesConfigurationFile(); + + Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + + ObserveWebDatabasesImmutable databases = observeWebDatabasesHelper.load(databasesFile); + Assert.assertNotNull(databases); + Collection<ObserveWebDatabaseImmutable> databasesSet = databases.getDatabases(); + Assert.assertNotNull(databasesSet); + Assert.assertEquals(2, databasesSet.size()); + + ObserveWebDatabaseImmutable defaultDatabase = databases.getDefaultDatabase(); + Assert.assertNotNull(defaultDatabase); + Assert.assertEquals("production", defaultDatabase.getName()); + + Optional<ObserveWebDatabaseImmutable> production = databases.getDatabaseByName("production"); + Assert.assertTrue(production.isPresent()); + + Optional<ObserveWebDatabaseImmutable> production2 = databases.getDatabaseByName("production2"); + Assert.assertFalse(production2.isPresent()); + + { + ObserveWebDatabaseImmutable database = Iterables.get(databasesSet, 0); + Assert.assertNotNull(database); + Assert.assertEquals("production", database.getName()); + Assert.assertNotNull(database.getRoles()); + Assert.assertEquals(4, database.getRoles().size()); + + Optional<ObserveWebDatabaseRoleImmutable> administrateur = database.getDatabaseRoleByLogin("admin"); + Assert.assertTrue(administrateur.isPresent()); + + Optional<ObserveWebDatabaseRoleImmutable> administrateur2 = database.getDatabaseRoleByLogin("administrateur2"); + Assert.assertFalse(administrateur2.isPresent()); + } + { + ObserveWebDatabaseImmutable database = Iterables.get(databasesSet, 1); + Assert.assertNotNull(database); + Assert.assertEquals("test", database.getName()); + Assert.assertNotNull(database.getRoles()); + Assert.assertEquals(4, database.getRoles().size()); + + Optional<ObserveWebDatabaseRoleImmutable> administrateur = database.getDatabaseRoleByLogin("admin"); + Assert.assertTrue(administrateur.isPresent()); + + Optional<ObserveWebDatabaseRoleImmutable> administrateur2 = database.getDatabaseRoleByLogin("administrateur2"); + Assert.assertFalse(administrateur2.isPresent()); + } + + } + + + @Test + public void testStoreBean() throws Exception { + + LinkedHashSet<ObserveWebDatabaseBean> databaseSet = new LinkedHashSet<>(); + { + ObserveWebDatabaseBean database = new ObserveWebDatabaseBean(); + database.setDefaultDatabase(true); + database.setName("production"); + database.setUrl("jdbc:postgresql://localhost:5432/production"); + LinkedHashSet<ObserveWebDatabaseRoleBean> roles = new LinkedHashSet<>(); + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("admin"); + databaseRole.setPassword("passwordAdmin"); + roles.add(databaseRole); + } + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("technicien"); + databaseRole.setPassword("passwordTechnicien"); + roles.add(databaseRole); + } + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("utilisateur"); + databaseRole.setPassword("passwordUtilisateur"); + roles.add(databaseRole); + } + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("referentiel"); + databaseRole.setPassword("passwordReferentiel"); + roles.add(databaseRole); + } + database.setRoles(roles); + databaseSet.add(database); + } + { + ObserveWebDatabaseBean database = new ObserveWebDatabaseBean(); + database.setDefaultDatabase(false); + database.setName("test"); + database.setUrl("jdbc:postgresql://localhost:5432/test"); + LinkedHashSet<ObserveWebDatabaseRoleBean> roles = new LinkedHashSet<>(); + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("admin"); + databaseRole.setPassword("passwordAdmin"); + roles.add(databaseRole); + } + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("technicien"); + databaseRole.setPassword("passwordTechnicien"); + roles.add(databaseRole); + } + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("utilisateur"); + databaseRole.setPassword("passwordUtilisateur"); + roles.add(databaseRole); + } + { + ObserveWebDatabaseRoleBean databaseRole = new ObserveWebDatabaseRoleBean(); + databaseRole.setLogin("referentiel"); + databaseRole.setPassword("passwordReferentiel"); + roles.add(databaseRole); + } + database.setRoles(roles); + databaseSet.add(database); + } + ObserveWebDatabasesBean databases = new ObserveWebDatabasesBean(); + databases.setDatabases(databaseSet); + + File databasesFile = configuration.getDatabasesConfigurationFile(); + + observeWebDatabasesHelper.storeBean(databases, databasesFile); + + String fileContent = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + + Assert.assertEquals(FILE_CONTENT, fileContent); + System.out.println(fileContent); + + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 21929c6..f0fede6 100644 --- a/pom.xml +++ b/pom.xml @@ -586,6 +586,13 @@ <version>${paranamerVersion}</version> </dependency> + <!-- Yaml --> + <dependency> + <groupId>com.esotericsoftware.yamlbeans</groupId> + <artifactId>yamlbeans</artifactId> + <version>1.08</version> + </dependency> + <!-- ne pas mettre à jour cette version est pour tomcat 7--> <dependency> <groupId>javax.servlet</groupId> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.