branch feature/7494 updated (ea81a8f -> 61245bc)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7494 in repository observe. See http://git.codelutin.com/observe.git from ea81a8f Suppresion des injectors, mise en place des controlleurs new 7dd673f Modélisation des configuration de base et chargement au démarrage de l'application web (See #7494) new 61245bc Modélisation des utilisateurs et chargement au démarrage de l'application web (See #7494) The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 61245bc03c8de739eeac82ce3e3ebcb6f2964b1c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 15:23:32 2015 +0200 Modélisation des utilisateurs et chargement au démarrage de l'application web (See #7494) 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) Summary of changes: observe-application-web/pom.xml | 6 +- .../web/ObserveWebApplicationContext.java | 31 ++- .../ObserveWebApplicationContextInitException.java | 16 ++ .../web/ObserveWebApplicationListener.java | 6 +- .../ObserveWebApplicationConfiguration.java | 76 ++++++- .../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 ++++++ .../user/InvalidObserveWebUserException.java | 15 ++ .../InvalidObserveWebUserPermissionException.java | 15 ++ .../user/InvalidObserveWebUsersException.java | 15 ++ .../web/configuration/user/ObserveWebUser.java | 22 ++ .../user/ObserveWebUserPermission.java | 14 ++ .../web/configuration/user/ObserveWebUsers.java | 18 ++ .../configuration/user/ObserveWebUsersHelper.java | 138 ++++++++++++ .../user/impl/ObserveWebUserBean.java | 65 ++++++ .../user/impl/ObserveWebUserImmutable.java | 58 ++++++ .../user/impl/ObserveWebUserPermissionBean.java | 38 ++++ .../impl/ObserveWebUserPermissionImmutable.java | 31 +++ .../user/impl/ObserveWebUsersBean.java | 43 ++++ .../user/impl/ObserveWebUsersImmutable.java | 42 ++++ .../db/ObserveWebDatabasesHelperTest.java | 232 +++++++++++++++++++++ .../user/ObserveWebUsersHelperTest.java | 183 ++++++++++++++++ pom.xml | 7 + 34 files changed, 1642 insertions(+), 11 deletions(-) create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInitException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabaseRoleException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/InvalidObserveWebDatabasesException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabase.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabaseRole.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabases.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelper.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseBean.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseImmutable.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleBean.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabaseRoleImmutable.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesBean.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/db/impl/ObserveWebDatabasesImmutable.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserPermissionException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUsersException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUser.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUserPermission.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsers.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserBean.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserImmutable.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionBean.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionImmutable.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersBean.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersImmutable.java create mode 100644 observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/db/ObserveWebDatabasesHelperTest.java create mode 100644 observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelperTest.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7494 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>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7494 in repository observe. See http://git.codelutin.com/observe.git commit 61245bc03c8de739eeac82ce3e3ebcb6f2964b1c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 15:23:32 2015 +0200 Modélisation des utilisateurs et chargement au démarrage de l'application web (See #7494) --- .../web/ObserveWebApplicationContext.java | 22 ++- .../ObserveWebApplicationConfiguration.java | 27 ++- .../user/InvalidObserveWebUserException.java | 15 ++ .../InvalidObserveWebUserPermissionException.java | 15 ++ .../user/InvalidObserveWebUsersException.java | 15 ++ .../web/configuration/user/ObserveWebUser.java | 22 +++ .../user/ObserveWebUserPermission.java | 14 ++ .../web/configuration/user/ObserveWebUsers.java | 18 ++ .../configuration/user/ObserveWebUsersHelper.java | 138 ++++++++++++++++ .../user/impl/ObserveWebUserBean.java | 65 ++++++++ .../user/impl/ObserveWebUserImmutable.java | 58 +++++++ .../user/impl/ObserveWebUserPermissionBean.java | 38 +++++ .../impl/ObserveWebUserPermissionImmutable.java | 31 ++++ .../user/impl/ObserveWebUsersBean.java | 43 +++++ .../user/impl/ObserveWebUsersImmutable.java | 42 +++++ .../user/ObserveWebUsersHelperTest.java | 183 +++++++++++++++++++++ 16 files changed, 736 insertions(+), 10 deletions(-) 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 ae5990b..0ad4882 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 @@ -7,6 +7,11 @@ import fr.ird.observe.application.web.configuration.db.InvalidObserveWebDatabase 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.application.web.configuration.user.InvalidObserveWebUserException; +import fr.ird.observe.application.web.configuration.user.InvalidObserveWebUserPermissionException; +import fr.ird.observe.application.web.configuration.user.InvalidObserveWebUsersException; +import fr.ird.observe.application.web.configuration.user.ObserveWebUsers; +import fr.ird.observe.application.web.configuration.user.ObserveWebUsersHelper; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; @@ -35,7 +40,9 @@ public class ObserveWebApplicationContext implements Closeable { protected ObserveServiceApplicationContext serviceApplicationContext; - private ObserveWebDatabases databases; + protected ObserveWebDatabases databases; + + protected ObserveWebUsers users; public static ObserveWebApplicationContext getApplicationContext(HttpContext context) { @@ -50,7 +57,7 @@ public class ObserveWebApplicationContext implements Closeable { } - public void init() throws InvalidObserveWebDatabaseException, InvalidObserveWebDatabasesException, InvalidObserveWebDatabaseRoleException { + public void init() throws InvalidObserveWebDatabaseException, InvalidObserveWebDatabasesException, InvalidObserveWebDatabaseRoleException, InvalidObserveWebUserPermissionException, InvalidObserveWebUsersException, InvalidObserveWebUserException { // init configuration applicationConfiguration = new ObserveWebApplicationConfiguration(); @@ -62,7 +69,8 @@ public class ObserveWebApplicationContext implements Closeable { databases = databasesHelper.load(applicationConfiguration.getDatabasesConfigurationFile()); // init users - //TODO + ObserveWebUsersHelper usersHelper = new ObserveWebUsersHelper(); + users = usersHelper.load(applicationConfiguration.getUsersConfigurationFile()); // init service application context serviceApplicationContext = new ObserveServiceApplicationContext(); @@ -86,6 +94,14 @@ public class ObserveWebApplicationContext implements Closeable { } + public ObserveWebDatabases getDatabases() { + return databases; + } + + public ObserveWebUsers getUsers() { + return users; + } + public ObserveDtoGsonSupplier getGsonSupplier() { return gsonSupplier; } 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 8f7d723..4429dcc 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 @@ -134,6 +134,10 @@ public class ObserveWebApplicationConfiguration { if (!databasesConfigurationFile.exists()) { // Generate a default databasesConfigurationFile + if (log.isInfoEnabled()) { + log.info("Generate a default databasesConfigurationFile for tests purpose only:\n" + DEV_DATABASES_CONFIGURATION_FILE_CONTENT); + } + try { Files.write(databasesConfigurationFile.toPath(), DEV_DATABASES_CONFIGURATION_FILE_CONTENT.getBytes()); } catch (IOException e) { @@ -144,6 +148,9 @@ public class ObserveWebApplicationConfiguration { if (!usersConfigurationFile.exists()) { // Generate a default usersConfigurationFile + if (log.isInfoEnabled()) { + log.info("Generate a default usersConfigurationFile for tests purpose only:\n" + DEV_USERS_CONFIGURATION_FILE_CONTENT); + } try { Files.write(usersConfigurationFile.toPath(), DEV_USERS_CONFIGURATION_FILE_CONTENT.getBytes()); } catch (IOException e) { @@ -246,14 +253,20 @@ public class ObserveWebApplicationConfiguration { " roles: \n" + " - login: admin\n" + " password: a\n" + + " - login: referentiel\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"; + "users: \n" + + "- login: admin\n" + + " password: a\n" + + " permissions: \n" + + " - database: production\n" + + " role: admin\n" + + "- login: referentiel\n" + + " password: a\n" + + " permissions: \n" + + " - database: production\n" + + " role: referentiel"; } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserException.java new file mode 100644 index 0000000..3d06b34 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserException.java @@ -0,0 +1,15 @@ +package fr.ird.observe.application.web.configuration.user; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidObserveWebUserException extends Exception { + + private static final long serialVersionUID = 1L; + + public InvalidObserveWebUserException(String message) { + super(message); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserPermissionException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserPermissionException.java new file mode 100644 index 0000000..20ebb4d --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUserPermissionException.java @@ -0,0 +1,15 @@ +package fr.ird.observe.application.web.configuration.user; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidObserveWebUserPermissionException extends Exception { + + private static final long serialVersionUID = 1L; + + public InvalidObserveWebUserPermissionException(String message) { + super(message); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUsersException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUsersException.java new file mode 100644 index 0000000..d617472 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/InvalidObserveWebUsersException.java @@ -0,0 +1,15 @@ +package fr.ird.observe.application.web.configuration.user; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidObserveWebUsersException extends Exception { + + private static final long serialVersionUID = 1L; + + public InvalidObserveWebUsersException(String message) { + super(message); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUser.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUser.java new file mode 100644 index 0000000..1c4211d --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUser.java @@ -0,0 +1,22 @@ +package fr.ird.observe.application.web.configuration.user; + +import com.google.common.base.Optional; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveWebUser<R extends ObserveWebUserPermission> { + + String getLogin(); + + String getPassword(); + + Collection<R> getPermissions(); + + Optional<R> getPermissionByDatabaseName(String databaseName); + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUserPermission.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUserPermission.java new file mode 100644 index 0000000..6e156fa --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUserPermission.java @@ -0,0 +1,14 @@ +package fr.ird.observe.application.web.configuration.user; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveWebUserPermission { + + String getDatabase(); + + String getRole(); + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsers.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsers.java new file mode 100644 index 0000000..19e6b69 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsers.java @@ -0,0 +1,18 @@ +package fr.ird.observe.application.web.configuration.user; + +import com.google.common.base.Optional; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public interface ObserveWebUsers<U extends ObserveWebUser> { + + Collection<U> getUsers(); + + Optional<U> getUserByLogin(String login); + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java new file mode 100644 index 0000000..e3661ff --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelper.java @@ -0,0 +1,138 @@ +package fr.ird.observe.application.web.configuration.user; + +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.user.impl.ObserveWebUserBean; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUserPermissionBean; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUsersBean; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUsersImmutable; +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 ObserveWebUsersHelper { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveWebUsersHelper.class); + + public ObserveWebUsersImmutable load(File file) throws InvalidObserveWebUsersException, InvalidObserveWebUserException, InvalidObserveWebUserPermissionException { + + ObserveWebUsersBean observeWebUsersBean = loadBean(file); + validateObserveWebUsersBean(observeWebUsersBean); + ObserveWebUsersImmutable observeWebUsersImmutable = observeWebUsersBean.toImmutable(); + return observeWebUsersImmutable; + + } + + public ObserveWebUsersBean loadBean(File file) { + ObserveWebUsersBean result; + try (Reader fileReader = Files.newReader(file, Charsets.UTF_8)) { + YamlReader reader = new YamlReader(fileReader, createConfig()); + result = reader.read(ObserveWebUsersBean.class); + fileReader.close(); + + } catch (Exception e) { + throw new RuntimeException("Could not read users from file: " + file, e); + } + + return result; + } + + public void validateObserveWebUsersBean(ObserveWebUsersBean observeWebUsersBean) throws InvalidObserveWebUsersException, InvalidObserveWebUserException, InvalidObserveWebUserPermissionException { + + if (CollectionUtils.isEmpty(observeWebUsersBean.getUsers())) { + throw new InvalidObserveWebUserException("No user defined"); + } + + for (ObserveWebUserBean observeWebUserBean : observeWebUsersBean.getUsers()) { + validateObserveWebUserBean(observeWebUserBean); + } + + } + + public void validateObserveWebUserBean(ObserveWebUserBean observeWebUserBean) throws InvalidObserveWebUserPermissionException, InvalidObserveWebUserException { + + String login = observeWebUserBean.getLogin(); + if (StringUtils.isBlank(login)) { + throw new InvalidObserveWebUserException("Found a user with no login defined"); + } + + if (StringUtils.isBlank(observeWebUserBean.getPassword())) { + throw new InvalidObserveWebUserException("User " + login + " has no password defined"); + } + + if (CollectionUtils.isEmpty(observeWebUserBean.getPermissions())) { + throw new InvalidObserveWebUserException("User " + login + " has no roles defined"); + } + + // unique database name + Set<String> databaseNames = new LinkedHashSet<>(); + + for (ObserveWebUserPermissionBean observeWebUserPermissionBean : observeWebUserBean.getPermissions()) { + + validateObserveWebUserPermissionBean(observeWebUserBean, observeWebUserPermissionBean); + + boolean added = databaseNames.add(observeWebUserPermissionBean.getDatabase()); + if (!added) { + throw new InvalidObserveWebUserException("User " + login + " contains with a doublon database permission: " + observeWebUserPermissionBean.getDatabase()); + } + + } + + } + + public void validateObserveWebUserPermissionBean(ObserveWebUserBean observeWebUserBean, ObserveWebUserPermissionBean observeWebUserRoleBean) throws InvalidObserveWebUserPermissionException { + + String login = observeWebUserBean.getLogin(); + + if (StringUtils.isBlank(observeWebUserRoleBean.getDatabase())) { + throw new InvalidObserveWebUserPermissionException("User " + login + ", found a permission with no database name defined"); + } + if (StringUtils.isBlank(observeWebUserRoleBean.getRole())) { + throw new InvalidObserveWebUserPermissionException("User " + login + ", found a permission " + observeWebUserRoleBean.getDatabase() + " with no role defined"); + } + + } + + public void storeBean(ObserveWebUsersBean users, File file) { + + if (log.isInfoEnabled()) { + log.info("Store users to " + file); + } + + try (BufferedWriter fileWriter = Files.newWriter(file, Charsets.UTF_8)) { + YamlWriter writer = new YamlWriter(fileWriter, createConfig()); + writer.write(users); + writer.close(); + } catch (Exception e) { + throw new RuntimeException("Could not write users to file: " + file, e); + } + + } + + protected YamlConfig createConfig() { + + YamlConfig yamlConfig = new YamlConfig(); + yamlConfig.writeConfig.setIndentSize(2); + yamlConfig.writeConfig.setWriteRootTags(false); + yamlConfig.setPropertyElementType(ObserveWebUsersBean.class, "users", ObserveWebUserBean.class); + yamlConfig.setPropertyElementType(ObserveWebUserBean.class, "permissions", ObserveWebUserPermissionBean.class); + return yamlConfig; + + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserBean.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserBean.java new file mode 100644 index 0000000..4b87486 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserBean.java @@ -0,0 +1,65 @@ +package fr.ird.observe.application.web.configuration.user.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.user.ObserveWebUser; + +import java.util.LinkedHashSet; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebUserBean implements ObserveWebUser<ObserveWebUserPermissionBean> { + + private String login; + + private String password; + + protected LinkedHashSet<ObserveWebUserPermissionBean> roles; + + @Override + public String getLogin() { + return login; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public LinkedHashSet<ObserveWebUserPermissionBean> getPermissions() { + return roles; + } + + @Override + public Optional<ObserveWebUserPermissionBean> getPermissionByDatabaseName(String databaseName) { + throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); + } + + public void setLogin(String login) { + this.login = login; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setPermissions(LinkedHashSet<ObserveWebUserPermissionBean> roles) { + this.roles = roles; + } + + public ObserveWebUserImmutable toImmutable() { + return new ObserveWebUserImmutable(login, password, Iterables.transform(roles, new Function<ObserveWebUserPermissionBean, ObserveWebUserPermissionImmutable>() { + + @Override + public ObserveWebUserPermissionImmutable apply(ObserveWebUserPermissionBean input) { + return input.toImmutable(); + } + })); + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserImmutable.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserImmutable.java new file mode 100644 index 0000000..2801cd6 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserImmutable.java @@ -0,0 +1,58 @@ +package fr.ird.observe.application.web.configuration.user.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.user.ObserveWebUser; + +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebUserImmutable implements ObserveWebUser<ObserveWebUserPermissionImmutable> { + + private final String login; + + private final String password; + + private final ImmutableMap<String, ObserveWebUserPermissionImmutable> permissions; + + public ObserveWebUserImmutable(String login, String password, Iterable<ObserveWebUserPermissionImmutable> permissions) { + + this.login = login; + this.password = password; + this.permissions = Maps.uniqueIndex(permissions, new Function<ObserveWebUserPermissionImmutable, String>() { + + @Override + public String apply(ObserveWebUserPermissionImmutable input) { + return input.getDatabase(); + } + }); + + } + + @Override + public String getLogin() { + return login; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public Collection<ObserveWebUserPermissionImmutable> getPermissions() { + return permissions.values(); + } + + @Override + public Optional<ObserveWebUserPermissionImmutable> getPermissionByDatabaseName(String databaseName) { + return Optional.fromNullable(permissions.get(databaseName)); + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionBean.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionBean.java new file mode 100644 index 0000000..133c2f6 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionBean.java @@ -0,0 +1,38 @@ +package fr.ird.observe.application.web.configuration.user.impl; + +import fr.ird.observe.application.web.configuration.user.ObserveWebUserPermission; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebUserPermissionBean implements ObserveWebUserPermission { + + private String role; + + private String database; + + @Override + public String getDatabase() { + return database; + } + + @Override + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public void setDatabase(String database) { + this.database = database; + } + + public ObserveWebUserPermissionImmutable toImmutable() { + return new ObserveWebUserPermissionImmutable(database, role); + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionImmutable.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionImmutable.java new file mode 100644 index 0000000..7692fda --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUserPermissionImmutable.java @@ -0,0 +1,31 @@ +package fr.ird.observe.application.web.configuration.user.impl; + +import fr.ird.observe.application.web.configuration.user.ObserveWebUserPermission; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebUserPermissionImmutable implements ObserveWebUserPermission { + + private final String database; + + private final String role; + + public ObserveWebUserPermissionImmutable(String database, String role) { + this.database = database; + this.role = role; + } + + @Override + public String getDatabase() { + return database; + } + + @Override + public String getRole() { + return role; + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersBean.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersBean.java new file mode 100644 index 0000000..d88e838 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersBean.java @@ -0,0 +1,43 @@ +package fr.ird.observe.application.web.configuration.user.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.user.ObserveWebUsers; + +import java.util.LinkedHashSet; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebUsersBean implements ObserveWebUsers<ObserveWebUserBean> { + + protected LinkedHashSet<ObserveWebUserBean> users; + + @Override + public LinkedHashSet<ObserveWebUserBean> getUsers() { + return users; + } + + @Override + public Optional<ObserveWebUserBean> getUserByLogin(String databaseName) { + throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); + } + + public void setUsers(LinkedHashSet<ObserveWebUserBean> users) { + this.users = users; + } + + public ObserveWebUsersImmutable toImmutable() { + return new ObserveWebUsersImmutable(Iterables.transform(users, new Function<ObserveWebUserBean, ObserveWebUserImmutable>() { + + @Override + public ObserveWebUserImmutable apply(ObserveWebUserBean input) { + return input.toImmutable(); + } + })); + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersImmutable.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersImmutable.java new file mode 100644 index 0000000..4ad728e --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/user/impl/ObserveWebUsersImmutable.java @@ -0,0 +1,42 @@ +package fr.ird.observe.application.web.configuration.user.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.user.ObserveWebUsers; + +import javax.annotation.Nullable; +import java.util.Collection; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebUsersImmutable implements ObserveWebUsers<ObserveWebUserImmutable> { + + private final ImmutableMap<String, ObserveWebUserImmutable> users; + + public ObserveWebUsersImmutable(Iterable<ObserveWebUserImmutable> users) { + this.users = Maps.uniqueIndex(users, new Function<ObserveWebUserImmutable, String>() { + + @Nullable + @Override + public String apply(ObserveWebUserImmutable input) { + return input.getLogin(); + } + }); + } + + @Override + public Collection<ObserveWebUserImmutable> getUsers() { + return users.values(); + } + + @Override + public Optional<ObserveWebUserImmutable> getUserByLogin(String login) { + return Optional.fromNullable(users.get(login)); + } + +} diff --git a/observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelperTest.java b/observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelperTest.java new file mode 100644 index 0000000..65cfbf7 --- /dev/null +++ b/observe-application-web/src/test/java/fr/ird/observe/application/web/configuration/user/ObserveWebUsersHelperTest.java @@ -0,0 +1,183 @@ +package fr.ird.observe.application.web.configuration.user; + +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.user.impl.ObserveWebUserBean; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUserImmutable; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUserPermissionBean; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUserPermissionImmutable; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUsersBean; +import fr.ird.observe.application.web.configuration.user.impl.ObserveWebUsersImmutable; +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 ObserveWebUsersHelperTest { + + protected ObserveWebApplicationConfiguration configuration; + + protected ObserveWebUsersHelper observeWebUsersHelper; + + public static final String FILE_CONTENT = "users: \n" + + "- login: user1\n" + + " password: password1\n" + + " permissions: \n" + + " - database: production\n" + + " role: admin\n" + + " - database: test\n" + + " role: technicien\n" + + "- login: user2\n" + + " password: password2\n" + + " permissions: \n" + + " - database: test\n" + + " role: referentiel\n"; + + @Before + public void setUp() throws Exception { + configuration = new ObserveWebApplicationConfiguration(); + configuration.init(); + observeWebUsersHelper = new ObserveWebUsersHelper(); + } + + @Test + public void testLoad() throws Exception { + + File databasesFile = configuration.getUsersConfigurationFile(); + + Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + + ObserveWebUsersImmutable databases = observeWebUsersHelper.load(databasesFile); + Assert.assertNotNull(databases); + Collection<ObserveWebUserImmutable> usersSet = databases.getUsers(); + Assert.assertNotNull(usersSet); + Assert.assertEquals(2, usersSet.size()); + + Optional<ObserveWebUserImmutable> production = databases.getUserByLogin("user1"); + Assert.assertTrue(production.isPresent()); + + Optional<ObserveWebUserImmutable> production2 = databases.getUserByLogin("user3"); + Assert.assertFalse(production2.isPresent()); + + { + ObserveWebUserImmutable user = Iterables.get(usersSet, 0); + Assert.assertNotNull(user); + Assert.assertEquals("user1", user.getLogin()); + Assert.assertNotNull(user.getPermissions()); + Assert.assertEquals(2, user.getPermissions().size()); + + Optional<ObserveWebUserPermissionImmutable> administrateur = user.getPermissionByDatabaseName("production"); + Assert.assertTrue(administrateur.isPresent()); + + Optional<ObserveWebUserPermissionImmutable> administrateur2 = user.getPermissionByDatabaseName("administrateur2"); + Assert.assertFalse(administrateur2.isPresent()); + } + { + ObserveWebUserImmutable user = Iterables.get(usersSet, 1); + Assert.assertNotNull(user); + Assert.assertEquals("user2", user.getLogin()); + Assert.assertNotNull(user.getPermissions()); + Assert.assertEquals(1, user.getPermissions().size()); + + Optional<ObserveWebUserPermissionImmutable> administrateur = user.getPermissionByDatabaseName("test"); + Assert.assertTrue(administrateur.isPresent()); + + } + + } + + @Test + public void testLoadBean() throws Exception { + + File databasesFile = configuration.getUsersConfigurationFile(); + + Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + + ObserveWebUsersBean users = observeWebUsersHelper.loadBean(databasesFile); + Assert.assertNotNull(users); + Set<ObserveWebUserBean> usersSet = users.getUsers(); + Assert.assertNotNull(usersSet); + Assert.assertEquals(2, usersSet.size()); + + { + ObserveWebUser user = Iterables.get(usersSet, 0); + Assert.assertNotNull(user); + Assert.assertEquals("user1", user.getLogin()); + Assert.assertNotNull(user.getPermissions()); + Assert.assertEquals(2, user.getPermissions().size()); + } + { + ObserveWebUser user = Iterables.get(usersSet, 1); + Assert.assertNotNull(user); + Assert.assertEquals("user2", user.getLogin()); + Assert.assertNotNull(user.getPermissions()); + Assert.assertEquals(1, user.getPermissions().size()); + } + } + + @Test + public void testStoreBean() throws Exception { + + LinkedHashSet<ObserveWebUserBean> userSet = new LinkedHashSet<>(); + { + ObserveWebUserBean user = new ObserveWebUserBean(); + user.setLogin("user1"); + user.setPassword("password1"); + LinkedHashSet<ObserveWebUserPermissionBean> permissions = new LinkedHashSet<>(); + { + ObserveWebUserPermissionBean permission = new ObserveWebUserPermissionBean(); + permission.setDatabase("production"); + permission.setRole("admin"); + permissions.add(permission); + } + { + ObserveWebUserPermissionBean permission = new ObserveWebUserPermissionBean(); + permission.setDatabase("test"); + permission.setRole("technicien"); + permissions.add(permission); + } + + user.setPermissions(permissions); + userSet.add(user); + } + { + ObserveWebUserBean user = new ObserveWebUserBean(); + user.setLogin("user2"); + user.setPassword("password2"); + LinkedHashSet<ObserveWebUserPermissionBean> permissions = new LinkedHashSet<>(); + { + ObserveWebUserPermissionBean permission = new ObserveWebUserPermissionBean(); + permission.setDatabase("test"); + permission.setRole("referentiel"); + permissions.add(permission); + } + + user.setPermissions(permissions); + userSet.add(user); + } + ObserveWebUsersBean users = new ObserveWebUsersBean(); + users.setUsers(userSet); + + File databasesFile = configuration.getUsersConfigurationFile(); + + observeWebUsersHelper.storeBean(users, 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 -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
participants (1)
-
codelutin.com scm