branch develop updated (819491b -> 26e197a)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository observe. See http://git.codelutin.com/observe.git from 819491b Nouvelle implantation du service de consolidation des données (termine #7488) Merge branch 'feature/7488' into develop new 0ef9322 Réactivitation des modules reset et de l'application web + Suppression d'objets non utiles et mise à jur de l'api de configuration pour les services rest new 1c7955d Rendre fermables les usines de services new b65d39b Mise en place du boot de l'application web (configuration, mapping, ...) (See 7494) new 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) new 0ede2d6 Faire fonctionner le chargement dynamqieu de la configuration des logs new 4ef2b84 Permettre d'enregistrer les configurations de bases et d'utilisateurs même immuables (See #7494) new 177d80c Vérification des permissions des utilisateurs en utilisant la configurations des bases (See #7494) new 598e7c5 Utilisation aussi du label dans le calcul de l'égalité sur une configuration de source de type topia PG (on s'en sert pour différencier différentes configuration sur la même base) new ef3be40 ajout d'une usine de configuration de sources de données neutre au niveau du runner de services, nettoyage de code et passage en scope compile des différentes configurations new b2f08df Gestion de la sécurité de l'application web bien avancée. new e5c6cd2 Amélioration du contexte de requete avec l'introduction d'un context de sécurité au niveau de la requete new 506e017 Fix javadoc author new 177d73f Suppression du ObserveServiceContext et remplacement par un object qui permet d'initialiser le service new 6d20092 Préparation du client rest new 364eb14 Suppression du context applicatif au niveau des service, on utilise maintenant uniquement l'objet d'initialisation des services. new 26e197a Retour sur develop termine #7494 Merge branch 'feature/7494' into develop The 18 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 26e197a3c3db2ebb85442f353dfdfaddfc9b588a Merge: 819491b 364eb14 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 11:15:50 2015 +0200 Retour sur develop termine #7494 Merge branch 'feature/7494' into develop commit 364eb149a3aa76fbc4648f9c2beacb5136b3f2ad Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 11:15:10 2015 +0200 Suppression du context applicatif au niveau des service, on utilise maintenant uniquement l'objet d'initialisation des services. commit 6d2009206aaeb9dd3981fe52148ad54327055868 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 00:35:22 2015 +0200 Préparation du client rest commit 177d73f35d34e3f3aad8be4f0c685830b4f71ff3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 00:12:33 2015 +0200 Suppression du ObserveServiceContext et remplacement par un object qui permet d'initialiser le service commit 506e017250e5df7727a38a4990823a0d6f25920a Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 07:26:34 2015 +0200 Fix javadoc author commit e5c6cd2b76880273468e120a315a984844595890 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 01:19:55 2015 +0200 Amélioration du contexte de requete avec l'introduction d'un context de sécurité au niveau de la requete commit b2f08df37f34be67f5b9664dac4516048f4078f5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 00:30:59 2015 +0200 Gestion de la sécurité de l'application web bien avancée. Mais il faudrait revoir le requestContext car je ne suis pas satisfait de ce que j'ai fait, il vaudrait mieux introduire un RequestSecurityContext et n'avoir q'un seul type de RequestContext. (See #7494) commit ef3be40f607d1aeddaddb3e11a7047faf1a9f45e Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 00:29:31 2015 +0200 ajout d'une usine de configuration de sources de données neutre au niveau du runner de services, nettoyage de code et passage en scope compile des différentes configurations commit 598e7c5ab19f0a1e85fde6824ab81f39d2a55cf7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 00:27:24 2015 +0200 Utilisation aussi du label dans le calcul de l'égalité sur une configuration de source de type topia PG (on s'en sert pour différencier différentes configuration sur la même base) commit 177d80cb4149cd329e3172f4d21f15990782e46c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 17:54:20 2015 +0200 Vérification des permissions des utilisateurs en utilisant la configurations des bases (See #7494) commit 4ef2b849b93ccc6878e113a1f3994341774adeea Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 16:09:51 2015 +0200 Permettre d'enregistrer les configurations de bases et d'utilisateurs même immuables (See #7494) commit 0ede2d64482f14b8c61790f02eff8eeaaad7e67d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 15:55:55 2015 +0200 Faire fonctionner le chargement dynamqieu de la configuration des logs 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) commit ea81a8f26ca2bf01cf7a49f4bb9caf65774e1dae Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 10:17:12 2015 +0200 Suppresion des injectors, mise en place des controlleurs commit b65d39b7c8cfed17ee12c31cdc0b7e9671cbd8d6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 09:37:17 2015 +0200 Mise en place du boot de l'application web (configuration, mapping, ...) (See 7494) commit 1c7955d20cec577a1ad011233c26ad0a32a4810d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Aug 29 16:07:50 2015 +0200 Rendre fermables les usines de services commit 0ef9322a16f08204fff12502db2a98394fdc0bad Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Aug 29 13:56:08 2015 +0200 Réactivitation des modules reset et de l'application web + Suppression d'objets non utiles et mise à jur de l'api de configuration pour les services rest Summary of changes: observe-application-web/pom.xml | 92 ++++++- .../src/jetty/jetty-context.xml | 10 + .../application/web/ObserveServiceInjector.java | 55 ----- .../web/ObserveWebApplicationContext.java | 109 ++++++--- .../ObserveWebApplicationContextInitException.java | 16 ++ .../web/ObserveWebApplicationListener.java | 10 +- .../application/web/ObserveWebMotionFilter.java | 98 +++++++- .../web/ObserveWebMotionJsonHelper.java | 2 +- .../application/web/ObserveWebMotionRender.java | 4 +- .../application/web/ObserveWebRequestContext.java | 77 ------ .../ObserveWebApplicationConfiguration.java | 271 +++++++++++++++++++++ ...veWebApplicationConfigurationInitException.java | 19 ++ .../ObserveWebApplicationConfigurationOption.java | 110 +++++++++ ...ObserveWebApplicationConfigurationProvider.java | 39 +++ .../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 | 22 ++ .../db/ObserveWebDatabasesHelper.java | 178 ++++++++++++++ .../db/impl/ObserveWebDatabaseBean.java | 74 ++++++ .../db/impl/ObserveWebDatabaseImmutable.java | 88 +++++++ .../db/impl/ObserveWebDatabaseRoleBean.java | 37 +++ .../db/impl/ObserveWebDatabaseRoleImmutable.java | 37 +++ .../db/impl/ObserveWebDatabasesBean.java | 54 ++++ .../db/impl/ObserveWebDatabasesImmutable.java | 79 ++++++ .../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 | 172 +++++++++++++ .../user/impl/ObserveWebUserBean.java | 65 +++++ .../user/impl/ObserveWebUserImmutable.java | 75 ++++++ .../user/impl/ObserveWebUserPermissionBean.java | 38 +++ .../impl/ObserveWebUserPermissionImmutable.java | 37 +++ .../user/impl/ObserveWebUsersBean.java | 43 ++++ .../user/impl/ObserveWebUsersImmutable.java | 56 +++++ .../web/controller/ObserveWebMotionController.java | 29 ++- .../web/controller/v1/ConfigurationController.java | 81 ++++++ .../controller/v1/DataSourceServiceController.java | 105 ++++++++ .../v1/ObserveServiceControllerSupport.java | 28 +++ .../v1/ReferentialServiceController.java | 36 +-- .../web/request/ObserveWebRequestContext.java | 108 ++++++++ .../request/ObserveWebRequestSecurityContext.java | 62 +++++ .../BadObserveWebUserPasswordException.java | 27 ++ ...urceConfigurationAlreadyRegistredException.java | 27 ++ .../InvalidAuthenticationTokenException.java | 22 ++ .../ObserveWebSecurityApplicationContext.java | 224 +++++++++++++++++ ...ObserveWebSecurityAuthenticationTokenCache.java | 84 +++++++ .../security/UnknownObserveWebUserException.java | 21 ++ .../UnknownObserveWebUserForDatabaseException.java | 27 ++ .../org.nuiton.config.ApplicationConfigProvider | 1 + .../src/main/resources/log4j.properties | 13 + observe-application-web/src/main/resources/mapping | 39 ++- .../src/main/resources/observeweb-log4j.conf | 21 ++ .../src/main/resources/observeweb.conf | 4 + .../db/ObserveWebDatabasesHelperTest.java | 241 ++++++++++++++++++ .../user/ObserveWebUsersHelperTest.java | 191 +++++++++++++++ .../fr/ird/observe/services/ObserveService.java | 2 - .../services/ObserveServiceApplicationContext.java | 81 ------ .../observe/services/ObserveServiceContext.java | 38 --- .../observe/services/ObserveServiceFactory.java | 12 +- .../services/ObserveServiceFactorySupport.java | 23 +- .../services/ObserveServiceInitializer.java | 99 ++++++++ .../ObserveDataSourceConfigurationRest.java | 25 +- .../ObserveDataSourceConfigurationTopiaPG.java | 6 +- .../services/ObserveServiceContextRest.java | 47 ---- .../services/ObserveServiceFactoryRest.java | 52 ++-- .../ird/observe/services/ObserveServiceRest.java | 20 -- observe-services-runner/pom.xml | 2 - .../ObserveDataSourceConfigurationMainFactory.java | 23 ++ .../services/ObserveServiceMainFactory.java | 27 +- .../services/ObserveServiceContextTopia.java | 73 +++--- .../services/ObserveServiceFactoryTopia.java | 29 ++- .../ird/observe/services/ObserveServiceTopia.java | 9 +- .../services/ApplicationContextResource.java | 30 +-- .../services/ObserveServiceContextTopiaTaiste.java | 5 + pom.xml | 117 +++++++-- 81 files changed, 3733 insertions(+), 527 deletions(-) create mode 100644 observe-application-web/src/jetty/jetty-context.xml delete mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveServiceInjector.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInitException.java delete mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationInitException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationProvider.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/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestSecurityContext.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/BadObserveWebUserPasswordException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/DataSourceConfigurationAlreadyRegistredException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/InvalidAuthenticationTokenException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityAuthenticationTokenCache.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserException.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserForDatabaseException.java create mode 100644 observe-application-web/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider create mode 100644 observe-application-web/src/main/resources/log4j.properties create mode 100644 observe-application-web/src/main/resources/observeweb-log4j.conf create mode 100644 observe-application-web/src/main/resources/observeweb.conf 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 delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java delete mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java create mode 100644 observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java delete mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceContextRest.java delete mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceRest.java create mode 100644 observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.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 develop in repository observe. See http://git.codelutin.com/observe.git commit 0ef9322a16f08204fff12502db2a98394fdc0bad Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Aug 29 13:56:08 2015 +0200 Réactivitation des modules reset et de l'application web + Suppression d'objets non utiles et mise à jur de l'api de configuration pour les services rest --- .../ObserveDataSourceConfigurationRest.java | 23 +++++++++++ .../services/ObserveServiceContextRest.java | 47 ---------------------- .../ird/observe/services/ObserveServiceRest.java | 20 --------- pom.xml | 8 ++-- 4 files changed, 27 insertions(+), 71 deletions(-) diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java index 50226ce..1f637fc 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java @@ -9,6 +9,13 @@ import java.net.URL; */ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConfiguration { + private static final long serialVersionUID = 1L; + + /** + * Le libellé de la data source. + */ + protected String label; + /** * L'url du serveur à utiliser. */ @@ -19,6 +26,15 @@ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConf */ protected String authenticationToken; + @Override + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + public URL getServerUrl() { return serverUrl; } @@ -34,4 +50,11 @@ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConf public void setAuthenticationToken(String authenticationToken) { this.authenticationToken = authenticationToken; } + + @Override + public boolean datasourceExists() { + //TODO + return false; + } + } diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceContextRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceContextRest.java deleted file mode 100644 index 926a7dc..0000000 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceContextRest.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.ird.observe.services; - -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; -import fr.ird.observe.services.dto.constants.ReferentialLocale; - -import java.net.URL; -import java.util.Date; - -/** - * Created on 16/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ObserveServiceContextRest implements ObserveServiceContext { - - protected ObserveServiceApplicationContext applicationContext; - - protected ObserveDataSourceConfigurationRest dataSourceConfiguration; - - @Override - public ReferentialLocale getReferentialLocale() { - return applicationContext.getReferentialLocale(); - } - - @Override - public Date now() { - return new Date(); - } - - public void setDataSourceConfiguration(ObserveDataSourceConfigurationRest dataSourceConfiguration) { - this.dataSourceConfiguration = dataSourceConfiguration; - } - - public void setApplicationContext(ObserveServiceApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - - public URL getServicesRemoteBaseUrl() { - return dataSourceConfiguration.getServerUrl(); - } - - public String getAuthenticationToken() { - return dataSourceConfiguration.getAuthenticationToken(); - } - - -} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceRest.java deleted file mode 100644 index 4a9b000..0000000 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceRest.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.ird.observe.services; - -/** - * Created on 16/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ObserveServiceRest implements ObserveService { - - protected ObserveServiceContextRest serviceContext; - - public void setServiceContext(ObserveServiceContextRest serviceContext) { - this.serviceContext = serviceContext; - } - - @Override - public void setServiceContext(ObserveServiceContext serviceContext) { - - } -} diff --git a/pom.xml b/pom.xml index 32c0ab1..56b2d70 100644 --- a/pom.xml +++ b/pom.xml @@ -89,10 +89,10 @@ <!--<module>observe-validation</module>--> <module>observe-services-configuration-topia</module> <module>observe-services-topia</module> - <!--<module>observe-services-configuration-rest</module>--> - <!--<module>observe-services-rest</module>--> - <!--<module>observe-services-runner</module>--> - <!--<module>observe-application-web</module>--> + <module>observe-services-configuration-rest</module> + <module>observe-services-rest</module> + <module>observe-services-runner</module> + <module>observe-application-web</module> <!--<module>observe-application-swing</module>--> </modules> <!--scm> -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 1c7955d20cec577a1ad011233c26ad0a32a4810d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Aug 29 16:07:50 2015 +0200 Rendre fermables les usines de services --- .../java/fr/ird/observe/services/ObserveServiceFactory.java | 6 +++++- .../fr/ird/observe/services/ObserveServiceFactoryRest.java | 5 +++++ .../fr/ird/observe/services/ObserveServiceMainFactory.java | 12 ++++++++++-- .../fr/ird/observe/services/ObserveServiceFactoryTopia.java | 3 +-- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java index 9ec36b0..b5ab0e5 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java @@ -2,15 +2,19 @@ package fr.ird.observe.services; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import java.io.Closeable; + /** * Created on 5/4/15. * * @author Tony Chemit - chemit@codelutin.com */ -public interface ObserveServiceFactory { +public interface ObserveServiceFactory extends Closeable { <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); + @Override + void close(); } diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index 11fc3d3..292c0c9 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -58,6 +58,11 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { } + @Override + public void close() { + //TODO Voir ce qu'il faut nettoyer, normalement pas grand chose + } + protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveDataSourceConfigurationRest dataSourceConfigurationRest) { String authenticationToken = dataSourceConfigurationRest.getAuthenticationToken(); diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java index eb2d31d..3d3c462 100644 --- a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java @@ -6,6 +6,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.io.Closeable; import java.util.ServiceLoader; /** @@ -13,7 +14,7 @@ import java.util.ServiceLoader; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveServiceMainFactory implements ObserveServiceFactory { +public class ObserveServiceMainFactory implements ObserveServiceFactory, Closeable { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceMainFactory.class); @@ -58,6 +59,14 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { } + @Override + public void close() { + + for (ObserveServiceFactory delegateFactory : delegateFactories) { + delegateFactory.close(); + } + } + protected ObserveServiceMainFactory() { if (log.isInfoEnabled()) { log.info("Init MainServiceFactory."); @@ -88,5 +97,4 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { return result; } - } \ No newline at end of file diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java index 3b015e3..c25033f 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java @@ -13,7 +13,6 @@ import fr.ird.observe.services.spi.Write; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.io.Closeable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -24,7 +23,7 @@ import java.util.Set; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport implements Closeable { +public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceFactoryTopia.class); -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit b65d39b7c8cfed17ee12c31cdc0b7e9671cbd8d6 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 09:37:17 2015 +0200 Mise en place du boot de l'application web (configuration, mapping, ...) (See 7494) --- observe-application-web/pom.xml | 86 ++++++++- .../src/jetty/jetty-context.xml | 10 + .../web/ObserveWebApplicationContext.java | 48 +++-- .../web/ObserveWebApplicationContextInjector.java | 53 ++++++ .../web/ObserveWebApplicationListener.java | 7 +- .../application/web/ObserveWebMotionRender.java | 4 +- .../ObserveWebApplicationConfiguration.java | 208 +++++++++++++++++++++ ...veWebApplicationConfigurationInitException.java | 19 ++ .../ObserveWebApplicationConfigurationOption.java | 110 +++++++++++ ...ObserveWebApplicationConfigurationProvider.java | 39 ++++ .../web/controller/v1/DocController.java | 41 ++++ .../org.nuiton.config.ApplicationConfigProvider | 1 + .../src/main/resources/log4j.properties | 13 ++ observe-application-web/src/main/resources/mapping | 38 +++- .../src/main/resources/observeweb-log4j.conf | 21 +++ .../src/main/resources/observeweb.conf | 4 + pom.xml | 100 +++++++--- 17 files changed, 742 insertions(+), 60 deletions(-) diff --git a/observe-application-web/pom.xml b/observe-application-web/pom.xml index de1c0da..ed03924 100644 --- a/observe-application-web/pom.xml +++ b/observe-application-web/pom.xml @@ -14,7 +14,14 @@ <name>ObServe :: Application Web</name> <description>ObServe Application Web</description> + <packaging>war</packaging> + <properties> + + <!-- Webapp configuration --> + <defaultWebContextPath>observeweb</defaultWebContextPath> + + </properties> <dependencies> <!-- sibling dependencies --> @@ -108,14 +115,24 @@ <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> <artifactId>slf4j-jcl</artifactId> - <scope>runtime</scope> + <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> - <scope>runtime</scope> + <scope>compile</scope> </dependency> <!-- test dependencies --> @@ -125,8 +142,71 @@ <artifactId>junit</artifactId> </dependency> - </dependencies> + <build> + <resources> + <resource> + <directory>src/main/resources</directory> + <includes> + <include>observeweb.conf</include> + <include>mapping</include> + </includes> + <filtering>true</filtering> + </resource> + <resource> + <directory>src/main/resources</directory> + <excludes> + <exclude>observeweb.conf</exclude> + </excludes> + </resource> + </resources> + + <plugins> + + </plugins> + + <pluginManagement> + <plugins> + <plugin> + <groupId>org.mortbay.jetty</groupId> + <artifactId>jetty-maven-plugin</artifactId> + <configuration> + <stopKey>B</stopKey> + <stopPort>1270</stopPort> + <contextXml>${basedir}/src/jetty/jetty-context.xml</contextXml> + <webAppConfig> + <contextPath>/${defaultWebContextPath}</contextPath> + </webAppConfig> + <!--systemProperties> + <systemProperty> + <name>testDirectory</name> + <value>${defaultLogDir}</value> + </systemProperty> + <systemProperty> + <name>pollen.data.directory</name> + <value>${defaultDbDir}</value> + </systemProperty> + </systemProperties--> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.tomcat.maven</groupId> + <artifactId>tomcat7-maven-plugin</artifactId> + <configuration> + <path>/${defaultWebContextPath}</path> + <!--systemProperties> + <pollen.data.directory>${defaultDbDir}</pollen.data.directory> + <pollen.log.dir>${defaultLogDir}</pollen.log.dir> + </systemProperties--> + <uriEncoding>UTF-8</uriEncoding> + </configuration> + </plugin> + </plugins> + </pluginManagement> + + </build> + </project> \ No newline at end of file diff --git a/observe-application-web/src/jetty/jetty-context.xml b/observe-application-web/src/jetty/jetty-context.xml new file mode 100644 index 0000000..164ccdd --- /dev/null +++ b/observe-application-web/src/jetty/jetty-context.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> + +<Configure class="org.eclipse.jetty.webapp.WebAppContext"> + <Call name="setAttribute"> + <Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg> + <Arg>.*/.*webmotion.*[^/]\.jar$</Arg> + </Call> +</Configure> \ No newline at end of file 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 cd39ff0..1e8dbab 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 @@ -1,6 +1,7 @@ package fr.ird.observe.application.web; import com.google.common.base.Preconditions; +import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.ObserveServiceMainFactory; @@ -8,11 +9,12 @@ import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; import org.debux.webmotion.server.call.HttpContext; import javax.servlet.ServletContext; +import java.io.Closeable; /** * @author Tony Chemit : chemit@codelutin.com */ -public class ObserveWebApplicationContext extends ObserveServiceApplicationContext { +public class ObserveWebApplicationContext extends ObserveServiceApplicationContext implements Closeable { public static final String APPLICATION_CONTEXT_PARAMETER = ObserveWebApplicationContext.class.getName(); @@ -24,6 +26,8 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte protected ObserveServiceFactory serviceFactory; + protected ObserveWebApplicationConfiguration applicationConfiguration; + protected static ObserveWebApplicationContext getApplicationContext(HttpContext context) { ServletContext servletContext = context.getServletContext(); @@ -37,42 +41,29 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte } -// protected ObserveServiceConfig serviceConfig; -// -// protected ObserveTopiaApplicationContext rootContext; - public void init() { - gsonSupplier = new ObserveDtoGsonSupplier(); + // init configuration + applicationConfiguration = new ObserveWebApplicationConfiguration(); + applicationConfiguration.init(); + + boolean devMode = applicationConfiguration.isDevMode(); + gsonSupplier = new ObserveDtoGsonSupplier(devMode); //FIXME Demander a la main factory directement la factory de topia serviceFactory = ObserveServiceMainFactory.get(); -// ObserveServiceConfig config = new ObserveServiceConfig(null); -// serviceConfig = config; -// Properties rootProperties = serviceConfig.getFlatOptions(); -// rootProperties.setProperty(TopiaConfigurationConstants.CONFIG_PERSISTENCE_CLASSES, ObserveEntityEnum.getImplementationClassesAsString()); -// -// rootContext = TopiaApplicationContextCache.getContext(rootProperties, ObserveConfigurationHelper.getCreateTopiaContextFunction(config)); } -// public ObserveServiceConfig getServiceConfig() { -// return serviceConfig; -// } + @Override + public void close() { -// public ObserveTopiaPersistenceContext newTransaction() { -// ObserveTopiaPersistenceContext persistenceContext = rootContext.newPersistenceContext(); -// return persistenceContext; -// } + // Supprimer le cache des sessions + //TODO - public void close() { -// if (rootContext != null) { -// rootContext.closeContext(); -// } - } + // Fermer l'usine de services + serviceFactory.close(); - public boolean isDevMode() { - return true; } public ObserveServiceFactory getServiceFactory() { @@ -82,4 +73,9 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte public ObserveDtoGsonSupplier getGsonSupplier() { return gsonSupplier; } + + public ObserveWebApplicationConfiguration getApplicationConfiguration() { + return applicationConfiguration; + } + } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInjector.java new file mode 100644 index 0000000..f585e23 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInjector.java @@ -0,0 +1,53 @@ +package fr.ird.observe.application.web; + +/* + * #%L + * Pollen :: Rest Api + * %% + * Copyright (C) 2009 - 2014 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import org.debux.webmotion.server.call.Call; +import org.debux.webmotion.server.call.HttpContext; +import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; +import org.debux.webmotion.server.mapping.Mapping; + +import java.lang.reflect.Type; + +/** + * Created on 5/23/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.0 + */ +public class ObserveWebApplicationContextInjector implements ExecutorParametersInjectorHandler.Injector { + + @Override + public ObserveWebApplicationContext getValue(Mapping m, Call call, String name, Class type, Type generic) { + + ObserveWebApplicationContext result = null; + if (ObserveWebApplicationContext.class.isAssignableFrom(type)) { + + HttpContext httpContext = call.getContext(); + result = ObserveWebApplicationContext.getApplicationContext(httpContext); + + } + + return result; + + } +} 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 52f984d..b304cee 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 @@ -18,15 +18,18 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { @Override public void onStart(Mapping mapping, ServerContext context) { - if (log.isInfoEnabled()) { log.info("Initializing " + ObserveWebApplicationListener.class.getName()); } + context.addInjector(new ObserveWebApplicationContextInjector()); + context.addInjector(new ObserveServiceInjector()); + applicationContext = new ObserveWebApplicationContext(); applicationContext.init(); - context.addInjector(new ObserveServiceInjector()); + context.getServletContext().setAttribute( + ObserveWebApplicationContext.APPLICATION_CONTEXT_PARAMETER, applicationContext); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionRender.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionRender.java index f50f873..e1784d1 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionRender.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionRender.java @@ -39,9 +39,7 @@ public class ObserveWebMotionRender<T> extends Render { // response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // // } - - boolean devMode = applicationContext.isDevMode(); - + applicationContext.getGsonSupplier(); Gson gson = applicationContext.getGsonSupplier().get(); 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 new file mode 100644 index 0000000..315596d --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfiguration.java @@ -0,0 +1,208 @@ +package fr.ird.observe.application.web.configuration; + +import com.google.common.base.Charsets; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.LogManager; +import org.apache.log4j.PropertyConfigurator; +import org.nuiton.config.ApplicationConfig; +import org.nuiton.config.ApplicationConfigHelper; +import org.nuiton.config.ApplicationConfigProvider; +import org.nuiton.config.ArgumentsParserException; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +/** + * La configuration de l'application web. + * + * Created on 29/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebApplicationConfiguration { + + /** Logger. */ + private static Log log = LogFactory.getLog(ObserveWebApplicationConfiguration.class); + + protected static final String DEFAULT_OBSERVE_WEB_CONF = "observeweb.conf"; + + private final ApplicationConfig applicationConfig; + + private File baseDirectory; + + + public ObserveWebApplicationConfiguration() { + this(DEFAULT_OBSERVE_WEB_CONF); + } + + public ObserveWebApplicationConfiguration(String confFileName) { + applicationConfig = new ApplicationConfig(); + applicationConfig.setEncoding(Charsets.UTF_8.name()); + applicationConfig.setConfigFileName(confFileName); + ApplicationConfigProvider applicationConfigProvider = ApplicationConfigHelper.getProvider(getClass().getClassLoader(), ObserveWebApplicationConfigurationProvider.OBSERVE_WEB_CONFIGURATION_PROVIDER_NAME); + applicationConfig.loadDefaultOptions(applicationConfigProvider.getOptions()); + + if (isDevMode()) { + + // on utilise un répertoire temporaire comme basedir + File basedir; + + try { + Set<PosixFilePermission> posixFilePermissions = PosixFilePermissions.fromString("rwxr-x---"); + FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(posixFilePermissions); + basedir = Files.createTempDirectory("observeweb", fileAttribute).toFile(); + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("could not create temporary basedir", e); + } + if (log.isInfoEnabled()) { + log.info("Dev mode detected, use temporary basedir: " + basedir); + } + applicationConfig.setOption(ObserveWebApplicationConfigurationOption.BASE_DIRECTORY.getKey(), basedir.getAbsolutePath()); + + } + } + + public boolean isDevMode() { + return applicationConfig.getOptionAsBoolean(ObserveWebApplicationConfigurationOption.DEV_MODE.getKey()); + } + + public File getBaseDirectory() { + return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.BASE_DIRECTORY.getKey()); + } + + public File getTemporaryDirectory() { + return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.TEMPORARY_DIRECTORY.getKey()); + } + + public File getDatabasesConfigurationFile() { + return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.DATABASES_CONFIGURATION_FILE.getKey()); + } + + public File getUsersConfigurationFile() { + return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.USERS_CONFIGURATION_FILE.getKey()); + } + + public int getSessionExpirationDelay() { + return applicationConfig.getOptionAsInt(ObserveWebApplicationConfigurationOption.SESSION_EXPIRATION_DELAY.getKey()); + } + + public void init(String... args) { + + if (log.isInfoEnabled()) { + log.info("Starts to init ObserVeWeb configuration..."); + } + + try { + applicationConfig.parse(args); + } catch (ArgumentsParserException e) { + throw new ObserveWebApplicationConfigurationInitException("could not parse configuration", e); + } + + if (log.isInfoEnabled()) { + String message = getConfigurationDescription(); + log.info(message); + } + + File applicationBaseDirectory = getBaseDirectory(); + try { + createDirectory(applicationBaseDirectory); + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("Impossible de créer le répertoire principal de l'application (" + applicationBaseDirectory + ")", e); + } + File temporaryDirectory = getTemporaryDirectory(); + try { + createDirectory(temporaryDirectory); + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("Impossible de créer le répertoire temporaire de l'application (" + temporaryDirectory + ")", e); + } + + if (!isDevMode()) { + initLog(); + } + + } + + public String getConfigurationDescription() { + StringBuilder builder = new StringBuilder(); + builder.append("\n====================================================================================================================="); + builder.append("\n=== Observe Web configuration ======================================================================================="); + builder.append(String.format("\n=== %1$-40s = %2$s", "Filename", applicationConfig.getConfigFileName())); + for (ObserveWebApplicationConfigurationOption option : ObserveWebApplicationConfigurationOption.orderedByNameValues()) { + builder.append(String.format("\n=== %1$-40s = %2$s", option.getKey(), applicationConfig.getOption(option))); + } + builder.append("\n====================================================================================================================="); + return builder.toString(); + } + + protected void createDirectory(File directory) throws IOException { + Set<PosixFilePermission> posixFilePermissions = PosixFilePermissions.fromString("rwxrwx---"); + FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(posixFilePermissions); + Files.createDirectories(directory.toPath(), fileAttribute); + } + + protected void initLog() { + + String logFilePath = applicationConfig.getOption(ObserveWebApplicationConfigurationOption.LOG4J_CONFIGURATION_FILE.getKey()); + + URL resource; + if (logFilePath.startsWith("classpath:")) { + resource = getClass().getResource(logFilePath.substring(10)); + + } else { + File logFile = applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.LOG4J_CONFIGURATION_FILE.getKey()); + + if (!logFile.exists()) { + throw new ObserveWebApplicationConfigurationInitException("Le fichier de configuration des logs (" + logFile + ") n'existe pas"); + } + + try { + resource = logFile.toURI().toURL(); + } catch (MalformedURLException e) { + + throw new ObserveWebApplicationConfigurationInitException("L'url du fichier de configuration des logs (" + logFile + ") est malformée", e); + + } + + } + + if (log.isInfoEnabled()) { + log.info("Chargement du fichier de de log4j depuis " + resource); + } + + Properties finalLogConfigurationProperties = new Properties(); + try (InputStream inputStream = resource.openStream()) { + + Properties logConfigurationProperties = new Properties(); + logConfigurationProperties.load(inputStream); + + for (Map.Entry<Object, Object> entry : logConfigurationProperties.entrySet()) { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + String newValue = applicationConfig.getOption(value); + finalLogConfigurationProperties.setProperty(key, newValue); + } + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("Impossible de charger le fichier de configuration des logs", e); + } + + LogManager.resetConfiguration(); + PropertyConfigurator.configure(finalLogConfigurationProperties); + + log = LogFactory.getLog(ObserveWebApplicationConfiguration.class); + if (log.isInfoEnabled()) { + log.info("Initialisation de log4j terminées depuis " + logFilePath); + } + + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationInitException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationInitException.java new file mode 100644 index 0000000..084fbd4 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationInitException.java @@ -0,0 +1,19 @@ +package fr.ird.observe.application.web.configuration; + +/** + * Created on 29/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebApplicationConfigurationInitException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public ObserveWebApplicationConfigurationInitException(String message) { + super(message); + } + + public ObserveWebApplicationConfigurationInitException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java new file mode 100644 index 0000000..b863bc8 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationOption.java @@ -0,0 +1,110 @@ +package fr.ird.observe.application.web.configuration; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import org.apache.commons.lang3.NotImplementedException; +import org.nuiton.config.ConfigOptionDef; +import org.nuiton.util.version.Version; + +import java.io.File; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static org.nuiton.i18n.I18n.n; + +/** + * La configuration de l'application web. + * + * Created on 29/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public enum ObserveWebApplicationConfigurationOption implements ConfigOptionDef { + + BUILD_VERSION("observeweb.build.version", n("observeweb.build.version.description"), "", Version.class), + BUILD_DATE("observeweb.build.date", n("observeweb.build.date.description"), "", String.class), + BUILD_NUMBER("observeweb.build.number", n("observeweb.build.number.description"), "", String.class), + + DEV_MODE("observeweb.devMode", n("observeweb.devMode.description"), "true", boolean.class), + BASE_DIRECTORY("observeweb.baseDirectory", n("observeweb.baseDirectory.description"), "/var/local/observeweb", File.class), + TEMPORARY_DIRECTORY("observeweb.temporaryDirectory", n("observeweb.temporaryDirectory.description"), "${observeweb.baseDirectory}/temp", File.class), + LOG4J_CONFIGURATION_FILE("observeweb.log4jConfigurationFile", n("observeweb.log4jConfigurationFile.description"), "${observeweb.baseDirectory}/observeweb-log4j.conf", String.class), + DATABASES_CONFIGURATION_FILE("observeweb.databasesConfigurationFile", n("observeweb.databasesConfigurationFile.description"), "${observeweb.baseDirectory}/databases.yml", File.class), + USERS_CONFIGURATION_FILE("observeweb.usersConfigurationFile", n("observeweb.usersConfigurationFile.description"), "${observeweb.baseDirectory}/users.yml", File.class), + SESSION_EXPIRATION_DELAY("observeweb.sessionExpirationDelay", n("observeweb.sessionExpirationDelay.description"), "60" /* en minutes */, int.class); + + ObserveWebApplicationConfigurationOption(String key, String description, String defaultValue, Class<?> type) { + this.key = key; + this.description = description; + this.defaultValue = defaultValue; + this.type = type; + } + + private final String key; + + private final String description; + + private final String defaultValue; + + private final Class<?> type; + + @Override + public String getKey() { + return key; + } + + @Override + public Class<?> getType() { + return type; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getDefaultValue() { + return defaultValue; + } + + @Override + public boolean isTransient() { + return false; + } + + @Override + public boolean isFinal() { + return true; + } + + @Override + public void setDefaultValue(String defaultValue) { + throw new NotImplementedException("Can't invoke setDefaultValue method"); + } + + @Override + public void setTransient(boolean isTransient) { + throw new NotImplementedException("Can't invoke setTransient method"); + } + + @Override + public void setFinal(boolean isFinal) { + throw new NotImplementedException("Can't invoke setFinal method"); + } + + public static ImmutableList<ObserveWebApplicationConfigurationOption> orderedByNameValues() { + + List<ObserveWebApplicationConfigurationOption> values = Lists.newArrayList(values()); + Collections.sort(values, new Comparator<ObserveWebApplicationConfigurationOption>() { + + @Override + public int compare(ObserveWebApplicationConfigurationOption o1, ObserveWebApplicationConfigurationOption o2) { + return o1.getKey().compareTo(o2.getKey()); + } + }); + return ImmutableList.copyOf(values); + + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationProvider.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationProvider.java new file mode 100644 index 0000000..629ebe9 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/configuration/ObserveWebApplicationConfigurationProvider.java @@ -0,0 +1,39 @@ +package fr.ird.observe.application.web.configuration; + +import org.nuiton.config.ApplicationConfigProvider; +import org.nuiton.config.ConfigActionDef; +import org.nuiton.config.ConfigOptionDef; + +import java.util.Locale; + +import static org.nuiton.i18n.I18n.l; + +/** + * Created on 29/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebApplicationConfigurationProvider implements ApplicationConfigProvider { + + public static final String OBSERVE_WEB_CONFIGURATION_PROVIDER_NAME = "observeWeb"; + + @Override + public String getName() { + return OBSERVE_WEB_CONFIGURATION_PROVIDER_NAME; + } + + @Override + public String getDescription(Locale locale) { + return l(locale, "observeweb.configuration.description"); + } + + @Override + public ConfigOptionDef[] getOptions() { + return ObserveWebApplicationConfigurationOption.values(); + } + + @Override + public ConfigActionDef[] getActions() { + return new ConfigActionDef[0]; + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java new file mode 100644 index 0000000..821819b --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java @@ -0,0 +1,41 @@ +package fr.ird.observe.application.web.controller.v1; + +import fr.ird.observe.application.web.ObserveWebApplicationContext; +import org.apache.commons.io.IOUtils; +import org.debux.webmotion.server.WebMotionController; +import org.debux.webmotion.server.render.Render; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Created on 8/30/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DocController extends WebMotionController { + + public Render mapping() { + + InputStream mappingUrl = getClass().getResourceAsStream("/mapping"); + + try { + + String content = IOUtils.toString(mappingUrl); + return renderContent(content, "text/plain"); + + } catch (IOException e) { + + throw new RuntimeException(e); + + } + + } + + public Render configuration(ObserveWebApplicationContext applicationContext) { + + String content = applicationContext.getApplicationConfiguration().getConfigurationDescription(); + return renderContent(content, "text/plain"); + + } +} diff --git a/observe-application-web/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider b/observe-application-web/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider new file mode 100644 index 0000000..e923a49 --- /dev/null +++ b/observe-application-web/src/main/resources/META-INF/services/org.nuiton.config.ApplicationConfigProvider @@ -0,0 +1 @@ +fr.ird.observe.application.web.configuration.ObserveWebApplicationConfigurationProvider \ No newline at end of file diff --git a/observe-application-web/src/main/resources/log4j.properties b/observe-application-web/src/main/resources/log4j.properties new file mode 100644 index 0000000..869ef14 --- /dev/null +++ b/observe-application-web/src/main/resources/log4j.properties @@ -0,0 +1,13 @@ + +# Global logging configuration +log4j.rootLogger=WARN, stdout + +# Console output... +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%c:%L) %M - %m%n + +# levels +log4j.logger.fr.ird.observe=DEBUG +log4j.logger.org.nuiton=INFO +log4j.logger.org.debux=INFO diff --git a/observe-application-web/src/main/resources/mapping b/observe-application-web/src/main/resources/mapping index 0aa5db6..51e97da 100644 --- a/observe-application-web/src/main/resources/mapping +++ b/observe-application-web/src/main/resources/mapping @@ -1,15 +1,45 @@ +### +# #%L +# ObServe :: Web Application +# %% +# Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit +# %% +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program. If not, see +# <http://www.gnu.org/licenses/gpl-3.0.html>. +# #L% +### + +# +# Application Version ${project.version} +# Build Date ${buildDate} +# Build Number ${buildNumber} +# + [config] -package.base=fr.ird.observe.application.web.controller +package.filters=fr.ird.observe.application.web package.actions=fr.ird.observe.application.web.controller.v1 package.errors=fr.ird.observe.application.web.controller.v1 server.controller.scope=request -server.listener.class=fr.ird.observe.services.rest.wm.ObserveServerListener +server.listener.class=fr.ird.observe.application.web.ObserveWebApplicationListener default.render=fr.ird.observe.application.web.ObserveWebMotionRender [filters] -* /* ObserveWebMotionFilter.inject +* /* ObserveWebMotionFilter.inject [actions] -GET,POST /api/v1/referential/{method} action:ReferentialServiceController.{method} + +GET /api/v1/doc/{method} DocController.{method} +GET,POST /api/v1/referential/{method} ReferentialServiceController.{method} diff --git a/observe-application-web/src/main/resources/observeweb-log4j.conf b/observe-application-web/src/main/resources/observeweb-log4j.conf new file mode 100644 index 0000000..2d6733f --- /dev/null +++ b/observe-application-web/src/main/resources/observeweb-log4j.conf @@ -0,0 +1,21 @@ + +# Global logging configuration +log4j.rootLogger=WARN, stdout, file + +# Console output... +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%c:%L) %M - %m%n + +# file output... +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=${observeweb.baseDirectory}/log/observeweb-${observeweb.version}.log +log4j.appender.file.MaxFileSize=10MB +log4j.appender.file.MaxBackupIndex=4 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss} %5p [%t] (%c:%L) %M - %m%n + +# levels + +log4j.logger.fr.ird.observe=INFO +log4j.logger.org.nuiton.topia.migration=INFO diff --git a/observe-application-web/src/main/resources/observeweb.conf b/observe-application-web/src/main/resources/observeweb.conf new file mode 100644 index 0000000..0284992 --- /dev/null +++ b/observe-application-web/src/main/resources/observeweb.conf @@ -0,0 +1,4 @@ +observeweb.devMode=${devMode} +observeweb.build.version=${project.version} +observeweb.build.date=${buildDate} +observeweb.build.number=${buildNumber} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 56b2d70..21929c6 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,8 @@ <http://www.gnu.org/licenses/lgpl-3.0.html>. #L% --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> @@ -95,13 +96,13 @@ <module>observe-application-web</module> <!--<module>observe-application-swing</module>--> </modules> -<!--scm> - <url>https://svn.mpl.ird.fr/osiris/observe/trunk</url> - <connection>scm:svn:https://svn.mpl.ird.fr/osiris/observe/trunk</connection> - <developerConnection> - scm:svn:https://svn.mpl.ird.fr/osiris/observe/trunk - </developerConnection> - </scm--> + <!--scm> + <url>https://svn.mpl.ird.fr/osiris/observe/trunk</url> + <connection>scm:svn:https://svn.mpl.ird.fr/osiris/observe/trunk</connection> + <developerConnection> + scm:svn:https://svn.mpl.ird.fr/osiris/observe/trunk + </developerConnection> + </scm--> <scm> <url>https://gitweb.codelutin.com/observe.git</url> <connection>scm:git:http://git.codelutin.com/observe.git</connection> @@ -146,6 +147,10 @@ <!-- Site configuration --> <locales>fr</locales> + <maven.build.timestamp.format>dd/MM/yyyy HH:mm z</maven.build.timestamp.format> + <buildDate>${maven.build.timestamp}</buildDate> + <devMode>true</devMode> + </properties> <repositories> @@ -250,12 +255,6 @@ </dependency> <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - <version>1.2.17</version> - </dependency> - - <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> @@ -597,6 +596,21 @@ <!-- logging --> <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.17</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>${sl4jVersion}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${sl4jVersion}</version> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jcl</artifactId> <version>${sl4jVersion}</version> @@ -636,6 +650,26 @@ </dependencyManagement> <build> + + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>buildnumber-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>create</goal> + </goals> + <phase>validate</phase> + </execution> + </executions> + <configuration> + <doCheck>false</doCheck> + <doUpdate>false</doUpdate> + </configuration> + </plugin> + </plugins> + <pluginManagement> <plugins> @@ -692,6 +726,12 @@ </plugin> <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>buildnumber-maven-plugin</artifactId> + <version>1.3</version> + </plugin> + + <plugin> <groupId>com.thoughtworks.paranamer</groupId> <artifactId>paranamer-maven-plugin</artifactId> <version>${paranamerVersion}</version> @@ -716,6 +756,19 @@ <profiles> <profile> + <id>no-devmode</id> + <activation> + <property> + <name>performRelease</name> + <value>true</value> + </property> + </activation> + <properties> + <devMode>false</devMode> + </properties> + </profile> + + <profile> <id>central-safe</id> <activation> <property> @@ -773,13 +826,14 @@ <configuration> <!-- TODO chemit 2011-02-24 Change to 'target' when using ant-run 1.6 in mavenpom4labs... --> <tasks> - <echo message="Copy model to site" /> - <copy verbose="${maven.verbose}" failonerror="false" overwrite="true" todir="${project.reporting.outputDirectory}/model"> + <echo message="Copy model to site"/> + <copy verbose="true" failonerror="false" overwrite="true" + todir="${project.reporting.outputDirectory}/model"> <fileset dir="${basedir}/doc/modelisation"> - <include name="**/*.pdf" /> + <include name="**/*.pdf"/> </fileset> <fileset dir="${basedir}/observe-entities/src/main/xmi"> - <include name="**/*.zargo" /> + <include name="**/*.zargo"/> </fileset> </copy> </tasks> @@ -794,9 +848,10 @@ <phase>pre-site</phase> <configuration> <tasks> - <copy todir="${project.reporting.outputDirectory}" verbose="${maven.verbose}" failonerror="false" overwrite="false"> + <copy todir="${project.reporting.outputDirectory}" verbose="true" failonerror="false" + overwrite="false"> <fileset dir="observe-validation/src/main/java"> - <include name="**/*-validation.xml" /> + <include name="**/*-validation.xml"/> </fileset> </copy> </tasks> @@ -811,9 +866,10 @@ <phase>pre-site</phase> <configuration> <tasks> - <copy todir="${project.reporting.outputDirectory}" verbose="${maven.verbose}" failonerror="false" overwrite="false"> + <copy todir="${project.reporting.outputDirectory}" verbose="true" failonerror="false" + overwrite="false"> <fileset dir="observe-validation/src/main/resources"> - <include name="validators.xml" /> + <include name="validators.xml"/> </fileset> </copy> </tasks> -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit ea81a8f26ca2bf01cf7a49f4bb9caf65774e1dae Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 10:17:12 2015 +0200 Suppresion des injectors, mise en place des controlleurs --- .../application/web/ObserveServiceInjector.java | 55 ---------------------- .../web/ObserveWebApplicationContext.java | 38 ++++++++++----- .../web/ObserveWebApplicationContextInjector.java | 53 --------------------- .../web/ObserveWebApplicationListener.java | 3 -- .../application/web/ObserveWebMotionFilter.java | 4 +- .../application/web/ObserveWebRequestContext.java | 28 ++++------- .../web/controller/ObserveWebMotionController.java | 18 ++++++- .../web/controller/v1/DocController.java | 9 ++-- .../v1/ReferentialServiceController.java | 10 +++- observe-application-web/src/main/resources/mapping | 8 ++-- .../services/ObserveServiceApplicationContext.java | 17 +++++-- 11 files changed, 81 insertions(+), 162 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveServiceInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveServiceInjector.java deleted file mode 100644 index 63de3be..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveServiceInjector.java +++ /dev/null @@ -1,55 +0,0 @@ -package fr.ird.observe.application.web; - -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import fr.ird.observe.services.ObserveService; -import org.debux.webmotion.server.call.Call; -import org.debux.webmotion.server.call.HttpContext; -import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; -import org.debux.webmotion.server.mapping.Mapping; - -import java.lang.reflect.Type; - -/** - * Created on 5/23/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 - */ -public class ObserveServiceInjector implements ExecutorParametersInjectorHandler.Injector { - - @Override - public ObserveService getValue(Mapping m, Call call, String name, Class type, Type generic) { - - ObserveService result = null; - if (ObserveService.class.isAssignableFrom(type)) { - - HttpContext httpContext = call.getContext(); - ObserveWebRequestContext requestContext = ObserveWebRequestContext.getRequestContext(httpContext); - result = requestContext.newService(type); - - } - - return result; - - } -} 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 1e8dbab..f6fd20c 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,9 +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.services.ObserveService; import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.ObserveServiceMainFactory; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; import org.debux.webmotion.server.call.HttpContext; @@ -12,9 +14,9 @@ import javax.servlet.ServletContext; import java.io.Closeable; /** - * @author Tony Chemit : chemit@codelutin.com + * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveWebApplicationContext extends ObserveServiceApplicationContext implements Closeable { +public class ObserveWebApplicationContext implements Closeable { public static final String APPLICATION_CONTEXT_PARAMETER = ObserveWebApplicationContext.class.getName(); @@ -24,11 +26,11 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte protected ObserveDtoGsonSupplier gsonSupplier; - protected ObserveServiceFactory serviceFactory; - protected ObserveWebApplicationConfiguration applicationConfiguration; - protected static ObserveWebApplicationContext getApplicationContext(HttpContext context) { + protected ObserveServiceApplicationContext serviceApplicationContext; + + public static ObserveWebApplicationContext getApplicationContext(HttpContext context) { ServletContext servletContext = context.getServletContext(); ObserveWebApplicationContext result = @@ -47,12 +49,21 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte applicationConfiguration = new ObserveWebApplicationConfiguration(); applicationConfiguration.init(); + // init databases + //TODO + + // init users + //TODO + + // init service application context + serviceApplicationContext = new ObserveServiceApplicationContext(); + serviceApplicationContext.setTemporaryDirectoryRoot(applicationConfiguration.getTemporaryDirectory().toPath()); + serviceApplicationContext.setMainServiceFactory(ObserveServiceMainFactory.get()); + + // init gson supplier boolean devMode = applicationConfiguration.isDevMode(); gsonSupplier = new ObserveDtoGsonSupplier(devMode); - //FIXME Demander a la main factory directement la factory de topia - serviceFactory = ObserveServiceMainFactory.get(); - } @Override @@ -62,12 +73,8 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte //TODO // Fermer l'usine de services - serviceFactory.close(); - - } + serviceApplicationContext.close(); - public ObserveServiceFactory getServiceFactory() { - return serviceFactory; } public ObserveDtoGsonSupplier getGsonSupplier() { @@ -78,4 +85,9 @@ public class ObserveWebApplicationContext extends ObserveServiceApplicationConte return applicationConfiguration; } + public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + ObserveServiceFactory mainServiceFactory = serviceApplicationContext.getMainServiceFactory(); + return mainServiceFactory.newService(serviceApplicationContext, dataSourceConfiguration, serviceType); + } + } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInjector.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInjector.java deleted file mode 100644 index f585e23..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebApplicationContextInjector.java +++ /dev/null @@ -1,53 +0,0 @@ -package fr.ird.observe.application.web; - -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import org.debux.webmotion.server.call.Call; -import org.debux.webmotion.server.call.HttpContext; -import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; -import org.debux.webmotion.server.mapping.Mapping; - -import java.lang.reflect.Type; - -/** - * Created on 5/23/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 - */ -public class ObserveWebApplicationContextInjector implements ExecutorParametersInjectorHandler.Injector { - - @Override - public ObserveWebApplicationContext getValue(Mapping m, Call call, String name, Class type, Type generic) { - - ObserveWebApplicationContext result = null; - if (ObserveWebApplicationContext.class.isAssignableFrom(type)) { - - HttpContext httpContext = call.getContext(); - result = ObserveWebApplicationContext.getApplicationContext(httpContext); - - } - - return result; - - } -} 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 b304cee..10b1c3a 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 @@ -22,9 +22,6 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { log.info("Initializing " + ObserveWebApplicationListener.class.getName()); } - context.addInjector(new ObserveWebApplicationContextInjector()); - context.addInjector(new ObserveServiceInjector()); - applicationContext = new ObserveWebApplicationContext(); applicationContext.init(); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java index 1b308ec..07d7abe 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java @@ -23,9 +23,7 @@ public class ObserveWebMotionFilter extends WebMotionFilter { //TODO Recuperation de la configuration de la data source de la base à partir du token ObserveDataSourceConfiguration dataSourceConfiguration = null; - ObserveWebRequestContext requestContext = new ObserveWebRequestContext(); - requestContext.setWebApplicationContext(applicationContext); - requestContext.setDataSourceConfiguration(dataSourceConfiguration); + ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, dataSourceConfiguration); ObserveWebRequestContext.setRequestContext(context, requestContext); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java index 5418c73..9846742 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java @@ -22,7 +22,6 @@ package fr.ird.observe.application.web; */ import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.ObserveServiceFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import org.debux.webmotion.server.call.HttpContext; @@ -34,43 +33,32 @@ import org.debux.webmotion.server.call.HttpContext; */ public class ObserveWebRequestContext { - protected static final String REQUEST_POLLEN_REQUEST_CONTEXT = ObserveWebRequestContext.class.getName(); + protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContext.class.getName(); public static ObserveWebRequestContext getRequestContext(HttpContext httpContext) { ObserveWebRequestContext result = (ObserveWebRequestContext) - httpContext.getRequest().getAttribute(REQUEST_POLLEN_REQUEST_CONTEXT); + httpContext.getRequest().getAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT); return result; } public static void setRequestContext(HttpContext httpContext, ObserveWebRequestContext serviceContext) { - httpContext.getRequest().setAttribute(REQUEST_POLLEN_REQUEST_CONTEXT, serviceContext); + httpContext.getRequest().setAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT, serviceContext); } - protected ObserveWebApplicationContext webApplicationContext; + protected final ObserveWebApplicationContext webApplicationContext; - protected ObserveDataSourceConfiguration dataSourceConfiguration; + protected final ObserveDataSourceConfiguration dataSourceConfiguration; - public ObserveWebApplicationContext getWebApplicationContext() { - return webApplicationContext; - } - - public ObserveDataSourceConfiguration getDataSourceConfiguration() { - return dataSourceConfiguration; - } - - public void setWebApplicationContext(ObserveWebApplicationContext webApplicationContext) { + public ObserveWebRequestContext(ObserveWebApplicationContext webApplicationContext, + ObserveDataSourceConfiguration dataSourceConfiguration) { this.webApplicationContext = webApplicationContext; - } - - public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { this.dataSourceConfiguration = dataSourceConfiguration; } public <S extends ObserveService> S newService(Class<S> serviceType) { - ObserveServiceFactory serviceFactory = webApplicationContext.getServiceFactory(); - S service = serviceFactory.newService(webApplicationContext, dataSourceConfiguration, serviceType); + S service = webApplicationContext.newService(dataSourceConfiguration, serviceType); return service; } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java index 7e31748..1844495 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java @@ -1,11 +1,27 @@ package fr.ird.observe.application.web.controller; +import fr.ird.observe.application.web.ObserveWebApplicationContext; +import fr.ird.observe.application.web.ObserveWebRequestContext; +import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; import fr.ird.observe.services.ObserveService; import org.debux.webmotion.server.WebMotionController; /** * @author Tony Chemit : chemit@codelutin.com */ -public abstract class ObserveWebMotionController extends WebMotionController implements ObserveService { +public abstract class ObserveWebMotionController extends WebMotionController { + public ObserveWebApplicationContext getObserveWebApplicationContext() { + return ObserveWebApplicationContext.getApplicationContext(getContext()); + } + + public ObserveWebApplicationConfiguration getObserveWebApplicationConfiguration() { + return getObserveWebApplicationContext().getApplicationConfiguration(); + } + + public <S extends ObserveService> S newService(Class<S> serviceType) { + ObserveWebRequestContext requestContext = ObserveWebRequestContext.getRequestContext(getContext()); + S service = requestContext.newService(serviceType); + return service; + } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java index 821819b..168d6f2 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java @@ -1,8 +1,7 @@ package fr.ird.observe.application.web.controller.v1; -import fr.ird.observe.application.web.ObserveWebApplicationContext; +import fr.ird.observe.application.web.controller.ObserveWebMotionController; import org.apache.commons.io.IOUtils; -import org.debux.webmotion.server.WebMotionController; import org.debux.webmotion.server.render.Render; import java.io.IOException; @@ -13,7 +12,7 @@ import java.io.InputStream; * * @author Tony Chemit - chemit@codelutin.com */ -public class DocController extends WebMotionController { +public class DocController extends ObserveWebMotionController { public Render mapping() { @@ -32,9 +31,9 @@ public class DocController extends WebMotionController { } - public Render configuration(ObserveWebApplicationContext applicationContext) { + public Render configuration() { - String content = applicationContext.getApplicationConfiguration().getConfigurationDescription(); + String content = getObserveWebApplicationConfiguration().getConfigurationDescription(); return renderContent(content, "text/plain"); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java index df59b76..35c8541 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java @@ -8,6 +8,7 @@ import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.DataNotFoundException; import fr.ird.observe.services.service.ReferentialService; import fr.ird.observe.services.spi.Write; +import org.debux.webmotion.server.WebMotionContextable; import java.util.Collection; @@ -18,9 +19,14 @@ import java.util.Collection; */ public class ReferentialServiceController extends ObserveWebMotionController implements ReferentialService { - //TODO A injecter protected ReferentialService referentialService; - + + @Override + public void setContextable(WebMotionContextable contextable) { + super.setContextable(contextable); + referentialService = newService(ReferentialService.class); + } + @Override public <R extends ReferentialDto> ReferenceSetDto<R> getReferentialReferenceSet(Class<R> type) { return referentialService.getReferentialReferenceSet(type); diff --git a/observe-application-web/src/main/resources/mapping b/observe-application-web/src/main/resources/mapping index 51e97da..860c553 100644 --- a/observe-application-web/src/main/resources/mapping +++ b/observe-application-web/src/main/resources/mapping @@ -2,7 +2,7 @@ # #%L # ObServe :: Web Application # %% -# Copyright (C) 2008 - 2010 IRD, Codelutin, Tony Chemit +# Copyright (C) 2015 IRD, Codelutin, Tony Chemit # %% # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as @@ -21,9 +21,9 @@ ### # -# Application Version ${project.version} -# Build Date ${buildDate} -# Build Number ${buildNumber} +# Build version ${project.version} +# Build date ${buildDate} +# Build number ${buildNumber} # [config] diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java index a25b1e7..791dbc4 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java @@ -2,6 +2,7 @@ package fr.ird.observe.services; import fr.ird.observe.services.dto.constants.ReferentialLocale; +import java.io.Closeable; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -17,7 +18,7 @@ import java.util.Set; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveServiceApplicationContext { +public class ObserveServiceApplicationContext implements Closeable { /** * FIXME peut-être pas le bon endroit, car la locale est en scope request. @@ -25,6 +26,7 @@ public class ObserveServiceApplicationContext { * La locale de l'application. */ protected Locale applicationLocale; + /** * La locale du référentiel. */ @@ -68,14 +70,23 @@ public class ObserveServiceApplicationContext { this.temporaryDirectoryRoot = temporaryDirectoryRoot; } - public File createTemporaryDirectory(String prefix) { + public File createTemporaryDirectory(String prefix) { Set<PosixFilePermission> posixFilePermissions = PosixFilePermissions.fromString("rwxr-x---"); FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(posixFilePermissions); try { return Files.createTempDirectory(temporaryDirectoryRoot, prefix, fileAttribute).toFile(); } catch (IOException e) { //TODO Avoir une exception plus concrete - throw new RuntimeException("Could not create temporary directory with preifx: "+prefix,e); + throw new RuntimeException("Could not create temporary directory with preifx: " + prefix, e); + } + } + + @Override + public void close() { + + if (mainServiceFactory != null) { + mainServiceFactory.close(); } + } } -- 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 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>.
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 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>.
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 0ede2d64482f14b8c61790f02eff8eeaaad7e67d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 15:55:55 2015 +0200 Faire fonctionner le chargement dynamqieu de la configuration des logs --- .../ObserveWebApplicationConfiguration.java | 67 +++++++++++----------- .../src/main/resources/observeweb-log4j.conf | 2 +- pom.xml | 2 +- 3 files changed, 35 insertions(+), 36 deletions(-) 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 4429dcc..eea7653 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 @@ -1,6 +1,8 @@ package fr.ird.observe.application.web.configuration; import com.google.common.base.Charsets; +import com.google.common.io.CharSource; +import com.google.common.io.Resources; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.LogManager; @@ -10,11 +12,9 @@ import org.nuiton.config.ApplicationConfigHelper; import org.nuiton.config.ApplicationConfigProvider; import org.nuiton.config.ArgumentsParserException; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; import java.nio.file.Files; import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFilePermission; @@ -90,6 +90,10 @@ public class ObserveWebApplicationConfiguration { return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.USERS_CONFIGURATION_FILE.getKey()); } + public File getLog4jConfigurationFile() { + return applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.LOG4J_CONFIGURATION_FILE.getKey()); + } + public int getSessionExpirationDelay() { return applicationConfig.getOptionAsInt(ObserveWebApplicationConfigurationOption.SESSION_EXPIRATION_DELAY.getKey()); } @@ -124,12 +128,11 @@ public class ObserveWebApplicationConfiguration { throw new ObserveWebApplicationConfigurationInitException("Impossible de créer le répertoire temporaire de l'application (" + temporaryDirectory + ")", e); } - boolean devMode = isDevMode(); - File databasesConfigurationFile = getDatabasesConfigurationFile(); File usersConfigurationFile = getUsersConfigurationFile(); + File log4jConfigurationFile = getLog4jConfigurationFile(); - if (devMode) { + if (isDevMode()) { if (!databasesConfigurationFile.exists()) { @@ -157,6 +160,21 @@ public class ObserveWebApplicationConfiguration { throw new ObserveWebApplicationConfigurationInitException("Impossible de créer un fichier de configuration des utilisateurs pour développement", e); } } + + if (!log4jConfigurationFile.exists()) { + + // Generate a default log4jConfigurationFile + try { + CharSource charSource = Resources.asCharSource(getClass().getResource("/observeweb-log4j.conf"), Charsets.UTF_8); + String log4jFileContent = charSource.read(); + if (log.isInfoEnabled()) { + log.info("Generate a default log4jConfigurationFile for tests purpose only:\n" + log4jFileContent); + } + Files.write(log4jConfigurationFile.toPath(), log4jFileContent.getBytes()); + } catch (IOException e) { + throw new ObserveWebApplicationConfigurationInitException("Impossible de créer un fichier de log4j pour développement", e); + } + } } if (!databasesConfigurationFile.exists()) { @@ -167,9 +185,7 @@ public class ObserveWebApplicationConfiguration { throw new ObserveWebApplicationConfigurationInitException("Le fichier de configuration des utilisateurs n'existe pas : " + usersConfigurationFile); } - if (!devMode) { - initLog(); - } + initLog(); } @@ -193,35 +209,18 @@ public class ObserveWebApplicationConfiguration { protected void initLog() { - String logFilePath = applicationConfig.getOption(ObserveWebApplicationConfigurationOption.LOG4J_CONFIGURATION_FILE.getKey()); - - URL resource; - if (logFilePath.startsWith("classpath:")) { - resource = getClass().getResource(logFilePath.substring(10)); - - } else { - File logFile = applicationConfig.getOptionAsFile(ObserveWebApplicationConfigurationOption.LOG4J_CONFIGURATION_FILE.getKey()); - - if (!logFile.exists()) { - throw new ObserveWebApplicationConfigurationInitException("Le fichier de configuration des logs (" + logFile + ") n'existe pas"); - } - - try { - resource = logFile.toURI().toURL(); - } catch (MalformedURLException e) { - - throw new ObserveWebApplicationConfigurationInitException("L'url du fichier de configuration des logs (" + logFile + ") est malformée", e); - - } + File logFile = getLog4jConfigurationFile(); + if (!logFile.exists()) { + throw new ObserveWebApplicationConfigurationInitException("Le fichier de configuration des logs (" + logFile + ") n'existe pas"); } if (log.isInfoEnabled()) { - log.info("Chargement du fichier de de log4j depuis " + resource); + log.info("Chargement du fichier de log : " + logFile); } Properties finalLogConfigurationProperties = new Properties(); - try (InputStream inputStream = resource.openStream()) { + try (BufferedReader inputStream = Files.newBufferedReader(logFile.toPath(), Charsets.UTF_8)) { Properties logConfigurationProperties = new Properties(); logConfigurationProperties.load(inputStream); @@ -229,10 +228,10 @@ public class ObserveWebApplicationConfiguration { for (Map.Entry<Object, Object> entry : logConfigurationProperties.entrySet()) { String key = (String) entry.getKey(); String value = (String) entry.getValue(); - String newValue = applicationConfig.getOption(value); + String newValue = applicationConfig.replaceRecursiveOptions(value); finalLogConfigurationProperties.setProperty(key, newValue); } - } catch (IOException e) { + } catch (Exception e) { throw new ObserveWebApplicationConfigurationInitException("Impossible de charger le fichier de configuration des logs", e); } @@ -241,7 +240,7 @@ public class ObserveWebApplicationConfiguration { log = LogFactory.getLog(ObserveWebApplicationConfiguration.class); if (log.isInfoEnabled()) { - log.info("Initialisation de log4j terminées depuis " + logFilePath); + log.info("Configuration des logs chargée depuis le fichier " + logFile); } } diff --git a/observe-application-web/src/main/resources/observeweb-log4j.conf b/observe-application-web/src/main/resources/observeweb-log4j.conf index 2d6733f..f4d9189 100644 --- a/observe-application-web/src/main/resources/observeweb-log4j.conf +++ b/observe-application-web/src/main/resources/observeweb-log4j.conf @@ -9,7 +9,7 @@ log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%c:%L) %M - %m%n # file output... log4j.appender.file=org.apache.log4j.RollingFileAppender -log4j.appender.file.File=${observeweb.baseDirectory}/log/observeweb-${observeweb.version}.log +log4j.appender.file.File=${observeweb.baseDirectory}/log/observeweb-${observeweb.build.version}.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=4 log4j.appender.file.layout=org.apache.log4j.PatternLayout diff --git a/pom.xml b/pom.xml index f0fede6..f154559 100644 --- a/pom.xml +++ b/pom.xml @@ -277,7 +277,7 @@ <dependency> <groupId>org.nuiton</groupId> <artifactId>nuiton-config</artifactId> - <version>3.0-rc-2</version> + <version>3.0-SNAPSHOT</version> <scope>compile</scope> </dependency> <dependency> -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 4ef2b849b93ccc6878e113a1f3994341774adeea Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 16:09:51 2015 +0200 Permettre d'enregistrer les configurations de bases et d'utilisateurs même immuables (See #7494) --- .../configuration/db/ObserveWebDatabasesHelper.java | 8 +++++++- .../db/impl/ObserveWebDatabaseImmutable.java | 20 ++++++++++++++++++++ .../db/impl/ObserveWebDatabaseRoleImmutable.java | 6 ++++++ .../db/impl/ObserveWebDatabasesImmutable.java | 16 ++++++++++++++++ .../configuration/user/ObserveWebUsersHelper.java | 8 +++++++- .../user/impl/ObserveWebUserImmutable.java | 17 +++++++++++++++++ .../user/impl/ObserveWebUserPermissionImmutable.java | 6 ++++++ .../user/impl/ObserveWebUsersImmutable.java | 14 ++++++++++++++ .../db/ObserveWebDatabasesHelperTest.java | 7 ++++++- .../user/ObserveWebUsersHelperTest.java | 7 ++++++- 10 files changed, 105 insertions(+), 4 deletions(-) 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 index 60dfb6c..cd3e21b 100644 --- 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 @@ -131,7 +131,7 @@ public class ObserveWebDatabasesHelper { } - public void storeBean(ObserveWebDatabasesBean databases, File file) { + public void store(ObserveWebDatabases databases, File file) { if (log.isInfoEnabled()) { log.info("Store databases to " + file); @@ -139,6 +139,12 @@ public class ObserveWebDatabasesHelper { try (BufferedWriter fileWriter = Files.newWriter(file, Charsets.UTF_8)) { YamlWriter writer = new YamlWriter(fileWriter, createConfig()); + if (databases instanceof ObserveWebDatabasesImmutable) { + + ObserveWebDatabasesImmutable observeWebDatabasesImmutable = (ObserveWebDatabasesImmutable) databases; + databases = observeWebDatabasesImmutable.toBean(); + + } writer.write(databases); writer.close(); } catch (Exception e) { 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 index 6d5b8b4..eba202a 100644 --- 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 @@ -3,9 +3,12 @@ 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.Iterables; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import fr.ird.observe.application.web.configuration.db.ObserveWebDatabase; +import javax.annotation.Nullable; import java.util.Collection; /** @@ -65,4 +68,21 @@ public class ObserveWebDatabaseImmutable implements ObserveWebDatabase<ObserveWe return Optional.fromNullable(observeWebDatabaseRole); } + public ObserveWebDatabaseBean toBean() { + ObserveWebDatabaseBean observeWebDatabaseBean = new ObserveWebDatabaseBean(); + observeWebDatabaseBean.setDefaultDatabase(defaultDatabase); + observeWebDatabaseBean.setName(name); + observeWebDatabaseBean.setUrl(url); + observeWebDatabaseBean.setRoles(Sets.newLinkedHashSet(Iterables.transform(getRoles(), new Function<ObserveWebDatabaseRoleImmutable, ObserveWebDatabaseRoleBean>() { + + @Nullable + @Override + public ObserveWebDatabaseRoleBean apply(ObserveWebDatabaseRoleImmutable input) { + return input.toBean(); + } + }))); + + return observeWebDatabaseBean; + } + } 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 index 2f67745..612e25d 100644 --- 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 @@ -28,4 +28,10 @@ public class ObserveWebDatabaseRoleImmutable implements ObserveWebDatabaseRole { return password; } + public ObserveWebDatabaseRoleBean toBean() { + ObserveWebDatabaseRoleBean observeWebDatabasesBean = new ObserveWebDatabaseRoleBean(); + observeWebDatabasesBean.setLogin(login); + observeWebDatabasesBean.setPassword(password); + return observeWebDatabasesBean; + } } 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 index cd5aad1..c579b0d 100644 --- 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 @@ -3,9 +3,12 @@ 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.Iterables; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import fr.ird.observe.application.web.configuration.db.ObserveWebDatabases; +import javax.annotation.Nullable; import java.util.Collection; /** @@ -55,4 +58,17 @@ public class ObserveWebDatabasesImmutable implements ObserveWebDatabases<Observe return Optional.fromNullable(database); } + public ObserveWebDatabasesBean toBean() { + ObserveWebDatabasesBean observeWebDatabasesBean = new ObserveWebDatabasesBean(); + observeWebDatabasesBean.setDatabases(Sets.newLinkedHashSet(Iterables.transform(getDatabases(), new Function<ObserveWebDatabaseImmutable, ObserveWebDatabaseBean>() { + + @Nullable + @Override + public ObserveWebDatabaseBean apply(ObserveWebDatabaseImmutable input) { + return input.toBean(); + } + }))); + return observeWebDatabasesBean; + } + } 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 index e3661ff..4f82b1f 100644 --- 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 @@ -109,7 +109,7 @@ public class ObserveWebUsersHelper { } - public void storeBean(ObserveWebUsersBean users, File file) { + public void store(ObserveWebUsers users, File file) { if (log.isInfoEnabled()) { log.info("Store users to " + file); @@ -117,6 +117,12 @@ public class ObserveWebUsersHelper { try (BufferedWriter fileWriter = Files.newWriter(file, Charsets.UTF_8)) { YamlWriter writer = new YamlWriter(fileWriter, createConfig()); + if (users instanceof ObserveWebUsersImmutable) { + + ObserveWebUsersImmutable observeWebUsersImmutable = (ObserveWebUsersImmutable) users; + users = observeWebUsersImmutable.toBean(); + + } writer.write(users); writer.close(); } catch (Exception e) { 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 index 2801cd6..acbdd73 100644 --- 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 @@ -3,7 +3,9 @@ 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.Iterables; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import fr.ird.observe.application.web.configuration.user.ObserveWebUser; import java.util.Collection; @@ -55,4 +57,19 @@ public class ObserveWebUserImmutable implements ObserveWebUser<ObserveWebUserPer return Optional.fromNullable(permissions.get(databaseName)); } + public ObserveWebUserBean toBean() { + ObserveWebUserBean observeWebUserBean = new ObserveWebUserBean(); + observeWebUserBean.setLogin(login); + observeWebUserBean.setPassword(password); + observeWebUserBean.setPermissions(Sets.newLinkedHashSet(Iterables.transform(getPermissions(), new Function<ObserveWebUserPermissionImmutable, ObserveWebUserPermissionBean>() { + + @Override + public ObserveWebUserPermissionBean apply(ObserveWebUserPermissionImmutable input) { + return input.toBean(); + } + }))); + + return observeWebUserBean; + } + } 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 index 7692fda..dd7e40b 100644 --- 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 @@ -28,4 +28,10 @@ public class ObserveWebUserPermissionImmutable implements ObserveWebUserPermissi return role; } + public ObserveWebUserPermissionBean toBean() { + ObserveWebUserPermissionBean observeWebUserPermissionBean = new ObserveWebUserPermissionBean(); + observeWebUserPermissionBean.setDatabase(database); + observeWebUserPermissionBean.setRole(role); + return observeWebUserPermissionBean; + } } 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 index 4ad728e..cf18fe7 100644 --- 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 @@ -3,7 +3,9 @@ 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.Iterables; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import fr.ird.observe.application.web.configuration.user.ObserveWebUsers; import javax.annotation.Nullable; @@ -39,4 +41,16 @@ public class ObserveWebUsersImmutable implements ObserveWebUsers<ObserveWebUserI return Optional.fromNullable(users.get(login)); } + public ObserveWebUsersBean toBean() { + ObserveWebUsersBean observeWebUsersBean = new ObserveWebUsersBean(); + observeWebUsersBean.setUsers(Sets.newLinkedHashSet(Iterables.transform(getUsers(), new Function<ObserveWebUserImmutable, ObserveWebUserBean>() { + + @Nullable + @Override + public ObserveWebUserBean apply(ObserveWebUserImmutable input) { + return input.toBean(); + } + }))); + return observeWebUsersBean; + } } 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 index 3ed490d..7d78f85 100644 --- 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 @@ -221,12 +221,17 @@ public class ObserveWebDatabasesHelperTest { File databasesFile = configuration.getDatabasesConfigurationFile(); - observeWebDatabasesHelper.storeBean(databases, databasesFile); + observeWebDatabasesHelper.store(databases, databasesFile); String fileContent = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); Assert.assertEquals(FILE_CONTENT, fileContent); System.out.println(fileContent); + observeWebDatabasesHelper.store(databases.toImmutable(), databasesFile); + + String fileContent2 = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + Assert.assertEquals(FILE_CONTENT, fileContent2); + } } \ No newline at end of file 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 index 65cfbf7..67b337d 100644 --- 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 @@ -172,12 +172,17 @@ public class ObserveWebUsersHelperTest { File databasesFile = configuration.getUsersConfigurationFile(); - observeWebUsersHelper.storeBean(users, databasesFile); + observeWebUsersHelper.store(users, databasesFile); String fileContent = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); Assert.assertEquals(FILE_CONTENT, fileContent); System.out.println(fileContent); + observeWebUsersHelper.store(users.toImmutable(), databasesFile); + + String fileContent2 = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + Assert.assertEquals(FILE_CONTENT, fileContent2); + } } \ 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>.
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 177d80cb4149cd329e3172f4d21f15990782e46c Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Aug 30 17:54:20 2015 +0200 Vérification des permissions des utilisateurs en utilisant la configurations des bases (See #7494) --- .../web/ObserveWebApplicationContext.java | 3 +- .../configuration/user/ObserveWebUsersHelper.java | 36 ++++++++++++----- .../db/ObserveWebDatabasesHelperTest.java | 40 ++++++++++--------- .../user/ObserveWebUsersHelperTest.java | 45 ++++++++++++---------- 4 files changed, 73 insertions(+), 51 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 0ad4882..a487916 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 @@ -64,13 +64,12 @@ public class ObserveWebApplicationContext implements Closeable { applicationConfiguration.init(); // init databases - ObserveWebDatabasesHelper databasesHelper = new ObserveWebDatabasesHelper(); databases = databasesHelper.load(applicationConfiguration.getDatabasesConfigurationFile()); // init users ObserveWebUsersHelper usersHelper = new ObserveWebUsersHelper(); - users = usersHelper.load(applicationConfiguration.getUsersConfigurationFile()); + users = usersHelper.load(databases, applicationConfiguration.getUsersConfigurationFile()); // init service application context serviceApplicationContext = new ObserveServiceApplicationContext(); 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 index 4f82b1f..db5cc8f 100644 --- 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 @@ -4,7 +4,11 @@ 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.base.Optional; import com.google.common.io.Files; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabase; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabaseRole; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabases; 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; @@ -30,10 +34,10 @@ public class ObserveWebUsersHelper { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveWebUsersHelper.class); - public ObserveWebUsersImmutable load(File file) throws InvalidObserveWebUsersException, InvalidObserveWebUserException, InvalidObserveWebUserPermissionException { + public ObserveWebUsersImmutable load(ObserveWebDatabases databases, File file) throws InvalidObserveWebUsersException, InvalidObserveWebUserException, InvalidObserveWebUserPermissionException { ObserveWebUsersBean observeWebUsersBean = loadBean(file); - validateObserveWebUsersBean(observeWebUsersBean); + validateObserveWebUsersBean(databases, observeWebUsersBean); ObserveWebUsersImmutable observeWebUsersImmutable = observeWebUsersBean.toImmutable(); return observeWebUsersImmutable; @@ -53,19 +57,19 @@ public class ObserveWebUsersHelper { return result; } - public void validateObserveWebUsersBean(ObserveWebUsersBean observeWebUsersBean) throws InvalidObserveWebUsersException, InvalidObserveWebUserException, InvalidObserveWebUserPermissionException { + public void validateObserveWebUsersBean(ObserveWebDatabases databases, ObserveWebUsersBean observeWebUsersBean) throws InvalidObserveWebUsersException, InvalidObserveWebUserException, InvalidObserveWebUserPermissionException { if (CollectionUtils.isEmpty(observeWebUsersBean.getUsers())) { throw new InvalidObserveWebUserException("No user defined"); } for (ObserveWebUserBean observeWebUserBean : observeWebUsersBean.getUsers()) { - validateObserveWebUserBean(observeWebUserBean); + validateObserveWebUserBean(databases, observeWebUserBean); } } - public void validateObserveWebUserBean(ObserveWebUserBean observeWebUserBean) throws InvalidObserveWebUserPermissionException, InvalidObserveWebUserException { + public void validateObserveWebUserBean(ObserveWebDatabases databases, ObserveWebUserBean observeWebUserBean) throws InvalidObserveWebUserPermissionException, InvalidObserveWebUserException { String login = observeWebUserBean.getLogin(); if (StringUtils.isBlank(login)) { @@ -85,7 +89,7 @@ public class ObserveWebUsersHelper { for (ObserveWebUserPermissionBean observeWebUserPermissionBean : observeWebUserBean.getPermissions()) { - validateObserveWebUserPermissionBean(observeWebUserBean, observeWebUserPermissionBean); + validateObserveWebUserPermissionBean(databases, observeWebUserBean, observeWebUserPermissionBean); boolean added = databaseNames.add(observeWebUserPermissionBean.getDatabase()); if (!added) { @@ -96,17 +100,29 @@ public class ObserveWebUsersHelper { } - public void validateObserveWebUserPermissionBean(ObserveWebUserBean observeWebUserBean, ObserveWebUserPermissionBean observeWebUserRoleBean) throws InvalidObserveWebUserPermissionException { + public void validateObserveWebUserPermissionBean(ObserveWebDatabases<?> databases, ObserveWebUserBean observeWebUserBean, ObserveWebUserPermissionBean observeWebUserRoleBean) throws InvalidObserveWebUserPermissionException { String login = observeWebUserBean.getLogin(); - if (StringUtils.isBlank(observeWebUserRoleBean.getDatabase())) { + String databaseName = observeWebUserRoleBean.getDatabase(); + if (StringUtils.isBlank(databaseName)) { 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"); + String role = observeWebUserRoleBean.getRole(); + if (StringUtils.isBlank(role)) { + throw new InvalidObserveWebUserPermissionException("User " + login + ", found a permission " + databaseName + " with no role defined"); } + Optional<? extends ObserveWebDatabase> databaseByName = databases.getDatabaseByName(databaseName); + if (!databaseByName.isPresent()) { + throw new InvalidObserveWebUserPermissionException("User " + login + ", found a permission " + databaseName + ", but database does not exists"); + } + + ObserveWebDatabase<?> database = databaseByName.get(); + Optional<? extends ObserveWebDatabaseRole> observeWebDatabaseRole = database.getDatabaseRoleByLogin(role); + if (!observeWebDatabaseRole.isPresent()) { + throw new InvalidObserveWebUserPermissionException("User " + login + ", found a permission " + databaseName + " with role " + role + ", but this role is not defined on this database"); + } } public void store(ObserveWebUsers users, File file) { 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 index 7d78f85..ba8749e 100644 --- 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 @@ -16,6 +16,7 @@ import org.junit.Before; import org.junit.Test; import java.io.File; +import java.io.IOException; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; @@ -27,10 +28,6 @@ import java.util.Set; */ public class ObserveWebDatabasesHelperTest { - protected ObserveWebApplicationConfiguration configuration; - - protected ObserveWebDatabasesHelper observeWebDatabasesHelper; - public static final String FILE_CONTENT = "databases: \n" + "- name: production\n" + " defaultDatabase: true\n" + @@ -56,21 +53,32 @@ public class ObserveWebDatabasesHelperTest { " password: passwordReferentiel\n" + " url: jdbc:postgresql://localhost:5432/test\n"; + protected ObserveWebApplicationConfiguration configuration; + + protected ObserveWebDatabasesHelper observeWebDatabasesHelper; + + protected File databasesConfigurationFile; + + public static File loadDatabasesConfigurationFileMock(ObserveWebApplicationConfiguration configuration) throws IOException { + File databasesConfigurationFile = configuration.getDatabasesConfigurationFile(); + Files.write(FILE_CONTENT, databasesConfigurationFile, Charsets.UTF_8); + return databasesConfigurationFile; + } + @Before public void setUp() { configuration = new ObserveWebApplicationConfiguration(); configuration.init(); observeWebDatabasesHelper = new ObserveWebDatabasesHelper(); + databasesConfigurationFile = configuration.getDatabasesConfigurationFile(); } @Test public void testLoadBean() throws Exception { - File databasesFile = configuration.getDatabasesConfigurationFile(); + loadDatabasesConfigurationFileMock(configuration); - Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); - - ObserveWebDatabasesBean databases = observeWebDatabasesHelper.loadBean(databasesFile); + ObserveWebDatabasesBean databases = observeWebDatabasesHelper.loadBean(databasesConfigurationFile); Assert.assertNotNull(databases); Set<ObserveWebDatabaseBean> databasesSet = databases.getDatabases(); Assert.assertNotNull(databasesSet); @@ -96,11 +104,9 @@ public class ObserveWebDatabasesHelperTest { @Test public void testLoad() throws Exception { - File databasesFile = configuration.getDatabasesConfigurationFile(); - - Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + loadDatabasesConfigurationFileMock(configuration); - ObserveWebDatabasesImmutable databases = observeWebDatabasesHelper.load(databasesFile); + ObserveWebDatabasesImmutable databases = observeWebDatabasesHelper.load(databasesConfigurationFile); Assert.assertNotNull(databases); Collection<ObserveWebDatabaseImmutable> databasesSet = databases.getDatabases(); Assert.assertNotNull(databasesSet); @@ -219,18 +225,16 @@ public class ObserveWebDatabasesHelperTest { ObserveWebDatabasesBean databases = new ObserveWebDatabasesBean(); databases.setDatabases(databaseSet); - File databasesFile = configuration.getDatabasesConfigurationFile(); - - observeWebDatabasesHelper.store(databases, databasesFile); + observeWebDatabasesHelper.store(databases, databasesConfigurationFile); - String fileContent = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + String fileContent = Files.asCharSource(databasesConfigurationFile, Charsets.UTF_8).read(); Assert.assertEquals(FILE_CONTENT, fileContent); System.out.println(fileContent); - observeWebDatabasesHelper.store(databases.toImmutable(), databasesFile); + observeWebDatabasesHelper.store(databases.toImmutable(), databasesConfigurationFile); - String fileContent2 = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + String fileContent2 = Files.asCharSource(databasesConfigurationFile, Charsets.UTF_8).read(); Assert.assertEquals(FILE_CONTENT, fileContent2); } 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 index 67b337d..6745ec6 100644 --- 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 @@ -5,6 +5,9 @@ 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.ObserveWebDatabasesHelper; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabasesHelperTest; +import fr.ird.observe.application.web.configuration.db.impl.ObserveWebDatabasesImmutable; 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; @@ -27,10 +30,6 @@ import java.util.Set; */ public class ObserveWebUsersHelperTest { - protected ObserveWebApplicationConfiguration configuration; - - protected ObserveWebUsersHelper observeWebUsersHelper; - public static final String FILE_CONTENT = "users: \n" + "- login: user1\n" + " password: password1\n" + @@ -45,30 +44,38 @@ public class ObserveWebUsersHelperTest { " - database: test\n" + " role: referentiel\n"; + protected ObserveWebApplicationConfiguration configuration; + + protected ObserveWebUsersHelper observeWebUsersHelper; + + protected File usersConfigurationFile; + @Before public void setUp() throws Exception { configuration = new ObserveWebApplicationConfiguration(); configuration.init(); observeWebUsersHelper = new ObserveWebUsersHelper(); + usersConfigurationFile = configuration.getUsersConfigurationFile(); } @Test public void testLoad() throws Exception { - File databasesFile = configuration.getUsersConfigurationFile(); + File databasesConfigurationFileMock = ObserveWebDatabasesHelperTest.loadDatabasesConfigurationFileMock(configuration); + ObserveWebDatabasesImmutable databases = new ObserveWebDatabasesHelper().load(databasesConfigurationFileMock); - Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + Files.write(FILE_CONTENT, usersConfigurationFile, Charsets.UTF_8); - ObserveWebUsersImmutable databases = observeWebUsersHelper.load(databasesFile); - Assert.assertNotNull(databases); - Collection<ObserveWebUserImmutable> usersSet = databases.getUsers(); + ObserveWebUsersImmutable users = observeWebUsersHelper.load(databases, usersConfigurationFile); + Assert.assertNotNull(users); + Collection<ObserveWebUserImmutable> usersSet = users.getUsers(); Assert.assertNotNull(usersSet); Assert.assertEquals(2, usersSet.size()); - Optional<ObserveWebUserImmutable> production = databases.getUserByLogin("user1"); + Optional<ObserveWebUserImmutable> production = users.getUserByLogin("user1"); Assert.assertTrue(production.isPresent()); - Optional<ObserveWebUserImmutable> production2 = databases.getUserByLogin("user3"); + Optional<ObserveWebUserImmutable> production2 = users.getUserByLogin("user3"); Assert.assertFalse(production2.isPresent()); { @@ -101,11 +108,9 @@ public class ObserveWebUsersHelperTest { @Test public void testLoadBean() throws Exception { - File databasesFile = configuration.getUsersConfigurationFile(); - - Files.write(FILE_CONTENT, databasesFile, Charsets.UTF_8); + Files.write(FILE_CONTENT, usersConfigurationFile, Charsets.UTF_8); - ObserveWebUsersBean users = observeWebUsersHelper.loadBean(databasesFile); + ObserveWebUsersBean users = observeWebUsersHelper.loadBean(usersConfigurationFile); Assert.assertNotNull(users); Set<ObserveWebUserBean> usersSet = users.getUsers(); Assert.assertNotNull(usersSet); @@ -170,18 +175,16 @@ public class ObserveWebUsersHelperTest { ObserveWebUsersBean users = new ObserveWebUsersBean(); users.setUsers(userSet); - File databasesFile = configuration.getUsersConfigurationFile(); - - observeWebUsersHelper.store(users, databasesFile); + observeWebUsersHelper.store(users, usersConfigurationFile); - String fileContent = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + String fileContent = Files.asCharSource(usersConfigurationFile, Charsets.UTF_8).read(); Assert.assertEquals(FILE_CONTENT, fileContent); System.out.println(fileContent); - observeWebUsersHelper.store(users.toImmutable(), databasesFile); + observeWebUsersHelper.store(users.toImmutable(), usersConfigurationFile); - String fileContent2 = Files.asCharSource(databasesFile, Charsets.UTF_8).read(); + String fileContent2 = Files.asCharSource(usersConfigurationFile, Charsets.UTF_8).read(); Assert.assertEquals(FILE_CONTENT, fileContent2); } -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 598e7c5ab19f0a1e85fde6824ab81f39d2a55cf7 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 00:27:24 2015 +0200 Utilisation aussi du label dans le calcul de l'égalité sur une configuration de source de type topia PG (on s'en sert pour différencier différentes configuration sur la même base) --- .../configuration/ObserveDataSourceConfigurationTopiaPG.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java index 4aa7fc1..62fd97c 100644 --- a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationTopiaPG.java @@ -60,19 +60,21 @@ public class ObserveDataSourceConfigurationTopiaPG extends ObserveDataSourceConf if (this == o) return true; if (!(o instanceof ObserveDataSourceConfigurationTopiaPG)) return false; ObserveDataSourceConfigurationTopiaPG that = (ObserveDataSourceConfigurationTopiaPG) o; - return Objects.equals(jdbcUrl, that.jdbcUrl) && + return Objects.equals(label, that.label) && + Objects.equals(jdbcUrl, that.jdbcUrl) && Objects.equals(username, that.username) && Objects.equals(password, that.password); } @Override public int hashCode() { - return Objects.hash(jdbcUrl, username, password); + return Objects.hash(label, jdbcUrl, username, password); } @Override public String toString() { return MoreObjects.toStringHelper(this) + .add("label", label) .add("jdbcUrl", jdbcUrl) .add("username", username) .add("password", "***") -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit ef3be40f607d1aeddaddb3e11a7047faf1a9f45e Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 00:29:31 2015 +0200 ajout d'une usine de configuration de sources de données neutre au niveau du runner de services, nettoyage de code et passage en scope compile des différentes configurations --- observe-services-runner/pom.xml | 2 -- .../ObserveDataSourceConfigurationMainFactory.java | 24 ++++++++++++++++++++++ .../services/ObserveServiceMainFactory.java | 3 +-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/observe-services-runner/pom.xml b/observe-services-runner/pom.xml index 2fb3820..a110705 100644 --- a/observe-services-runner/pom.xml +++ b/observe-services-runner/pom.xml @@ -37,13 +37,11 @@ <groupId>${project.groupId}</groupId> <artifactId>observe-services-configuration-rest</artifactId> <version>${project.version}</version> - <scope>runtime</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>observe-services-configuration-topia</artifactId> <version>${project.version}</version> - <scope>runtime</scope> </dependency> <dependency> <groupId>${project.groupId}</groupId> diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java new file mode 100644 index 0000000..c5fd02f --- /dev/null +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java @@ -0,0 +1,24 @@ +package fr.ird.observe.services; + +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveDataSourceConfigurationMainFactory { + + public ObserveDataSourceConfiguration createObserveDataSourceConfigurationTopiaPG(String label, String jdbcUrl, String username, char[] password, boolean useSsl) { + ObserveDataSourceConfigurationTopiaPG result = new ObserveDataSourceConfigurationTopiaPG(); + result.setLabel(label); + result.setJdbcUrl(jdbcUrl); + result.setUsername(username); + result.setPassword(password); + result.setUseSsl(useSsl); + return result; + + } + +} diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java index 3d3c462..cf860e6 100644 --- a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java @@ -6,7 +6,6 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.io.Closeable; import java.util.ServiceLoader; /** @@ -14,7 +13,7 @@ import java.util.ServiceLoader; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveServiceMainFactory implements ObserveServiceFactory, Closeable { +public class ObserveServiceMainFactory implements ObserveServiceFactory { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceMainFactory.class); -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit b2f08df37f34be67f5b9664dac4516048f4078f5 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 00:30:59 2015 +0200 Gestion de la sécurité de l'application web bien avancée. Mais il faudrait revoir le requestContext car je ne suis pas satisfait de ce que j'ai fait, il vaudrait mieux introduire un RequestSecurityContext et n'avoir q'un seul type de RequestContext. (See #7494) --- .../web/ObserveWebApplicationContext.java | 29 ++- .../application/web/ObserveWebMotionFilter.java | 85 +++++++- .../web/configuration/db/ObserveWebDatabases.java | 2 + .../db/ObserveWebDatabasesHelper.java | 26 ++- .../db/impl/ObserveWebDatabasesBean.java | 5 + .../db/impl/ObserveWebDatabasesImmutable.java | 5 + .../configuration/user/ObserveWebUsersHelper.java | 28 ++- .../web/controller/ObserveWebMotionController.java | 35 +++- .../web/controller/v1/ConfigurationController.java | 82 ++++++++ .../controller/v1/DataSourceServiceController.java | 108 ++++++++++ .../web/controller/v1/DocController.java | 40 ---- .../v1/ObserveServiceControllerSupport.java | 34 ++++ .../v1/ReferentialServiceController.java | 31 +-- .../ObserveWebRequestContextConnected.java} | 36 ++-- .../ObserveWebRequestContextNotConnected.java} | 43 ++-- .../ObserveWebRequestContextSupport.java} | 33 +-- ...equestContextWithNoDataSourceConfiguration.java | 47 +++++ .../BadObserveWebUserPasswordException.java | 27 +++ ...urceConfigurationAlreadyRegistredException.java | 27 +++ .../InvalidAuthenticationTokenException.java | 22 ++ .../ObserveWebSecurityApplicationContext.java | 224 +++++++++++++++++++++ ...ObserveWebSecurityAuthenticationTokenCache.java | 84 ++++++++ .../security/UnknownObserveWebUserException.java | 21 ++ .../UnknownObserveWebUserForDatabaseException.java | 27 +++ observe-application-web/src/main/resources/mapping | 3 +- 25 files changed, 955 insertions(+), 149 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 a487916..48d38c8 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 @@ -12,6 +12,7 @@ import fr.ird.observe.application.web.configuration.user.InvalidObserveWebUserPe 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.application.web.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; @@ -44,6 +45,8 @@ public class ObserveWebApplicationContext implements Closeable { protected ObserveWebUsers users; + protected ObserveWebSecurityApplicationContext securityApplicationContext; + public static ObserveWebApplicationContext getApplicationContext(HttpContext context) { ServletContext servletContext = context.getServletContext(); @@ -71,6 +74,10 @@ public class ObserveWebApplicationContext implements Closeable { ObserveWebUsersHelper usersHelper = new ObserveWebUsersHelper(); users = usersHelper.load(databases, applicationConfiguration.getUsersConfigurationFile()); + // init security application context + securityApplicationContext = new ObserveWebSecurityApplicationContext(); + securityApplicationContext.init(databases, users); + // init service application context serviceApplicationContext = new ObserveServiceApplicationContext(); serviceApplicationContext.setTemporaryDirectoryRoot(applicationConfiguration.getTemporaryDirectory().toPath()); @@ -86,21 +93,13 @@ public class ObserveWebApplicationContext implements Closeable { public void close() { // Supprimer le cache des sessions - //TODO + securityApplicationContext.close(); // Fermer l'usine de services serviceApplicationContext.close(); } - public ObserveWebDatabases getDatabases() { - return databases; - } - - public ObserveWebUsers getUsers() { - return users; - } - public ObserveDtoGsonSupplier getGsonSupplier() { return gsonSupplier; } @@ -109,6 +108,18 @@ public class ObserveWebApplicationContext implements Closeable { return applicationConfiguration; } + public ObserveWebSecurityApplicationContext getSecurityApplicationContext() { + return securityApplicationContext; + } + + public ObserveWebDatabases getDatabases() { + return databases; + } + + public ObserveWebUsers getUsers() { + return users; + } + public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { ObserveServiceFactory mainServiceFactory = serviceApplicationContext.getMainServiceFactory(); return mainServiceFactory.newService(serviceApplicationContext, dataSourceConfiguration, serviceType); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java index 07d7abe..ad8922b 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java @@ -1,6 +1,18 @@ package fr.ird.observe.application.web; +import com.google.common.base.Optional; +import fr.ird.observe.application.web.request.ObserveWebRequestContextConnected; +import fr.ird.observe.application.web.request.ObserveWebRequestContextNotConnected; +import fr.ird.observe.application.web.request.ObserveWebRequestContextSupport; +import fr.ird.observe.application.web.request.ObserveWebRequestContextWithNoDataSourceConfiguration; +import fr.ird.observe.application.web.security.BadObserveWebUserPasswordException; +import fr.ird.observe.application.web.security.DataSourceConfigurationAlreadyRegistredException; +import fr.ird.observe.application.web.security.InvalidAuthenticationTokenException; +import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationContext; +import fr.ird.observe.application.web.security.UnknownObserveWebUserException; +import fr.ird.observe.application.web.security.UnknownObserveWebUserForDatabaseException; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import org.apache.commons.lang3.StringUtils; import org.debux.webmotion.server.WebMotionFilter; import org.debux.webmotion.server.call.HttpContext; @@ -11,24 +23,81 @@ import javax.servlet.http.HttpServletRequest; */ public class ObserveWebMotionFilter extends WebMotionFilter { - public void inject(HttpContext context) { + public void inject(HttpContext context) throws InvalidAuthenticationTokenException, UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException { - ObserveWebApplicationContext applicationContext = - ObserveWebApplicationContext.getApplicationContext(context); + ObserveWebApplicationContext applicationContext = ObserveWebApplicationContext.getApplicationContext(context); HttpServletRequest request = context.getRequest(); - String authenticationToken = request.getHeader("authenticationToken"); + ObserveWebRequestContextSupport requestContext; - //TODO Recuperation de la configuration de la data source de la base à partir du token - ObserveDataSourceConfiguration dataSourceConfiguration = null; + String authenticationToken = getRequestParameterValueOrNull(request, "authenticationToken"); + if (authenticationToken == null) { + authenticationToken = request.getHeader("authenticationToken"); + } - ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, dataSourceConfiguration); + if (StringUtils.isNotBlank(authenticationToken)) { - ObserveWebRequestContext.setRequestContext(context, requestContext); + // Recherche de la configuration à la source de donnée + + requestContext = getObserveWebRequestContextConnected(applicationContext, authenticationToken); + + } else { + + // Cas où on l'utilisateur n'est pas connecté + + String userLogin = getRequestParameterValueOrNull(request, "userLogin"); + String userPassword = getRequestParameterValueOrNull(request, "userPassword"); + String userDatabaseName = getRequestParameterValueOrNull(request, "userDatabaseName"); + + if (!(userLogin == null && userPassword == null)) { + + // On recherche une configuration de source de données à partir de l'identité de l'utilisateur + + requestContext = getObserveWebRequestContextNotConnected(applicationContext, userLogin, userPassword, userDatabaseName); + + } else { + + // Ce cas peut arriver pour des requètes qui ne nécessitent pas de sources de données + // À noter que dans ce cas, on ne sera pas autorisé à créer des services de l'API + + requestContext = new ObserveWebRequestContextWithNoDataSourceConfiguration(applicationContext); + + } + + } + + ObserveWebRequestContextSupport.setRequestContext(context, requestContext); doProcess(); } + protected ObserveWebRequestContextNotConnected getObserveWebRequestContextNotConnected(ObserveWebApplicationContext applicationContext, String userLogin, String userPassword, String userDatabaseName) throws UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException { + + Optional<String> optionalDatabaseName = Optional.fromNullable(userDatabaseName); + + ObserveWebSecurityApplicationContext securityApplicationContext = applicationContext.getSecurityApplicationContext(); + ObserveDataSourceConfiguration dataSourceConfiguration = securityApplicationContext.getDataSourceConfiguration(userLogin, userPassword, optionalDatabaseName); + ObserveWebRequestContextNotConnected requestContext = new ObserveWebRequestContextNotConnected(applicationContext, dataSourceConfiguration, userLogin, optionalDatabaseName); + return requestContext; + } + + protected ObserveWebRequestContextConnected getObserveWebRequestContextConnected(ObserveWebApplicationContext applicationContext, String authenticationToken) throws InvalidAuthenticationTokenException { + + ObserveWebSecurityApplicationContext securityApplicationContext = applicationContext.getSecurityApplicationContext(); + ObserveDataSourceConfiguration dataSourceConfiguration = securityApplicationContext.getDataSourceConfiguration(authenticationToken); + ObserveWebRequestContextConnected requestContext = new ObserveWebRequestContextConnected(applicationContext, dataSourceConfiguration, authenticationToken); + return requestContext; + + } + + protected String getRequestParameterValueOrNull(HttpServletRequest request, String parameterName) { + String parameterValue = request.getParameter(parameterName); + if (StringUtils.isBlank(parameterValue)) { + parameterValue = null; + } + return parameterValue; + } + } 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 index 7008542..df13f7b 100644 --- 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 @@ -13,6 +13,8 @@ public interface ObserveWebDatabases<D extends ObserveWebDatabase> { Collection<D> getDatabases(); + String getDefaultDatabaseName(); + 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 index cd3e21b..7e2e3cc 100644 --- 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 @@ -1,6 +1,7 @@ package fr.ird.observe.application.web.configuration.db; import com.esotericsoftware.yamlbeans.YamlConfig; +import com.esotericsoftware.yamlbeans.YamlException; import com.esotericsoftware.yamlbeans.YamlReader; import com.esotericsoftware.yamlbeans.YamlWriter; import com.google.common.base.Charsets; @@ -17,6 +18,7 @@ import org.apache.commons.logging.LogFactory; import java.io.BufferedWriter; import java.io.File; import java.io.Reader; +import java.io.Writer; import java.util.LinkedHashSet; import java.util.Set; @@ -137,22 +139,30 @@ public class ObserveWebDatabasesHelper { log.info("Store databases to " + file); } - try (BufferedWriter fileWriter = Files.newWriter(file, Charsets.UTF_8)) { - YamlWriter writer = new YamlWriter(fileWriter, createConfig()); - if (databases instanceof ObserveWebDatabasesImmutable) { + try (BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8)) { - ObserveWebDatabasesImmutable observeWebDatabasesImmutable = (ObserveWebDatabasesImmutable) databases; - databases = observeWebDatabasesImmutable.toBean(); + store(databases, writer); - } - writer.write(databases); - writer.close(); } catch (Exception e) { throw new RuntimeException("Could not write databases to file: " + file, e); } } + public void store(ObserveWebDatabases databases, Writer writer) throws YamlException { + + YamlWriter yamlWriter = new YamlWriter(writer, createConfig()); + if (databases instanceof ObserveWebDatabasesImmutable) { + + ObserveWebDatabasesImmutable observeWebDatabasesImmutable = (ObserveWebDatabasesImmutable) databases; + databases = observeWebDatabasesImmutable.toBean(); + + } + yamlWriter.write(databases); + yamlWriter.close(); + + } + protected YamlConfig createConfig() { YamlConfig yamlConfig = new YamlConfig(); 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 index 646c9b3..ef71705 100644 --- 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 @@ -27,6 +27,11 @@ public class ObserveWebDatabasesBean implements ObserveWebDatabases<ObserveWebDa } @Override + public String getDefaultDatabaseName() { + throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); + } + + @Override public ObserveWebDatabaseBean getDefaultDatabase() { throw new UnsupportedOperationException("Can not call this method on bean version, use immutable one."); } 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 index c579b0d..216a930 100644 --- 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 @@ -48,6 +48,11 @@ public class ObserveWebDatabasesImmutable implements ObserveWebDatabases<Observe } @Override + public String getDefaultDatabaseName() { + return defaultDatabase.getName(); + } + + @Override public ObserveWebDatabaseImmutable getDefaultDatabase() { return defaultDatabase; } 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 index db5cc8f..b268948 100644 --- 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 @@ -1,6 +1,7 @@ package fr.ird.observe.application.web.configuration.user; import com.esotericsoftware.yamlbeans.YamlConfig; +import com.esotericsoftware.yamlbeans.YamlException; import com.esotericsoftware.yamlbeans.YamlReader; import com.esotericsoftware.yamlbeans.YamlWriter; import com.google.common.base.Charsets; @@ -21,6 +22,7 @@ import org.apache.commons.logging.LogFactory; import java.io.BufferedWriter; import java.io.File; import java.io.Reader; +import java.io.Writer; import java.util.LinkedHashSet; import java.util.Set; @@ -131,22 +133,32 @@ public class ObserveWebUsersHelper { log.info("Store users to " + file); } - try (BufferedWriter fileWriter = Files.newWriter(file, Charsets.UTF_8)) { - YamlWriter writer = new YamlWriter(fileWriter, createConfig()); - if (users instanceof ObserveWebUsersImmutable) { + try (BufferedWriter writer = Files.newWriter(file, Charsets.UTF_8)) { - ObserveWebUsersImmutable observeWebUsersImmutable = (ObserveWebUsersImmutable) users; - users = observeWebUsersImmutable.toBean(); + store(users, writer); - } - writer.write(users); - writer.close(); } catch (Exception e) { throw new RuntimeException("Could not write users to file: " + file, e); } } + public void store(ObserveWebUsers users, Writer writer) throws YamlException { + + + YamlWriter yamlWriter = new YamlWriter(writer, createConfig()); + if (users instanceof ObserveWebUsersImmutable) { + + ObserveWebUsersImmutable observeWebUsersImmutable = (ObserveWebUsersImmutable) users; + users = observeWebUsersImmutable.toBean(); + + } + yamlWriter.write(users); + yamlWriter.close(); + + + } + protected YamlConfig createConfig() { YamlConfig yamlConfig = new YamlConfig(); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java index 1844495..df6763e 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java @@ -1,8 +1,11 @@ package fr.ird.observe.application.web.controller; import fr.ird.observe.application.web.ObserveWebApplicationContext; -import fr.ird.observe.application.web.ObserveWebRequestContext; import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; +import fr.ird.observe.application.web.request.ObserveWebRequestContextConnected; +import fr.ird.observe.application.web.request.ObserveWebRequestContextNotConnected; +import fr.ird.observe.application.web.request.ObserveWebRequestContextSupport; +import fr.ird.observe.application.web.request.ObserveWebRequestContextWithNoDataSourceConfiguration; import fr.ird.observe.services.ObserveService; import org.debux.webmotion.server.WebMotionController; @@ -20,8 +23,36 @@ public abstract class ObserveWebMotionController extends WebMotionController { } public <S extends ObserveService> S newService(Class<S> serviceType) { - ObserveWebRequestContext requestContext = ObserveWebRequestContext.getRequestContext(getContext()); + ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); + + if (!requestContext.isCanCreateService()) { + throw new IllegalStateException("The request context " + requestContext + " can not create service"); + } S service = requestContext.newService(serviceType); return service; } + + public ObserveWebRequestContextNotConnected getObserveWebRequestContextNotConnected() { + ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); + if (!(requestContext instanceof ObserveWebRequestContextNotConnected)) { + throw new IllegalStateException("Bad request context type"); + } + return (ObserveWebRequestContextNotConnected) requestContext; + } + + public ObserveWebRequestContextConnected getObserveWebRequestContextConnected() { + ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); + if (!(requestContext instanceof ObserveWebRequestContextConnected)) { + throw new IllegalStateException("Bad request context type"); + } + return (ObserveWebRequestContextConnected) requestContext; + } + + public ObserveWebRequestContextWithNoDataSourceConfiguration getObserveWebRequestContextWithNoDataSourceConfiguration() { + ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); + if (!(requestContext instanceof ObserveWebRequestContextWithNoDataSourceConfiguration)) { + throw new IllegalStateException("Bad request context type"); + } + return (ObserveWebRequestContextWithNoDataSourceConfiguration) requestContext; + } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java new file mode 100644 index 0000000..579e2c5 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java @@ -0,0 +1,82 @@ +package fr.ird.observe.application.web.controller.v1; + +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.ObserveWebUsers; +import fr.ird.observe.application.web.configuration.user.ObserveWebUsersHelper; +import fr.ird.observe.application.web.controller.ObserveWebMotionController; +import org.apache.commons.io.IOUtils; +import org.debux.webmotion.server.render.Render; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +/** + * Created on 8/30/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ConfigurationController extends ObserveWebMotionController { + + public Render mapping() { + + InputStream mappingUrl = getClass().getResourceAsStream("/mapping"); + + try { + + String content = IOUtils.toString(mappingUrl); + return renderContent(content, "text/plain"); + + } catch (IOException e) { + + throw new RuntimeException(e); + + } + + } + + public Render configuration() { + + String content = getObserveWebApplicationConfiguration().getConfigurationDescription(); + return renderContent(content, "text/plain"); + + } + + public Render databases() throws IOException { + + + String content; + try (StringWriter writer = new StringWriter()) { + + ObserveWebDatabasesHelper observeWebDatabasesHelper = new ObserveWebDatabasesHelper(); + ObserveWebDatabases databases = getObserveWebApplicationContext().getDatabases(); + observeWebDatabasesHelper.store(databases, writer); + + writer.flush(); + content = writer.toString(); + + } + return renderContent(content, "text/plain"); + + } + + public Render users() throws IOException { + + String content; + try (StringWriter writer = new StringWriter()) { + + ObserveWebUsersHelper observeWebUsersHelper = new ObserveWebUsersHelper(); + ObserveWebUsers databases = getObserveWebApplicationContext().getUsers(); + observeWebUsersHelper.store(databases, writer); + + writer.flush(); + content = writer.toString(); + + } + return renderContent(content, "text/plain"); + + } + + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java new file mode 100644 index 0000000..05adeea --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -0,0 +1,108 @@ +package fr.ird.observe.application.web.controller.v1; + +import com.google.common.base.Optional; +import fr.ird.observe.application.web.request.ObserveWebRequestContextConnected; +import fr.ird.observe.application.web.request.ObserveWebRequestContextNotConnected; +import fr.ird.observe.application.web.security.DataSourceConfigurationAlreadyRegistredException; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; +import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; +import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; +import fr.ird.observe.services.service.DataSourceService; +import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; +import fr.ird.observe.services.service.DatabaseNotFoundException; +import fr.ird.observe.services.spi.NoDataAccess; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DataSourceServiceController extends ObserveServiceControllerSupport<DataSourceService> implements DataSourceService { + + /** Logger. */ + private static final Log log = LogFactory.getLog(DataSourceServiceController.class); + + public DataSourceServiceController() { + super(DataSourceService.class); + } + + @NoDataAccess + public boolean exists() { + return service.exists(); + } + + @NoDataAccess + public boolean canConnect() { + return service.canConnect(); + } + + @NoDataAccess + public void create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + service.create(dataSourceCreateConfiguration); + + ObserveWebRequestContextNotConnected requestContext = getObserveWebRequestContextNotConnected(); + ObserveDataSourceConfiguration dataSourceConfiguration = requestContext.getDataSourceConfiguration(); + + String userLogin = requestContext.getUserLogin(); + Optional<String> optionalDatabaseName = requestContext.getOptionalDatabaseName(); + String authenticationToken; + try { + authenticationToken = getObserveWebApplicationContext().getSecurityApplicationContext().registerDataSourceConfiguration(userLogin, optionalDatabaseName, dataSourceConfiguration); + } catch (DataSourceConfigurationAlreadyRegistredException e) { + throw new RuntimeException("DataSource already registred", e); + } + if (log.isInfoEnabled()) { + log.info("New authenticationToken: " + authenticationToken + " for " + dataSourceConfiguration); + } + + //TODO Voir comment retourner le jeton de sécurité + getContext().getResponse().addHeader("authenticationToken", authenticationToken); + + } + + @NoDataAccess + public void open() throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + + service.open(); + + ObserveWebRequestContextNotConnected requestContext = getObserveWebRequestContextNotConnected(); + ObserveDataSourceConfiguration dataSourceConfiguration = requestContext.getDataSourceConfiguration(); + + String userLogin = requestContext.getUserLogin(); + Optional<String> optionalDatabaseName = requestContext.getOptionalDatabaseName(); + String authenticationToken; + try { + authenticationToken = getObserveWebApplicationContext().getSecurityApplicationContext().registerDataSourceConfiguration(userLogin, optionalDatabaseName, dataSourceConfiguration); + } catch (DataSourceConfigurationAlreadyRegistredException e) { + throw new RuntimeException("DataSource already registred", e); + } + if (log.isInfoEnabled()) { + log.info("New authenticationToken: " + authenticationToken + " for " + dataSourceConfiguration); + } + + //TODO Voir comment retourner le jeton de sécurité + getContext().getResponse().addHeader("authenticationToken", authenticationToken); + + } + + public void close() { + + service.close(); + + ObserveWebRequestContextConnected requestContext = getObserveWebRequestContextConnected(); + String authenticationToken = requestContext.getAuthenticationToken(); + getObserveWebApplicationContext().getSecurityApplicationContext().invalidateAuthenticationToken(authenticationToken); + if (log.isInfoEnabled()) { + log.info("Invalidate authenticationToken: " + authenticationToken); + } + + } + + public void destroy() { + service.destroy(); + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java deleted file mode 100644 index 168d6f2..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DocController.java +++ /dev/null @@ -1,40 +0,0 @@ -package fr.ird.observe.application.web.controller.v1; - -import fr.ird.observe.application.web.controller.ObserveWebMotionController; -import org.apache.commons.io.IOUtils; -import org.debux.webmotion.server.render.Render; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Created on 8/30/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class DocController extends ObserveWebMotionController { - - public Render mapping() { - - InputStream mappingUrl = getClass().getResourceAsStream("/mapping"); - - try { - - String content = IOUtils.toString(mappingUrl); - return renderContent(content, "text/plain"); - - } catch (IOException e) { - - throw new RuntimeException(e); - - } - - } - - public Render configuration() { - - String content = getObserveWebApplicationConfiguration().getConfigurationDescription(); - return renderContent(content, "text/plain"); - - } -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java new file mode 100644 index 0000000..68d3fdf --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java @@ -0,0 +1,34 @@ +package fr.ird.observe.application.web.controller.v1; + +import fr.ird.observe.application.web.controller.ObserveWebMotionController; +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.ObserveServiceContext; +import org.debux.webmotion.server.WebMotionContextable; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public abstract class ObserveServiceControllerSupport<S extends ObserveService> extends ObserveWebMotionController implements ObserveService { + + protected S service; + + protected final Class<S> serviceType; + + protected ObserveServiceControllerSupport(Class<S> serviceType) { + this.serviceType = serviceType; + } + + @Override + public void setContextable(WebMotionContextable contextable) { + super.setContextable(contextable); + service = newService(serviceType); + } + + @Override + public void setServiceContext(ObserveServiceContext serviceContext) { + // Non utilisé ici + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java index 35c8541..fc35ea0 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java @@ -1,14 +1,11 @@ package fr.ird.observe.application.web.controller.v1; -import fr.ird.observe.application.web.controller.ObserveWebMotionController; -import fr.ird.observe.services.ObserveServiceContext; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.ReferenceSetDto; import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.DataNotFoundException; import fr.ird.observe.services.service.ReferentialService; import fr.ird.observe.services.spi.Write; -import org.debux.webmotion.server.WebMotionContextable; import java.util.Collection; @@ -17,56 +14,48 @@ import java.util.Collection; * * @author Tony Chemit - chemit@codelutin.com */ -public class ReferentialServiceController extends ObserveWebMotionController implements ReferentialService { +public class ReferentialServiceController extends ObserveServiceControllerSupport<ReferentialService> implements ReferentialService { - protected ReferentialService referentialService; - - @Override - public void setContextable(WebMotionContextable contextable) { - super.setContextable(contextable); - referentialService = newService(ReferentialService.class); + public ReferentialServiceController() { + super(ReferentialService.class); } @Override public <R extends ReferentialDto> ReferenceSetDto<R> getReferentialReferenceSet(Class<R> type) { - return referentialService.getReferentialReferenceSet(type); + return service.getReferentialReferenceSet(type); } @Override public <R extends ReferentialDto> FormDto<R> loadToRead(Class<R> type, String id) throws DataNotFoundException { - return referentialService.loadToRead(type, id); + return service.loadToRead(type, id); } @Override public <R extends ReferentialDto> FormDto<R> loadToEdit(Class<R> type, String id) throws DataNotFoundException { - return referentialService.loadToEdit(type, id); + return service.loadToEdit(type, id); } @Override public <R extends ReferentialDto> FormDto<R> preCreate(Class<R> type) { - return referentialService.preCreate(type); + return service.preCreate(type); } @Override @Write public <R extends ReferentialDto> String save(FormDto<R> form) { - return referentialService.save(form); + return service.save(form); } @Override @Write public <R extends ReferentialDto> void delete(Class<R> type, String id) throws DataNotFoundException { - referentialService.delete(type, id); + service.delete(type, id); } @Override @Write public <R extends ReferentialDto> void delete(Class<R> type, Collection<String> ids) throws DataNotFoundException { - referentialService.delete(type, ids); + service.delete(type, ids); } - @Override - public void setServiceContext(ObserveServiceContext serviceContext) { - // Non utilisé ici - } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextConnected.java similarity index 55% copy from observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java copy to observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextConnected.java index 9846742..1adb3de 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextConnected.java @@ -1,4 +1,4 @@ -package fr.ird.observe.application.web; +package fr.ird.observe.application.web.request; /* * #%L @@ -21,9 +21,9 @@ package fr.ird.observe.application.web; * #L% */ +import fr.ird.observe.application.web.ObserveWebApplicationContext; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import org.debux.webmotion.server.call.HttpContext; /** * Created on 4/25/14. @@ -31,35 +31,33 @@ import org.debux.webmotion.server.call.HttpContext; * @author Tony Chemit <chemit@codelutin.com> * @since 2.0 */ -public class ObserveWebRequestContext { +public class ObserveWebRequestContextConnected extends ObserveWebRequestContextSupport { - protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContext.class.getName(); + protected final ObserveDataSourceConfiguration dataSourceConfiguration; - public static ObserveWebRequestContext getRequestContext(HttpContext httpContext) { + protected final String authenticationToken; - ObserveWebRequestContext result = (ObserveWebRequestContext) - httpContext.getRequest().getAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT); - return result; + public ObserveWebRequestContextConnected(ObserveWebApplicationContext webApplicationContext, + ObserveDataSourceConfiguration dataSourceConfiguration, + String authenticationToken) { + super(webApplicationContext, true); + this.dataSourceConfiguration = dataSourceConfiguration; + this.authenticationToken = authenticationToken; } - public static void setRequestContext(HttpContext httpContext, - ObserveWebRequestContext serviceContext) { - httpContext.getRequest().setAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT, serviceContext); + public String getAuthenticationToken() { + return authenticationToken; } - protected final ObserveWebApplicationContext webApplicationContext; - - protected final ObserveDataSourceConfiguration dataSourceConfiguration; - - public ObserveWebRequestContext(ObserveWebApplicationContext webApplicationContext, - ObserveDataSourceConfiguration dataSourceConfiguration) { - this.webApplicationContext = webApplicationContext; - this.dataSourceConfiguration = dataSourceConfiguration; + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; } public <S extends ObserveService> S newService(Class<S> serviceType) { + S service = webApplicationContext.newService(dataSourceConfiguration, serviceType); return service; + } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextNotConnected.java similarity index 54% copy from observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java copy to observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextNotConnected.java index 9846742..e34778f 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextNotConnected.java @@ -1,4 +1,4 @@ -package fr.ird.observe.application.web; +package fr.ird.observe.application.web.request; /* * #%L @@ -21,9 +21,10 @@ package fr.ird.observe.application.web; * #L% */ +import com.google.common.base.Optional; +import fr.ird.observe.application.web.ObserveWebApplicationContext; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import org.debux.webmotion.server.call.HttpContext; /** * Created on 4/25/14. @@ -31,35 +32,41 @@ import org.debux.webmotion.server.call.HttpContext; * @author Tony Chemit <chemit@codelutin.com> * @since 2.0 */ -public class ObserveWebRequestContext { +public class ObserveWebRequestContextNotConnected extends ObserveWebRequestContextSupport { - protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContext.class.getName(); + protected final String userLogin; - public static ObserveWebRequestContext getRequestContext(HttpContext httpContext) { + protected final Optional<String> optionalDatabaseName; - ObserveWebRequestContext result = (ObserveWebRequestContext) - httpContext.getRequest().getAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT); - return result; - } + protected final ObserveDataSourceConfiguration dataSourceConfiguration; - public static void setRequestContext(HttpContext httpContext, - ObserveWebRequestContext serviceContext) { - httpContext.getRequest().setAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT, serviceContext); + public ObserveWebRequestContextNotConnected(ObserveWebApplicationContext webApplicationContext, + ObserveDataSourceConfiguration dataSourceConfiguration, + String userLogin, + Optional<String> optionalDatabaseName) { + super(webApplicationContext, true); + this.dataSourceConfiguration = dataSourceConfiguration; + this.userLogin = userLogin; + this.optionalDatabaseName = optionalDatabaseName; } - protected final ObserveWebApplicationContext webApplicationContext; + public String getUserLogin() { + return userLogin; + } - protected final ObserveDataSourceConfiguration dataSourceConfiguration; + public Optional<String> getOptionalDatabaseName() { + return optionalDatabaseName; + } - public ObserveWebRequestContext(ObserveWebApplicationContext webApplicationContext, - ObserveDataSourceConfiguration dataSourceConfiguration) { - this.webApplicationContext = webApplicationContext; - this.dataSourceConfiguration = dataSourceConfiguration; + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; } public <S extends ObserveService> S newService(Class<S> serviceType) { + S service = webApplicationContext.newService(dataSourceConfiguration, serviceType); return service; + } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextSupport.java similarity index 62% rename from observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java rename to observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextSupport.java index 9846742..f402af9 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextSupport.java @@ -1,4 +1,4 @@ -package fr.ird.observe.application.web; +package fr.ird.observe.application.web.request; /* * #%L @@ -21,8 +21,8 @@ package fr.ird.observe.application.web; * #L% */ +import fr.ird.observe.application.web.ObserveWebApplicationContext; import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import org.debux.webmotion.server.call.HttpContext; /** @@ -31,35 +31,38 @@ import org.debux.webmotion.server.call.HttpContext; * @author Tony Chemit <chemit@codelutin.com> * @since 2.0 */ -public class ObserveWebRequestContext { +public abstract class ObserveWebRequestContextSupport { - protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContext.class.getName(); + protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContextSupport.class.getName(); - public static ObserveWebRequestContext getRequestContext(HttpContext httpContext) { + public static ObserveWebRequestContextSupport getRequestContext(HttpContext httpContext) { - ObserveWebRequestContext result = (ObserveWebRequestContext) + ObserveWebRequestContextSupport result = (ObserveWebRequestContextSupport) httpContext.getRequest().getAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT); return result; } public static void setRequestContext(HttpContext httpContext, - ObserveWebRequestContext serviceContext) { + ObserveWebRequestContextSupport serviceContext) { httpContext.getRequest().setAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT, serviceContext); } protected final ObserveWebApplicationContext webApplicationContext; + protected final boolean canCreateService; - protected final ObserveDataSourceConfiguration dataSourceConfiguration; - - public ObserveWebRequestContext(ObserveWebApplicationContext webApplicationContext, - ObserveDataSourceConfiguration dataSourceConfiguration) { + public ObserveWebRequestContextSupport(ObserveWebApplicationContext webApplicationContext, boolean canCreateService) { this.webApplicationContext = webApplicationContext; - this.dataSourceConfiguration = dataSourceConfiguration; + this.canCreateService = canCreateService; + } + + public ObserveWebApplicationContext getWebApplicationContext() { + return webApplicationContext; } - public <S extends ObserveService> S newService(Class<S> serviceType) { - S service = webApplicationContext.newService(dataSourceConfiguration, serviceType); - return service; + public boolean isCanCreateService() { + return canCreateService; } + public abstract <S extends ObserveService> S newService(Class<S> serviceType); + } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextWithNoDataSourceConfiguration.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextWithNoDataSourceConfiguration.java new file mode 100644 index 0000000..6abfac1 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextWithNoDataSourceConfiguration.java @@ -0,0 +1,47 @@ +package fr.ird.observe.application.web.request; + +/* + * #%L + * Pollen :: Rest Api + * %% + * Copyright (C) 2009 - 2014 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import fr.ird.observe.application.web.ObserveWebApplicationContext; +import fr.ird.observe.services.ObserveService; +import org.apache.commons.lang3.NotImplementedException; + +/** + * Created on 4/25/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.0 + */ +public class ObserveWebRequestContextWithNoDataSourceConfiguration extends ObserveWebRequestContextSupport { + + public ObserveWebRequestContextWithNoDataSourceConfiguration(ObserveWebApplicationContext webApplicationContext) { + super(webApplicationContext, false); + + } + + public <S extends ObserveService> S newService(Class<S> serviceType) { + + throw new NotImplementedException("Not authorize to create observe services from this requestContext."); + + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/BadObserveWebUserPasswordException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/BadObserveWebUserPasswordException.java new file mode 100644 index 0000000..9518e5c --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/BadObserveWebUserPasswordException.java @@ -0,0 +1,27 @@ +package fr.ird.observe.application.web.security; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class BadObserveWebUserPasswordException extends Exception{ + + private static final long serialVersionUID = 1L; + + protected final String userLogin; + protected final String userPassword; + + public BadObserveWebUserPasswordException(String userLogin, String userPassword) { + this.userLogin= userLogin; + this.userPassword = userPassword; + } + + public String getUserLogin() { + return userLogin; + } + + public String getUserPassword() { + return userPassword; + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/DataSourceConfigurationAlreadyRegistredException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/DataSourceConfigurationAlreadyRegistredException.java new file mode 100644 index 0000000..1ced100 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/DataSourceConfigurationAlreadyRegistredException.java @@ -0,0 +1,27 @@ +package fr.ird.observe.application.web.security; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class DataSourceConfigurationAlreadyRegistredException extends Exception { + + private static final long serialVersionUID = 1L; + + protected final String databaseName; + protected final String role; + + public DataSourceConfigurationAlreadyRegistredException(String databaseName, String role) { + this.databaseName = databaseName; + this.role = role; + } + + public String getDatabaseName() { + return databaseName; + } + + public String getRole() { + return role; + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/InvalidAuthenticationTokenException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/InvalidAuthenticationTokenException.java new file mode 100644 index 0000000..1ab9212 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/InvalidAuthenticationTokenException.java @@ -0,0 +1,22 @@ +package fr.ird.observe.application.web.security; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class InvalidAuthenticationTokenException extends Exception { + + private static final long serialVersionUID = 1L; + + protected final String authenticationToken; + + public InvalidAuthenticationTokenException(String authenticationToken) { + this.authenticationToken = authenticationToken; + } + + public String getAuthenticationToken() { + return authenticationToken; + } + +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java new file mode 100644 index 0000000..b5b5942 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java @@ -0,0 +1,224 @@ +package fr.ird.observe.application.web.security; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabase; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabaseRole; +import fr.ird.observe.application.web.configuration.db.ObserveWebDatabases; +import fr.ird.observe.application.web.configuration.user.ObserveWebUser; +import fr.ird.observe.application.web.configuration.user.ObserveWebUserPermission; +import fr.ird.observe.application.web.configuration.user.ObserveWebUsers; +import fr.ird.observe.services.ObserveDataSourceConfigurationMainFactory; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.Closeable; +import java.util.Objects; + +/** + * Pour conserver les données applicatives liée à la sécurité (principale le cache des utilisateurs connectés). + * + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebSecurityApplicationContext implements Closeable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveWebSecurityApplicationContext.class); + + /** + * Le cache des jetons de sécurité générés liés aux configurations de sources de données. + */ + protected final ObserveWebSecurityAuthenticationTokenCache authenticateCache; + + /** + * Le cache des configurations disponibles pour les couple (utilisateur#base) connus du système. + * + * @see #getUserKey(String, String) + */ + protected ImmutableMap<String, ObserveDataSourceConfiguration> dataSourceConfigurationCache; + + /** + * Le nom de la base par défaut à utiliser si elle n'est pas spécifiée. + * + * @see ObserveWebDatabases#getDefaultDatabase() + */ + protected String defaultDatabaseName; + + protected ObserveWebDatabases<?> databases; + + protected ObserveWebUsers<?> users; + + public ObserveWebSecurityApplicationContext() { + this.authenticateCache = new ObserveWebSecurityAuthenticationTokenCache(); + } + + public synchronized void init(ObserveWebDatabases<?> databases, ObserveWebUsers<?> users) { + this.databases = databases; + this.users = users; + + authenticateCache.removeAllAuthenticationTokens(); + ObserveWebDatabase defaultDatabase = databases.getDefaultDatabase(); + Preconditions.checkNotNull(defaultDatabase); + defaultDatabaseName = defaultDatabase.getName(); + + ImmutableMap.Builder<String, ObserveDataSourceConfiguration> dataSourceConfigurationsCacheBuilder = new ImmutableMap.Builder<>(); + + ObserveDataSourceConfigurationMainFactory configurationFactory = new ObserveDataSourceConfigurationMainFactory(); + for (ObserveWebUser<?> observeWebUser : users.getUsers()) { + + for (ObserveWebUserPermission observeWebUserPermission : observeWebUser.getPermissions()) { + + String databaseName = observeWebUserPermission.getDatabase(); + Optional<? extends ObserveWebDatabase> optionalDatabase = databases.getDatabaseByName(databaseName); + Preconditions.checkArgument(optionalDatabase.isPresent()); + + ObserveWebDatabase<?> database = optionalDatabase.get(); + + String role = observeWebUserPermission.getRole(); + Optional<? extends ObserveWebDatabaseRole> optionalDatabaseRole = database.getDatabaseRoleByLogin(role); + Preconditions.checkArgument(optionalDatabaseRole.isPresent()); + ObserveWebDatabaseRole databaseRole = optionalDatabaseRole.get(); + + String jdbcUrl = database.getUrl(); + String login = databaseRole.getLogin(); + String password = databaseRole.getPassword(); + String userKey = getUserKey(observeWebUser.getLogin(), databaseName); + + // Create DataSourceConfiguration + ObserveDataSourceConfiguration configuration = configurationFactory.createObserveDataSourceConfigurationTopiaPG( + userKey, + jdbcUrl, + login, + password.toCharArray(), + true + ); + + + if (log.isInfoEnabled()) { + log.info(String.format("Creates data source configuration for userKey %s : %s", userKey, configuration)); + } + dataSourceConfigurationsCacheBuilder.put(userKey, configuration); + + } + + } + + dataSourceConfigurationCache = dataSourceConfigurationsCacheBuilder.build(); + + } + + /** + * Récupére la configuration de la data source associé à l'utilisateur et à la base passé en paramètre. + * + * @param userLogin le login de l'utilisateur + * @param optionalDatabaseName le nom de la base à utiliser + * @return + * @throws UnknownObserveWebUserForDatabaseException + * @throws DataSourceConfigurationAlreadyRegistredException + */ + public ObserveDataSourceConfiguration getDataSourceConfiguration(String userLogin, Optional<String> optionalDatabaseName) throws UnknownObserveWebUserForDatabaseException, DataSourceConfigurationAlreadyRegistredException { + + // Get database name + String databaseName; + if (optionalDatabaseName.isPresent()) { + databaseName = optionalDatabaseName.get(); + } else { + databaseName = defaultDatabaseName; + } + + // Get data source configuration key cache + String userKey = getUserKey(userLogin, databaseName); + if (log.isInfoEnabled()) { + log.info("Try to find data source configuration for: " + userKey); + } + + // Get data source configuration + ObserveDataSourceConfiguration dataSourceConfiguration = dataSourceConfigurationCache.get(userKey); + if (dataSourceConfiguration == null) { + + // unknown userLogin - database + throw new UnknownObserveWebUserForDatabaseException(userLogin, databaseName); + } + + if (log.isInfoEnabled()) { + log.info("Will use database configuration: " + dataSourceConfiguration); + } + + return dataSourceConfiguration; + + } + + public String registerDataSourceConfiguration(String userLogin, Optional<String> optionalDatabaseName, ObserveDataSourceConfiguration dataSourceConfiguration) throws DataSourceConfigurationAlreadyRegistredException { + + // Check if the data source configuration is not already registred in cache + boolean alreadyInCache = authenticateCache.isDataSourceConfigurationInCache(dataSourceConfiguration); + if (alreadyInCache) { + + // Get database name + String databaseName; + if (optionalDatabaseName.isPresent()) { + databaseName = optionalDatabaseName.get(); + } else { + databaseName = defaultDatabaseName; + } + + // can't register twice a user for a database + throw new DataSourceConfigurationAlreadyRegistredException(userLogin, databaseName); + } + + // Register data source configuration in cache + String authenticationToken = authenticateCache.registerDataSourceConfiguration(dataSourceConfiguration); + + return authenticationToken; + + } + + public ObserveDataSourceConfiguration getDataSourceConfiguration(String userLogin, String userPassword, Optional<String> optionalDatabaseName) throws UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException { + + // Get user + Optional<? extends ObserveWebUser> optionalUser = users.getUserByLogin(userLogin); + if (!optionalUser.isPresent()) { + throw new UnknownObserveWebUserException(userLogin); + } + ObserveWebUser user = optionalUser.get(); + if (!Objects.equals(user.getPassword(), userPassword)) { + throw new BadObserveWebUserPasswordException(userLogin, userPassword); + } + ObserveDataSourceConfiguration dataSourceConfiguration = getDataSourceConfiguration(userLogin, optionalDatabaseName); + return dataSourceConfiguration; + + } + + /** + * Pour récupérer la configuration de la data source à partir d'un jeton d'authentification. + * + * @param authenticationToken le jeton de sécurité + * @return la configuration de la data source associée au jeton + * @throws InvalidAuthenticationTokenException si le jeton n'est pas connu + */ + public ObserveDataSourceConfiguration getDataSourceConfiguration(String authenticationToken) throws InvalidAuthenticationTokenException { + ObserveDataSourceConfiguration dataSourceConfiguration = authenticateCache.getDataSourceConfigurationIfPresent(authenticationToken); + if (dataSourceConfiguration == null) { + throw new InvalidAuthenticationTokenException(authenticationToken); + } + return dataSourceConfiguration; + + } + + public void invalidateAuthenticationToken(String authenticationToken) { + authenticateCache.removeAuthenticationToken(authenticationToken); + } + + @Override + public void close() { + authenticateCache.close(); + } + + protected String getUserKey(String userLogin, String databaseName) { + return userLogin + "--" + databaseName; + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityAuthenticationTokenCache.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityAuthenticationTokenCache.java new file mode 100644 index 0000000..ecd3de4 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityAuthenticationTokenCache.java @@ -0,0 +1,84 @@ +package fr.ird.observe.application.web.security; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.RemovalListener; +import com.google.common.cache.RemovalNotification; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * Le cache des jetons d'authentification. + * + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebSecurityAuthenticationTokenCache { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveWebSecurityAuthenticationTokenCache.class); + + /** + * Le cache des jetons de sécurité liés aux configurations de sources de données. + */ + protected final Cache<String, ObserveDataSourceConfiguration> authenticationTokenCache; + + public ObserveWebSecurityAuthenticationTokenCache() { + this.authenticationTokenCache = CacheBuilder.newBuilder() + .maximumSize(10000) + .expireAfterWrite(20, TimeUnit.MINUTES) + .expireAfterAccess(20, TimeUnit.MINUTES) + .removalListener(new RemovalListener<String, ObserveDataSourceConfiguration>() { + + @Override + public void onRemoval(RemovalNotification<String, ObserveDataSourceConfiguration> notification) { + if (log.isInfoEnabled()) { + log.info(String.format("Remove authentication token: %s - %s", notification.getKey(), notification.getValue())); + } + } + }) + .build(); + } + + public ObserveDataSourceConfiguration getDataSourceConfigurationIfPresent(String authenticationToken) { + ObserveDataSourceConfiguration dataSourceConfiguration = authenticationTokenCache.getIfPresent(authenticationToken); + return dataSourceConfiguration; + } + + public boolean isDataSourceConfigurationInCache(ObserveDataSourceConfiguration dataSourceConfiguration) { + boolean inCache = authenticationTokenCache.asMap().containsValue(dataSourceConfiguration); + return inCache; + } + + public String registerDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { + String authenticationToken = UUID.randomUUID().toString(); + if (log.isInfoEnabled()) { + log.info(String.format("Add authenticationToken: %s for data source configuration: %s", authenticationToken, dataSourceConfiguration)); + } + authenticationTokenCache.put(authenticationToken, dataSourceConfiguration); + return authenticationToken; + } + + public void removeAuthenticationToken(String authenticationToken) { + if (log.isInfoEnabled()) { + log.info(String.format("Remove authenticationToken: %s ", authenticationToken)); + } + authenticationTokenCache.invalidate(authenticationToken); + } + + public void removeAllAuthenticationTokens() { + if (log.isInfoEnabled()) { + log.info("Remove all authenticationTokens"); + } + authenticationTokenCache.invalidateAll(); + } + + public void close() { + removeAllAuthenticationTokens(); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserException.java new file mode 100644 index 0000000..4568096 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserException.java @@ -0,0 +1,21 @@ +package fr.ird.observe.application.web.security; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class UnknownObserveWebUserException extends Exception { + + private static final long serialVersionUID = 1L; + + protected final String userLogin; + + public UnknownObserveWebUserException(String userLogin) { + this.userLogin= userLogin; + } + + public String getUserLogin() { + return userLogin; + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserForDatabaseException.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserForDatabaseException.java new file mode 100644 index 0000000..6ff40f2 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/UnknownObserveWebUserForDatabaseException.java @@ -0,0 +1,27 @@ +package fr.ird.observe.application.web.security; + +/** + * Created on 30/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class UnknownObserveWebUserForDatabaseException extends Exception { + + private static final long serialVersionUID = 1L; + + protected final String databaseName; + protected final String role; + + public UnknownObserveWebUserForDatabaseException(String databaseName, String role) { + this.databaseName = databaseName; + this.role = role; + } + + public String getDatabaseName() { + return databaseName; + } + + public String getRole() { + return role; + } +} diff --git a/observe-application-web/src/main/resources/mapping b/observe-application-web/src/main/resources/mapping index 860c553..df7804d 100644 --- a/observe-application-web/src/main/resources/mapping +++ b/observe-application-web/src/main/resources/mapping @@ -40,6 +40,7 @@ default.render=fr.ird.observe.application.web.ObserveWebMotionRender [actions] -GET /api/v1/doc/{method} DocController.{method} +GET /api/v1/configuration/{method} ConfigurationController.{method} GET,POST /api/v1/referential/{method} ReferentialServiceController.{method} +GET,POST /api/v1/dataSource/{method} DataSourceServiceController.{method} -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit e5c6cd2b76880273468e120a315a984844595890 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 01:19:55 2015 +0200 Amélioration du contexte de requete avec l'introduction d'un context de sécurité au niveau de la requete --- .../application/web/ObserveWebMotionFilter.java | 60 ++++------- .../web/controller/ObserveWebMotionController.java | 50 +++------ .../web/controller/v1/ConfigurationController.java | 7 +- .../controller/v1/DataSourceServiceController.java | 83 ++++++++------- .../v1/ReferentialServiceController.java | 7 ++ .../web/request/ObserveWebRequestContext.java | 112 +++++++++++++++++++++ .../request/ObserveWebRequestContextConnected.java | 63 ------------ .../ObserveWebRequestContextNotConnected.java | 72 ------------- .../request/ObserveWebRequestContextSupport.java | 68 ------------- ...equestContextWithNoDataSourceConfiguration.java | 47 --------- .../request/ObserveWebRequestSecurityContext.java | 62 ++++++++++++ 11 files changed, 260 insertions(+), 371 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java index ad8922b..fd319a3 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java @@ -1,10 +1,8 @@ package fr.ird.observe.application.web; import com.google.common.base.Optional; -import fr.ird.observe.application.web.request.ObserveWebRequestContextConnected; -import fr.ird.observe.application.web.request.ObserveWebRequestContextNotConnected; -import fr.ird.observe.application.web.request.ObserveWebRequestContextSupport; -import fr.ird.observe.application.web.request.ObserveWebRequestContextWithNoDataSourceConfiguration; +import fr.ird.observe.application.web.request.ObserveWebRequestContext; +import fr.ird.observe.application.web.request.ObserveWebRequestSecurityContext; import fr.ird.observe.application.web.security.BadObserveWebUserPasswordException; import fr.ird.observe.application.web.security.DataSourceConfigurationAlreadyRegistredException; import fr.ird.observe.application.web.security.InvalidAuthenticationTokenException; @@ -29,19 +27,30 @@ public class ObserveWebMotionFilter extends WebMotionFilter { HttpServletRequest request = context.getRequest(); - ObserveWebRequestContextSupport requestContext; + ObserveWebRequestSecurityContext securityContext = createSecurityContext(applicationContext, request); + ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, securityContext); + + ObserveWebRequestContext.setRequestContext(context, requestContext); + + doProcess(); + + } + + protected ObserveWebRequestSecurityContext createSecurityContext(ObserveWebApplicationContext applicationContext, HttpServletRequest request) throws InvalidAuthenticationTokenException, UnknownObserveWebUserForDatabaseException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserException { + + ObserveWebRequestSecurityContext securityContext = null; String authenticationToken = getRequestParameterValueOrNull(request, "authenticationToken"); if (authenticationToken == null) { authenticationToken = request.getHeader("authenticationToken"); } - if (StringUtils.isNotBlank(authenticationToken)) { // Recherche de la configuration à la source de donnée - requestContext = getObserveWebRequestContextConnected(applicationContext, authenticationToken); - + ObserveWebSecurityApplicationContext securityApplicationContext = applicationContext.getSecurityApplicationContext(); + ObserveDataSourceConfiguration dataSourceConfiguration = securityApplicationContext.getDataSourceConfiguration(authenticationToken); + securityContext = ObserveWebRequestSecurityContext.createAuthenticated(dataSourceConfiguration, authenticationToken); } else { // Cas où on l'utilisateur n'est pas connecté @@ -53,42 +62,15 @@ public class ObserveWebMotionFilter extends WebMotionFilter { if (!(userLogin == null && userPassword == null)) { // On recherche une configuration de source de données à partir de l'identité de l'utilisateur - - requestContext = getObserveWebRequestContextNotConnected(applicationContext, userLogin, userPassword, userDatabaseName); - - } else { - - // Ce cas peut arriver pour des requètes qui ne nécessitent pas de sources de données - // À noter que dans ce cas, on ne sera pas autorisé à créer des services de l'API - - requestContext = new ObserveWebRequestContextWithNoDataSourceConfiguration(applicationContext); + ObserveWebSecurityApplicationContext securityApplicationContext = applicationContext.getSecurityApplicationContext(); + ObserveDataSourceConfiguration dataSourceConfiguration = securityApplicationContext.getDataSourceConfiguration(userLogin, userPassword, Optional.fromNullable(userDatabaseName)); + securityContext = ObserveWebRequestSecurityContext.create(dataSourceConfiguration, userLogin, userPassword, userDatabaseName); } } - ObserveWebRequestContextSupport.setRequestContext(context, requestContext); - - doProcess(); - - } - - protected ObserveWebRequestContextNotConnected getObserveWebRequestContextNotConnected(ObserveWebApplicationContext applicationContext, String userLogin, String userPassword, String userDatabaseName) throws UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException { - - Optional<String> optionalDatabaseName = Optional.fromNullable(userDatabaseName); - - ObserveWebSecurityApplicationContext securityApplicationContext = applicationContext.getSecurityApplicationContext(); - ObserveDataSourceConfiguration dataSourceConfiguration = securityApplicationContext.getDataSourceConfiguration(userLogin, userPassword, optionalDatabaseName); - ObserveWebRequestContextNotConnected requestContext = new ObserveWebRequestContextNotConnected(applicationContext, dataSourceConfiguration, userLogin, optionalDatabaseName); - return requestContext; - } - - protected ObserveWebRequestContextConnected getObserveWebRequestContextConnected(ObserveWebApplicationContext applicationContext, String authenticationToken) throws InvalidAuthenticationTokenException { - - ObserveWebSecurityApplicationContext securityApplicationContext = applicationContext.getSecurityApplicationContext(); - ObserveDataSourceConfiguration dataSourceConfiguration = securityApplicationContext.getDataSourceConfiguration(authenticationToken); - ObserveWebRequestContextConnected requestContext = new ObserveWebRequestContextConnected(applicationContext, dataSourceConfiguration, authenticationToken); - return requestContext; + return securityContext; } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java index df6763e..7e004a6 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/ObserveWebMotionController.java @@ -2,10 +2,8 @@ package fr.ird.observe.application.web.controller; import fr.ird.observe.application.web.ObserveWebApplicationContext; import fr.ird.observe.application.web.configuration.ObserveWebApplicationConfiguration; -import fr.ird.observe.application.web.request.ObserveWebRequestContextConnected; -import fr.ird.observe.application.web.request.ObserveWebRequestContextNotConnected; -import fr.ird.observe.application.web.request.ObserveWebRequestContextSupport; -import fr.ird.observe.application.web.request.ObserveWebRequestContextWithNoDataSourceConfiguration; +import fr.ird.observe.application.web.request.ObserveWebRequestContext; +import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.services.ObserveService; import org.debux.webmotion.server.WebMotionController; @@ -14,45 +12,27 @@ import org.debux.webmotion.server.WebMotionController; */ public abstract class ObserveWebMotionController extends WebMotionController { - public ObserveWebApplicationContext getObserveWebApplicationContext() { - return ObserveWebApplicationContext.getApplicationContext(getContext()); + protected ObserveWebApplicationContext getApplicationContext() { + return getRequestContext().getApplicationContext(); } - public ObserveWebApplicationConfiguration getObserveWebApplicationConfiguration() { - return getObserveWebApplicationContext().getApplicationConfiguration(); + protected ObserveWebSecurityApplicationContext getSecurityApplicationContext() { + return getApplicationContext().getSecurityApplicationContext(); } - public <S extends ObserveService> S newService(Class<S> serviceType) { - ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); - - if (!requestContext.isCanCreateService()) { - throw new IllegalStateException("The request context " + requestContext + " can not create service"); - } - S service = requestContext.newService(serviceType); - return service; + protected ObserveWebApplicationConfiguration getApplicationConfiguration() { + return getApplicationContext().getApplicationConfiguration(); } - public ObserveWebRequestContextNotConnected getObserveWebRequestContextNotConnected() { - ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); - if (!(requestContext instanceof ObserveWebRequestContextNotConnected)) { - throw new IllegalStateException("Bad request context type"); - } - return (ObserveWebRequestContextNotConnected) requestContext; + protected ObserveWebRequestContext getRequestContext() { + return ObserveWebRequestContext.getRequestContext(getContext()); } - public ObserveWebRequestContextConnected getObserveWebRequestContextConnected() { - ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); - if (!(requestContext instanceof ObserveWebRequestContextConnected)) { - throw new IllegalStateException("Bad request context type"); - } - return (ObserveWebRequestContextConnected) requestContext; - } + public <S extends ObserveService> S newService(Class<S> serviceType) { + ObserveWebRequestContext requestContext = getRequestContext(); - public ObserveWebRequestContextWithNoDataSourceConfiguration getObserveWebRequestContextWithNoDataSourceConfiguration() { - ObserveWebRequestContextSupport requestContext = ObserveWebRequestContextSupport.getRequestContext(getContext()); - if (!(requestContext instanceof ObserveWebRequestContextWithNoDataSourceConfiguration)) { - throw new IllegalStateException("Bad request context type"); - } - return (ObserveWebRequestContextWithNoDataSourceConfiguration) requestContext; + S service = requestContext.newService(serviceType); + return service; } + } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java index 579e2c5..5a2d4da 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ConfigurationController.java @@ -38,19 +38,18 @@ public class ConfigurationController extends ObserveWebMotionController { public Render configuration() { - String content = getObserveWebApplicationConfiguration().getConfigurationDescription(); + String content = getApplicationConfiguration().getConfigurationDescription(); return renderContent(content, "text/plain"); } public Render databases() throws IOException { - String content; try (StringWriter writer = new StringWriter()) { ObserveWebDatabasesHelper observeWebDatabasesHelper = new ObserveWebDatabasesHelper(); - ObserveWebDatabases databases = getObserveWebApplicationContext().getDatabases(); + ObserveWebDatabases databases = getApplicationContext().getDatabases(); observeWebDatabasesHelper.store(databases, writer); writer.flush(); @@ -67,7 +66,7 @@ public class ConfigurationController extends ObserveWebMotionController { try (StringWriter writer = new StringWriter()) { ObserveWebUsersHelper observeWebUsersHelper = new ObserveWebUsersHelper(); - ObserveWebUsers databases = getObserveWebApplicationContext().getUsers(); + ObserveWebUsers databases = getApplicationContext().getUsers(); observeWebUsersHelper.store(databases, writer); writer.flush(); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java index 05adeea..7de27ab 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/DataSourceServiceController.java @@ -1,8 +1,7 @@ package fr.ird.observe.application.web.controller.v1; import com.google.common.base.Optional; -import fr.ird.observe.application.web.request.ObserveWebRequestContextConnected; -import fr.ird.observe.application.web.request.ObserveWebRequestContextNotConnected; +import fr.ird.observe.application.web.request.ObserveWebRequestContext; import fr.ird.observe.application.web.security.DataSourceConfigurationAlreadyRegistredException; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; @@ -11,9 +10,9 @@ import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationExce import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; -import fr.ird.observe.services.spi.NoDataAccess; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.debux.webmotion.server.WebMotionContextable; /** * Created on 30/08/15. @@ -29,80 +28,78 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport super(DataSourceService.class); } - @NoDataAccess + @Override + public void setContextable(WebMotionContextable contextable) { + super.setContextable(contextable); + getRequestContext().checkSecurityContextIsPresent(); + } + + @Override public boolean exists() { return service.exists(); } - @NoDataAccess + @Override public boolean canConnect() { return service.canConnect(); } - @NoDataAccess + @Override public void create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + service.create(dataSourceCreateConfiguration); - ObserveWebRequestContextNotConnected requestContext = getObserveWebRequestContextNotConnected(); - ObserveDataSourceConfiguration dataSourceConfiguration = requestContext.getDataSourceConfiguration(); + registerDataSourceConfiguration(); - String userLogin = requestContext.getUserLogin(); - Optional<String> optionalDatabaseName = requestContext.getOptionalDatabaseName(); - String authenticationToken; - try { - authenticationToken = getObserveWebApplicationContext().getSecurityApplicationContext().registerDataSourceConfiguration(userLogin, optionalDatabaseName, dataSourceConfiguration); - } catch (DataSourceConfigurationAlreadyRegistredException e) { - throw new RuntimeException("DataSource already registred", e); - } - if (log.isInfoEnabled()) { - log.info("New authenticationToken: " + authenticationToken + " for " + dataSourceConfiguration); - } - - //TODO Voir comment retourner le jeton de sécurité - getContext().getResponse().addHeader("authenticationToken", authenticationToken); - } - @NoDataAccess + @Override public void open() throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { service.open(); - ObserveWebRequestContextNotConnected requestContext = getObserveWebRequestContextNotConnected(); - ObserveDataSourceConfiguration dataSourceConfiguration = requestContext.getDataSourceConfiguration(); - - String userLogin = requestContext.getUserLogin(); - Optional<String> optionalDatabaseName = requestContext.getOptionalDatabaseName(); - String authenticationToken; - try { - authenticationToken = getObserveWebApplicationContext().getSecurityApplicationContext().registerDataSourceConfiguration(userLogin, optionalDatabaseName, dataSourceConfiguration); - } catch (DataSourceConfigurationAlreadyRegistredException e) { - throw new RuntimeException("DataSource already registred", e); - } - if (log.isInfoEnabled()) { - log.info("New authenticationToken: " + authenticationToken + " for " + dataSourceConfiguration); - } - - //TODO Voir comment retourner le jeton de sécurité - getContext().getResponse().addHeader("authenticationToken", authenticationToken); + registerDataSourceConfiguration(); } + @Override public void close() { + ObserveWebRequestContext requestContext = getRequestContext(); + requestContext.checkIsAuthenticated(); + service.close(); - ObserveWebRequestContextConnected requestContext = getObserveWebRequestContextConnected(); String authenticationToken = requestContext.getAuthenticationToken(); - getObserveWebApplicationContext().getSecurityApplicationContext().invalidateAuthenticationToken(authenticationToken); + getSecurityApplicationContext().invalidateAuthenticationToken(authenticationToken); if (log.isInfoEnabled()) { log.info("Invalidate authenticationToken: " + authenticationToken); } } + @Override public void destroy() { service.destroy(); } + protected void registerDataSourceConfiguration() { + + ObserveWebRequestContext requestContext = getRequestContext(); + + ObserveDataSourceConfiguration dataSourceConfiguration = requestContext.getDataSourceConfiguration(); + + String userLogin = requestContext.getUserLogin(); + Optional<String> optionalDatabaseName = requestContext.getOptionalDatabaseName(); + String authenticationToken; + try { + authenticationToken = getSecurityApplicationContext().registerDataSourceConfiguration(userLogin, optionalDatabaseName, dataSourceConfiguration); + } catch (DataSourceConfigurationAlreadyRegistredException e) { + throw new RuntimeException("DataSource already registred", e); + } + + getContext().getResponse().addHeader("authenticationToken", authenticationToken); + + } + } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java index fc35ea0..502e370 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ReferentialServiceController.java @@ -6,6 +6,7 @@ import fr.ird.observe.services.dto.referential.ReferentialDto; import fr.ird.observe.services.service.DataNotFoundException; import fr.ird.observe.services.service.ReferentialService; import fr.ird.observe.services.spi.Write; +import org.debux.webmotion.server.WebMotionContextable; import java.util.Collection; @@ -21,6 +22,12 @@ public class ReferentialServiceController extends ObserveServiceControllerSuppor } @Override + public void setContextable(WebMotionContextable contextable) { + super.setContextable(contextable); + getRequestContext().checkIsAuthenticated(); + } + + @Override public <R extends ReferentialDto> ReferenceSetDto<R> getReferentialReferenceSet(Class<R> type) { return service.getReferentialReferenceSet(type); } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java new file mode 100644 index 0000000..7fe7457 --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java @@ -0,0 +1,112 @@ +package fr.ird.observe.application.web.request; + +/* + * #%L + * Pollen :: Rest Api + * %% + * Copyright (C) 2009 - 2014 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import fr.ird.observe.application.web.ObserveWebApplicationContext; +import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import org.debux.webmotion.server.call.HttpContext; + +/** + * Created on 4/25/14. + * + * @author Tony Chemit <chemit@codelutin.com> + * @since 2.0 + */ +public class ObserveWebRequestContext { + + protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContext.class.getName(); + + public static ObserveWebRequestContext getRequestContext(HttpContext httpContext) { + + ObserveWebRequestContext result = (ObserveWebRequestContext) + httpContext.getRequest().getAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT); + return result; + } + + public static void setRequestContext(HttpContext httpContext, + ObserveWebRequestContext serviceContext) { + httpContext.getRequest().setAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT, serviceContext); + } + + protected final ObserveWebApplicationContext applicationContext; + + protected final Optional<ObserveWebRequestSecurityContext> optionalSecurityContext; + + public ObserveWebRequestContext(ObserveWebApplicationContext applicationContext, + ObserveWebRequestSecurityContext optionalSecurityContext) { + this.applicationContext = applicationContext; + this.optionalSecurityContext = Optional.fromNullable(optionalSecurityContext); + } + + public ObserveWebApplicationContext getApplicationContext() { + return applicationContext; + } + + public <S extends ObserveService> S newService(Class<S> serviceType) { + + + checkIsAuthenticated(); + S service = applicationContext.newService(getSecurityContext().getDataSourceConfiguration(), serviceType); + return service; + + } + + public void checkIsAuthenticated() { + checkSecurityContextIsPresent(); + Preconditions.checkState(getSecurityContext().isAuthenticated()); + } + + public void checkSecurityContextIsPresent() { + Preconditions.checkState(optionalSecurityContext.isPresent()); + } + + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + checkSecurityContextIsPresent(); + return optionalSecurityContext.get().getDataSourceConfiguration(); + } + + public String getUserLogin() { + checkSecurityContextIsPresent(); + ObserveWebRequestSecurityContext securityContext = getSecurityContext(); + Preconditions.checkState(securityContext.getOptionalUserLogin().isPresent()); + return securityContext.getOptionalUserLogin().get(); + } + + protected ObserveWebRequestSecurityContext getSecurityContext() { + return optionalSecurityContext.get(); + } + + public Optional<String> getOptionalDatabaseName() { + checkSecurityContextIsPresent(); + return optionalSecurityContext.get().getOptionalUserDatabaseName(); + } + + public String getAuthenticationToken() { + checkSecurityContextIsPresent(); + ObserveWebRequestSecurityContext securityContext = getSecurityContext(); + Preconditions.checkState(securityContext.getOptionalAuthenticationToken().isPresent()); + return securityContext.getOptionalAuthenticationToken().get(); + } +} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextConnected.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextConnected.java deleted file mode 100644 index 1adb3de..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextConnected.java +++ /dev/null @@ -1,63 +0,0 @@ -package fr.ird.observe.application.web.request; - -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import fr.ird.observe.application.web.ObserveWebApplicationContext; -import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; - -/** - * Created on 4/25/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 - */ -public class ObserveWebRequestContextConnected extends ObserveWebRequestContextSupport { - - protected final ObserveDataSourceConfiguration dataSourceConfiguration; - - protected final String authenticationToken; - - public ObserveWebRequestContextConnected(ObserveWebApplicationContext webApplicationContext, - ObserveDataSourceConfiguration dataSourceConfiguration, - String authenticationToken) { - super(webApplicationContext, true); - this.dataSourceConfiguration = dataSourceConfiguration; - this.authenticationToken = authenticationToken; - } - - public String getAuthenticationToken() { - return authenticationToken; - } - - public ObserveDataSourceConfiguration getDataSourceConfiguration() { - return dataSourceConfiguration; - } - - public <S extends ObserveService> S newService(Class<S> serviceType) { - - S service = webApplicationContext.newService(dataSourceConfiguration, serviceType); - return service; - - } - -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextNotConnected.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextNotConnected.java deleted file mode 100644 index e34778f..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextNotConnected.java +++ /dev/null @@ -1,72 +0,0 @@ -package fr.ird.observe.application.web.request; - -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.google.common.base.Optional; -import fr.ird.observe.application.web.ObserveWebApplicationContext; -import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; - -/** - * Created on 4/25/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 - */ -public class ObserveWebRequestContextNotConnected extends ObserveWebRequestContextSupport { - - protected final String userLogin; - - protected final Optional<String> optionalDatabaseName; - - protected final ObserveDataSourceConfiguration dataSourceConfiguration; - - public ObserveWebRequestContextNotConnected(ObserveWebApplicationContext webApplicationContext, - ObserveDataSourceConfiguration dataSourceConfiguration, - String userLogin, - Optional<String> optionalDatabaseName) { - super(webApplicationContext, true); - this.dataSourceConfiguration = dataSourceConfiguration; - this.userLogin = userLogin; - this.optionalDatabaseName = optionalDatabaseName; - } - - public String getUserLogin() { - return userLogin; - } - - public Optional<String> getOptionalDatabaseName() { - return optionalDatabaseName; - } - - public ObserveDataSourceConfiguration getDataSourceConfiguration() { - return dataSourceConfiguration; - } - - public <S extends ObserveService> S newService(Class<S> serviceType) { - - S service = webApplicationContext.newService(dataSourceConfiguration, serviceType); - return service; - - } - -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextSupport.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextSupport.java deleted file mode 100644 index f402af9..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextSupport.java +++ /dev/null @@ -1,68 +0,0 @@ -package fr.ird.observe.application.web.request; - -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import fr.ird.observe.application.web.ObserveWebApplicationContext; -import fr.ird.observe.services.ObserveService; -import org.debux.webmotion.server.call.HttpContext; - -/** - * Created on 4/25/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 - */ -public abstract class ObserveWebRequestContextSupport { - - protected static final String REQUEST_OBSERVE_WEB_REQUEST_CONTEXT = ObserveWebRequestContextSupport.class.getName(); - - public static ObserveWebRequestContextSupport getRequestContext(HttpContext httpContext) { - - ObserveWebRequestContextSupport result = (ObserveWebRequestContextSupport) - httpContext.getRequest().getAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT); - return result; - } - - public static void setRequestContext(HttpContext httpContext, - ObserveWebRequestContextSupport serviceContext) { - httpContext.getRequest().setAttribute(REQUEST_OBSERVE_WEB_REQUEST_CONTEXT, serviceContext); - } - - protected final ObserveWebApplicationContext webApplicationContext; - protected final boolean canCreateService; - - public ObserveWebRequestContextSupport(ObserveWebApplicationContext webApplicationContext, boolean canCreateService) { - this.webApplicationContext = webApplicationContext; - this.canCreateService = canCreateService; - } - - public ObserveWebApplicationContext getWebApplicationContext() { - return webApplicationContext; - } - - public boolean isCanCreateService() { - return canCreateService; - } - - public abstract <S extends ObserveService> S newService(Class<S> serviceType); - -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextWithNoDataSourceConfiguration.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextWithNoDataSourceConfiguration.java deleted file mode 100644 index 6abfac1..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContextWithNoDataSourceConfiguration.java +++ /dev/null @@ -1,47 +0,0 @@ -package fr.ird.observe.application.web.request; - -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import fr.ird.observe.application.web.ObserveWebApplicationContext; -import fr.ird.observe.services.ObserveService; -import org.apache.commons.lang3.NotImplementedException; - -/** - * Created on 4/25/14. - * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 - */ -public class ObserveWebRequestContextWithNoDataSourceConfiguration extends ObserveWebRequestContextSupport { - - public ObserveWebRequestContextWithNoDataSourceConfiguration(ObserveWebApplicationContext webApplicationContext) { - super(webApplicationContext, false); - - } - - public <S extends ObserveService> S newService(Class<S> serviceType) { - - throw new NotImplementedException("Not authorize to create observe services from this requestContext."); - - } - -} diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestSecurityContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestSecurityContext.java new file mode 100644 index 0000000..3e1348c --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestSecurityContext.java @@ -0,0 +1,62 @@ +package fr.ird.observe.application.web.request; + +import com.google.common.base.Optional; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; + +/** + * Created on 31/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebRequestSecurityContext { + + public static ObserveWebRequestSecurityContext create(ObserveDataSourceConfiguration dataSourceConfiguration, String userLogin,String userPassword, String userDatabaseName) { + return new ObserveWebRequestSecurityContext(dataSourceConfiguration, Optional.<String>absent(), Optional.fromNullable(userLogin), Optional.fromNullable(userPassword), Optional.fromNullable(userDatabaseName)); + } + + public static ObserveWebRequestSecurityContext createAuthenticated(ObserveDataSourceConfiguration dataSourceConfiguration, String authenticationToken) { + return new ObserveWebRequestSecurityContext(dataSourceConfiguration, Optional.of(authenticationToken), Optional.<String>absent(), Optional.<String>absent(), Optional.<String>absent()); + } + + protected final ObserveDataSourceConfiguration dataSourceConfiguration; + + protected final Optional<String> optionalAuthenticationToken; + + protected final Optional<String> optionalUserLogin; + + protected final Optional<String> optionalUserPassword; + + protected final Optional<String> optionalUserDatabaseName; + + public boolean isAuthenticated() { + return optionalAuthenticationToken.isPresent(); + } + + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; + } + + public Optional<String> getOptionalAuthenticationToken() { + return optionalAuthenticationToken; + } + + public Optional<String> getOptionalUserLogin() { + return optionalUserLogin; + } + + public Optional<String> getOptionalUserPassword() { + return optionalUserPassword; + } + + public Optional<String> getOptionalUserDatabaseName() { + return optionalUserDatabaseName; + } + + protected ObserveWebRequestSecurityContext(ObserveDataSourceConfiguration dataSourceConfiguration, Optional<String> optionalAuthenticationToken, Optional<String> optionalUserLogin, Optional<String> optionalUserPassword, Optional<String> optionalUserDatabaseName) { + this.dataSourceConfiguration = dataSourceConfiguration; + this.optionalAuthenticationToken = optionalAuthenticationToken; + this.optionalUserLogin = optionalUserLogin; + this.optionalUserPassword = optionalUserPassword; + this.optionalUserDatabaseName = optionalUserDatabaseName; + } +} -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 506e017250e5df7727a38a4990823a0d6f25920a Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Aug 31 07:26:34 2015 +0200 Fix javadoc author --- .../web/ObserveWebMotionJsonHelper.java | 2 +- .../web/request/ObserveWebRequestContext.java | 24 +--------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionJsonHelper.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionJsonHelper.java index 0e22499..ca01d38 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionJsonHelper.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionJsonHelper.java @@ -40,7 +40,7 @@ import java.util.Date; /** * Created on 5/24/14. * - * @author Tony Chemit <chemit@codelutin.com> + * @author Tony Chemit - chemit@codelutin.com * @since 2.0 */ public class ObserveWebMotionJsonHelper { diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java index 7fe7457..1875c18 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java @@ -1,26 +1,5 @@ package fr.ird.observe.application.web.request; -/* - * #%L - * Pollen :: Rest Api - * %% - * Copyright (C) 2009 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - import com.google.common.base.Optional; import com.google.common.base.Preconditions; import fr.ird.observe.application.web.ObserveWebApplicationContext; @@ -31,8 +10,7 @@ import org.debux.webmotion.server.call.HttpContext; /** * Created on 4/25/14. * - * @author Tony Chemit <chemit@codelutin.com> - * @since 2.0 + * @author Tony Chemit - chemit@codelutin.com */ public class ObserveWebRequestContext { -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 177d73f35d34e3f3aad8be4f0c685830b4f71ff3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 00:12:33 2015 +0200 Suppression du ObserveServiceContext et remplacement par un object qui permet d'initialiser le service --- .../web/ObserveWebApplicationContext.java | 6 +- .../application/web/ObserveWebMotionFilter.java | 22 ++++++- .../v1/ObserveServiceControllerSupport.java | 6 -- .../web/request/ObserveWebRequestContext.java | 31 +++++++++- .../fr/ird/observe/services/ObserveService.java | 2 - .../services/ObserveServiceApplicationContext.java | 31 ---------- .../observe/services/ObserveServiceContext.java | 38 ------------ .../observe/services/ObserveServiceFactory.java | 2 +- .../services/ObserveServiceFactorySupport.java | 11 ---- .../services/ObserveServiceInitializerContext.java | 69 ++++++++++++++++++++++ .../ObserveDataSourceConfigurationRest.java | 2 +- .../services/ObserveServiceFactoryRest.java | 6 +- .../ObserveDataSourceConfigurationMainFactory.java | 1 - .../services/ObserveServiceMainFactory.java | 6 +- .../services/ObserveServiceContextTopia.java | 62 ++++++++++--------- .../services/ObserveServiceFactoryTopia.java | 21 +++++-- .../ird/observe/services/ObserveServiceTopia.java | 8 +-- .../services/ApplicationContextResource.java | 15 ++--- .../services/ObserveServiceContextTopiaTaiste.java | 1 + 19 files changed, 194 insertions(+), 146 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 48d38c8..569520d 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 @@ -16,8 +16,8 @@ import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationCont import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; +import fr.ird.observe.services.ObserveServiceInitializerContext; import fr.ird.observe.services.ObserveServiceMainFactory; -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; import org.debux.webmotion.server.call.HttpContext; @@ -120,9 +120,9 @@ public class ObserveWebApplicationContext implements Closeable { return users; } - public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { ObserveServiceFactory mainServiceFactory = serviceApplicationContext.getMainServiceFactory(); - return mainServiceFactory.newService(serviceApplicationContext, dataSourceConfiguration, serviceType); + return mainServiceFactory.newService(serviceApplicationContext, observeServiceInitializerContext, serviceType); } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java index fd319a3..8678455 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java @@ -10,11 +10,14 @@ import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationCont import fr.ird.observe.application.web.security.UnknownObserveWebUserException; import fr.ird.observe.application.web.security.UnknownObserveWebUserForDatabaseException; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.constants.ReferentialLocale; import org.apache.commons.lang3.StringUtils; import org.debux.webmotion.server.WebMotionFilter; import org.debux.webmotion.server.call.HttpContext; +import org.nuiton.converter.ConverterUtil; import javax.servlet.http.HttpServletRequest; +import java.util.Locale; /** * @author Tony Chemit - chemit@codelutin.com @@ -29,7 +32,7 @@ public class ObserveWebMotionFilter extends WebMotionFilter { ObserveWebRequestSecurityContext securityContext = createSecurityContext(applicationContext, request); - ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, securityContext); + ObserveWebRequestContext requestContext = createObserveWebRequestContext(applicationContext, securityContext, request); ObserveWebRequestContext.setRequestContext(context, requestContext); @@ -37,6 +40,23 @@ public class ObserveWebMotionFilter extends WebMotionFilter { } + protected ObserveWebRequestContext createObserveWebRequestContext(ObserveWebApplicationContext applicationContext, ObserveWebRequestSecurityContext securityContext, HttpServletRequest request) { + + Locale applicationLocale = null; + String applicationLocaleStr = getRequestParameterValueOrNull(request, "applicationLocale"); + if (applicationLocaleStr != null) { + applicationLocale = ConverterUtil.convert(Locale.class, applicationLocaleStr); + } + + ReferentialLocale referentialLocale = null; + String referentialLocaleStr = getRequestParameterValueOrNull(request, "referentialLocale"); + if (referentialLocaleStr != null) { + Locale referentialLoca = ConverterUtil.convert(Locale.class, referentialLocaleStr); + referentialLocale = ReferentialLocale.valueOf(referentialLoca); + } + return new ObserveWebRequestContext(applicationContext, securityContext, applicationLocale, referentialLocale); + } + protected ObserveWebRequestSecurityContext createSecurityContext(ObserveWebApplicationContext applicationContext, HttpServletRequest request) throws InvalidAuthenticationTokenException, UnknownObserveWebUserForDatabaseException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserException { ObserveWebRequestSecurityContext securityContext = null; diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java index 68d3fdf..786c8a2 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/controller/v1/ObserveServiceControllerSupport.java @@ -2,7 +2,6 @@ package fr.ird.observe.application.web.controller.v1; import fr.ird.observe.application.web.controller.ObserveWebMotionController; import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.ObserveServiceContext; import org.debux.webmotion.server.WebMotionContextable; /** @@ -26,9 +25,4 @@ public abstract class ObserveServiceControllerSupport<S extends ObserveService> service = newService(serviceType); } - @Override - public void setServiceContext(ObserveServiceContext serviceContext) { - // Non utilisé ici - } - } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java index 1875c18..f72a5dd 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java @@ -4,9 +4,13 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import fr.ird.observe.application.web.ObserveWebApplicationContext; import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.ObserveServiceInitializerContext; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.constants.ReferentialLocale; import org.debux.webmotion.server.call.HttpContext; +import java.util.Locale; + /** * Created on 4/25/14. * @@ -30,23 +34,44 @@ public class ObserveWebRequestContext { protected final ObserveWebApplicationContext applicationContext; + protected final Locale applicationLocale; + + protected final ReferentialLocale referentialLocale; + protected final Optional<ObserveWebRequestSecurityContext> optionalSecurityContext; public ObserveWebRequestContext(ObserveWebApplicationContext applicationContext, - ObserveWebRequestSecurityContext optionalSecurityContext) { + ObserveWebRequestSecurityContext optionalSecurityContext, + Locale applicationLocale, + ReferentialLocale referentialLocale) { this.applicationContext = applicationContext; + this.applicationLocale = applicationLocale; + this.referentialLocale = referentialLocale; this.optionalSecurityContext = Optional.fromNullable(optionalSecurityContext); } + public Locale getApplicationLocale() { + return applicationLocale; + } + + public ReferentialLocale getReferentialLocale() { + return referentialLocale; + } + public ObserveWebApplicationContext getApplicationContext() { return applicationContext; } public <S extends ObserveService> S newService(Class<S> serviceType) { + checkSecurityContextIsPresent(); + ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); + observeServiceInitializerContext.setApplicationLocale(applicationLocale); + observeServiceInitializerContext.setReferentialLocale(referentialLocale); + observeServiceInitializerContext.setDataSourceConfiguration(getSecurityContext().getDataSourceConfiguration()); + - checkIsAuthenticated(); - S service = applicationContext.newService(getSecurityContext().getDataSourceConfiguration(), serviceType); + S service = applicationContext.newService(observeServiceInitializerContext, serviceType); return service; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java index e8a8316..13ab64c 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveService.java @@ -7,6 +7,4 @@ package fr.ird.observe.services; */ public interface ObserveService { - void setServiceContext(ObserveServiceContext serviceContext); - } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java index 791dbc4..ea1b1bf 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java @@ -1,7 +1,5 @@ package fr.ird.observe.services; -import fr.ird.observe.services.dto.constants.ReferentialLocale; - import java.io.Closeable; import java.io.File; import java.io.IOException; @@ -10,7 +8,6 @@ import java.nio.file.Path; import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; -import java.util.Locale; import java.util.Set; /** @@ -21,18 +18,6 @@ import java.util.Set; public class ObserveServiceApplicationContext implements Closeable { /** - * FIXME peut-être pas le bon endroit, car la locale est en scope request. - * - * La locale de l'application. - */ - protected Locale applicationLocale; - - /** - * La locale du référentiel. - */ - protected ReferentialLocale referentialLocale; - - /** * L'usine de services principale (celle au dessus de toutes les usines d'implantation). */ protected ObserveServiceFactory mainServiceFactory; @@ -42,22 +27,6 @@ public class ObserveServiceApplicationContext implements Closeable { */ protected Path temporaryDirectoryRoot; - public Locale getApplicationLocale() { - return applicationLocale; - } - - public void setApplicationLocale(Locale applicationLocale) { - this.applicationLocale = applicationLocale; - } - - public ReferentialLocale getReferentialLocale() { - return referentialLocale; - } - - public void setReferentialLocale(ReferentialLocale referentialLocale) { - this.referentialLocale = referentialLocale; - } - public ObserveServiceFactory getMainServiceFactory() { return mainServiceFactory; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java deleted file mode 100644 index f811dd6..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceContext.java +++ /dev/null @@ -1,38 +0,0 @@ -package fr.ird.observe.services; - -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.dto.constants.ReferentialLocale; - -import java.io.File; -import java.io.IOException; -import java.util.Date; -import java.util.Locale; - -/** - * Created on 16/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public interface ObserveServiceContext { - - ReferentialLocale getReferentialLocale(); - - Locale getApplicationLocale(); - - Date now(); - - /** - * Pour créer un service à partir de la data source courante. - */ - <S extends ObserveService> S newService(Class<S> serviceType); - - /** - * Pour créer un service à partir de la data source donnée. - */ - <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); - - /** - * Pour créer un répertoire temporaire dont le nom commence par le préfixe donné. - */ - File createTemporaryDirectory(String prefix) throws IOException; -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java index b5ab0e5..b149135 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java @@ -13,7 +13,7 @@ public interface ObserveServiceFactory extends Closeable { <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); - <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); + <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType); @Override void close(); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java index 846ac79..8e5577a 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java @@ -21,16 +21,6 @@ public abstract class ObserveServiceFactorySupport implements ObserveServiceFact } } - protected <S extends ObserveService> S newServiceInstance(Class<S> serviceTypeImpl, ObserveServiceContext serviceContext) { - try { - S service = serviceTypeImpl.newInstance(); - service.setServiceContext(serviceContext); - return service; - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException("Could not create service", e); - } - } - protected static LoadingCache<Class<?>, Class<?>> newServiceImplementationTypesCache(final String suffix) { return CacheBuilder.newBuilder().build(new CacheLoader<Class<?>, Class<?>>() { @@ -46,7 +36,6 @@ public abstract class ObserveServiceFactorySupport implements ObserveServiceFact throw new IllegalStateException("Could not get class: " + fqn, e); } - } }); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializerContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializerContext.java new file mode 100644 index 0000000..fbb0389 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializerContext.java @@ -0,0 +1,69 @@ +package fr.ird.observe.services; + +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.constants.ReferentialLocale; + +import java.nio.file.Path; +import java.util.Locale; + +/** + * Objet contentant les infotmations utiles pour créer un nouveau service. + * + * Created on 31/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveServiceInitializerContext { + + /** + * La locale à utiliser pour faire des traductions. + */ + protected Locale applicationLocale; + + /** + * La locale à utiliser pour la source de données. + */ + protected ReferentialLocale referentialLocale; + + /** + * La configuration de la source de données. + */ + protected ObserveDataSourceConfiguration dataSourceConfiguration; + + /** + * Le répertoire où créer les répertoires temporaires. + */ + protected Path temporaryDirectoryRoot; + + public Locale getApplicationLocale() { + return applicationLocale; + } + + public void setApplicationLocale(Locale applicationLocale) { + this.applicationLocale = applicationLocale; + } + + public ReferentialLocale getReferentialLocale() { + return referentialLocale; + } + + public void setReferentialLocale(ReferentialLocale referentialLocale) { + this.referentialLocale = referentialLocale; + } + + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; + } + + public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { + this.dataSourceConfiguration = dataSourceConfiguration; + } + + public Path getTemporaryDirectoryRoot() { + return temporaryDirectoryRoot; + } + + public void setTemporaryDirectoryRoot(Path temporaryDirectoryRoot) { + this.temporaryDirectoryRoot = temporaryDirectoryRoot; + } +} diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java index 1f637fc..c9625bd 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java @@ -22,7 +22,7 @@ public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConf protected URL serverUrl; /** - * Le token d'authentification. + * Le jeton d'authentification. */ protected String authenticationToken; diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index 292c0c9..931cf0e 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -44,9 +44,11 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { } @Override - public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); + Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationRest, "dataSourceConfiguration must be of type ObserveRestClientDataSourceConfiguration"); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); @@ -90,7 +92,7 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { this.serviceClass = serviceClass; this.authenticationToken = authenticationToken; this.gsonSupplier = gsonSupplier; - serviceUrl = serverUrl + "/" + serviceClass.getSimpleName(); + this.serviceUrl = serverUrl + "/" + serviceClass.getSimpleName(); } @Override diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java index c5fd02f..6e2b6a8 100644 --- a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveDataSourceConfigurationMainFactory.java @@ -18,7 +18,6 @@ public class ObserveDataSourceConfigurationMainFactory { result.setPassword(password); result.setUseSsl(useSsl); return result; - } } diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java index cf860e6..c62d659 100644 --- a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java @@ -35,9 +35,11 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { } @Override - public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); + Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); @@ -48,7 +50,7 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { log.debug("Using factory: " + factory); } - S service = factory.newService(applicationContext, dataSourceConfiguration, serviceType); + S service = factory.newService(applicationContext, observeServiceInitializerContext, serviceType); if (log.isInfoEnabled()) { log.info("New service created: " + service); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java index cee443b..7310042 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java @@ -7,6 +7,7 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia import fr.ird.observe.services.dto.constants.ReferentialLocale; import java.io.File; +import java.nio.file.Path; import java.util.Date; import java.util.Locale; @@ -15,54 +16,52 @@ import java.util.Locale; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveServiceContextTopia implements ObserveServiceContext { +public class ObserveServiceContextTopia { - protected ObserveServiceApplicationContext applicationContext; + protected ObserveServiceInitializerContext observeServiceInitializerContext; protected ObserveServiceFactory serviceFactory; - protected ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration; - protected ObserveTopiaPersistenceContext topiaPersistenceContext; protected ObserveTopiaApplicationContext topiaApplicationContext; + protected ObserveServiceApplicationContext applicationContext; + public ObserveTopiaApplicationContext getTopiaApplicationContext() { return topiaApplicationContext; } - @Override + public Locale getApplicationLocale() { + return observeServiceInitializerContext.getApplicationLocale(); + } + public ReferentialLocale getReferentialLocale() { - return applicationContext.getReferentialLocale(); + return observeServiceInitializerContext.getReferentialLocale(); } - @Override - public Locale getApplicationLocale() { - return applicationContext.getApplicationLocale(); + public Path getTemporaryDirectoryRoot() { + return observeServiceInitializerContext.getTemporaryDirectoryRoot(); } - @Override public Date now() { return new Date(); } - @Override public <S extends ObserveService> S newService(Class<S> serviceType) { - return serviceFactory.newService(applicationContext, dataSourceConfiguration, serviceType); + return serviceFactory.newService(applicationContext, observeServiceInitializerContext, serviceType); } - @Override public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { - return applicationContext.getMainServiceFactory().newService(applicationContext, dataSourceConfiguration, serviceType); - } - - @Override - public File createTemporaryDirectory(String prefix) { - return applicationContext.createTemporaryDirectory(prefix); + ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); + observeServiceInitializerContext.setApplicationLocale(this.observeServiceInitializerContext.getApplicationLocale()); + observeServiceInitializerContext.setReferentialLocale(this.observeServiceInitializerContext.getReferentialLocale()); + observeServiceInitializerContext.setDataSourceConfiguration(dataSourceConfiguration); + return applicationContext.getMainServiceFactory().newService(applicationContext, observeServiceInitializerContext, serviceType); } public ObserveDataSourceConfigurationTopiaSupport getDataSourceConfiguration() { - return dataSourceConfiguration; + return (ObserveDataSourceConfigurationTopiaSupport) observeServiceInitializerContext.getDataSourceConfiguration(); } public ObserveTopiaPersistenceContext getTopiaPersistenceContext() { @@ -77,14 +76,6 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { this.topiaApplicationContext = topiaApplicationContext; } - public void setApplicationContext(ObserveServiceApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - - public void setDataSourceConfiguration(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { - this.dataSourceConfiguration = dataSourceConfiguration; - } - public void setServiceFactory(ObserveServiceFactory serviceFactory) { this.serviceFactory = serviceFactory; } @@ -94,4 +85,19 @@ public class ObserveServiceContextTopia implements ObserveServiceContext { topiaPersistenceContext = null; } + public void setApplicationContext(ObserveServiceApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + public ObserveServiceApplicationContext getApplicationContext() { + return applicationContext; + } + + public File createTemporaryDirectory(String prefix) { + return applicationContext.createTemporaryDirectory(prefix); + } + + public void setObserveServiceInitializerContext(ObserveServiceInitializerContext observeServiceInitializerContext) { + this.observeServiceInitializerContext = observeServiceInitializerContext; + } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java index c25033f..b9345bc 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java @@ -40,17 +40,18 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } @Override - public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); - Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); + Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationTopiaSupport.class.getName()); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); Class<S> serviceTypeImpl = getServiceClassType(serviceTypeCache, serviceType); Preconditions.checkNotNull(serviceTypeImpl, "serviceTypeImpl not found for : " + serviceType.getName()); - ObserveServiceContextTopia serviceContext = createServiceContext(applicationContext, (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); + ObserveServiceContextTopia serviceContext = createServiceContext(applicationContext, observeServiceInitializerContext); S service = newServiceInstance(serviceTypeImpl, serviceContext); service = newServiceTransactionalProxy(serviceType, service, serviceContext); @@ -58,18 +59,28 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } - protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext) { ObserveServiceContextTopia serviceContext = new ObserveServiceContextTopia(); serviceContext.setApplicationContext(applicationContext); - serviceContext.setDataSourceConfiguration(dataSourceConfiguration); + serviceContext.setObserveServiceInitializerContext(observeServiceInitializerContext); serviceContext.setServiceFactory(this); return serviceContext; } + protected <S extends ObserveService> S newServiceInstance(Class<S> serviceTypeImpl, ObserveServiceContextTopia serviceContext) { + try { + S service = serviceTypeImpl.newInstance(); + ((ObserveServiceTopia) service).setServiceContext(serviceContext); + return service; + } catch (InstantiationException | IllegalAccessException e) { + throw new IllegalStateException("Could not create service", e); + } + } + protected <S extends ObserveService> S newServiceTransactionalProxy(Class<S> serviceType, S service, ObserveServiceContextTopia serviceContext) { ObserveServiceInvocationHandler invocationHandler = new ObserveServiceInvocationHandler(serviceContext, service); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java index dfc644c..38f04e6 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java @@ -79,11 +79,10 @@ public class ObserveServiceTopia implements ObserveService { init(); } - @Override - public void setServiceContext(ObserveServiceContext serviceContext) { + public void setServiceContext(ObserveServiceContextTopia serviceContext) { Preconditions.checkNotNull(serviceContext, "serviceContext can't be null."); Preconditions.checkArgument(serviceContext instanceof ObserveServiceContextTopia, "serviceContext must be of type " + ObserveServiceContextTopia.class.getName()); - this.serviceContext = (ObserveServiceContextTopia) serviceContext; + this.serviceContext = serviceContext; } public static <D extends IdDto, E extends TopiaEntity> Class<E> getEntityType(Class<D> dtoType) { @@ -193,7 +192,7 @@ public class ObserveServiceTopia implements ObserveService { Class<D> dtoType, Class<E> entityType, E entity, - Class<? extends IdDto> ... includeReferenceDtoTypes) { + Class<? extends IdDto>... includeReferenceDtoTypes) { try (EntityToDtoBuilder<E, D> dtoBuilder = EntityToDtoBuilder.create(entityType, dtoType)) { @@ -301,6 +300,7 @@ public class ObserveServiceTopia implements ObserveService { return temporaryDataSourceConfiguration; } + protected ObserveDataSourceConfigurationTopiaH2 createTemporaryDatabase(String prefix) { ObserveDataSourceConfigurationTopiaH2 temporaryDataSourceConfiguration = new ObserveDataSourceConfigurationTopiaH2(); diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java index 9ed1d71..f854184 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java @@ -4,7 +4,6 @@ import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.test.TestHelper; import org.apache.commons.logging.Log; @@ -43,11 +42,10 @@ public class ApplicationContextResource implements TestRule { this.serviceFactory = new ObserveServiceFactoryTopia() { @Override - protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { + protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext) { ObserveServiceContextTopiaTaiste serviceContext = new ObserveServiceContextTopiaTaiste(); serviceContext.setApplicationContext(applicationContext); - - serviceContext.setDataSourceConfiguration(dataSourceConfiguration); + serviceContext.setObserveServiceInitializerContext(observeServiceInitializerContext); serviceContext.setServiceFactory(this); return serviceContext; @@ -60,7 +58,12 @@ public class ApplicationContextResource implements TestRule { } public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { - return serviceFactory.newService(serviceApplicationContext, dataSourceConfiguration, serviceType); + ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); + observeServiceInitializerContext.setDataSourceConfiguration(dataSourceConfiguration); + observeServiceInitializerContext.setApplicationLocale(Locale.FRANCE); + observeServiceInitializerContext.setReferentialLocale(ReferentialLocale.FR); + observeServiceInitializerContext.setTemporaryDirectoryRoot(serviceApplicationContext.temporaryDirectoryRoot); + return serviceFactory.newService(serviceApplicationContext, observeServiceInitializerContext, serviceType); } public void closeServiceFactory() { @@ -98,8 +101,6 @@ public class ApplicationContextResource implements TestRule { ObserveServiceTopia.init(); - serviceApplicationContext.setApplicationLocale(Locale.FRANCE); - serviceApplicationContext.setReferentialLocale(ReferentialLocale.FR); serviceApplicationContext.setMainServiceFactory(serviceFactory); } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java index 7d49eb5..14b4032 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java @@ -15,4 +15,5 @@ public class ObserveServiceContextTopiaTaiste extends ObserveServiceContextTopia public Date now() { return DATE; } + } -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 6d2009206aaeb9dd3981fe52148ad54327055868 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 00:35:22 2015 +0200 Préparation du client rest --- .../application/web/ObserveWebMotionFilter.java | 39 ++++++++++++-------- .../web/request/ObserveWebRequestContext.java | 10 +---- .../services/ObserveServiceFactoryRest.java | 43 +++++++++++++++------- 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java index 8678455..c54892e 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionFilter.java @@ -32,7 +32,9 @@ public class ObserveWebMotionFilter extends WebMotionFilter { ObserveWebRequestSecurityContext securityContext = createSecurityContext(applicationContext, request); - ObserveWebRequestContext requestContext = createObserveWebRequestContext(applicationContext, securityContext, request); + Locale applicationLocale = getApplicationLocale(request); + ReferentialLocale referentialLocale = getReferentialLocale(request); + ObserveWebRequestContext requestContext = new ObserveWebRequestContext(applicationContext, securityContext, applicationLocale, referentialLocale); ObserveWebRequestContext.setRequestContext(context, requestContext); @@ -40,30 +42,29 @@ public class ObserveWebMotionFilter extends WebMotionFilter { } - protected ObserveWebRequestContext createObserveWebRequestContext(ObserveWebApplicationContext applicationContext, ObserveWebRequestSecurityContext securityContext, HttpServletRequest request) { - - Locale applicationLocale = null; - String applicationLocaleStr = getRequestParameterValueOrNull(request, "applicationLocale"); - if (applicationLocaleStr != null) { - applicationLocale = ConverterUtil.convert(Locale.class, applicationLocaleStr); - } - + protected ReferentialLocale getReferentialLocale(HttpServletRequest request) { ReferentialLocale referentialLocale = null; - String referentialLocaleStr = getRequestParameterValueOrNull(request, "referentialLocale"); + String referentialLocaleStr = getRequestHeaderOrParameterValueOrNull(request, "referentialLocale"); if (referentialLocaleStr != null) { Locale referentialLoca = ConverterUtil.convert(Locale.class, referentialLocaleStr); referentialLocale = ReferentialLocale.valueOf(referentialLoca); } - return new ObserveWebRequestContext(applicationContext, securityContext, applicationLocale, referentialLocale); + return referentialLocale; + } + + protected Locale getApplicationLocale(HttpServletRequest request) { + Locale applicationLocale = null; + String applicationLocaleStr = getRequestHeaderOrParameterValueOrNull(request, "applicationLocale"); + if (applicationLocaleStr != null) { + applicationLocale = ConverterUtil.convert(Locale.class, applicationLocaleStr); + } + return applicationLocale; } protected ObserveWebRequestSecurityContext createSecurityContext(ObserveWebApplicationContext applicationContext, HttpServletRequest request) throws InvalidAuthenticationTokenException, UnknownObserveWebUserForDatabaseException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserException { ObserveWebRequestSecurityContext securityContext = null; - String authenticationToken = getRequestParameterValueOrNull(request, "authenticationToken"); - if (authenticationToken == null) { - authenticationToken = request.getHeader("authenticationToken"); - } + String authenticationToken = getRequestHeaderOrParameterValueOrNull(request, "authenticationToken"); if (StringUtils.isNotBlank(authenticationToken)) { // Recherche de la configuration à la source de donnée @@ -94,6 +95,14 @@ public class ObserveWebMotionFilter extends WebMotionFilter { } + protected String getRequestHeaderOrParameterValueOrNull(HttpServletRequest request, String parameterName) { + String result = request.getHeader(parameterName); + if (StringUtils.isBlank(result)) { + result = getRequestParameterValueOrNull(request, parameterName); + } + return result; + } + protected String getRequestParameterValueOrNull(HttpServletRequest request, String parameterName) { String parameterValue = request.getParameter(parameterName); if (StringUtils.isBlank(parameterValue)) { diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java index f72a5dd..ffecad6 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java @@ -50,14 +50,6 @@ public class ObserveWebRequestContext { this.optionalSecurityContext = Optional.fromNullable(optionalSecurityContext); } - public Locale getApplicationLocale() { - return applicationLocale; - } - - public ReferentialLocale getReferentialLocale() { - return referentialLocale; - } - public ObserveWebApplicationContext getApplicationContext() { return applicationContext; } @@ -65,12 +57,12 @@ public class ObserveWebRequestContext { public <S extends ObserveService> S newService(Class<S> serviceType) { checkSecurityContextIsPresent(); + ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); observeServiceInitializerContext.setApplicationLocale(applicationLocale); observeServiceInitializerContext.setReferentialLocale(referentialLocale); observeServiceInitializerContext.setDataSourceConfiguration(getSecurityContext().getDataSourceConfiguration()); - S service = applicationContext.newService(observeServiceInitializerContext, serviceType); return service; diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index 931cf0e..86f8043 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -17,7 +17,6 @@ import org.apache.commons.logging.LogFactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; -import java.net.URL; import java.util.Collection; /** @@ -32,6 +31,10 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { public static final String AUTHENTICATION_TOKEN = "authenticationToken"; + public static final String APPLICATION_LOCALE = "applicationLocale"; + + public static final String REFERENTIAL_LOCALE = "referentialLocale"; + protected final CachingParanamer paranamer = new CachingParanamer(); protected final Supplier<Gson> gsonSupplier = new ObserveDtoGsonSupplier(); @@ -48,14 +51,14 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + Preconditions.checkNotNull(observeServiceInitializerContext.getApplicationLocale(), "applicationLocale can't be null."); + Preconditions.checkNotNull(observeServiceInitializerContext.getReferentialLocale(), "referentialLocale can't be null."); ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationRest, "dataSourceConfiguration must be of type ObserveRestClientDataSourceConfiguration"); - Preconditions.checkNotNull(serviceType, "serviceType can't be null."); - ObserveDataSourceConfigurationRest dataSourceConfigurationRest = (ObserveDataSourceConfigurationRest) dataSourceConfiguration; - - S service = newRemoteProxyServiceInstance(serviceType, dataSourceConfigurationRest); + S service = newRemoteProxyServiceInstance(serviceType, observeServiceInitializerContext); return service; } @@ -65,14 +68,12 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { //TODO Voir ce qu'il faut nettoyer, normalement pas grand chose } - protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveDataSourceConfigurationRest dataSourceConfigurationRest) { - - String authenticationToken = dataSourceConfigurationRest.getAuthenticationToken(); - URL serverUrl = dataSourceConfigurationRest.getServerUrl(); + protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveServiceInitializerContext observeServiceInitializerContext) { - RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, serverUrl, authenticationToken, gsonSupplier); + RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, observeServiceInitializerContext, gsonSupplier); S result = Reflection.newProxy(serviceType, handler); return result; + } protected static class RemoteInvocationHandler<E extends ObserveService> implements InvocationHandler { @@ -87,12 +88,22 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { protected final String serviceUrl; - public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, URL serverUrl, String authenticationToken, Supplier<Gson> gsonSupplier) { + protected final String applicationLocale; + + protected final String referentialLocale; + + public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializerContext observeServiceInitializerContext, Supplier<Gson> gsonSupplier) { this.paranamer = paranamer; this.serviceClass = serviceClass; - this.authenticationToken = authenticationToken; + + ObserveDataSourceConfigurationRest dataSourceConfiguration = (ObserveDataSourceConfigurationRest) observeServiceInitializerContext.getDataSourceConfiguration(); + this.authenticationToken = dataSourceConfiguration.getAuthenticationToken(); + this.serviceUrl = dataSourceConfiguration.getServerUrl() + "/" + serviceClass.getSimpleName(); this.gsonSupplier = gsonSupplier; - this.serviceUrl = serverUrl + "/" + serviceClass.getSimpleName(); + this.applicationLocale = observeServiceInitializerContext.getApplicationLocale().toString(); + this.referentialLocale = observeServiceInitializerContext.getReferentialLocale().toString(); + + } @Override @@ -137,6 +148,12 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { if (!Strings.isNullOrEmpty(authenticationToken)) { requestBuilder.addHeader(AUTHENTICATION_TOKEN, authenticationToken); } + if (!Strings.isNullOrEmpty(applicationLocale)) { + requestBuilder.addHeader(APPLICATION_LOCALE, applicationLocale); + } + if (!Strings.isNullOrEmpty(referentialLocale)) { + requestBuilder.addHeader(REFERENTIAL_LOCALE, referentialLocale); + } Object result; try { -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 364eb149a3aa76fbc4648f9c2beacb5136b3f2ad Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 11:15:10 2015 +0200 Suppression du context applicatif au niveau des service, on utilise maintenant uniquement l'objet d'initialisation des services. --- .../web/ObserveWebApplicationContext.java | 18 ++-- .../web/request/ObserveWebRequestContext.java | 15 ++-- .../services/ObserveServiceApplicationContext.java | 61 ------------- .../observe/services/ObserveServiceFactory.java | 6 +- .../services/ObserveServiceFactorySupport.java | 12 +++ .../services/ObserveServiceInitializer.java | 99 ++++++++++++++++++++++ .../services/ObserveServiceInitializerContext.java | 69 --------------- .../services/ObserveServiceFactoryRest.java | 26 +++--- .../services/ObserveServiceMainFactory.java | 20 +++-- .../services/ObserveServiceContextTopia.java | 65 +++++++------- .../services/ObserveServiceFactoryTopia.java | 17 ++-- .../ird/observe/services/ObserveServiceTopia.java | 1 - .../services/ApplicationContextResource.java | 31 +++---- .../services/ObserveServiceContextTopiaTaiste.java | 4 + 14 files changed, 216 insertions(+), 228 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 569520d..2b364f1 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 @@ -14,9 +14,8 @@ import fr.ird.observe.application.web.configuration.user.ObserveWebUsers; import fr.ird.observe.application.web.configuration.user.ObserveWebUsersHelper; import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.ObserveServiceApplicationContext; import fr.ird.observe.services.ObserveServiceFactory; -import fr.ird.observe.services.ObserveServiceInitializerContext; +import fr.ird.observe.services.ObserveServiceInitializer; import fr.ird.observe.services.ObserveServiceMainFactory; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; import org.debux.webmotion.server.call.HttpContext; @@ -39,7 +38,7 @@ public class ObserveWebApplicationContext implements Closeable { protected ObserveWebApplicationConfiguration applicationConfiguration; - protected ObserveServiceApplicationContext serviceApplicationContext; + protected ObserveServiceFactory mainServiceFactory; protected ObserveWebDatabases databases; @@ -78,10 +77,8 @@ public class ObserveWebApplicationContext implements Closeable { securityApplicationContext = new ObserveWebSecurityApplicationContext(); securityApplicationContext.init(databases, users); - // init service application context - serviceApplicationContext = new ObserveServiceApplicationContext(); - serviceApplicationContext.setTemporaryDirectoryRoot(applicationConfiguration.getTemporaryDirectory().toPath()); - serviceApplicationContext.setMainServiceFactory(ObserveServiceMainFactory.get()); + // init service factory + mainServiceFactory = ObserveServiceMainFactory.get(); // init gson supplier boolean devMode = applicationConfiguration.isDevMode(); @@ -96,7 +93,7 @@ public class ObserveWebApplicationContext implements Closeable { securityApplicationContext.close(); // Fermer l'usine de services - serviceApplicationContext.close(); + mainServiceFactory.close(); } @@ -120,9 +117,8 @@ public class ObserveWebApplicationContext implements Closeable { return users; } - public <S extends ObserveService> S newService(ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { - ObserveServiceFactory mainServiceFactory = serviceApplicationContext.getMainServiceFactory(); - return mainServiceFactory.newService(serviceApplicationContext, observeServiceInitializerContext, serviceType); + public <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType) { + return mainServiceFactory.newService(observeServiceInitializer, serviceType); } } diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java index ffecad6..4dc0c8e 100644 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/request/ObserveWebRequestContext.java @@ -4,7 +4,7 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import fr.ird.observe.application.web.ObserveWebApplicationContext; import fr.ird.observe.services.ObserveService; -import fr.ird.observe.services.ObserveServiceInitializerContext; +import fr.ird.observe.services.ObserveServiceInitializer; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.dto.constants.ReferentialLocale; import org.debux.webmotion.server.call.HttpContext; @@ -58,12 +58,13 @@ public class ObserveWebRequestContext { checkSecurityContextIsPresent(); - ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); - observeServiceInitializerContext.setApplicationLocale(applicationLocale); - observeServiceInitializerContext.setReferentialLocale(referentialLocale); - observeServiceInitializerContext.setDataSourceConfiguration(getSecurityContext().getDataSourceConfiguration()); - - S service = applicationContext.newService(observeServiceInitializerContext, serviceType); + ObserveServiceInitializer observeServiceInitializer = ObserveServiceInitializer.create( + applicationLocale, + referentialLocale, + applicationContext.getApplicationConfiguration().getTemporaryDirectory(), + getSecurityContext().getDataSourceConfiguration() + ); + S service = applicationContext.newService(observeServiceInitializer, serviceType); return service; } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java deleted file mode 100644 index ea1b1bf..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceApplicationContext.java +++ /dev/null @@ -1,61 +0,0 @@ -package fr.ird.observe.services; - -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.attribute.FileAttribute; -import java.nio.file.attribute.PosixFilePermission; -import java.nio.file.attribute.PosixFilePermissions; -import java.util.Set; - -/** - * Created on 19/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ObserveServiceApplicationContext implements Closeable { - - /** - * L'usine de services principale (celle au dessus de toutes les usines d'implantation). - */ - protected ObserveServiceFactory mainServiceFactory; - - /** - * Le répertoire où créer les répertoires temporaires. - */ - protected Path temporaryDirectoryRoot; - - public ObserveServiceFactory getMainServiceFactory() { - return mainServiceFactory; - } - - public void setMainServiceFactory(ObserveServiceFactory mainServiceFactory) { - this.mainServiceFactory = mainServiceFactory; - } - - public void setTemporaryDirectoryRoot(Path temporaryDirectoryRoot) { - this.temporaryDirectoryRoot = temporaryDirectoryRoot; - } - - public File createTemporaryDirectory(String prefix) { - Set<PosixFilePermission> posixFilePermissions = PosixFilePermissions.fromString("rwxr-x---"); - FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(posixFilePermissions); - try { - return Files.createTempDirectory(temporaryDirectoryRoot, prefix, fileAttribute).toFile(); - } catch (IOException e) { - //TODO Avoir une exception plus concrete - throw new RuntimeException("Could not create temporary directory with preifx: " + prefix, e); - } - } - - @Override - public void close() { - - if (mainServiceFactory != null) { - mainServiceFactory.close(); - } - - } -} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java index b149135..5d3ee70 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactory.java @@ -11,9 +11,13 @@ import java.io.Closeable; */ public interface ObserveServiceFactory extends Closeable { + ObserveServiceFactory getMainServiceFactory(); + + void setMainServiceFactory(ObserveServiceFactory mainServiceFactory); + <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); - <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType); + <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType); @Override void close(); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java index 8e5577a..9ea7b0a 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceFactorySupport.java @@ -13,6 +13,18 @@ import java.util.concurrent.ExecutionException; */ public abstract class ObserveServiceFactorySupport implements ObserveServiceFactory { + protected ObserveServiceFactory mainServiceFactory; + + @Override + public ObserveServiceFactory getMainServiceFactory() { + return mainServiceFactory; + } + + @Override + public void setMainServiceFactory(ObserveServiceFactory mainServiceFactory) { + this.mainServiceFactory = mainServiceFactory; + } + protected <S extends ObserveService> Class<S> getServiceClassType(LoadingCache<Class<?>, Class<?>> serviceTypeCache, Class<S> serviceType) { try { return (Class<S>) serviceTypeCache.get(serviceType); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java new file mode 100644 index 0000000..c201fc6 --- /dev/null +++ b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializer.java @@ -0,0 +1,99 @@ +package fr.ird.observe.services; + +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.dto.constants.ReferentialLocale; + +import java.io.File; +import java.util.Locale; + +/** + * Objet contentant les informations nécessaire pour créer un nouveau service. + * + * Ces informations viennent en général du context applicatif appelant. + * + * Created on 31/08/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveServiceInitializer { + + public static ObserveServiceInitializer create(Locale applicationLocale, + ReferentialLocale referentialLocale, + File temporaryDirectoryRoot, + ObserveDataSourceConfiguration dataSourceConfiguration) { + + ObserveServiceInitializer observeServiceInitializer = new ObserveServiceInitializer(); + observeServiceInitializer.setApplicationLocale(applicationLocale); + observeServiceInitializer.setReferentialLocale(referentialLocale); + observeServiceInitializer.setTemporaryDirectoryRoot(temporaryDirectoryRoot); + observeServiceInitializer.setDataSourceConfiguration(dataSourceConfiguration); + return observeServiceInitializer; + + } + + public static ObserveServiceInitializer create(ObserveServiceInitializer otherObserveServiceInitializer) { + + ObserveServiceInitializer observeServiceInitializer = new ObserveServiceInitializer(); + observeServiceInitializer.setApplicationLocale(otherObserveServiceInitializer.getApplicationLocale()); + observeServiceInitializer.setReferentialLocale(otherObserveServiceInitializer.getReferentialLocale()); + observeServiceInitializer.setTemporaryDirectoryRoot(otherObserveServiceInitializer.getTemporaryDirectoryRoot()); + observeServiceInitializer.setDataSourceConfiguration(otherObserveServiceInitializer.getDataSourceConfiguration()); + return observeServiceInitializer; + + } + + /** + * La locale à utiliser pour faire des traductions. + */ + protected Locale applicationLocale; + + /** + * La locale à utiliser pour la source de données. + */ + protected ReferentialLocale referentialLocale; + + /** + * La configuration de la source de données. + */ + protected ObserveDataSourceConfiguration dataSourceConfiguration; + + /** + * Le répertoire où créer les répertoires temporaires. + */ + protected File temporaryDirectoryRoot; + + public Locale getApplicationLocale() { + return applicationLocale; + } + + public ReferentialLocale getReferentialLocale() { + return referentialLocale; + } + + public ObserveDataSourceConfiguration getDataSourceConfiguration() { + return dataSourceConfiguration; + } + + public File getTemporaryDirectoryRoot() { + return temporaryDirectoryRoot; + } + + protected void setApplicationLocale(Locale applicationLocale) { + this.applicationLocale = applicationLocale; + } + + protected void setReferentialLocale(ReferentialLocale referentialLocale) { + this.referentialLocale = referentialLocale; + } + + public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { + this.dataSourceConfiguration = dataSourceConfiguration; + } + + protected void setTemporaryDirectoryRoot(File temporaryDirectoryRoot) { + this.temporaryDirectoryRoot = temporaryDirectoryRoot; + } + + protected ObserveServiceInitializer() { + } +} diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializerContext.java b/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializerContext.java deleted file mode 100644 index fbb0389..0000000 --- a/observe-services-api/src/main/java/fr/ird/observe/services/ObserveServiceInitializerContext.java +++ /dev/null @@ -1,69 +0,0 @@ -package fr.ird.observe.services; - -import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.dto.constants.ReferentialLocale; - -import java.nio.file.Path; -import java.util.Locale; - -/** - * Objet contentant les infotmations utiles pour créer un nouveau service. - * - * Created on 31/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ObserveServiceInitializerContext { - - /** - * La locale à utiliser pour faire des traductions. - */ - protected Locale applicationLocale; - - /** - * La locale à utiliser pour la source de données. - */ - protected ReferentialLocale referentialLocale; - - /** - * La configuration de la source de données. - */ - protected ObserveDataSourceConfiguration dataSourceConfiguration; - - /** - * Le répertoire où créer les répertoires temporaires. - */ - protected Path temporaryDirectoryRoot; - - public Locale getApplicationLocale() { - return applicationLocale; - } - - public void setApplicationLocale(Locale applicationLocale) { - this.applicationLocale = applicationLocale; - } - - public ReferentialLocale getReferentialLocale() { - return referentialLocale; - } - - public void setReferentialLocale(ReferentialLocale referentialLocale) { - this.referentialLocale = referentialLocale; - } - - public ObserveDataSourceConfiguration getDataSourceConfiguration() { - return dataSourceConfiguration; - } - - public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { - this.dataSourceConfiguration = dataSourceConfiguration; - } - - public Path getTemporaryDirectoryRoot() { - return temporaryDirectoryRoot; - } - - public void setTemporaryDirectoryRoot(Path temporaryDirectoryRoot) { - this.temporaryDirectoryRoot = temporaryDirectoryRoot; - } -} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index 86f8043..e324069 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -47,18 +47,18 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { } @Override - public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType) { - Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); - Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); + Preconditions.checkNotNull(observeServiceInitializer, "observeServiceInitializerContext can't be null."); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); - Preconditions.checkNotNull(observeServiceInitializerContext.getApplicationLocale(), "applicationLocale can't be null."); - Preconditions.checkNotNull(observeServiceInitializerContext.getReferentialLocale(), "referentialLocale can't be null."); - ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); + Preconditions.checkNotNull(observeServiceInitializer.getApplicationLocale(), "applicationLocale can't be null."); + Preconditions.checkNotNull(observeServiceInitializer.getReferentialLocale(), "referentialLocale can't be null."); + Preconditions.checkNotNull(observeServiceInitializer.getTemporaryDirectoryRoot(), "temporaryDirectoryRoot can't be null."); + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializer.getDataSourceConfiguration(); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationRest, "dataSourceConfiguration must be of type ObserveRestClientDataSourceConfiguration"); - S service = newRemoteProxyServiceInstance(serviceType, observeServiceInitializerContext); + S service = newRemoteProxyServiceInstance(serviceType, observeServiceInitializer); return service; } @@ -68,9 +68,9 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { //TODO Voir ce qu'il faut nettoyer, normalement pas grand chose } - protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveServiceInitializerContext observeServiceInitializerContext) { + protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveServiceInitializer observeServiceInitializer) { - RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, observeServiceInitializerContext, gsonSupplier); + RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, observeServiceInitializer, gsonSupplier); S result = Reflection.newProxy(serviceType, handler); return result; @@ -92,16 +92,16 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport { protected final String referentialLocale; - public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializerContext observeServiceInitializerContext, Supplier<Gson> gsonSupplier) { + public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializer observeServiceInitializer, Supplier<Gson> gsonSupplier) { this.paranamer = paranamer; this.serviceClass = serviceClass; - ObserveDataSourceConfigurationRest dataSourceConfiguration = (ObserveDataSourceConfigurationRest) observeServiceInitializerContext.getDataSourceConfiguration(); + ObserveDataSourceConfigurationRest dataSourceConfiguration = (ObserveDataSourceConfigurationRest) observeServiceInitializer.getDataSourceConfiguration(); this.authenticationToken = dataSourceConfiguration.getAuthenticationToken(); this.serviceUrl = dataSourceConfiguration.getServerUrl() + "/" + serviceClass.getSimpleName(); this.gsonSupplier = gsonSupplier; - this.applicationLocale = observeServiceInitializerContext.getApplicationLocale().toString(); - this.referentialLocale = observeServiceInitializerContext.getReferentialLocale().toString(); + this.applicationLocale = observeServiceInitializer.getApplicationLocale().toString(); + this.referentialLocale = observeServiceInitializer.getReferentialLocale().toString(); } diff --git a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java index c62d659..0445dd8 100644 --- a/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java +++ b/observe-services-runner/src/main/java/fr/ird/observe/services/ObserveServiceMainFactory.java @@ -27,6 +27,16 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { } @Override + public ObserveServiceFactory getMainServiceFactory() { + return this; + } + + @Override + public void setMainServiceFactory(ObserveServiceFactory mainServiceFactory) { + // Rien à faire on est déjà sur l'usine principale + } + + @Override public <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { ObserveServiceFactory factory = getFactory(dataSourceConfiguration, serviceType); @@ -35,11 +45,10 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { } @Override - public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType) { - Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); - Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); - ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); + Preconditions.checkNotNull(observeServiceInitializer, "observeServiceInitializerContext can't be null."); + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializer.getDataSourceConfiguration(); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); @@ -50,7 +59,7 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { log.debug("Using factory: " + factory); } - S service = factory.newService(applicationContext, observeServiceInitializerContext, serviceType); + S service = factory.newService(observeServiceInitializer, serviceType); if (log.isInfoEnabled()) { log.info("New service created: " + service); @@ -79,6 +88,7 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { if (log.isInfoEnabled()) { log.info("Found service factory: " + factory); } + factory.setMainServiceFactory(this); builder.add(factory); } delegateFactories = builder.build(); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java index 7310042..7db2ef8 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceContextTopia.java @@ -7,9 +7,14 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia import fr.ird.observe.services.dto.constants.ReferentialLocale; import java.io.File; -import java.nio.file.Path; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.attribute.FileAttribute; +import java.nio.file.attribute.PosixFilePermission; +import java.nio.file.attribute.PosixFilePermissions; import java.util.Date; import java.util.Locale; +import java.util.Set; /** * Created on 16/08/15. @@ -18,30 +23,38 @@ import java.util.Locale; */ public class ObserveServiceContextTopia { - protected ObserveServiceInitializerContext observeServiceInitializerContext; + protected final ObserveServiceInitializer observeServiceInitializer; - protected ObserveServiceFactory serviceFactory; + protected final ObserveServiceFactory mainServiceFactory; + + protected final ObserveServiceFactory serviceFactory; protected ObserveTopiaPersistenceContext topiaPersistenceContext; protected ObserveTopiaApplicationContext topiaApplicationContext; - protected ObserveServiceApplicationContext applicationContext; + public ObserveServiceContextTopia(ObserveServiceInitializer observeServiceInitializer, + ObserveServiceFactory mainServiceFactory, + ObserveServiceFactory serviceFactory) { + this.observeServiceInitializer = observeServiceInitializer; + this.mainServiceFactory = mainServiceFactory; + this.serviceFactory = serviceFactory; + } public ObserveTopiaApplicationContext getTopiaApplicationContext() { return topiaApplicationContext; } public Locale getApplicationLocale() { - return observeServiceInitializerContext.getApplicationLocale(); + return observeServiceInitializer.getApplicationLocale(); } public ReferentialLocale getReferentialLocale() { - return observeServiceInitializerContext.getReferentialLocale(); + return observeServiceInitializer.getReferentialLocale(); } - public Path getTemporaryDirectoryRoot() { - return observeServiceInitializerContext.getTemporaryDirectoryRoot(); + public File getTemporaryDirectoryRoot() { + return observeServiceInitializer.getTemporaryDirectoryRoot(); } public Date now() { @@ -49,19 +62,17 @@ public class ObserveServiceContextTopia { } public <S extends ObserveService> S newService(Class<S> serviceType) { - return serviceFactory.newService(applicationContext, observeServiceInitializerContext, serviceType); + return serviceFactory.newService(observeServiceInitializer, serviceType); } public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { - ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); - observeServiceInitializerContext.setApplicationLocale(this.observeServiceInitializerContext.getApplicationLocale()); - observeServiceInitializerContext.setReferentialLocale(this.observeServiceInitializerContext.getReferentialLocale()); - observeServiceInitializerContext.setDataSourceConfiguration(dataSourceConfiguration); - return applicationContext.getMainServiceFactory().newService(applicationContext, observeServiceInitializerContext, serviceType); + ObserveServiceInitializer newObserveServiceInitializer = ObserveServiceInitializer.create(this.observeServiceInitializer); + newObserveServiceInitializer.setDataSourceConfiguration(dataSourceConfiguration); + return mainServiceFactory.newService(newObserveServiceInitializer, serviceType); } public ObserveDataSourceConfigurationTopiaSupport getDataSourceConfiguration() { - return (ObserveDataSourceConfigurationTopiaSupport) observeServiceInitializerContext.getDataSourceConfiguration(); + return (ObserveDataSourceConfigurationTopiaSupport) observeServiceInitializer.getDataSourceConfiguration(); } public ObserveTopiaPersistenceContext getTopiaPersistenceContext() { @@ -76,28 +87,20 @@ public class ObserveServiceContextTopia { this.topiaApplicationContext = topiaApplicationContext; } - public void setServiceFactory(ObserveServiceFactory serviceFactory) { - this.serviceFactory = serviceFactory; - } - public void closeTopiaPersistenceContext() { topiaPersistenceContext.close(); topiaPersistenceContext = null; } - public void setApplicationContext(ObserveServiceApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - - public ObserveServiceApplicationContext getApplicationContext() { - return applicationContext; - } - public File createTemporaryDirectory(String prefix) { - return applicationContext.createTemporaryDirectory(prefix); + Set<PosixFilePermission> posixFilePermissions = PosixFilePermissions.fromString("rwxr-x---"); + FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(posixFilePermissions); + try { + return Files.createTempDirectory(getTemporaryDirectoryRoot().toPath(), prefix, fileAttribute).toFile(); + } catch (IOException e) { + //TODO Avoir une exception plus concrete + throw new RuntimeException("Could not create temporary directory with preifx: " + prefix, e); + } } - public void setObserveServiceInitializerContext(ObserveServiceInitializerContext observeServiceInitializerContext) { - this.observeServiceInitializerContext = observeServiceInitializerContext; - } } diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java index b9345bc..5b471ad 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceFactoryTopia.java @@ -40,18 +40,17 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } @Override - public <S extends ObserveService> S newService(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext, Class<S> serviceType) { + public <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType) { - Preconditions.checkNotNull(applicationContext, "applicationContext can't be null."); - Preconditions.checkNotNull(observeServiceInitializerContext, "observeServiceInitializerContext can't be null."); - ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializerContext.getDataSourceConfiguration(); + Preconditions.checkNotNull(observeServiceInitializer, "observeServiceInitializerContext can't be null."); + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializer.getDataSourceConfiguration(); Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationTopiaSupport.class.getName()); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); Class<S> serviceTypeImpl = getServiceClassType(serviceTypeCache, serviceType); Preconditions.checkNotNull(serviceTypeImpl, "serviceTypeImpl not found for : " + serviceType.getName()); - ObserveServiceContextTopia serviceContext = createServiceContext(applicationContext, observeServiceInitializerContext); + ObserveServiceContextTopia serviceContext = createServiceContext(observeServiceInitializer); S service = newServiceInstance(serviceTypeImpl, serviceContext); service = newServiceTransactionalProxy(serviceType, service, serviceContext); @@ -59,13 +58,9 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } - protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext) { + protected ObserveServiceContextTopia createServiceContext(ObserveServiceInitializer observeServiceInitializer) { - ObserveServiceContextTopia serviceContext = new ObserveServiceContextTopia(); - serviceContext.setApplicationContext(applicationContext); - - serviceContext.setObserveServiceInitializerContext(observeServiceInitializerContext); - serviceContext.setServiceFactory(this); + ObserveServiceContextTopia serviceContext = new ObserveServiceContextTopia(observeServiceInitializer, mainServiceFactory, this); return serviceContext; diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java index 38f04e6..de21753 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveServiceTopia.java @@ -81,7 +81,6 @@ public class ObserveServiceTopia implements ObserveService { public void setServiceContext(ObserveServiceContextTopia serviceContext) { Preconditions.checkNotNull(serviceContext, "serviceContext can't be null."); - Preconditions.checkArgument(serviceContext instanceof ObserveServiceContextTopia, "serviceContext must be of type " + ObserveServiceContextTopia.class.getName()); this.serviceContext = serviceContext; } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java index f854184..fb086e0 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ApplicationContextResource.java @@ -29,28 +29,24 @@ public class ApplicationContextResource implements TestRule { /** Logger. */ private static final Log log = LogFactory.getLog(ApplicationContextResource.class); - protected final ObserveServiceApplicationContext serviceApplicationContext; - protected final ObserveServiceFactoryTopia serviceFactory; private File testDirectory; private File dataBaseDirectory; + private Path temporaryDirectoryRoot; + public ApplicationContextResource() { - this.serviceApplicationContext = new ObserveServiceApplicationContext(); this.serviceFactory = new ObserveServiceFactoryTopia() { @Override - protected ObserveServiceContextTopia createServiceContext(ObserveServiceApplicationContext applicationContext, ObserveServiceInitializerContext observeServiceInitializerContext) { - ObserveServiceContextTopiaTaiste serviceContext = new ObserveServiceContextTopiaTaiste(); - serviceContext.setApplicationContext(applicationContext); - serviceContext.setObserveServiceInitializerContext(observeServiceInitializerContext); - serviceContext.setServiceFactory(this); - + protected ObserveServiceContextTopia createServiceContext(ObserveServiceInitializer observeServiceInitializer) { + ObserveServiceContextTopiaTaiste serviceContext = new ObserveServiceContextTopiaTaiste(observeServiceInitializer, mainServiceFactory, this); return serviceContext; } }; + serviceFactory.setMainServiceFactory(serviceFactory); } public String getScriptPath(String classifier, Version databaseVersion) { @@ -58,12 +54,13 @@ public class ApplicationContextResource implements TestRule { } public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { - ObserveServiceInitializerContext observeServiceInitializerContext = new ObserveServiceInitializerContext(); - observeServiceInitializerContext.setDataSourceConfiguration(dataSourceConfiguration); - observeServiceInitializerContext.setApplicationLocale(Locale.FRANCE); - observeServiceInitializerContext.setReferentialLocale(ReferentialLocale.FR); - observeServiceInitializerContext.setTemporaryDirectoryRoot(serviceApplicationContext.temporaryDirectoryRoot); - return serviceFactory.newService(serviceApplicationContext, observeServiceInitializerContext, serviceType); + ObserveServiceInitializer observeServiceInitializer = ObserveServiceInitializer.create( + Locale.FRANCE, + ReferentialLocale.FR, + temporaryDirectoryRoot.toFile(), + dataSourceConfiguration + ); + return serviceFactory.newService(observeServiceInitializer, serviceType); } public void closeServiceFactory() { @@ -71,7 +68,7 @@ public class ApplicationContextResource implements TestRule { } public void setTemporaryDirectoryRoot(Path temporaryDirectoryRoot) { - serviceApplicationContext.setTemporaryDirectoryRoot(temporaryDirectoryRoot); + this.temporaryDirectoryRoot = temporaryDirectoryRoot; } @Override @@ -101,8 +98,6 @@ public class ApplicationContextResource implements TestRule { ObserveServiceTopia.init(); - serviceApplicationContext.setMainServiceFactory(serviceFactory); - } protected void after(Description description) { diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java index 14b4032..abd1d9d 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/ObserveServiceContextTopiaTaiste.java @@ -11,6 +11,10 @@ public class ObserveServiceContextTopiaTaiste extends ObserveServiceContextTopia public static final Date DATE = DateUtil.createDate(36, 15, 17, 21, 8, 2015); + public ObserveServiceContextTopiaTaiste(ObserveServiceInitializer observeServiceInitializer, ObserveServiceFactory mainServiceFactory, ObserveServiceFactory serviceFactory) { + super(observeServiceInitializer, mainServiceFactory, serviceFactory); + } + @Override public Date now() { return DATE; -- 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 develop in repository observe. See http://git.codelutin.com/observe.git commit 26e197a3c3db2ebb85442f353dfdfaddfc9b588a Merge: 819491b 364eb14 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Sep 1 11:15:50 2015 +0200 Retour sur develop termine #7494 Merge branch 'feature/7494' into develop observe-application-web/pom.xml | 92 ++++++- .../src/jetty/jetty-context.xml | 10 + .../application/web/ObserveServiceInjector.java | 55 ----- .../web/ObserveWebApplicationContext.java | 109 ++++++--- .../ObserveWebApplicationContextInitException.java | 16 ++ .../web/ObserveWebApplicationListener.java | 10 +- .../application/web/ObserveWebMotionFilter.java | 98 +++++++- .../web/ObserveWebMotionJsonHelper.java | 2 +- .../application/web/ObserveWebMotionRender.java | 4 +- .../application/web/ObserveWebRequestContext.java | 77 ------ .../ObserveWebApplicationConfiguration.java | 271 +++++++++++++++++++++ ...veWebApplicationConfigurationInitException.java | 19 ++ .../ObserveWebApplicationConfigurationOption.java | 110 +++++++++ ...ObserveWebApplicationConfigurationProvider.java | 39 +++ .../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 | 22 ++ .../db/ObserveWebDatabasesHelper.java | 178 ++++++++++++++ .../db/impl/ObserveWebDatabaseBean.java | 74 ++++++ .../db/impl/ObserveWebDatabaseImmutable.java | 88 +++++++ .../db/impl/ObserveWebDatabaseRoleBean.java | 37 +++ .../db/impl/ObserveWebDatabaseRoleImmutable.java | 37 +++ .../db/impl/ObserveWebDatabasesBean.java | 54 ++++ .../db/impl/ObserveWebDatabasesImmutable.java | 79 ++++++ .../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 | 172 +++++++++++++ .../user/impl/ObserveWebUserBean.java | 65 +++++ .../user/impl/ObserveWebUserImmutable.java | 75 ++++++ .../user/impl/ObserveWebUserPermissionBean.java | 38 +++ .../impl/ObserveWebUserPermissionImmutable.java | 37 +++ .../user/impl/ObserveWebUsersBean.java | 43 ++++ .../user/impl/ObserveWebUsersImmutable.java | 56 +++++ .../web/controller/ObserveWebMotionController.java | 29 ++- .../web/controller/v1/ConfigurationController.java | 81 ++++++ .../controller/v1/DataSourceServiceController.java | 105 ++++++++ .../v1/ObserveServiceControllerSupport.java | 28 +++ .../v1/ReferentialServiceController.java | 36 +-- .../web/request/ObserveWebRequestContext.java | 108 ++++++++ .../request/ObserveWebRequestSecurityContext.java | 62 +++++ .../BadObserveWebUserPasswordException.java | 27 ++ ...urceConfigurationAlreadyRegistredException.java | 27 ++ .../InvalidAuthenticationTokenException.java | 22 ++ .../ObserveWebSecurityApplicationContext.java | 224 +++++++++++++++++ ...ObserveWebSecurityAuthenticationTokenCache.java | 84 +++++++ .../security/UnknownObserveWebUserException.java | 21 ++ .../UnknownObserveWebUserForDatabaseException.java | 27 ++ .../org.nuiton.config.ApplicationConfigProvider | 1 + .../src/main/resources/log4j.properties | 13 + observe-application-web/src/main/resources/mapping | 39 ++- .../src/main/resources/observeweb-log4j.conf | 21 ++ .../src/main/resources/observeweb.conf | 4 + .../db/ObserveWebDatabasesHelperTest.java | 241 ++++++++++++++++++ .../user/ObserveWebUsersHelperTest.java | 191 +++++++++++++++ .../fr/ird/observe/services/ObserveService.java | 2 - .../services/ObserveServiceApplicationContext.java | 81 ------ .../observe/services/ObserveServiceContext.java | 38 --- .../observe/services/ObserveServiceFactory.java | 12 +- .../services/ObserveServiceFactorySupport.java | 23 +- .../services/ObserveServiceInitializer.java | 99 ++++++++ .../ObserveDataSourceConfigurationRest.java | 25 +- .../ObserveDataSourceConfigurationTopiaPG.java | 6 +- .../services/ObserveServiceContextRest.java | 47 ---- .../services/ObserveServiceFactoryRest.java | 52 ++-- .../ird/observe/services/ObserveServiceRest.java | 20 -- observe-services-runner/pom.xml | 2 - .../ObserveDataSourceConfigurationMainFactory.java | 23 ++ .../services/ObserveServiceMainFactory.java | 27 +- .../services/ObserveServiceContextTopia.java | 73 +++--- .../services/ObserveServiceFactoryTopia.java | 29 ++- .../ird/observe/services/ObserveServiceTopia.java | 9 +- .../services/ApplicationContextResource.java | 30 +-- .../services/ObserveServiceContextTopiaTaiste.java | 5 + pom.xml | 117 +++++++-- 81 files changed, 3733 insertions(+), 527 deletions(-) -- 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