branch feature/7463 updated (e042916 -> f7d8d84)
This is an automated email from the git hooks/post-receive script. New change to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git from e042916 test + correction de la communication entre le client REST et le serveur Web (refs #7463) new aa39edd Revue de la manière de se connecter (introduction de ObserveDataSourceConnection) new b9bf71e Ajout du jeton d'authentification sur le DataSourceConnection new 3fca647 Ajout d'un supplier de builder de Gson par default new ae4d46b Revue du client reste new e8d1850 Utilisation d'un main handler et faire fonctionner la connexion à une source de données new cb211a9 Permettre de connecter plusieurs utilisateurs à la même source de données (un must pour une application web... new f7d8d84 Ajout de la méthode DataSourceService.canConnect The 7 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 f7d8d849f0cfd49fea56a4e1854430b5900d8f6d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 12:27:05 2015 +0200 Ajout de la méthode DataSourceService.canConnect commit cb211a96b80249ee743c9cc1eee741f22096e88f Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:21:44 2015 +0200 Permettre de connecter plusieurs utilisateurs à la même source de données (un must pour une application web... commit e8d18506f0a0bea9029748d7cc620844f0022500 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:09:03 2015 +0200 Utilisation d'un main handler et faire fonctionner la connexion à une source de données commit ae4d46b7247434c8131586153e27e334191ff3ee Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:07:42 2015 +0200 Revue du client reste commit 3fca6475fecc55e6a3a7177f2fd80970520dc7c4 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:07:04 2015 +0200 Ajout d'un supplier de builder de Gson par default commit b9bf71e4e49538918a1305f81e54bdf7d93f70cc Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:06:27 2015 +0200 Ajout du jeton d'authentification sur le DataSourceConnection commit aa39eddd9ec5404d3b78512e8b22fc56d842daf3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Sep 5 09:00:21 2015 +0200 Revue de la manière de se connecter (introduction de ObserveDataSourceConnection) Summary of changes: .../ObserveDataSourceConfigurationConverter.java | 47 ++ .../web/ObserveWebApplicationListener.java | 30 ++ .../application/web/ObserveWebMainHandler.java | 27 ++ .../application/web/ObserveWebMotionFilter.java | 5 +- .../web/ObserveWebMotionJsonHelper.java | 130 ----- .../controller/v1/DataSourceServiceController.java | 55 +-- ...urceConfigurationAlreadyRegistredException.java | 27 -- .../ObserveWebSecurityApplicationContext.java | 45 +- ...ObserveWebSecurityAuthenticationTokenCache.java | 10 +- observe-application-web/src/main/resources/mapping | 1 + .../observe/ObserveTopiaApplicationContext.java | 22 + .../observe/services/ObserveServiceFactory.java | 3 + .../services/ObserveServiceInitializer.java | 69 ++- .../services/service/DataSourceService.java | 10 +- .../DatabaseConnexionNotAuthorizedException.java | 5 + .../service/DatabaseNotFoundException.java | 6 +- .../configuration/ObserveDataSourceConnection.java | 4 +- .../ObserveDataSourceConnectionSupport.java | 42 +- ...ava => ObserveDataSourceConfigurationRest.java} | 37 +- ...veDataSourceConfigurationRestAuthenticated.java | 32 -- ...bserveDataSourceConfigurationRestConstants.java | 7 + .../ObserveDataSourceConfigurationRestSupport.java | 43 -- .../ObserveDataSourceConnectionRest.java | 17 +- .../ObserveDataSourceConnectionTopia.java | 6 +- .../services/dto/gson/ObserveDtoGsonSupplier.java | 8 + .../ObserveDataSourceConnectionAdapter.java | 24 + .../services/ObserveServiceFactoryRest.java | 237 ++++++--- .../ird/observe/services/http/ObserveRequest.java | 77 +++ .../services/http/ObserveRequestBuilder.java | 134 ++++++ .../services/http/ObserveRequestMethod.java | 13 + .../ird/observe/services/http/ObserveResponse.java | 140 ++++++ .../services/http/ObserveResponseBuilder.java | 396 +++++++++++++++ .../ird/observe/services/http/RequestBuilder.java | 531 --------------------- .../ird/observe/services/http/RequestResult.java | 86 ---- .../fr/ird/observe/services/TestClassResource.java | 25 +- .../ird/observe/services/TestMethodResource.java | 6 +- .../service/DataSourceServiceRestTest.java | 40 +- .../service/seine/TripSeineServiceTest.java | 4 +- .../ObserveDataSourceConfigurationMainFactory.java | 52 +- .../services/ObserveServiceMainFactory.java | 25 + .../services/ObserveServiceContextTopia.java | 28 +- .../services/ObserveServiceFactoryTopia.java | 60 ++- .../ird/observe/services/ObserveServiceTopia.java | 12 +- .../ObserveTopiaApplicationContextFactory.java | 18 +- .../services/service/DataSourceServiceTopia.java | 162 +++++-- .../ird/observe/services/DataSourceResource.java | 2 +- .../service/DataSourceServiceTopiaTest.java | 87 +++- 47 files changed, 1682 insertions(+), 1165 deletions(-) create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveDataSourceConfigurationConverter.java create mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMainHandler.java delete mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionJsonHelper.java delete mode 100644 observe-application-web/src/main/java/fr/ird/observe/application/web/security/DataSourceConfigurationAlreadyRegistredException.java rename observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/{ObserveDataSourceConfigurationRestNotAuthenticated.java => ObserveDataSourceConfigurationRest.java} (69%) delete mode 100644 observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestAuthenticated.java delete mode 100644 observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestSupport.java create mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/ObserveDataSourceConnectionAdapter.java create mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequest.java create mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestBuilder.java create mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestMethod.java create mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponse.java create mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java delete mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestBuilder.java delete mode 100644 observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestResult.java -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit aa39eddd9ec5404d3b78512e8b22fc56d842daf3 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Sep 5 09:00:21 2015 +0200 Revue de la manière de se connecter (introduction de ObserveDataSourceConnection) --- .../controller/v1/DataSourceServiceController.java | 39 +++-------- .../ObserveWebSecurityApplicationContext.java | 15 +--- .../observe/ObserveTopiaApplicationContext.java | 22 ++++++ .../observe/services/ObserveServiceFactory.java | 3 + .../services/ObserveServiceInitializer.java | 65 ++++++++++++++--- .../services/service/DataSourceService.java | 11 +-- .../configuration/ObserveDataSourceConnection.java | 5 -- .../ObserveDataSourceConnectionSupport.java | 46 ++++++++++-- ...ava => ObserveDataSourceConfigurationRest.java} | 37 ++++++++-- ...veDataSourceConfigurationRestAuthenticated.java | 32 --------- ...bserveDataSourceConfigurationRestConstants.java | 1 + .../ObserveDataSourceConfigurationRestSupport.java | 43 ------------ .../ObserveDataSourceConnectionRest.java | 17 +++-- .../ObserveDataSourceConnectionTopia.java | 6 +- .../services/ObserveServiceFactoryRest.java | 76 +++++++++++++------- .../fr/ird/observe/services/TestClassResource.java | 12 ++-- .../ird/observe/services/TestMethodResource.java | 6 +- .../service/DataSourceServiceRestTest.java | 18 +++-- .../ObserveDataSourceConfigurationMainFactory.java | 52 ++++++-------- .../services/ObserveServiceMainFactory.java | 25 +++++++ .../services/ObserveServiceContextTopia.java | 28 ++++++-- .../services/ObserveServiceFactoryTopia.java | 60 ++++++++++++---- .../ird/observe/services/ObserveServiceTopia.java | 8 +-- .../ObserveTopiaApplicationContextFactory.java | 18 ++++- .../services/service/DataSourceServiceTopia.java | 81 ++++++++++------------ .../ird/observe/services/DataSourceResource.java | 2 +- .../service/DataSourceServiceTopiaTest.java | 20 ++++-- 27 files changed, 436 insertions(+), 312 deletions(-) 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 745c66e..8d79e93 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 @@ -3,9 +3,7 @@ package fr.ird.observe.application.web.controller.v1; import com.google.common.base.Optional; import fr.ird.observe.application.web.request.ObserveWebRequestContext; import fr.ird.observe.application.web.security.DataSourceConfigurationAlreadyRegistredException; -import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestAuthenticated; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; @@ -16,7 +14,6 @@ import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.debux.webmotion.server.WebMotionContextable; /** * Created on 30/08/15. @@ -33,25 +30,9 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public void setContextable(WebMotionContextable contextable) { - super.setContextable(contextable); - getRequestContext().checkSecurityContextIsPresent(); - } - - @Override - public boolean exists() { - return service.exists(); - } + public ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { - @Override - public boolean canConnect() { - return service.canConnect(); - } - - @Override - public ObserveDataSourceConnection create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { - - ObserveDataSourceConnection observeDataSourceConnection = service.create(dataSourceCreateConfiguration); + ObserveDataSourceConnection observeDataSourceConnection = service.create(dataSourceConfiguration, dataSourceCreateConfiguration); String authenticationToken = registerDataSourceConfiguration(); ObserveDataSourceConnection dataSourceConnection = createDataSourceConnection(observeDataSourceConnection, authenticationToken); @@ -60,9 +41,9 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public ObserveDataSourceConnection open() throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + public ObserveDataSourceConnection open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { - ObserveDataSourceConnection observeDataSourceConnection = service.open(); + ObserveDataSourceConnection observeDataSourceConnection = service.open(dataSourceConfiguration); String authenticationToken = registerDataSourceConfiguration(); ObserveDataSourceConnection dataSourceConnection = createDataSourceConnection(observeDataSourceConnection, authenticationToken); @@ -112,18 +93,14 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport protected ObserveDataSourceConnection createDataSourceConnection(ObserveDataSourceConnection observeDataSourceConnection, String authenticationToken) { - ObserveWebSecurityApplicationContext securityApplicationContext = getSecurityApplicationContext(); - - ObserveDataSourceConfigurationRestAuthenticated dataSourceConfiguration = - securityApplicationContext.createDataSourceConnection(getApplicationConfiguration().getApiUrl(), - authenticationToken); - ObserveDataSourceConnectionRest dataSourceConnection = new ObserveDataSourceConnectionRest( - dataSourceConfiguration, + getApplicationConfiguration().getApiUrl(), + authenticationToken, observeDataSourceConnection.canReadReferential(), observeDataSourceConnection.canWriteReferential(), observeDataSourceConnection.canReadData(), - observeDataSourceConnection.canWriteData()); + observeDataSourceConnection.canWriteData() + ); return dataSourceConnection; 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 index a659779..6aff7aa 100644 --- 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 @@ -11,12 +11,10 @@ import fr.ird.observe.application.web.configuration.user.ObserveWebUserPermissio import fr.ird.observe.application.web.configuration.user.ObserveWebUsers; import fr.ird.observe.services.ObserveDataSourceConfigurationMainFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestAuthenticated; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.Closeable; -import java.net.URL; import java.util.Objects; /** @@ -64,16 +62,6 @@ public class ObserveWebSecurityApplicationContext implements Closeable { this.dataSourceConfigurationFactory = new ObserveDataSourceConfigurationMainFactory(); } - public ObserveDataSourceConfigurationRestAuthenticated createDataSourceConnection(URL apiUrl, String authenticationToken) { - ObserveDataSourceConfigurationRestAuthenticated dataSourceConfiguration = - dataSourceConfigurationFactory.createObserveDataSourceConfigurationRestAuthenticated( - "TODO", //FIXME - apiUrl, - authenticationToken - ); - return dataSourceConfiguration; - } - public synchronized void init(ObserveWebDatabases<?> databases, ObserveWebUsers<?> users) { this.databases = databases; this.users = users; @@ -113,8 +101,7 @@ public class ObserveWebSecurityApplicationContext implements Closeable { password.toCharArray(), true, true, - true - ); + true); if (log.isInfoEnabled()) { diff --git a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java index 809f4c1..0a50246 100644 --- a/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java +++ b/observe-entities/src/main/java/fr/ird/observe/ObserveTopiaApplicationContext.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Objects; +import java.util.UUID; import java.util.zip.GZIPInputStream; public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicationContext { @@ -43,8 +45,11 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat */ protected boolean open; + protected final String authenticationToken; + public ObserveTopiaApplicationContext(ObserveTopiaConfiguration topiaConfiguration) { super(topiaConfiguration); + this.authenticationToken = UUID.randomUUID().toString(); } @Override @@ -137,4 +142,21 @@ public class ObserveTopiaApplicationContext extends AbstractObserveTopiaApplicat } + public String getAuthenticationToken() { + return authenticationToken; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ObserveTopiaApplicationContext)) return false; + ObserveTopiaApplicationContext that = (ObserveTopiaApplicationContext) o; + return Objects.equals(authenticationToken, that.authenticationToken); + } + + @Override + public int hashCode() { + return Objects.hash(authenticationToken); + } + } 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 5d3ee70..c6b6bc4 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 @@ -1,6 +1,7 @@ package fr.ird.observe.services; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import java.io.Closeable; @@ -17,6 +18,8 @@ public interface ObserveServiceFactory extends Closeable { <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType); + <S extends ObserveService> boolean accept(ObserveDataSourceConnection dataSourceConnection, Class<S> serviceType); + <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType); @Override 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 index 7e15004..8ea0674 100644 --- 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 @@ -1,6 +1,8 @@ package fr.ird.observe.services; +import com.google.common.base.Optional; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.dto.constants.ReferentialLocale; import java.io.File; @@ -20,6 +22,21 @@ public class ObserveServiceInitializer { public static ObserveServiceInitializer create(Locale applicationLocale, ReferentialLocale referentialLocale, File temporaryDirectoryRoot, + ObserveDataSourceConnection dataSourceConnection) { + + ObserveServiceInitializer observeServiceInitializer = new ObserveServiceInitializer(); + observeServiceInitializer.setApplicationLocale(applicationLocale); + observeServiceInitializer.setReferentialLocale(referentialLocale); + observeServiceInitializer.setTemporaryDirectoryRoot(temporaryDirectoryRoot); + observeServiceInitializer.setDataSourceConfiguration(null); + observeServiceInitializer.setDataSourceConnection(dataSourceConnection); + return observeServiceInitializer; + + } + + public static ObserveServiceInitializer create(Locale applicationLocale, + ReferentialLocale referentialLocale, + File temporaryDirectoryRoot, ObserveDataSourceConfiguration dataSourceConfiguration) { ObserveServiceInitializer observeServiceInitializer = new ObserveServiceInitializer(); @@ -27,17 +44,28 @@ public class ObserveServiceInitializer { observeServiceInitializer.setReferentialLocale(referentialLocale); observeServiceInitializer.setTemporaryDirectoryRoot(temporaryDirectoryRoot); observeServiceInitializer.setDataSourceConfiguration(dataSourceConfiguration); + observeServiceInitializer.setDataSourceConnection(null); 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()); + ObserveServiceInitializer observeServiceInitializer; + if (otherObserveServiceInitializer.withDataSourceConnection()) { + observeServiceInitializer = create( + otherObserveServiceInitializer.getApplicationLocale(), + otherObserveServiceInitializer.getReferentialLocale(), + otherObserveServiceInitializer.getTemporaryDirectoryRoot(), + otherObserveServiceInitializer.getDataSourceConnection()); + } else { + observeServiceInitializer = create( + otherObserveServiceInitializer.getApplicationLocale(), + otherObserveServiceInitializer.getReferentialLocale(), + otherObserveServiceInitializer.getTemporaryDirectoryRoot(), + otherObserveServiceInitializer.getDataSourceConfiguration()); + } + return observeServiceInitializer; } @@ -53,9 +81,14 @@ public class ObserveServiceInitializer { protected ReferentialLocale referentialLocale; /** - * La configuration de la source de données. + * La connexion à la source de données (peut être null si on a pas encore de connexion). + */ + protected Optional<ObserveDataSourceConnection> dataSourceConnection; + + /** + * La configuration à la source de données quand on a pas encore de connexion. */ - protected ObserveDataSourceConfiguration dataSourceConfiguration; + protected Optional<ObserveDataSourceConfiguration> dataSourceConfiguration; /** * Le répertoire où créer les répertoires temporaires. @@ -71,14 +104,22 @@ public class ObserveServiceInitializer { return referentialLocale; } + public ObserveDataSourceConnection getDataSourceConnection() { + return dataSourceConnection.get(); + } + public ObserveDataSourceConfiguration getDataSourceConfiguration() { - return dataSourceConfiguration; + return dataSourceConfiguration.get(); } public File getTemporaryDirectoryRoot() { return temporaryDirectoryRoot; } + public boolean withDataSourceConnection() { + return dataSourceConnection.isPresent(); + } + protected void setApplicationLocale(Locale applicationLocale) { this.applicationLocale = applicationLocale; } @@ -87,8 +128,12 @@ public class ObserveServiceInitializer { this.referentialLocale = referentialLocale; } - public void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { - this.dataSourceConfiguration = dataSourceConfiguration; + protected void setDataSourceConnection(ObserveDataSourceConnection dataSourceConnection) { + this.dataSourceConnection = Optional.fromNullable(dataSourceConnection); + } + + protected void setDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { + this.dataSourceConfiguration = Optional.fromNullable(dataSourceConfiguration); } protected void setTemporaryDirectoryRoot(File temporaryDirectoryRoot) { diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java index a0e9a5e..2a9ab95 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java @@ -1,6 +1,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.ObserveService; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; @@ -15,16 +16,10 @@ import fr.ird.observe.services.spi.NoDataAccess; public interface DataSourceService extends ObserveService { @NoDataAccess - boolean exists(); + ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException; @NoDataAccess - boolean canConnect(); - - @NoDataAccess - ObserveDataSourceConnection create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException; - - @NoDataAccess - ObserveDataSourceConnection open() throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; + ObserveDataSourceConnection open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; void close(); diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java index e950af2..2871e9e 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java @@ -10,11 +10,6 @@ package fr.ird.observe.services.configuration; public interface ObserveDataSourceConnection { /** - * @return la configuration de la source de données. - */ - ObserveDataSourceConfiguration getDataSourceConfiguration(); - - /** * @return {@code true} si on peut lire les référentiels, {@code false} sinon. */ boolean canReadReferential(); diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java index fa8d407..37272d5 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java @@ -1,13 +1,17 @@ package fr.ird.observe.services.configuration; +import com.google.common.base.MoreObjects; + +import java.util.Objects; + /** * Created on 04/09/15. * * @author Tony Chemit - chemit@codelutin.com */ -public abstract class ObserveDataSourceConnectionSupport<C extends ObserveDataSourceConfiguration> implements ObserveDataSourceConnection { +public abstract class ObserveDataSourceConnectionSupport implements ObserveDataSourceConnection { - protected final C dataSourceConfiguration; + protected final String authenticationToken; protected final boolean readReferential; @@ -17,21 +21,20 @@ public abstract class ObserveDataSourceConnectionSupport<C extends ObserveDataSo protected final boolean writeData; - protected ObserveDataSourceConnectionSupport(C dataSourceConfiguration, + protected ObserveDataSourceConnectionSupport(String authenticationToken, boolean readReferential, boolean writeReferential, boolean readData, boolean writeData) { - this.dataSourceConfiguration = dataSourceConfiguration; + this.authenticationToken = authenticationToken; this.writeData = writeData; this.readReferential = readReferential; this.writeReferential = writeReferential; this.readData = readData; } - @Override - public C getDataSourceConfiguration() { - return dataSourceConfiguration; + public String getAuthenticationToken() { + return authenticationToken; } @Override @@ -53,4 +56,33 @@ public abstract class ObserveDataSourceConnectionSupport<C extends ObserveDataSo public boolean canWriteData() { return writeData; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ObserveDataSourceConnectionSupport)) return false; + ObserveDataSourceConnectionSupport that = (ObserveDataSourceConnectionSupport) o; + return Objects.equals(readReferential, that.readReferential) && + Objects.equals(writeReferential, that.writeReferential) && + Objects.equals(readData, that.readData) && + Objects.equals(writeData, that.writeData) && + Objects.equals(authenticationToken, that.authenticationToken); + } + + @Override + public int hashCode() { + return Objects.hash(authenticationToken, readReferential, writeReferential, readData, writeData); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("authenticationToken", authenticationToken) + .add("readReferential", readReferential) + .add("writeReferential", writeReferential) + .add("readData", readData) + .add("writeData", writeData) + .toString(); + } + } diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestNotAuthenticated.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java similarity index 69% rename from observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestNotAuthenticated.java rename to observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java index b260232..d173079 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestNotAuthenticated.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRest.java @@ -2,6 +2,8 @@ package fr.ird.observe.services.configuration; import com.google.common.base.Optional; +import java.net.URL; + /** * Configuration d'une source de données Rest non connectée. * @@ -9,11 +11,21 @@ import com.google.common.base.Optional; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveDataSourceConfigurationRestNotAuthenticated extends ObserveDataSourceConfigurationRestSupport { +public class ObserveDataSourceConfigurationRest implements ObserveDataSourceConfiguration { private static final long serialVersionUID = 1L; /** + * Le libellé de la source de données. + */ + protected String label; + + /** + * L'url du serveur à utiliser. + */ + protected URL serverUrl; + + /** * Le login de l'utilisateur. */ protected String login; @@ -28,6 +40,23 @@ public class ObserveDataSourceConfigurationRestNotAuthenticated extends ObserveD */ protected Optional<String> optionalDatabaseName; + @Override + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public URL getServerUrl() { + return serverUrl; + } + + public void setServerUrl(URL serverUrl) { + this.serverUrl = serverUrl; + } + public String getLogin() { return login; } @@ -47,6 +76,7 @@ public class ObserveDataSourceConfigurationRestNotAuthenticated extends ObserveD public boolean withDatabaseName() { return optionalDatabaseName.isPresent(); } + public Optional<String> getOptionalDatabaseName() { return optionalDatabaseName; } @@ -55,9 +85,4 @@ public class ObserveDataSourceConfigurationRestNotAuthenticated extends ObserveD this.optionalDatabaseName = optionalDatabaseName; } - @Override - public boolean isAuthenticated() { - return false; - } - } diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestAuthenticated.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestAuthenticated.java deleted file mode 100644 index 45ff7e1..0000000 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestAuthenticated.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.ird.observe.services.configuration; - -/** - * La configuration d'une source de données connectée. - * - * Created on 19/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public class ObserveDataSourceConfigurationRestAuthenticated extends ObserveDataSourceConfigurationRestSupport { - - private static final long serialVersionUID = 1L; - - /** - * Le jeton d'authentification. - */ - protected String authenticationToken; - - public String getAuthenticationToken() { - return authenticationToken; - } - - public void setAuthenticationToken(String authenticationToken) { - this.authenticationToken = authenticationToken; - } - - @Override - public boolean isAuthenticated() { - return true; - } - -} diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java index f093639..4df18a0 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java @@ -20,4 +20,5 @@ public interface ObserveDataSourceConfigurationRestConstants { String REQUEST_USER_DATABASE_NAME = "userDatabaseName"; String REQUEST_ADMIN_API_KEY = "adminApiKey"; + } diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestSupport.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestSupport.java deleted file mode 100644 index d6ae525..0000000 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestSupport.java +++ /dev/null @@ -1,43 +0,0 @@ -package fr.ird.observe.services.configuration; - -import java.net.URL; - -/** - * Created on 19/08/15. - * - * @author Tony Chemit - chemit@codelutin.com - */ -public abstract class ObserveDataSourceConfigurationRestSupport implements ObserveDataSourceConfiguration { - - private static final long serialVersionUID = 1L; - - /** - * Le libellé de la data source. - */ - protected String label; - - /** - * L'url du serveur à utiliser. - */ - protected URL serverUrl; - - public abstract boolean isAuthenticated(); - - @Override - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public URL getServerUrl() { - return serverUrl; - } - - public void setServerUrl(URL serverUrl) { - this.serverUrl = serverUrl; - } - -} diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java index 9948a4f..e510f00 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionRest.java @@ -1,21 +1,28 @@ package fr.ird.observe.services.configuration; +import java.net.URL; + /** * Created on 04/09/15. * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveDataSourceConnectionRest extends ObserveDataSourceConnectionSupport<ObserveDataSourceConfigurationRestAuthenticated> { +public class ObserveDataSourceConnectionRest extends ObserveDataSourceConnectionSupport { + + protected final URL serverUrl; - public ObserveDataSourceConnectionRest(ObserveDataSourceConfigurationRestAuthenticated dataSourceConfiguration, + public ObserveDataSourceConnectionRest(URL serverUrl, + String authenticationToken, boolean readReferential, boolean writeReferential, boolean readData, boolean writeData) { - super(dataSourceConfiguration, readReferential, writeReferential, readData, writeData); + super(authenticationToken, readReferential, writeReferential, readData, writeData); + this.serverUrl = serverUrl; } - public String getAuthenticationToken() { - return getDataSourceConfiguration().getAuthenticationToken(); + public URL getServerUrl() { + return serverUrl; } + } diff --git a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java index 86385a3..6409838 100644 --- a/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java +++ b/observe-services-configuration-topia/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionTopia.java @@ -5,14 +5,14 @@ package fr.ird.observe.services.configuration; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveDataSourceConnectionTopia extends ObserveDataSourceConnectionSupport<ObserveDataSourceConfigurationTopiaSupport> { +public class ObserveDataSourceConnectionTopia extends ObserveDataSourceConnectionSupport { - public ObserveDataSourceConnectionTopia(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration, + public ObserveDataSourceConnectionTopia(String authenticationToken, boolean readReferential, boolean writeReferential, boolean readData, boolean writeData) { - super(dataSourceConfiguration, readReferential, writeReferential, readData, writeData); + super(authenticationToken, readReferential, writeReferential, readData, writeData); } } 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 bff5f14..d0f262c 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 @@ -8,10 +8,10 @@ import com.google.gson.Gson; import com.thoughtworks.paranamer.CachingParanamer; import com.thoughtworks.paranamer.Paranamer; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestAuthenticated; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestConstants; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestNotAuthenticated; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; import fr.ird.observe.services.http.RequestBuilder; import fr.ird.observe.services.service.DataSourceService; @@ -46,7 +46,16 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); Preconditions.checkNotNull(serviceType, "serviceType can't be null."); - return dataSourceConfiguration instanceof ObserveDataSourceConfigurationRestSupport; + return dataSourceConfiguration instanceof ObserveDataSourceConfigurationRest; + + } + + @Override + public <S extends ObserveService> boolean accept(ObserveDataSourceConnection dataSourceConnection, Class<S> serviceType) { + + Preconditions.checkNotNull(dataSourceConnection, "dataSourceConfiguration can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + return dataSourceConnection instanceof ObserveDataSourceConnectionRest; } @@ -58,9 +67,20 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl 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 ObserveDataSourceConfigurationRestSupport, "dataSourceConfiguration must be of type ObserveDataSourceConfigurationRestSupport"); + + if (observeServiceInitializer.withDataSourceConnection()) { + + ObserveDataSourceConnection dataSourceConnection = observeServiceInitializer.getDataSourceConnection(); + Preconditions.checkArgument(dataSourceConnection instanceof ObserveDataSourceConnectionRest, "dataSourceConfiguration must be of type " + ObserveDataSourceConnectionRest.class.getName()); + + } else { + + // Pas encore connecte on utilise la configuration de la source de données + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializer.getDataSourceConfiguration(); + Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConnection and dataSourceConfiguration can't be null."); + Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationRest, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationRest.class.getName()); + + } S service = newRemoteProxyServiceInstance(serviceType, observeServiceInitializer); return service; @@ -82,7 +102,9 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl protected static class RemoteInvocationHandler<E extends ObserveService> implements InvocationHandler { - protected final ObserveDataSourceConfigurationRestSupport dataSourceConfiguration; + protected final ObserveDataSourceConfigurationRest dataSourceConfiguration; + + protected final ObserveDataSourceConnectionRest dataSourceConnection; protected final Supplier<Gson> gsonSupplier; @@ -99,18 +121,25 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializer observeServiceInitializer, Supplier<Gson> gsonSupplier) { this.paranamer = paranamer; this.serviceClass = serviceClass; - - this.dataSourceConfiguration = (ObserveDataSourceConfigurationRestSupport) observeServiceInitializer.getDataSourceConfiguration(); - String locateService = serviceClass.getCanonicalName().replace(ROOT_SERVICES_PACKAGE.getName(), ""); locateService = locateService.replace(".", "/"); + if (observeServiceInitializer.withDataSourceConnection()) { + + this.dataSourceConnection = (ObserveDataSourceConnectionRest) observeServiceInitializer.getDataSourceConnection(); + this.dataSourceConfiguration = null; + this.serviceUrl = dataSourceConnection.getServerUrl() + locateService; + + } else { - this.serviceUrl = dataSourceConfiguration.getServerUrl() + locateService; + this.dataSourceConnection = null; + this.dataSourceConfiguration = (ObserveDataSourceConfigurationRest) observeServiceInitializer.getDataSourceConfiguration(); + this.serviceUrl = dataSourceConfiguration.getServerUrl() + locateService; + + } this.gsonSupplier = gsonSupplier; this.applicationLocale = observeServiceInitializer.getApplicationLocale().toString(); - this.referentialLocale = observeServiceInitializer.getReferentialLocale().getLocale().toString(); - + this.referentialLocale = observeServiceInitializer.getReferentialLocale().toString(); } @@ -135,7 +164,7 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl String url = String.format("%s/%s", serviceUrl, methodName); if (log.isDebugEnabled()) { - log.debug("Invoke remote service on endpoint: " + url); + log.debug(String.format("Invoke remote service on endpoint: %s", url)); } RequestBuilder requestBuilder = new RequestBuilder(url, gsonSupplier); @@ -193,20 +222,19 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl protected void addHeaders(RequestBuilder requestBuilder) { - if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationRestNotAuthenticated) { + if (dataSourceConfiguration != null) { + + requestBuilder.addHeader(REQUEST_USER_LOGIN, dataSourceConfiguration.getLogin()); + requestBuilder.addHeader(REQUEST_USER_PASSWORD, new String(dataSourceConfiguration.getPassword())); + if (dataSourceConfiguration.withDatabaseName()) { - ObserveDataSourceConfigurationRestNotAuthenticated sourceConfiguration = (ObserveDataSourceConfigurationRestNotAuthenticated) dataSourceConfiguration; - requestBuilder.addHeader(REQUEST_USER_LOGIN, sourceConfiguration.getLogin()); - requestBuilder.addHeader(REQUEST_USER_PASSWORD, new String(sourceConfiguration.getPassword())); - if (sourceConfiguration.withDatabaseName()) { + requestBuilder.addHeader(REQUEST_USER_DATABASE_NAME, dataSourceConfiguration.getOptionalDatabaseName().get()); - requestBuilder.addHeader(REQUEST_USER_DATABASE_NAME, sourceConfiguration.getOptionalDatabaseName().get()); } - } else if (dataSourceConfiguration instanceof ObserveDataSourceConfigurationRestAuthenticated) { + } else { - ObserveDataSourceConfigurationRestAuthenticated sourceConfiguration = (ObserveDataSourceConfigurationRestAuthenticated) dataSourceConfiguration; - requestBuilder.addHeader(REQUEST_AUTHENTICATION_TOKEN, sourceConfiguration.getAuthenticationToken()); + requestBuilder.addHeader(REQUEST_AUTHENTICATION_TOKEN, dataSourceConnection.getAuthenticationToken()); } if (!Strings.isNullOrEmpty(applicationLocale)) { diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java b/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java index 82165c4..b3b2f24 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java @@ -2,8 +2,7 @@ package fr.ird.observe.services; import com.google.common.base.Optional; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestNotAuthenticated; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.test.TestHelper; import org.apache.commons.logging.Log; @@ -122,14 +121,17 @@ public class TestClassResource implements TestRule { this.testDirectory = testDirectory; } - public ObserveDataSourceConfigurationRestSupport createDataSourceConfigurationRest(Class<?> testClass, String login, char... password) { + public ObserveDataSourceConfigurationRest createDataSourceConfigurationRest(Class<?> testClass, + String databaseName, + String login, + char... password) { - ObserveDataSourceConfigurationRestNotAuthenticated configurationRest = new ObserveDataSourceConfigurationRestNotAuthenticated(); + ObserveDataSourceConfigurationRest configurationRest = new ObserveDataSourceConfigurationRest(); configurationRest.setLabel(testClass.getSimpleName() + "#" + serverUrl); configurationRest.setServerUrl(serverUrl); configurationRest.setLogin(login); configurationRest.setPassword(password); - configurationRest.setOptionalDatabaseName(Optional.<String>absent()); + configurationRest.setOptionalDatabaseName(Optional.fromNullable(databaseName)); return configurationRest; diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java b/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java index 9e2627e..0f62ca4 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/TestMethodResource.java @@ -1,6 +1,6 @@ package fr.ird.observe.services; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.test.TestHelper; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -28,7 +28,7 @@ public class TestMethodResource implements TestRule { protected final char[] password; - protected ObserveDataSourceConfigurationRestSupport dataSourceConfiguration; + protected ObserveDataSourceConfigurationRest dataSourceConfiguration; public TestMethodResource(TestClassResource testClassResource) { this(testClassResource, "admin", 'a'); @@ -56,7 +56,7 @@ public class TestMethodResource implements TestRule { }; } - public ObserveDataSourceConfigurationRestSupport getDataSourceConfiguration() { + public ObserveDataSourceConfigurationRest getDataSourceConfiguration() { return dataSourceConfiguration; } diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java index e9a1b83..1dbab67 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java @@ -2,7 +2,7 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.TestClassResource; import fr.ird.observe.services.TestMethodResource; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; @@ -32,11 +32,12 @@ public class DataSourceServiceRestTest { @Before public void setUp() throws Exception { - ObserveDataSourceConfigurationRestSupport dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); + ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); service = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); - //TODO Tester si le serveur est accessible si non + //TODO Tester si le serveur est accessible sinon on ignore le test boolean serverExist = false; + Assume.assumeTrue("Serveur " + dataSourceConfiguration.getServerUrl() + " no found", serverExist); } @@ -44,28 +45,31 @@ public class DataSourceServiceRestTest { @Test(expected = DatabaseNotFoundException.class) public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { - service.open(); + ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); + service.open(dataSourceConfiguration); } @Test public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); - service.create(dataSourceCreateConfiguration); + service.create(dataSourceConfiguration, dataSourceCreateConfiguration); - service.open(); + service.open(dataSourceConfiguration); } @Test public void testCreateEmptyDataSource() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); - service.create(dataSourceCreateConfiguration); + service.create(dataSourceConfiguration, dataSourceCreateConfiguration); } 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 d4ad6a7..5331b72 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 @@ -1,7 +1,7 @@ package fr.ird.observe.services; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestAuthenticated; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestNotAuthenticated; +import com.google.common.base.Optional; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; @@ -16,12 +16,12 @@ import java.net.URL; public class ObserveDataSourceConfigurationMainFactory { public ObserveDataSourceConfigurationTopiaPG createObserveDataSourceConfigurationTopiaPG(String label, - String jdbcUrl, - String username, - char[] password, - boolean useSsl, - boolean showMigrationProgression, - boolean showMigrationSql) { + String jdbcUrl, + String username, + char[] password, + boolean useSsl, + boolean showMigrationProgression, + boolean showMigrationSql) { ObserveDataSourceConfigurationTopiaPG result = new ObserveDataSourceConfigurationTopiaPG(); result.setLabel(label); @@ -37,12 +37,12 @@ public class ObserveDataSourceConfigurationMainFactory { } public ObserveDataSourceConfigurationTopiaH2 createObserveDataSourceConfigurationTopiaH2(String label, - File directory, - String databaseName, - String username, - char[] password, - boolean showMigrationProgression, - boolean showMigrationSql) { + File directory, + String databaseName, + String username, + char[] password, + boolean showMigrationProgression, + boolean showMigrationSql) { ObserveDataSourceConfigurationTopiaH2 result = new ObserveDataSourceConfigurationTopiaH2(); result.setLabel(label); @@ -57,32 +57,22 @@ public class ObserveDataSourceConfigurationMainFactory { } - public ObserveDataSourceConfigurationRestNotAuthenticated createObserveDataSourceConfigurationRestNotAuthenticated(String label, - URL serverUrl, - String login, - char... password) { + public ObserveDataSourceConfigurationRest createObserveDataSourceConfigurationRest(String label, + URL serverUrl, + String login, + char[] password, + String databaseName) { - ObserveDataSourceConfigurationRestNotAuthenticated result = new ObserveDataSourceConfigurationRestNotAuthenticated(); + ObserveDataSourceConfigurationRest result = new ObserveDataSourceConfigurationRest(); result.setLabel(label); result.setServerUrl(serverUrl); result.setLogin(login); result.setPassword(password); + result.setOptionalDatabaseName(Optional.fromNullable(databaseName)); return result; } - public ObserveDataSourceConfigurationRestAuthenticated createObserveDataSourceConfigurationRestAuthenticated(String label, - URL serverUrl, - String authenticationToken) { - - ObserveDataSourceConfigurationRestAuthenticated result = new ObserveDataSourceConfigurationRestAuthenticated(); - result.setLabel(label); - result.setServerUrl(serverUrl); - result.setAuthenticationToken(authenticationToken); - - 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 0445dd8..7f5cd95 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 @@ -3,6 +3,7 @@ package fr.ird.observe.services; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -45,6 +46,14 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { } @Override + public <S extends ObserveService> boolean accept(ObserveDataSourceConnection dataSourceConnection, Class<S> serviceType) { + + ObserveServiceFactory factory = getFactory(dataSourceConnection, serviceType); + return factory != null; + + } + + @Override public <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType) { Preconditions.checkNotNull(observeServiceInitializer, "observeServiceInitializerContext can't be null."); @@ -108,4 +117,20 @@ public class ObserveServiceMainFactory implements ObserveServiceFactory { return result; } + + protected <S extends ObserveService> ObserveServiceFactory getFactory(ObserveDataSourceConnection dataSourceConnection, Class<S> serviceType) { + + ObserveServiceFactory result = null; + for (ObserveServiceFactory serviceFactory : delegateFactories) { + if (serviceFactory.accept(dataSourceConnection, serviceType)) { + result = serviceFactory; + break; + } + } + + Preconditions.checkState(result != null, String.format("No factory found for dataSourceConnection: %s and serviceType: %s", dataSourceConnection, serviceType.getName())); + return result; + + } + } \ No newline at end of file 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 7db2ef8..4154600 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 @@ -4,6 +4,8 @@ import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; import fr.ird.observe.services.dto.constants.ReferentialLocale; import java.io.File; @@ -57,6 +59,18 @@ public class ObserveServiceContextTopia { return observeServiceInitializer.getTemporaryDirectoryRoot(); } + public boolean withDataSourceConnection() { + return observeServiceInitializer.withDataSourceConnection(); + } + + public ObserveDataSourceConnectionTopia getDataSourceConnection() { + return (ObserveDataSourceConnectionTopia) observeServiceInitializer.getDataSourceConnection(); + } + + public ObserveDataSourceConfigurationTopiaSupport getDataSourceConfiguration() { + return (ObserveDataSourceConfigurationTopiaSupport) observeServiceInitializer.getDataSourceConfiguration(); + } + public Date now() { return new Date(); } @@ -65,14 +79,18 @@ public class ObserveServiceContextTopia { return serviceFactory.newService(observeServiceInitializer, serviceType); } - public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { - ObserveServiceInitializer newObserveServiceInitializer = ObserveServiceInitializer.create(this.observeServiceInitializer); - newObserveServiceInitializer.setDataSourceConfiguration(dataSourceConfiguration); + public <S extends ObserveService> S newService(ObserveDataSourceConnection dataSourceConnection, Class<S> serviceType) { + ObserveServiceInitializer newObserveServiceInitializer = ObserveServiceInitializer.create(observeServiceInitializer); + newObserveServiceInitializer.setDataSourceConnection(dataSourceConnection); + newObserveServiceInitializer.setDataSourceConfiguration(null); return mainServiceFactory.newService(newObserveServiceInitializer, serviceType); } - public ObserveDataSourceConfigurationTopiaSupport getDataSourceConfiguration() { - return (ObserveDataSourceConfigurationTopiaSupport) observeServiceInitializer.getDataSourceConfiguration(); + public <S extends ObserveService> S newService(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { + ObserveServiceInitializer newObserveServiceInitializer = ObserveServiceInitializer.create(observeServiceInitializer); + newObserveServiceInitializer.setDataSourceConnection(null); + newObserveServiceInitializer.setDataSourceConfiguration(dataSourceConfiguration); + return mainServiceFactory.newService(newObserveServiceInitializer, serviceType); } public ObserveTopiaPersistenceContext getTopiaPersistenceContext() { 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 5b471ad..ed05742 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 @@ -8,6 +8,8 @@ import fr.ird.observe.ObserveTopiaApplicationContext; import fr.ird.observe.ObserveTopiaPersistenceContext; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; import fr.ird.observe.services.spi.NoDataAccess; import fr.ird.observe.services.spi.Write; import org.apache.commons.logging.Log; @@ -40,13 +42,33 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { } @Override + public <S extends ObserveService> boolean accept(ObserveDataSourceConnection dataSourceConnection, Class<S> serviceType) { + + Preconditions.checkNotNull(dataSourceConnection, "dataSourceConfiguration can't be null."); + Preconditions.checkNotNull(serviceType, "serviceType can't be null."); + return dataSourceConnection instanceof ObserveDataSourceConnectionTopia; + + } + + @Override public <S extends ObserveService> S newService(ObserveServiceInitializer observeServiceInitializer, Class<S> serviceType) { 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."); + if (observeServiceInitializer.withDataSourceConnection()) { + + ObserveDataSourceConnection dataSourceConnection = observeServiceInitializer.getDataSourceConnection(); + Preconditions.checkArgument(dataSourceConnection instanceof ObserveDataSourceConnectionTopia, "dataSourceConnection must be of type " + ObserveDataSourceConnectionTopia.class.getName()); + + } else { + + ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializer.getDataSourceConfiguration(); + Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConfiguration can't be null."); + Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationTopiaSupport.class.getName()); + + } + Class<S> serviceTypeImpl = getServiceClassType(serviceTypeCache, serviceType); Preconditions.checkNotNull(serviceTypeImpl, "serviceTypeImpl not found for : " + serviceType.getName()); @@ -103,14 +125,13 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { this.serviceContext = serviceContext; this.target = target; - this.methodNamesToByPass = ImmutableSet.of( - "equals", - "hashCode", - "finalize", - "toString", - "clone", - "getClass", - "close"); + this.methodNamesToByPass = ImmutableSet.of("equals", + "hashCode", + "finalize", + "toString", + "clone", + "getClass", + "close"); } @@ -119,8 +140,7 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { Object result; - if (methodNamesToByPass.contains(method.getName()) - || method.isAnnotationPresent(NoDataAccess.class)) { + if (methodNamesToByPass.contains(method.getName()) || method.isAnnotationPresent(NoDataAccess.class)) { result = invokeMethod(method, args); @@ -128,7 +148,21 @@ public class ObserveServiceFactoryTopia extends ObserveServiceFactorySupport { if (serviceContext.getTopiaApplicationContext() == null) { - ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(serviceContext.getDataSourceConfiguration()); + ObserveTopiaApplicationContext topiaApplicationContext; + ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration; + + if (serviceContext.withDataSourceConnection()) { + + String authenticationToken = serviceContext.getDataSourceConnection().getAuthenticationToken(); + topiaApplicationContext = ObserveTopiaApplicationContextFactory.getTopiaApplicationContext(authenticationToken); + + } else { + + dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(dataSourceConfiguration); + + } + serviceContext.setTopiaApplicationContext(topiaApplicationContext); } 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 7d2e310..5014aa5 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 @@ -110,7 +110,7 @@ public class ObserveServiceTopia implements ObserveService { } public static ImmutableSet<Class<? extends ReferentialDto>> getReferentialDtoTypes() { - ImmutableSet.Builder<Class<? extends ReferentialDto>> builder = new ImmutableSet.Builder<>(); + ImmutableSet.Builder<Class<? extends ReferentialDto>> builder = new ImmutableSet.Builder<>(); for (Map.Entry<Class<?>, Class<?>> entry : getDtoTypes()) { Class<?> dtoType = entry.getKey(); if (ReferentialDto.class.isAssignableFrom(dtoType)) { @@ -121,7 +121,7 @@ public class ObserveServiceTopia implements ObserveService { } public static ImmutableSet<Class<? extends IdDto>> getDataDtoTypes() { - ImmutableSet.Builder<Class<? extends IdDto>> builder = new ImmutableSet.Builder<>(); + ImmutableSet.Builder<Class<? extends IdDto>> builder = new ImmutableSet.Builder<>(); for (Map.Entry<Class<?>, Class<?>> entry : getDtoTypes()) { Class<?> dtoType = entry.getKey(); if (!ReferentialDto.class.isAssignableFrom(dtoType)) { @@ -324,7 +324,7 @@ public class ObserveServiceTopia implements ObserveService { try { DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setImportDatabase(importContent); - dataSourceService.create(dataSourceCreateConfiguration); + dataSourceService.create(temporaryDataSourceConfiguration, dataSourceCreateConfiguration); } catch (IncompatibleDataSourceCreateConfigurationException | DataSourceCreateWithNoReferentialImportException e) { //FIXME Avoir une exception plus concrete throw new RuntimeException("Could not create temporary database: " + prefix, e); @@ -348,7 +348,7 @@ public class ObserveServiceTopia implements ObserveService { try { DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); - dataSourceService.create(dataSourceCreateConfiguration); + dataSourceService.create(temporaryDataSourceConfiguration, dataSourceCreateConfiguration); } catch (IncompatibleDataSourceCreateConfigurationException | DataSourceCreateWithNoReferentialImportException e) { //FIXME Avoir une exception plus concrete throw new RuntimeException("Could not create temporary database: " + prefix, e); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java index 7d9783a..7119ed1 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/ObserveTopiaApplicationContextFactory.java @@ -45,7 +45,7 @@ public class ObserveTopiaApplicationContextFactory { public static ObserveTopiaApplicationContext createTopiaApplicationContext(ObserveDataSourceConfigurationTopiaSupport configuration, boolean initSchema) { Optional<ObserveTopiaApplicationContext> topiaApplicationContextIfPresent = getTopiaApplicationContextIfPresent(configuration); - Preconditions.checkState(!topiaApplicationContextIfPresent.isPresent(),"There is already a TopiaApplicationContext for configuration: "+configuration); + Preconditions.checkState(!topiaApplicationContextIfPresent.isPresent(), "There is already a TopiaApplicationContext for configuration: " + configuration); ObserveTopiaApplicationContext topiaApplicationContext = null; @@ -54,7 +54,7 @@ public class ObserveTopiaApplicationContextFactory { } else if (configuration instanceof ObserveDataSourceConfigurationTopiaPG) { topiaApplicationContext = createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaPG) configuration, initSchema); } - Preconditions.checkState(topiaApplicationContext != null, "Did not find how to create ObserveTopiaApplicationContext from: " + configuration); + Preconditions.checkNotNull(topiaApplicationContext, "Did not find how to create ObserveTopiaApplicationContext from: " + configuration); return topiaApplicationContext; } @@ -66,6 +66,20 @@ public class ObserveTopiaApplicationContextFactory { } + public static ObserveTopiaApplicationContext getTopiaApplicationContext(String authenticationToken) { + + ObserveTopiaApplicationContext result = null; + for (ObserveTopiaApplicationContext topiaApplicationContext : TOPIA_APPLICATION_CONTEXT_CACHE.values()) { + if (authenticationToken.equals(topiaApplicationContext.getAuthenticationToken())) { + result = topiaApplicationContext; + break; + } + } + Preconditions.checkNotNull(result, "Did not find how to create ObserveTopiaApplicationContext from: " + authenticationToken); + return result; + + } + public static void close() { for (TopiaApplicationContext topiaApplicationContext : new LinkedHashSet<>(TOPIA_APPLICATION_CONTEXT_CACHE.values())) { diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java index ff22891..ee25055 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java @@ -28,26 +28,14 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS /** Logger. */ private static final Log log = LogFactory.getLog(DataSourceServiceTopia.class); - //FIXME Supprimer cette méthode, on va plutot la placer au niveau de la factory @Override - public boolean exists() { - -// ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); -// return dataSourceConfiguration.datasourceExists(); - return true; - - } - - @Override - public ObserveDataSourceConnectionTopia create(DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + public ObserveDataSourceConnectionTopia create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { dataSourceCreateConfiguration.validateConfiguration(); boolean initSchema = !dataSourceCreateConfiguration.isImportDatabase(); - ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); - - ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.createTopiaApplicationContext(dataSourceConfiguration, initSchema); + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.createTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, initSchema); if (log.isInfoEnabled()) { log.info("Create topia application context: " + topiaApplicationContext); @@ -98,7 +86,6 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS // création d'une base temporaire pour y importer le référentiel ObserveDataSourceConfigurationTopiaH2 temporaryDataSourceConfiguration = createTemporaryDatabaseFromDump("ImportReferential", referentialDump); ObserveTopiaApplicationContext temporaryTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(temporaryDataSourceConfiguration); -// executeGzipSqlStatements(temporaryTopiaApplicationContext, "ImportReferential_" + importDataSourceConfiguration.getLabel(), referentialDump); // Réplication du référentiel replicateReferential(temporaryTopiaApplicationContext, topiaApplicationContext); @@ -120,7 +107,6 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS // création d'une base temporaire pour y importer le référentiel et les données ObserveDataSourceConfigurationTopiaH2 temporaryDataSourceConfiguration = createTemporaryDatabaseFromDump("ImportData", dataDump); ObserveTopiaApplicationContext temporaryTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(temporaryDataSourceConfiguration); -// executeGzipSqlStatements(temporaryTopiaApplicationContext, "ImportData_" + importDataSourceConfiguration.getLabel(), dataDump); if (!referantialImported) { @@ -144,27 +130,25 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - //FIXME A remplir apèrs avoir lue les droits sur le schema - return createDataSourceConnection(dataSourceConfiguration); + return createDataSourceConnection((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getAuthenticationToken()); } @Override - public ObserveDataSourceConnectionTopia open() throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { - - ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); + public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { - if (!exists()) { + //FIXME + if (false) { throw new DatabaseNotFoundException(dataSourceConfiguration); } - if (!canConnect()) { + //FIXME + if (false) { throw new DatabaseConnexionNotAuthorizedException(dataSourceConfiguration); } - ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(dataSourceConfiguration); - return createDataSourceConnection(dataSourceConfiguration); - + ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); + return createDataSourceConnection( (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getAuthenticationToken()); } @@ -180,16 +164,6 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - //FIXME Supprimer cette méthode, on va plutot la placer au niveau de la factory - @Override - public boolean canConnect() { - -// ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration = serviceContext.getDataSourceConfiguration(); -// return dataSourceConfiguration.datasourceExists(); - return true; - - } - @Override public void destroy() { @@ -209,17 +183,32 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS } - protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration) { - //FIXME A remplir apèrs avoir lue les droits sur le schema - boolean readReferential = true; - //FIXME A remplir apèrs avoir lue les droits sur le schema - boolean writeReferential = true; - //FIXME A remplir apèrs avoir lue les droits sur le schema - boolean readData = true; - //FIXME A remplir apèrs avoir lue les droits sur le schema - boolean writeData = true; + protected ObserveDataSourceConnectionTopia createDataSourceConnection(ObserveDataSourceConfigurationTopiaSupport dataSourceConfiguration, String authenticationToken) { + + boolean readReferential; + boolean writeReferential; + boolean readData; + boolean writeData; + + if (dataSourceConfiguration.isH2Database()) { + + // Sur une base H2, on a le droit de tout lire, mais uniquement d'écrire les données + readReferential = true; + writeReferential = false; + readData = true; + writeData = true; + } else { + + // Sur une base PG, on regarde en base ce que l'utilisateur peut lire/écrire + //FIXME A remplir apèrs avoir lue les droits sur le schema + readReferential = true; + writeReferential = true; + readData = true; + writeData = true; + + } ObserveDataSourceConnectionTopia dataSourceConnection = new ObserveDataSourceConnectionTopia( - dataSourceConfiguration, + authenticationToken, readReferential, writeReferential, readData, diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java b/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java index 0ac727d..3f83804 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/DataSourceResource.java @@ -73,7 +73,7 @@ public class DataSourceResource implements TestRule { DataSourceService dataSourceService = applicationContextResource.newService(dataSourceConfiguration, DataSourceService.class); DataSourceCreateConfigurationDto createConfiguration = new DataSourceCreateConfigurationDto(); createConfiguration.setImportDatabase(databaseToImportContent); - dataSourceService.create(createConfiguration); + dataSourceService.create(dataSourceConfiguration, createConfiguration); } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java index 6f38391..7d0aae4 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java @@ -54,17 +54,21 @@ public class DataSourceServiceTopiaTest { @Ignore @Test(expected = DatabaseNotFoundException.class) public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { - service.open(); + + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); + service.open(dataSourceConfiguration); + } @Test public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); - service.create(dataSourceCreateConfiguration); + service.create(dataSourceConfiguration, dataSourceCreateConfiguration); - service.open(); + service.open(dataSourceConfiguration); applicationContextResource.assertSchemaCreated(dataSourceResource.getTopiaApplicationContext()); } @@ -72,10 +76,11 @@ public class DataSourceServiceTopiaTest { @Test public void testCreateEmptyDataSource() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); - service.create(dataSourceCreateConfiguration); + service.create(dataSourceConfiguration, dataSourceCreateConfiguration); applicationContextResource.assertSchemaCreated(dataSourceResource.getTopiaApplicationContext()); } @@ -87,10 +92,11 @@ public class DataSourceServiceTopiaTest { byte[] dumpContent = dataSourceResource.getDatabaseToImportContent(scriptPath); + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setImportDatabase(dumpContent); - service.create(dataSourceCreateConfiguration); + service.create(dataSourceConfiguration, dataSourceCreateConfiguration); applicationContextResource.assertSchemaCreated(dataSourceResource.getTopiaApplicationContext()); } @@ -111,7 +117,7 @@ public class DataSourceServiceTopiaTest { DataSourceService dataSourceService = applicationContextResource.newService(createdDatabaseDataSourceConfiguration, DataSourceService.class); - dataSourceService.create(dataSourceCreateConfiguration); + dataSourceService.create(createdDatabaseDataSourceConfiguration, dataSourceCreateConfiguration); ObserveTopiaApplicationContext createdDatabaseTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(createdDatabaseDataSourceConfiguration); applicationContextResource.assertSchemaCreated(createdDatabaseTopiaApplicationContext); @@ -135,7 +141,7 @@ public class DataSourceServiceTopiaTest { DataSourceService dataSourceService = applicationContextResource.newService(createdDatabaseDataSourceConfiguration, DataSourceService.class); - dataSourceService.create(dataSourceCreateConfiguration); + dataSourceService.create(createdDatabaseDataSourceConfiguration, dataSourceCreateConfiguration); ObserveTopiaApplicationContext createdDatabaseTopiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext(createdDatabaseDataSourceConfiguration); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit b9bf71e4e49538918a1305f81e54bdf7d93f70cc Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:06:27 2015 +0200 Ajout du jeton d'authentification sur le DataSourceConnection --- .../java/fr/ird/observe/services/ObserveServiceInitializer.java | 4 ++++ .../services/configuration/ObserveDataSourceConnection.java | 5 +++++ .../configuration/ObserveDataSourceConnectionSupport.java | 8 ++------ 3 files changed, 11 insertions(+), 6 deletions(-) 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 index 8ea0674..779ed81 100644 --- 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 @@ -120,6 +120,10 @@ public class ObserveServiceInitializer { return dataSourceConnection.isPresent(); } + public boolean withDataSourceConfiguration() { + return dataSourceConfiguration.isPresent(); + } + protected void setApplicationLocale(Locale applicationLocale) { this.applicationLocale = applicationLocale; } diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java index 2871e9e..6484d53 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnection.java @@ -10,6 +10,11 @@ package fr.ird.observe.services.configuration; public interface ObserveDataSourceConnection { /** + * @return le jeton qui identifie cette connexion + */ + String getAuthenticationToken(); + + /** * @return {@code true} si on peut lire les référentiels, {@code false} sinon. */ boolean canReadReferential(); diff --git a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java index 37272d5..a803d10 100644 --- a/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java +++ b/observe-services-configuration-api/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConnectionSupport.java @@ -62,16 +62,12 @@ public abstract class ObserveDataSourceConnectionSupport implements ObserveDataS if (this == o) return true; if (!(o instanceof ObserveDataSourceConnectionSupport)) return false; ObserveDataSourceConnectionSupport that = (ObserveDataSourceConnectionSupport) o; - return Objects.equals(readReferential, that.readReferential) && - Objects.equals(writeReferential, that.writeReferential) && - Objects.equals(readData, that.readData) && - Objects.equals(writeData, that.writeData) && - Objects.equals(authenticationToken, that.authenticationToken); + return Objects.equals(authenticationToken, that.authenticationToken); } @Override public int hashCode() { - return Objects.hash(authenticationToken, readReferential, writeReferential, readData, writeData); + return Objects.hash(authenticationToken); } @Override -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit 3fca6475fecc55e6a3a7177f2fd80970520dc7c4 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:07:04 2015 +0200 Ajout d'un supplier de builder de Gson par default --- .../fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java index 5fc0b5e..b6e23fc 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/gson/ObserveDtoGsonSupplier.java @@ -16,6 +16,14 @@ import java.util.Date; */ public class ObserveDtoGsonSupplier implements Supplier<Gson> { + public static final Supplier<Gson> DEFAULT_GSON_SUPPLIER = new Supplier<Gson>() { + + @Override + public Gson get() { + return new ObserveDtoGsonSupplier().get(); + } + }; + protected GsonBuilder gsonBuilder; protected final boolean prettyPrint; -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit ae4d46b7247434c8131586153e27e334191ff3ee Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:07:42 2015 +0200 Revue du client reste --- ...bserveDataSourceConfigurationRestConstants.java | 6 + .../ObserveDataSourceConnectionAdapter.java | 24 + .../services/ObserveServiceFactoryRest.java | 209 +++++--- .../ird/observe/services/http/ObserveRequest.java | 77 +++ .../services/http/ObserveRequestBuilder.java | 134 ++++++ .../services/http/ObserveRequestMethod.java | 13 + .../ird/observe/services/http/ObserveResponse.java | 140 ++++++ .../services/http/ObserveResponseBuilder.java | 396 +++++++++++++++ .../ird/observe/services/http/RequestBuilder.java | 531 --------------------- .../ird/observe/services/http/RequestResult.java | 86 ---- .../fr/ird/observe/services/TestClassResource.java | 15 + .../service/DataSourceServiceRestTest.java | 18 +- .../service/seine/TripSeineServiceTest.java | 4 +- 13 files changed, 971 insertions(+), 682 deletions(-) diff --git a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java index 4df18a0..8bb72a4 100644 --- a/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java +++ b/observe-services-configuration-rest/src/main/java/fr/ird/observe/services/configuration/ObserveDataSourceConfigurationRestConstants.java @@ -1,5 +1,7 @@ package fr.ird.observe.services.configuration; +import fr.ird.observe.services.service.DataSourceService; + /** * Created on 04/09/15. * @@ -7,6 +9,10 @@ package fr.ird.observe.services.configuration; */ public interface ObserveDataSourceConfigurationRestConstants { + Package ROOT_SERVICES_PACKAGE = DataSourceService.class.getPackage(); + + String PARAMETER_DATA_SOURCE_CONFIGURATION = "dataSourceConfiguration"; + String REQUEST_APPLICATION_LOCALE = "applicationLocale"; String REQUEST_REFERENTIAL_LOCALE = "referentialLocale"; diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveDataSourceConnectionAdapter.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveDataSourceConnectionAdapter.java new file mode 100644 index 0000000..dfb45b2 --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveDataSourceConnectionAdapter.java @@ -0,0 +1,24 @@ +package fr.ird.observe.services; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; +import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; + +import java.lang.reflect.Type; + +/** + * Created on 05/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveDataSourceConnectionAdapter implements JsonDeserializer<ObserveDataSourceConnection> { + + @Override + public ObserveDataSourceConnection deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return context.deserialize(json, ObserveDataSourceConnectionRest.class); + } + +} 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 d0f262c..966f40d 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 @@ -3,8 +3,10 @@ package fr.ird.observe.services; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; import com.google.common.reflect.Reflection; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.thoughtworks.paranamer.CachingParanamer; import com.thoughtworks.paranamer.Paranamer; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; @@ -13,7 +15,11 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestC import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; -import fr.ird.observe.services.http.RequestBuilder; +import fr.ird.observe.services.http.ObserveRequest; +import fr.ird.observe.services.http.ObserveRequestBuilder; +import fr.ird.observe.services.http.ObserveRequestMethod; +import fr.ird.observe.services.http.ObserveResponse; +import fr.ird.observe.services.http.ObserveResponseBuilder; import fr.ird.observe.services.service.DataSourceService; import fr.ird.observe.services.spi.Write; import org.apache.commons.logging.Log; @@ -22,7 +28,6 @@ import org.apache.commons.logging.LogFactory; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; -import java.lang.reflect.Type; import java.util.Collection; /** @@ -35,11 +40,23 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl /** Logger. */ private static final Log log = LogFactory.getLog(ObserveServiceFactoryRest.class); - protected static final Package ROOT_SERVICES_PACKAGE = DataSourceService.class.getPackage(); - protected final CachingParanamer paranamer = new CachingParanamer(); - protected final Supplier<Gson> gsonSupplier = new ObserveDtoGsonSupplier(); + protected final Supplier<Gson> gsonSupplier = new ObserveDtoGsonSupplier() { + + @Override + protected GsonBuilder getGsonBuilder(boolean prettyPrint) { + + GsonBuilder builder = super.getGsonBuilder(prettyPrint); + + // Les ObserveDataSourceConnection sont obligatoirement de type ObserveDataSourceConnectionRest + builder.registerTypeAdapter(ObserveDataSourceConnection.class, new ObserveDataSourceConnectionAdapter()); + return builder; + + } + }; + + protected final ObserveResponseBuilder responseBuilder = ObserveResponseBuilder.create(gsonSupplier); @Override public <S extends ObserveService> boolean accept(ObserveDataSourceConfiguration dataSourceConfiguration, Class<S> serviceType) { @@ -70,12 +87,13 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl if (observeServiceInitializer.withDataSourceConnection()) { + // Connecté ObserveDataSourceConnection dataSourceConnection = observeServiceInitializer.getDataSourceConnection(); Preconditions.checkArgument(dataSourceConnection instanceof ObserveDataSourceConnectionRest, "dataSourceConfiguration must be of type " + ObserveDataSourceConnectionRest.class.getName()); } else { - // Pas encore connecte on utilise la configuration de la source de données + // Pas encore connecté on utilise la configuration de la source de données ObserveDataSourceConfiguration dataSourceConfiguration = observeServiceInitializer.getDataSourceConfiguration(); Preconditions.checkNotNull(dataSourceConfiguration, "dataSourceConnection and dataSourceConfiguration can't be null."); Preconditions.checkArgument(dataSourceConfiguration instanceof ObserveDataSourceConfigurationRest, "dataSourceConfiguration must be of type " + ObserveDataSourceConfigurationRest.class.getName()); @@ -89,12 +107,12 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl @Override public void close() { - //TODO Voir ce qu'il faut nettoyer, normalement pas grand chose + responseBuilder.close(); } protected <S extends ObserveService> S newRemoteProxyServiceInstance(Class<S> serviceType, ObserveServiceInitializer observeServiceInitializer) { - RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, observeServiceInitializer, gsonSupplier); + RemoteInvocationHandler handler = new RemoteInvocationHandler<>(paranamer, serviceType, observeServiceInitializer, gsonSupplier, responseBuilder); S result = Reflection.newProxy(serviceType, handler); return result; @@ -102,9 +120,7 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl protected static class RemoteInvocationHandler<E extends ObserveService> implements InvocationHandler { - protected final ObserveDataSourceConfigurationRest dataSourceConfiguration; - - protected final ObserveDataSourceConnectionRest dataSourceConnection; + protected final ObserveServiceInitializer observeServiceInitializer; protected final Supplier<Gson> gsonSupplier; @@ -112,37 +128,69 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl protected final Class<E> serviceClass; - protected final String serviceUrl; - protected final String applicationLocale; protected final String referentialLocale; - public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializer observeServiceInitializer, Supplier<Gson> gsonSupplier) { + protected final String locateService; + + protected final ObserveResponseBuilder responseBuilder; + + public RemoteInvocationHandler(Paranamer paranamer, Class<E> serviceClass, ObserveServiceInitializer observeServiceInitializer, Supplier<Gson> gsonSupplier, ObserveResponseBuilder responseBuilder) { this.paranamer = paranamer; this.serviceClass = serviceClass; - String locateService = serviceClass.getCanonicalName().replace(ROOT_SERVICES_PACKAGE.getName(), ""); - locateService = locateService.replace(".", "/"); + this.locateService = serviceClass.getCanonicalName().replace(ROOT_SERVICES_PACKAGE.getName(), "").replace(".", "/"); - if (observeServiceInitializer.withDataSourceConnection()) { + this.observeServiceInitializer = observeServiceInitializer; - this.dataSourceConnection = (ObserveDataSourceConnectionRest) observeServiceInitializer.getDataSourceConnection(); - this.dataSourceConfiguration = null; - this.serviceUrl = dataSourceConnection.getServerUrl() + locateService; - - } else { + if (!observeServiceInitializer.withDataSourceConnection() && !observeServiceInitializer.withDataSourceConfiguration()) { + + throw new IllegalStateException("No data source configuration, nor connection defined"); - this.dataSourceConnection = null; - this.dataSourceConfiguration = (ObserveDataSourceConfigurationRest) observeServiceInitializer.getDataSourceConfiguration(); - this.serviceUrl = dataSourceConfiguration.getServerUrl() + locateService; - } this.gsonSupplier = gsonSupplier; this.applicationLocale = observeServiceInitializer.getApplicationLocale().toString(); - this.referentialLocale = observeServiceInitializer.getReferentialLocale().toString(); + this.referentialLocale = observeServiceInitializer.getReferentialLocale().getLocale().toString(); + this.responseBuilder = responseBuilder; + } + + protected String getServiceUrl() { + String serviceUrl; + if (observeServiceInitializer.withDataSourceConnection()) { + + ObserveDataSourceConnectionRest dataSourceConnection = (ObserveDataSourceConnectionRest) observeServiceInitializer.getDataSourceConnection(); + serviceUrl = dataSourceConnection.getServerUrl() + locateService; + + } else if (observeServiceInitializer.withDataSourceConfiguration()) { + + ObserveDataSourceConfigurationRest dataSourceConfiguration = (ObserveDataSourceConfigurationRest) observeServiceInitializer.getDataSourceConfiguration(); + serviceUrl = dataSourceConfiguration.getServerUrl() + locateService; + } else { + + throw new IllegalStateException("No data source configuration, nor connection defined"); + + } + return serviceUrl; + } + + protected ObserveDataSourceConfigurationRest getDataSourceConfiguration() { + ObserveDataSourceConfigurationRest dataSourceConnection = null; + if (observeServiceInitializer.withDataSourceConfiguration()) { + dataSourceConnection = (ObserveDataSourceConfigurationRest) observeServiceInitializer.getDataSourceConfiguration(); + } + return dataSourceConnection; + } + + protected ObserveDataSourceConnectionRest getDataSourceConnection() { + ObserveDataSourceConnectionRest dataSourceConnection = null; + if (observeServiceInitializer.withDataSourceConnection()) { + dataSourceConnection = (ObserveDataSourceConnectionRest) observeServiceInitializer.getDataSourceConnection(); + } + return dataSourceConnection; } + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); @@ -162,45 +210,79 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl return null; } - String url = String.format("%s/%s", serviceUrl, methodName); - if (log.isDebugEnabled()) { - log.debug(String.format("Invoke remote service on endpoint: %s", url)); - } + ObserveRequest request = createRequest(method, methodName, args); - RequestBuilder requestBuilder = new RequestBuilder(url, gsonSupplier); - addParameters(requestBuilder, method, args); - addHeaders(requestBuilder); - Object result = getResult(method, requestBuilder); + ObserveResponse<?> response = responseBuilder.build(request, method.getGenericReturnType()); - return result; + Object result = response.getResultObject(); - } + if (DataSourceService.class.equals(serviceClass)) { - protected Object getResult(Method method, RequestBuilder requestBuilder) throws IOException { + if (OPEN_CONNECTION_METHOD_NAMES.contains(methodName)) { - Object result; - try { + ObserveDataSourceConnection dataSourceConnection = (ObserveDataSourceConnection) result; - boolean writeData = method.isAnnotationPresent(Write.class); + // On enregistre la connexion + observeServiceInitializer.setDataSourceConnection(dataSourceConnection); - Type genericReturnType = method.getGenericReturnType(); - if (writeData) { - result = requestBuilder.postAndGetJsonAndCloseConnection(genericReturnType); - } else { - result = requestBuilder.getJsonAndCloseConnection(genericReturnType); - } + // On supprime la configuration + observeServiceInitializer.setDataSourceConfiguration(null); + + } else if (CLOSE_CONNECTION_METHOD_NAMES.contains(methodName)) { + + // On supprime la connexion + observeServiceInitializer.setDataSourceConnection(null); - } catch (RuntimeException re) { - if (log.isWarnEnabled()) { - log.warn("An error occurred during remote service call", re); } - throw re; } + return result; } - protected void addParameters(RequestBuilder requestBuilder, Method method, Object... args) throws IOException { + protected ObserveRequest createRequest(Method method, String methodName, Object... args) throws IOException { + + ObserveRequestBuilder requestBuilder = ObserveRequestBuilder.create(gsonSupplier); + addParameters(requestBuilder, method, args); + addHeaders(requestBuilder); + + //FIXME On devrait utiliser des annotations POST, PUT et DELETE + boolean writeData = method.isAnnotationPresent(Write.class); + if (writeData) { + requestBuilder.setRequestMethod(ObserveRequestMethod.POST); + } else { + requestBuilder.setRequestMethod(ObserveRequestMethod.GET); + } + + String serviceUrl = getServiceUrl(); + String url = String.format("%s/%s", serviceUrl, methodName); + if (log.isDebugEnabled()) { + log.debug(String.format("Invoke remote service on endpoint: %s", url)); + } + + ObserveRequest request = requestBuilder.build(url); + return request; + + } + + protected static final ImmutableSet<String> OPEN_CONNECTION_METHOD_NAMES = ImmutableSet.of("create", "open"); + + protected static final ImmutableSet<String> CLOSE_CONNECTION_METHOD_NAMES = ImmutableSet.of("close"); + + protected void addParameters(ObserveRequestBuilder requestBuilder, Method method, Object... args) throws IOException { + + boolean reinjectConfiguration = false; + + if (DataSourceService.class.equals(serviceClass)) { + + if (OPEN_CONNECTION_METHOD_NAMES.contains(method.getName()) && getDataSourceConnection() == null && getDataSourceConfiguration() == null) { + + // On va essayer de réinjecter la configuration + reinjectConfiguration = true; + + } + + } String[] strings = paranamer.lookupParameterNames(method); int index = 0; @@ -215,14 +297,28 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl requestBuilder.addParameter(name, value); } } + + if (reinjectConfiguration && PARAMETER_DATA_SOURCE_CONFIGURATION.equals(name)) { + observeServiceInitializer.setDataSourceConfiguration((ObserveDataSourceConfiguration) args[index]); + } + index++; + } } - protected void addHeaders(RequestBuilder requestBuilder) { + protected void addHeaders(ObserveRequestBuilder requestBuilder) { - if (dataSourceConfiguration != null) { + ObserveDataSourceConnectionRest dataSourceConnection = getDataSourceConnection(); + if (dataSourceConnection != null) { + + requestBuilder.addHeader(REQUEST_AUTHENTICATION_TOKEN, dataSourceConnection.getAuthenticationToken()); + + } else { + + ObserveDataSourceConfigurationRest dataSourceConfiguration = getDataSourceConfiguration(); + Preconditions.checkState(dataSourceConfiguration != null, "Must have at least a connection or a configuration"); requestBuilder.addHeader(REQUEST_USER_LOGIN, dataSourceConfiguration.getLogin()); requestBuilder.addHeader(REQUEST_USER_PASSWORD, new String(dataSourceConfiguration.getPassword())); @@ -232,11 +328,8 @@ public class ObserveServiceFactoryRest extends ObserveServiceFactorySupport impl } - } else { - - requestBuilder.addHeader(REQUEST_AUTHENTICATION_TOKEN, dataSourceConnection.getAuthenticationToken()); - } + if (!Strings.isNullOrEmpty(applicationLocale)) { requestBuilder.addHeader(REQUEST_APPLICATION_LOCALE, applicationLocale); } diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequest.java new file mode 100644 index 0000000..e26b40b --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequest.java @@ -0,0 +1,77 @@ +package fr.ird.observe.services.http; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.apache.http.NameValuePair; + +import java.io.File; + +/** + * Created on 06/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveRequest { + + private final ObserveRequestMethod requestMethod; + + private final String baseUrl; + + private final String contentType; + + private final String requestBody; + + private final ImmutableMap<String, String> headers; + + private final ImmutableList<NameValuePair> parameters; + + private final ImmutableMap<String, File> files; + + public ObserveRequest(ObserveRequestMethod requestMethod, + String baseUrl, + String requestBody, + String contentType, + ImmutableMap<String, String> header, + ImmutableList<NameValuePair> params, + ImmutableMap<String, File> files) { + this.requestMethod = requestMethod; + this.baseUrl = baseUrl; + this.requestBody = requestBody; + this.contentType = contentType; + this.headers = header; + this.parameters = params; + this.files = files; + } + + public ObserveRequestMethod getRequestMethod() { + return requestMethod; + } + + public String getBaseUrl() { + return baseUrl; + } + + public String getContentType() { + return contentType; + } + + public String getRequestBody() { + return requestBody; + } + + public ImmutableMap<String, String> getHeaders() { + return headers; + } + + public ImmutableList<NameValuePair> getParameters() { + return parameters; + } + + public ImmutableMap<String, File> getFiles() { + return files; + } + + public boolean withoutFiles() { + return files.isEmpty(); + } +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestBuilder.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestBuilder.java new file mode 100644 index 0000000..7f59d2a --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestBuilder.java @@ -0,0 +1,134 @@ +package fr.ird.observe.services.http; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Preconditions; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.gson.Gson; +import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; + +/** + * @author Arnaud Thimel - thimel@codelutin.com + */ +public class ObserveRequestBuilder { + + protected final ImmutableList.Builder<NameValuePair> parameters; + + protected final ImmutableMap.Builder<String, String> headers; + + protected final ImmutableMap.Builder<String, File> files; + + protected final Gson gson; + + protected String requestBody; + + protected String contentType; + + protected ObserveRequestMethod requestMethod; + + public static ObserveRequestBuilder create(Supplier<Gson> gsonSupplier) { + return new ObserveRequestBuilder(gsonSupplier); + } + + public ObserveRequest build(String baseUrl) { + + Preconditions.checkNotNull(baseUrl, "'baseUrl' can't be null"); + Preconditions.checkState(requestMethod != null, "'requestMethod' was not setted"); + + ObserveRequest request = new ObserveRequest( + requestMethod, + baseUrl, + contentType, + requestBody, + headers.build(), + parameters.build(), + files.build() + ); + return request; + } + + public ObserveRequestBuilder setRequestMethod(ObserveRequestMethod requestMethod) { + this.requestMethod = requestMethod; + return this; + } + + public ObserveRequestBuilder setRequestBody(String requestBody) { + this.requestBody = requestBody; + return this; + } + + public ObserveRequestBuilder setContentType(String contentType) { + this.contentType = contentType; + return this; + } + + public ObserveRequestBuilder addHeader(String key, String value) { + checkRequestNotNull(key, value); + headers.put(key, value); + return this; + } + + public ObserveRequestBuilder addParameter(String parameterName, String value) { + checkParameterNotNull(parameterName, value); + parameters.add(new BasicNameValuePair(parameterName, value)); + return this; + } + + public ObserveRequestBuilder addParameter(String parameterName, int value) { + return addParameter(parameterName, String.valueOf(value)); + } + + public ObserveRequestBuilder addParameter(String parameterName, File file) { + checkParameterNotNull(parameterName, file); + files.put(parameterName, file); + return this; + } + + public ObserveRequestBuilder addParameter(String parameterName, Object toJson) throws IOException { + String json = gson.toJson(toJson); + return addParameter(parameterName, json); + } + + public ObserveRequestBuilder addParameter(String parameterName, Collection<?> toJsonList) throws IOException { + + // we must add values with same paramName to get List<?> in service + for (Object toJson : toJsonList) { + if (toJson instanceof String) { + + // don't serialize String objects + addParameter(parameterName, (String) toJson); + } else { + addParameter(parameterName, toJson); + } + } + return this; + } + + protected ObserveRequestBuilder(Supplier<Gson> gsonSupplier) { + this.headers = new ImmutableMap.Builder<>(); + this.files = new ImmutableMap.Builder<>(); + this.parameters = new ImmutableList.Builder<>(); + this.gson = MoreObjects.firstNonNull(gsonSupplier, ObserveDtoGsonSupplier.DEFAULT_GSON_SUPPLIER).get(); + } + + protected void checkParameterNotNull(String parparameterNamemName, Object value) { + checkKeyValueNotNull(parparameterNamemName, value, "Parameter key must be not null", "Parameter value must be not null for paramName : " + parparameterNamemName); + } + + protected void checkRequestNotNull(String key, Object value) { + checkKeyValueNotNull(key, value, "Request key must be not null", "Request value must be not null for key : " + key); + } + + protected void checkKeyValueNotNull(String key, Object value, String keyErrorMessage, String valueErrorMessage) { + Preconditions.checkNotNull(key, keyErrorMessage); + Preconditions.checkNotNull(value, valueErrorMessage); + } + +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestMethod.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestMethod.java new file mode 100644 index 0000000..5c3bbcb --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveRequestMethod.java @@ -0,0 +1,13 @@ +package fr.ird.observe.services.http; + +/** + * Created on 06/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public enum ObserveRequestMethod { + GET, + POST, + PUT, + DELETE +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponse.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponse.java new file mode 100644 index 0000000..9e1011e --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponse.java @@ -0,0 +1,140 @@ +package fr.ird.observe.services.http; + +import com.google.common.base.Preconditions; +import com.google.gson.Gson; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; + +import java.io.IOException; +import java.lang.reflect.Type; + +/** + * @author Arnaud Thimel - thimel@codelutin.com + */ +public class ObserveResponse<T> { + + /** Logger. */ + private static final Log log = LogFactory.getLog(ObserveResponse.class); + + protected final int statusCode; + + protected final Header[] headers; + + protected final String responseAsString; + + protected final T resultObject; + + protected ObserveResponse(int statusCode, Header[] headers, String responseAsString, T resultObject) throws IOException { + this.statusCode = statusCode; + this.headers = headers; + this.resultObject = resultObject; + this.responseAsString = responseAsString; + } + + public int getStatusCode() { + return statusCode; + } + + public Header[] getHeaders() { + return headers; + } + + public String getHeader(String key) { + return getHeader(key, headers); + } + + public boolean containsHeader(String key) { + for (Header header : headers) { + if (key.equals(header.getName())) { + return true; + } + } + return false; + } + + protected String getHeader(String key, Header[] headers) { + + for (Header header : headers) { + if (key.equals(header.getName())) { + return header.getValue(); + } + } + throw new IllegalArgumentException(key + " key is not found in header"); + } + + public String getResponse() throws IOException { + return responseAsString; + } + + public T getResultObject() { + return resultObject; + } + + public static <T> T convertJson(String json, Type type, Gson gson) throws IOException { + + Preconditions.checkNotNull(json); + Preconditions.checkNotNull(gson); + + // we must try to convert json to a T instance + T result = null; + +// try { + + // let's first try to convert json to T + if (!Void.TYPE.equals(type)) { + result = gson.fromJson(json, type); + } + +// } catch (IOException e) { +// +// // conversion to T failed, we will throw a json exception +// RemoteCallUnexpectedJsonException remoteCallUnexpectedJsonException; +// +// try { +// +// // before, try to read json as an error message +// remoteCallUnexpectedJsonException = RemoteCallUnexpectedJsonException.newFromJson(json); +// +// if (log.isInfoEnabled()) { +// log.info("service returned a json showing an error occurred ", remoteCallUnexpectedJsonException); +// } +// +// } catch (IOException ee) { +// +// if (log.isErrorEnabled()) { +// log.error("json parsing failed, json=" + json, e); +// } +// +// // json is not of type T and not an error message, +// // throw the exception with e as cause cause it may be the real problem +// remoteCallUnexpectedJsonException = RemoteCallUnexpectedJsonException.newFromParsingException(e); +// +// } +// +// throw remoteCallUnexpectedJsonException; +// +// } + + if (log.isTraceEnabled()) { + log.trace("parsing json " + json + " returns " + result); + } + + + return result; + } + + @Override + public String toString() { + StringBuilder buffer = new StringBuilder(). + append("HTTP ").append(statusCode).append('\n'); + if (headers != null) { + for (Header header : headers) { + buffer.append('[').append(header.getName()).append("] ").append(header.getValue()).append('\n'); + } + } + buffer.append('\n').append(responseAsString); + String result = buffer.toString(); + return result; + } +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java new file mode 100644 index 0000000..821120a --- /dev/null +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/http/ObserveResponseBuilder.java @@ -0,0 +1,396 @@ +package fr.ird.observe.services.http; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Preconditions; +import com.google.common.base.Supplier; +import com.google.gson.Gson; +import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntity; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.entity.mime.content.StringBody; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.PoolingClientConnectionManager; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.CoreConnectionPNames; +import org.apache.http.params.HttpParams; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveResponseBuilder { + + private static final Log log = LogFactory.getLog(ObserveResponseBuilder.class); + + public static ObserveResponseBuilder create(Supplier<Gson> gsonSupplier) { + return new ObserveResponseBuilder(new DefaultHttpClient(new PoolingClientConnectionManager()), gsonSupplier); + } + + public static ObserveResponseBuilder create(HttpClient client, Supplier<Gson> gsonSupplier) { + return new ObserveResponseBuilder(client, gsonSupplier); + } + + protected final HttpClient client; + + protected final Gson gson; + + protected class ResponseContext { + + final Integer statusCode; + + final String responseAsString; + + final Header[] responseHeaders; + + public ResponseContext(Integer statusCode, String responseAsString, Header... responseHeaders) { + this.statusCode = statusCode; + this.responseAsString = responseAsString; + this.responseHeaders = responseHeaders; + } + + } + + public <T> ObserveResponse<T> build(ObserveRequest request, Type resultType) throws IOException { + + String baseUrl = request.getBaseUrl(); + Preconditions.checkNotNull(baseUrl, "'baseUrl' can't be null"); + + ObserveRequestMethod requestMethod = request.getRequestMethod(); + Preconditions.checkState(requestMethod != null, "'requestMethod' was not setted"); + + ResponseContext responseContext = executeRequest(request); + + if (responseContext.statusCode != 200 && log.isWarnEnabled()) { + log.warn(String.format("Unexpected status code for url: %s\n%s", baseUrl, responseContext.responseAsString)); + } + + T resultObject = convertJson(responseContext.responseAsString, resultType); + ObserveResponse<T> result = new ObserveResponse<>(responseContext.statusCode, responseContext.responseHeaders, responseContext.responseAsString, resultObject); + + return result; + + } + + protected ResponseContext executeRequest(ObserveRequest request) throws IOException { + + Pair<? extends HttpRequestBase, HttpResponse> responsePair = null; + + try { + + ObserveRequestMethod requestMethod = request.getRequestMethod(); + switch (requestMethod) { + case GET: + responsePair = get0(request); + break; + case POST: + responsePair = post0(request, null); + break; + case PUT: + responsePair = put0(request); + break; + case DELETE: + responsePair = delete0(request); + break; + default: + throw new IllegalStateException("Can't come here!"); + } + + HttpResponse response = responsePair.getRight(); + + ResponseContext responseContext = consumeResponse(request, response); + return responseContext; + + } finally { + if (responsePair != null) { + close(responsePair); + } + } + + } + + protected ResponseContext consumeResponse(ObserveRequest request, HttpResponse response) throws IOException { + + String baseUrl = request.getBaseUrl(); + + Header[] responseHeaders = response.getAllHeaders(); + int statusCode = response.getStatusLine().getStatusCode(); + if (log.isDebugEnabled()) { + log.debug(request.getRequestMethod() + " '" + baseUrl + "' return status code : " + statusCode); + } + + response.getEntity(); + + String responseAsString; + + try (InputStream inputStream = response.getEntity().getContent()) { + try (StringWriter writer = new StringWriter()) { + IOUtils.copy(inputStream, writer, "UTF-8"); + responseAsString = writer.toString(); + } + } + return new ResponseContext(statusCode, responseAsString, responseHeaders); + } + + protected ObserveResponseBuilder(HttpClient client, Supplier<Gson> gsonSupplier) { + this.client = client; + this.gson = MoreObjects.firstNonNull(gsonSupplier, ObserveDtoGsonSupplier.DEFAULT_GSON_SUPPLIER).get(); + } + + protected Pair<HttpGet, HttpResponse> get0(ObserveRequest request) throws IOException { + + String baseUrl = request.getBaseUrl(); + String url = buildUrlWithParameters(baseUrl, request.getParameters()); + + HttpGet getMethod = new HttpGet(url); + + addHeaders(getMethod, request.getHeaders()); + + HttpResponse response = client.execute(getMethod); + + if (log.isDebugEnabled()) { + log.debug("GET '" + baseUrl + "' return status code : " + response.getStatusLine().getStatusCode()); + } + + return Pair.of(getMethod, response); + + } + + protected Pair<HttpPost, HttpResponse> post0(ObserveRequest request, Integer timeout) throws IOException { + + String baseUrl = request.getBaseUrl(); + String contentType = request.getContentType(); + String requestBody = request.getRequestBody(); + + HttpPost postMethod = new HttpPost(baseUrl); + + if (timeout != null) { + HttpParams httpParams = new BasicHttpParams(); + httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout); + httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout); + postMethod.setParams(httpParams); + } + + if (request.withoutFiles()) { + addHeaders(postMethod, request.getHeaders()); + addParameters(postMethod, contentType, request.getParameters()); + addRequestBody(postMethod, contentType, requestBody); + } else { + addHeaders(postMethod, request.getHeaders()); + addParameters(postMethod, contentType, request.getParameters()); + addRequestBody(postMethod, contentType, requestBody); + MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); + for (Map.Entry<String, File> paramFile : request.getFiles().entrySet()) { + entity.addPart(paramFile.getKey(), new FileBody(paramFile.getValue())); + } + for (NameValuePair param : request.getParameters()) { + if (StringUtils.isBlank(contentType)) { + contentType = "text/plain"; + } + entity.addPart(param.getName(), new StringBody(param.getValue(), contentType, + Charset.forName("UTF-8"))); + } + postMethod.setEntity(entity); + } + + HttpResponse response = client.execute(postMethod); + + if (log.isDebugEnabled()) { + log.debug("POST '" + baseUrl + "' return status code : " + response.getStatusLine().getStatusCode()); + } + + return Pair.of(postMethod, response); + + } + + protected Pair<HttpPut, HttpResponse> put0(ObserveRequest request) throws IOException { + + String baseUrl = request.getBaseUrl(); + + HttpPut putMethod = new HttpPut(baseUrl); + addHeaders(putMethod, request.getHeaders()); + + String contentType = request.getContentType(); + addParameters(putMethod, contentType, request.getParameters()); + addRequestBody(putMethod, contentType, request.getRequestBody()); + + HttpResponse response = client.execute(putMethod); + + if (log.isDebugEnabled()) { + log.debug("PUT '" + baseUrl + "' return status code : " + response.getStatusLine().getStatusCode()); + } + + return Pair.of(putMethod, response); + + } + + + protected Pair<HttpDelete, HttpResponse> delete0(ObserveRequest request) throws IOException { + + String baseUrl = request.getBaseUrl(); + + HttpDelete deleteMethod = new HttpDelete(buildUrlWithParameters(baseUrl, request.getParameters())); + + addHeaders(deleteMethod, request.getHeaders()); + + HttpResponse response = client.execute(deleteMethod); + + if (log.isDebugEnabled()) { + log.debug("DELETE '" + baseUrl + "' return status code : " + response.getStatusLine().getStatusCode()); + } + + return Pair.of(deleteMethod, response); + + } + + protected String buildUrlWithParameters(String baseUrl, List<NameValuePair> parameters) { + String result = baseUrl; + if (!parameters.isEmpty()) { + result += "?" + URLEncodedUtils.format(parameters, Charsets.UTF_8); + } + return result; + } + + protected <M extends HttpRequestBase> void addHeaders(M httpMethod, Map<String, String> headers) { + for (Map.Entry<String, String> entry : headers.entrySet()) { + httpMethod.setHeader(entry.getKey(), entry.getValue()); + } + } + + protected <M extends HttpEntityEnclosingRequestBase> void addParameters(M method, String contentType, List<? extends NameValuePair> parameters) throws UnsupportedEncodingException { + UrlEncodedFormEntity encodedFormEntity = new UrlEncodedFormEntity(parameters, Charsets.UTF_8); + if (StringUtils.isNotBlank(contentType)) { + encodedFormEntity.setContentType(contentType); + } + method.setEntity(encodedFormEntity); + } + + protected <M extends HttpEntityEnclosingRequestBase> void addRequestBody(M method, String contentType, String requestBody) throws UnsupportedEncodingException { + if (StringUtils.isNotEmpty(requestBody)) { + if (StringUtils.isNotBlank(contentType)) { + method.setEntity(new StringEntity(requestBody, ContentType.parse(contentType))); + } else { + method.setEntity(new StringEntity(requestBody)); + } + } + } + + public <T> T convertJson(String json, Type type) throws IOException { + + Preconditions.checkNotNull(json); + Preconditions.checkNotNull(gson); + + // we must try to convert json to a T instance + T result = null; + +// try { + + // let's first try to convert json to T + if (!Void.TYPE.equals(type)) { + result = gson.fromJson(json, type); + } + +// } catch (IOException e) { +// +// // conversion to T failed, we will throw a json exception +// RemoteCallUnexpectedJsonException remoteCallUnexpectedJsonException; +// +// try { +// +// // before, try to read json as an error message +// remoteCallUnexpectedJsonException = RemoteCallUnexpectedJsonException.newFromJson(json); +// +// if (log.isInfoEnabled()) { +// log.info("service returned a json showing an error occurred ", remoteCallUnexpectedJsonException); +// } +// +// } catch (IOException ee) { +// +// if (log.isErrorEnabled()) { +// log.error("json parsing failed, json=" + json, e); +// } +// +// // json is not of type T and not an error message, +// // throw the exception with e as cause cause it may be the real problem +// remoteCallUnexpectedJsonException = RemoteCallUnexpectedJsonException.newFromParsingException(e); +// +// } +// +// throw remoteCallUnexpectedJsonException; +// +// } + + if (log.isTraceEnabled()) { + log.trace("parsing json " + json + " returns " + result); + } + + + return result; + } + + protected void close(Pair<? extends HttpRequestBase, HttpResponse> responsePair) throws IOException { + + HttpRequestBase httpRequestBase = responsePair.getLeft(); + HttpResponse response = responsePair.getRight(); + + + if (response != null && response.getEntity() != null) { + response.getEntity().getContent().close(); + } + + // Release the connection. + httpRequestBase.releaseConnection(); + + } + + public void close() { + if (getConnectionManager() != null) { + getConnectionManager().shutdown(); + } + } + + @Override + protected void finalize() throws Throwable { + if (getConnectionManager() != null) { + getConnectionManager().closeExpiredConnections(); + getConnectionManager().closeIdleConnections(1, TimeUnit.MINUTES); + } + super.finalize(); + } + + protected ClientConnectionManager getConnectionManager() { + return client.getConnectionManager(); + } + +} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestBuilder.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestBuilder.java deleted file mode 100644 index 1a67ae0..0000000 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestBuilder.java +++ /dev/null @@ -1,531 +0,0 @@ -package fr.ird.observe.services.http; - -import com.google.common.base.Charsets; -import com.google.common.base.MoreObjects; -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.gson.Gson; -import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpDelete; -import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.methods.HttpRequestBase; -import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.entity.mime.HttpMultipartMode; -import org.apache.http.entity.mime.MultipartEntity; -import org.apache.http.entity.mime.content.FileBody; -import org.apache.http.entity.mime.content.StringBody; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.conn.PoolingClientConnectionManager; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.CoreConnectionPNames; -import org.apache.http.params.HttpParams; - -import java.io.File; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Type; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * @author Arnaud Thimel - thimel@codelutin.com - */ -public class RequestBuilder { - - private static final Log log = LogFactory.getLog(RequestBuilder.class); - - protected static final Supplier<Gson> DEFAULT_GSON_SUPPLIER = new Supplier<Gson>() { - - @Override - public Gson get() { - return new ObserveDtoGsonSupplier().get(); - } - }; - - protected HttpClient client; - - protected Map<String, String> header; - - protected List<NameValuePair> params; - - protected String baseUrl; - - protected String requestBody; - - protected String contentType; - - protected Map<String, File> files = Maps.newHashMap(); - - protected Supplier<Gson> gsonSupplier; - - protected Gson gson; - - public RequestBuilder(String baseUrl, HttpClient client, Supplier<Gson> gsonSupplier) { - this.baseUrl = baseUrl; - this.client = client; - this.header = Maps.newHashMap(); - this.params = Lists.newArrayList(); - this.gsonSupplier = MoreObjects.firstNonNull(gsonSupplier, DEFAULT_GSON_SUPPLIER); - } - -// public RequestBuilder(String baseUrl, HttpClient client) { -// this(baseUrl, client, null); -// } - - public RequestBuilder(String baseUrl, Supplier<Gson> gsonSupplier) { - this(baseUrl, new DefaultHttpClient(new PoolingClientConnectionManager()), gsonSupplier); - } - -// public RequestBuilder(String baseUrl) { -// this(baseUrl, (Supplier) null); -// } - - public RequestBuilder addToUrl(Collection<?> toJsonList) throws IOException { - - // we must add values with same paramName to get List<?> in service - for (Object toJson : toJsonList) { - if (toJson instanceof String) { - - // don't serialize String objects - addToUrl((String) toJson); - } else { - addToUrl(toJson); - } - } - return this; - } - - public Gson getGson() { - if (gson == null) { - gson = gsonSupplier.get(); - } - return gson; - } - - public RequestBuilder addToUrl(Object toJson) throws IOException { - String json = getGson().toJson(toJson); - return addToUrl(json); - } - - public RequestBuilder addToUrl(String url) throws UnsupportedEncodingException { - baseUrl = baseUrl + "/" + URLEncoder.encode(url, Charsets.UTF_8.name()); - return this; - } - - public RequestBuilder addHeader(String key, String value) { - checkRequestNotNull(key, value); - header.put(key, value); - return this; - } - - public void setContentType(String contentType) { - this.contentType = contentType; - } - - public RequestBuilder addParameter(String paramName, File file) { - files.put(paramName, file); - return this; - } - - public RequestBuilder addParameter(String paramName, Collection<?> toJsonList) throws IOException { - - // we must add values with same paramName to get List<?> in service - for (Object toJson : toJsonList) { - if (toJson instanceof String) { - - // don't serialize String objects - addParameter(paramName, (String) toJson); - } else { - addParameter(paramName, toJson); - } - } - return this; - } - - public RequestBuilder addParameter(String paramName, Object toJson) throws IOException { - String json = getGson().toJson(toJson); - return addParameter(paramName, json); - } - - public RequestBuilder addParameter(String paramName, String value) { - checkParameterNotNull(paramName, value); - params.add(new BasicNameValuePair(paramName, value)); - return this; - } - - public RequestBuilder addParameter(String paramName, int value) { - return addParameter(paramName, String.valueOf(value)); - } - - public RequestBuilder addParameters(String paramName, String value, String... others) { - checkParameterNotNull(paramName, value); - params.add(new BasicNameValuePair(paramName, value)); - String name = null; - for (int i = 0; i < others.length; ) { - try { - name = others[i++]; - value = others[i++]; - checkParameterNotNull(paramName, value); - params.add(new BasicNameValuePair(name, value)); - } catch (ArrayIndexOutOfBoundsException eee) { - throw new IllegalArgumentException( - "Parameters number must be pair number : " - + (others.length + 2) + " Last parameter is : " + name, eee); - } - } - return this; - } - - public RequestBuilder setRequestBody(String requestBody) { - this.requestBody = requestBody; - return this; - } - - protected void checkParameterNotNull(String paramName, String value) { - checkKeyValueNotNull(paramName, value, "Parameter key must be not null", "Parameter value must be not null for paramName : " + paramName); - } - - protected void checkRequestNotNull(String key, String value) { - checkKeyValueNotNull(key, value, "Request key must be not null", "Request value must be not null for key : " + key); - } - - protected void checkKeyValueNotNull(String key, String value, String keyErrorMessage, String valueErrorMessage) { - Preconditions.checkNotNull(key, keyErrorMessage); - Preconditions.checkNotNull(value, valueErrorMessage); - } - - protected <M extends HttpRequestBase> M addHeaders(M httpMethod) { - for (Map.Entry<String, String> entry : header.entrySet()) { - httpMethod.setHeader(entry.getKey(), entry.getValue()); - } - return httpMethod; - } - - protected <M extends HttpEntityEnclosingRequestBase> M addParameters(M method) throws UnsupportedEncodingException { - UrlEncodedFormEntity encodedFormEntity = new UrlEncodedFormEntity(params, "UTF-8"); - if (StringUtils.isNotBlank(contentType)) { - encodedFormEntity.setContentType(contentType); - } - method.setEntity(encodedFormEntity); - return method; - } - - protected <M extends HttpEntityEnclosingRequestBase> M addRequestBody(M method) throws UnsupportedEncodingException { - if (StringUtils.isNotEmpty(requestBody)) { - if (StringUtils.isNotBlank(contentType)) { - method.setEntity(new StringEntity(requestBody, ContentType.parse(contentType))); - } else { - method.setEntity(new StringEntity(requestBody)); - } - } - return method; - } - - public String buildUrlWithParams(String baseUrl) { - return baseUrl + "?" + URLEncodedUtils.format(params, "UTF-8"); - } - - protected RequestResult get0() throws IOException { - - HttpGet getMethod = new HttpGet(buildUrlWithParams(baseUrl)); - - getMethod = addHeaders(getMethod); - - HttpResponse response = null; - try { - response = client.execute(getMethod); - - RequestResult result = new RequestResult(response); - if (log.isDebugEnabled()) { - log.debug("GET '" + baseUrl + "' return status code : " + result.getStatusCode()); - } - - return result; - } finally { - - if (response != null && response.getEntity() != null) { - response.getEntity().getContent().close(); - } - - // Release the connection. - getMethod.releaseConnection(); - } - } - - public RequestResult getAndCloseConnection() throws IOException { - - try { - RequestResult result = get0(); - return result; - } finally { - releaseConnections(); - } - } - - public <T> T getJsonAndCloseConnection(Type type) throws IOException { - RequestResult getResult = getAndCloseConnection(); - if (getResult.getStatusCode() != 200 && log.isWarnEnabled()) { - log.warn(String.format("Unexpected status code for url: %s%n%s", baseUrl, getResult)); - } - T result = convertJson(getResult.getResponse(), type, getGson()); - return result; - } - - protected RequestResult post0(Integer timeout) throws IOException { - - HttpPost postMethod = new HttpPost(baseUrl); - - if (timeout != null) { - HttpParams httpParams = new BasicHttpParams(); - httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout); - httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout); - postMethod.setParams(httpParams); - } - - if (files.isEmpty()) { - postMethod = addHeaders(postMethod); - postMethod = addParameters(postMethod); - postMethod = addRequestBody(postMethod); - } else { - postMethod = addHeaders(postMethod); - postMethod = addParameters(postMethod); - postMethod = addRequestBody(postMethod); - MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); - for (Map.Entry<String, File> paramFile : files.entrySet()) { - entity.addPart(paramFile.getKey(), new FileBody(paramFile.getValue())); - } - for (NameValuePair param : params) { - if (StringUtils.isBlank(contentType)) { - contentType = "text/plain"; - } - entity.addPart(param.getName(), new StringBody(param.getValue(), contentType, - Charset.forName("UTF-8"))); - } - postMethod.setEntity(entity); - } - - HttpResponse response = null; - try { - response = client.execute(postMethod); - - RequestResult result = new RequestResult(response); - if (log.isDebugEnabled()) { - log.debug("POST '" + baseUrl + "' return status code : " + result.getStatusCode()); - } - - return result; - } finally { - - if (response != null && response.getEntity() != null) { - response.getEntity().getContent().close(); - } - - // Release the connection. - postMethod.releaseConnection(); - } - } - - public RequestResult postAndCloseConnection() throws IOException { - RequestResult result = postAndCloseConnection(null); - return result; - } - - public RequestResult postAndCloseConnection(Integer timeout) throws IOException { - try { - RequestResult result = post0(timeout); - return result; -// } catch (ConnectTimeoutException cte) { -// throw new RemoteCallTimeoutException("Timeout (" + timeout + ") reached", cte); - } finally { - releaseConnections(); - } - } - - public <T> T postAndGetJsonAndCloseConnection(Type type) throws IOException { - RequestResult postResult = postAndCloseConnection(); - if (postResult.getStatusCode() != 200 && log.isWarnEnabled()) { - log.warn(String.format("Unexpected status code: %d\nResponse is: %s", postResult.getStatusCode(), postResult)); - } - T result = convertJson(postResult.getResponse(), type, getGson()); - return result; - } - - protected RequestResult put0() throws IOException { - - HttpPut putMethod = new HttpPut(baseUrl); - - putMethod = addHeaders(putMethod); - putMethod = addParameters(putMethod); - putMethod = addRequestBody(putMethod); - - HttpResponse response = null; - try { - response = client.execute(putMethod); - - RequestResult result = new RequestResult(response); - - if (log.isDebugEnabled()) { - log.debug("PUT '" + baseUrl + "' return status code : " + result.getStatusCode()); - if (result.getStatusCode() != HttpStatus.SC_OK) { - log.debug(result.getResponse()); - } - } - - return result; - } finally { - - if (response != null && response.getEntity() != null) { - response.getEntity().getContent().close(); - } - - // Release the connection. - putMethod.releaseConnection(); - } - } - - protected RequestResult delete0() throws IOException { - - HttpDelete deleteMethod = new HttpDelete(buildUrlWithParams(baseUrl)); - - deleteMethod = addHeaders(deleteMethod); - - HttpResponse response = null; - try { - response = client.execute(deleteMethod); - - RequestResult result = new RequestResult(response); - if (log.isDebugEnabled()) { - log.debug("DELETE '" + baseUrl + "' return status code : " + result.getStatusCode()); - } - - return result; - } finally { - - if (response != null && response.getEntity() != null) { - response.getEntity().getContent().close(); - } - - // Release the connection. - deleteMethod.releaseConnection(); - } - } - - public static <T> T convertJson(String json, Type type) throws IOException { - return convertJson(json, type, DEFAULT_GSON_SUPPLIER.get()); - } - - public static <T> T convertJson(String json, Type type, Gson gson) throws IOException { - - Preconditions.checkNotNull(json); - Preconditions.checkNotNull(gson); - - // we must try to convert json to a T instance - T result = null; - -// try { - - // let's first try to convert json to T - if (!Void.TYPE.equals(type)) { - result = gson.fromJson(json, type); - } - -// } catch (IOException e) { -// -// // conversion to T failed, we will throw a json exception -// RemoteCallUnexpectedJsonException remoteCallUnexpectedJsonException; -// -// try { -// -// // before, try to read json as an error message -// remoteCallUnexpectedJsonException = RemoteCallUnexpectedJsonException.newFromJson(json); -// -// if (log.isInfoEnabled()) { -// log.info("service returned a json showing an error occurred ", remoteCallUnexpectedJsonException); -// } -// -// } catch (IOException ee) { -// -// if (log.isErrorEnabled()) { -// log.error("json parsing failed, json=" + json, e); -// } -// -// // json is not of type T and not an error message, -// // throw the exception with e as cause cause it may be the real problem -// remoteCallUnexpectedJsonException = RemoteCallUnexpectedJsonException.newFromParsingException(e); -// -// } -// -// throw remoteCallUnexpectedJsonException; -// -// } - - if (log.isTraceEnabled()) { - log.trace("parsing json " + json + " returns " + result); - } - - - return result; - } - - @Override - public String toString() { - MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(this).add("url", baseUrl); - if (header != null) { - for (Map.Entry<String, String> entry : header.entrySet()) { - String key = String.format("Header [%s]", entry.getKey()); - String value = entry.getValue(); - helper.add(key, value); - } - } - if (params != null) { - for (NameValuePair pair : params) { - String key = String.format("Param [%s]", pair.getName()); - String value = pair.getValue(); - helper.add(key, value); - } - } - - if (StringUtils.isNotBlank(contentType)) { - helper.add("Content-type", contentType); - } - - String result = helper.toString(); - return result; - } - - public void releaseConnections() { - if (client != null && client.getConnectionManager() != null) { - client.getConnectionManager().shutdown(); - } - } - - @Override - protected void finalize() throws Throwable { - if (client != null && client.getConnectionManager() != null) { - client.getConnectionManager().closeExpiredConnections(); - client.getConnectionManager().closeIdleConnections(1, TimeUnit.MINUTES); - } - super.finalize(); - } - -} diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestResult.java b/observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestResult.java deleted file mode 100644 index 47d7ed2..0000000 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/http/RequestResult.java +++ /dev/null @@ -1,86 +0,0 @@ -package fr.ird.observe.services.http; - -import org.apache.commons.io.IOUtils; -import org.apache.http.Header; -import org.apache.http.HttpResponse; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; - -/** - * @author Arnaud Thimel - thimel@codelutin.com - */ -public class RequestResult { - - protected final int statusCode; - - protected final Header[] headers; - - protected final String responseAsString; - - public RequestResult(HttpResponse response) throws IOException { - this.statusCode = response.getStatusLine().getStatusCode(); - this.headers = response.getAllHeaders(); - response.getEntity(); - - try (InputStream inputStream = response.getEntity().getContent()) { - - try (StringWriter writer = new StringWriter()) { - - IOUtils.copy(inputStream, writer, "UTF-8"); - - responseAsString = writer.toString(); - } - } - } - - public int getStatusCode() { - return statusCode; - } - - public Header[] getHeaders() { - return headers; - } - - public String getHeader(String key) { - return getHeader(key, headers); - } - - public boolean containsHeader(String key) { - for (Header header : headers) { - if (key.equals(header.getName())) { - return true; - } - } - return false; - } - - protected String getHeader(String key, Header[] headers) { - - for (Header header : headers) { - if (key.equals(header.getName())) { - return header.getValue(); - } - } - throw new IllegalArgumentException(key + " key is not found in header"); - } - - public String getResponse() throws IOException { - return responseAsString; - } - - @Override - public String toString() { - StringBuilder buffer = new StringBuilder(). - append("HTTP ").append(statusCode).append('\n'); - if (headers != null) { - for (Header header : headers) { - buffer.append('[').append(header.getName()).append("] ").append(header.getValue()).append('\n'); - } - } - buffer.append('\n').append(responseAsString); - String result = buffer.toString(); - return result; - } -} diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java b/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java index b3b2f24..a7f4de9 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/TestClassResource.java @@ -137,4 +137,19 @@ public class TestClassResource implements TestRule { } + public ObserveDataSourceConfigurationRest createDataSourceConfigurationRest(Class<?> testClass, + String login, + char... password) { + + ObserveDataSourceConfigurationRest configurationRest = new ObserveDataSourceConfigurationRest(); + configurationRest.setLabel(testClass.getSimpleName() + "#" + serverUrl); + configurationRest.setServerUrl(serverUrl); + configurationRest.setLogin(login); + configurationRest.setPassword(password); + configurationRest.setOptionalDatabaseName(Optional.<String>absent()); + + return configurationRest; + + } + } diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java index 1dbab67..b3fb694 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java @@ -3,9 +3,11 @@ package fr.ird.observe.services.service; import fr.ird.observe.services.TestClassResource; import fr.ird.observe.services.TestMethodResource; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; +import fr.ird.observe.services.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportException; import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; +import org.junit.Assert; import org.junit.Assume; import org.junit.Before; import org.junit.ClassRule; @@ -36,7 +38,7 @@ public class DataSourceServiceRestTest { service = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); //TODO Tester si le serveur est accessible sinon on ignore le test - boolean serverExist = false; + boolean serverExist = true; Assume.assumeTrue("Serveur " + dataSourceConfiguration.getServerUrl() + " no found", serverExist); @@ -54,11 +56,17 @@ public class DataSourceServiceRestTest { public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); - DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); - dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); - service.create(dataSourceConfiguration, dataSourceCreateConfiguration); + ObserveDataSourceConnection dataSourceConnection = service.open(dataSourceConfiguration); + Assert.assertNotNull(dataSourceConnection); + Assert.assertNotNull(dataSourceConnection.getAuthenticationToken()); - service.open(dataSourceConfiguration); + service.close(); + + dataSourceConnection = service.open(dataSourceConfiguration); + Assert.assertNotNull(dataSourceConnection); + Assert.assertNotNull(dataSourceConnection.getAuthenticationToken()); + + service.close(); } diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTest.java b/observe-services-rest/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTest.java index 6e25e91..88c0ccd 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTest.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/service/seine/TripSeineServiceTest.java @@ -4,7 +4,7 @@ import com.google.common.collect.Collections2; import com.google.common.collect.Iterables; import fr.ird.observe.services.TestClassResource; import fr.ird.observe.services.TestMethodResource; -import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRestSupport; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationRest; import fr.ird.observe.services.dto.FormDto; import fr.ird.observe.services.dto.IdDtos; import fr.ird.observe.services.dto.ReferenceSetDto; @@ -49,7 +49,7 @@ public class TripSeineServiceTest { @Before public void setUp() throws Exception { - ObserveDataSourceConfigurationRestSupport dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); + ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); service = testClassResource.newService(dataSourceConfiguration, TripSeineService.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 feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit e8d18506f0a0bea9029748d7cc620844f0022500 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:09:03 2015 +0200 Utilisation d'un main handler et faire fonctionner la connexion à une source de données --- .../ObserveDataSourceConfigurationConverter.java | 47 ++++++++ .../web/ObserveWebApplicationListener.java | 30 +++++ .../application/web/ObserveWebMainHandler.java | 27 +++++ .../web/ObserveWebMotionJsonHelper.java | 130 --------------------- .../controller/v1/DataSourceServiceController.java | 10 +- observe-application-web/src/main/resources/mapping | 1 + 6 files changed, 110 insertions(+), 135 deletions(-) diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveDataSourceConfigurationConverter.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveDataSourceConfigurationConverter.java new file mode 100644 index 0000000..0e688ae --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveDataSourceConfigurationConverter.java @@ -0,0 +1,47 @@ +package fr.ird.observe.application.web; + +import com.google.gson.Gson; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; +import fr.ird.observe.services.dto.gson.ObserveDtoGsonSupplier; +import org.apache.commons.beanutils.converters.AbstractConverter; + +/** + * Created on 05/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveDataSourceConfigurationConverter extends AbstractConverter { + + protected final Gson gson; + + public ObserveDataSourceConfigurationConverter(boolean devMode) { + gson = new ObserveDtoGsonSupplier(devMode).get(); + } + + @Override + protected <T> T convertToType(Class<T> type, Object value) throws Throwable { + + String stringValue; + + if (value instanceof String) { + + stringValue = (String) value; + + } else { + + stringValue = ((String[]) value)[0]; + + } + + T result = (T) gson.fromJson(stringValue, ObserveDataSourceConfigurationTopiaPG.class); + + return result; + + } + + @Override + protected Class<?> getDefaultType() { + return ObserveDataSourceConfiguration.class; + } +} 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 1f87b1c..f25db9d 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 @@ -1,11 +1,17 @@ package fr.ird.observe.application.web; +import fr.ird.observe.application.web.request.ObserveWebRequestContext; +import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.debux.webmotion.server.WebMotionServerListener; +import org.debux.webmotion.server.call.Call; import org.debux.webmotion.server.call.ServerContext; +import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; import org.debux.webmotion.server.mapping.Mapping; +import java.lang.reflect.Type; + /** * @author Tony Chemit : chemit@codelutin.com */ @@ -29,6 +35,30 @@ public class ObserveWebApplicationListener implements WebMotionServerListener { throw new ObserveWebApplicationContextInitException("Impossible d'initialiser le context applicatif", e); } + context.addInjector(new ExecutorParametersInjectorHandler.Injector() { + + @Override + public Object getValue(Mapping mapping, Call call, String name, Class<?> type, Type generic) { + + ObserveDataSourceConfiguration dataSourceConfiguration = null; + if (type.equals(ObserveDataSourceConfiguration.class)) { + + // on recupère la configuration de source de données depuis le requestContext + ObserveWebRequestContext requestContext = ObserveWebRequestContext.getRequestContext(call.getContext()); + + dataSourceConfiguration = requestContext.getDataSourceConfiguration(); + + if (log.isInfoEnabled()) { + log.info("Inject dataSourceConfiguration: " + dataSourceConfiguration); + } + + } + + return dataSourceConfiguration; + + } + }); + context.getServletContext().setAttribute( ObserveWebApplicationContext.APPLICATION_CONTEXT_PARAMETER, applicationContext); diff --git a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMainHandler.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMainHandler.java new file mode 100644 index 0000000..b94820b --- /dev/null +++ b/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMainHandler.java @@ -0,0 +1,27 @@ +package fr.ird.observe.application.web; + +import org.debux.webmotion.server.WebMotionHandler; +import org.debux.webmotion.server.WebMotionMainHandler; +import org.debux.webmotion.server.handler.ExecutorInstanceCreatorHandler; +import org.debux.webmotion.server.handler.ExecutorParametersConvertorHandler; +import org.debux.webmotion.server.handler.ExecutorParametersInjectorHandler; +import org.debux.webmotion.server.tools.OrderedList; + +/** + * On utilise un main handler pour supprimer la validation proposée par hibernate car ça ne fonctionne pas! + * + * Created on 05/09/15. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class ObserveWebMainHandler extends WebMotionMainHandler { + + @Override + public OrderedList<Class<? extends WebMotionHandler>> getExecutorHandlers() { + return OrderedList.asList( + ExecutorInstanceCreatorHandler.class, + ExecutorParametersInjectorHandler.class, + ExecutorParametersConvertorHandler.class + ); + } +} 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 deleted file mode 100644 index ca01d38..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/ObserveWebMotionJsonHelper.java +++ /dev/null @@ -1,130 +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 com.google.gson.ExclusionStrategy; -import com.google.gson.FieldAttributes; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import java.lang.reflect.Type; -import java.util.Date; - -/** - * Created on 5/24/14. - * - * @author Tony Chemit - chemit@codelutin.com - * @since 2.0 - */ -public class ObserveWebMotionJsonHelper { - - private final Gson gson; - - public ObserveWebMotionJsonHelper(boolean prettyPrint) { - - GsonBuilder gsonBuilder = new GsonBuilder(); - - gsonBuilder.setExclusionStrategies(new ExclusionStrategy() { - - @Override - public boolean shouldSkipField(FieldAttributes f) { - return false; - } - - @Override - public boolean shouldSkipClass(Class<?> clazz) { - return clazz == Class.class; - } - }); - - gsonBuilder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() { - - @Override - public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { - - JsonElement result; - - if (src == null) { - - result = JsonNull.INSTANCE; - - } else { - - result = new JsonPrimitive(src.getTime()); - - } - - return result; - - } - - }); - - gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { - - @Override - public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return new Date(json.getAsLong()); - } - - }); - - if (prettyPrint) { - - gsonBuilder.setPrettyPrinting(); - - } - - this.gson = gsonBuilder.create(); - - } - - public String toJson(Object model) { - - String json = gson.toJson(model); - return json; - - } - - public <O> O fromJson(String json, Class<O> type) { - - O o = gson.fromJson(json, type); - return o; - - } - - public <O> O fromJson(String json, Type type) { - - O o = gson.fromJson(json, type); - return o; - - } - -} 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 8d79e93..28a2972 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 @@ -30,23 +30,23 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override - public ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { + public ObserveDataSourceConnectionRest create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { ObserveDataSourceConnection observeDataSourceConnection = service.create(dataSourceConfiguration, dataSourceCreateConfiguration); String authenticationToken = registerDataSourceConfiguration(); - ObserveDataSourceConnection dataSourceConnection = createDataSourceConnection(observeDataSourceConnection, authenticationToken); + ObserveDataSourceConnectionRest dataSourceConnection = createDataSourceConnection(observeDataSourceConnection, authenticationToken); return dataSourceConnection; } @Override - public ObserveDataSourceConnection open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + public ObserveDataSourceConnectionRest open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { ObserveDataSourceConnection observeDataSourceConnection = service.open(dataSourceConfiguration); String authenticationToken = registerDataSourceConfiguration(); - ObserveDataSourceConnection dataSourceConnection = createDataSourceConnection(observeDataSourceConnection, authenticationToken); + ObserveDataSourceConnectionRest dataSourceConnection = createDataSourceConnection(observeDataSourceConnection, authenticationToken); return dataSourceConnection; } @@ -91,7 +91,7 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } - protected ObserveDataSourceConnection createDataSourceConnection(ObserveDataSourceConnection observeDataSourceConnection, String authenticationToken) { + protected ObserveDataSourceConnectionRest createDataSourceConnection(ObserveDataSourceConnection observeDataSourceConnection, String authenticationToken) { ObserveDataSourceConnectionRest dataSourceConnection = new ObserveDataSourceConnectionRest( getApplicationConfiguration().getApiUrl(), diff --git a/observe-application-web/src/main/resources/mapping b/observe-application-web/src/main/resources/mapping index b5936f8..60d2791 100644 --- a/observe-application-web/src/main/resources/mapping +++ b/observe-application-web/src/main/resources/mapping @@ -31,6 +31,7 @@ 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.main.handler.class=fr.ird.observe.application.web.ObserveWebMainHandler server.controller.scope=request server.listener.class=fr.ird.observe.application.web.ObserveWebApplicationListener default.render=fr.ird.observe.application.web.ObserveWebMotionRender -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit cb211a96b80249ee743c9cc1eee741f22096e88f Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 11:21:44 2015 +0200 Permettre de connecter plusieurs utilisateurs à la même source de données (un must pour une application web... --- .../application/web/ObserveWebMotionFilter.java | 5 ++-- .../controller/v1/DataSourceServiceController.java | 11 +------- ...urceConfigurationAlreadyRegistredException.java | 27 ------------------- .../ObserveWebSecurityApplicationContext.java | 30 +++++----------------- ...ObserveWebSecurityAuthenticationTokenCache.java | 10 +++----- .../service/DataSourceServiceRestTest.java | 24 +++++++++-------- 6 files changed, 27 insertions(+), 80 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 4590091..562c5c2 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 @@ -4,7 +4,6 @@ import com.google.common.base.Optional; 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; import fr.ird.observe.application.web.security.ObserveWebSecurityApplicationContext; import fr.ird.observe.application.web.security.UnknownObserveWebUserException; @@ -25,7 +24,7 @@ import java.util.Locale; */ public class ObserveWebMotionFilter extends WebMotionFilter implements ObserveDataSourceConfigurationRestConstants { - public void inject(HttpContext context) throws InvalidAuthenticationTokenException, UnknownObserveWebUserException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserForDatabaseException, InvalidAdminKeyApiException { + public void inject(HttpContext context) throws InvalidAuthenticationTokenException, UnknownObserveWebUserException, BadObserveWebUserPasswordException, UnknownObserveWebUserForDatabaseException, InvalidAdminKeyApiException { ObserveWebApplicationContext applicationContext = ObserveWebApplicationContext.getApplicationContext(context); @@ -75,7 +74,7 @@ public class ObserveWebMotionFilter extends WebMotionFilter implements ObserveDa } - protected ObserveWebRequestSecurityContext createSecurityContext(ObserveWebApplicationContext applicationContext, HttpServletRequest request) throws InvalidAuthenticationTokenException, UnknownObserveWebUserForDatabaseException, BadObserveWebUserPasswordException, DataSourceConfigurationAlreadyRegistredException, UnknownObserveWebUserException { + protected ObserveWebRequestSecurityContext createSecurityContext(ObserveWebApplicationContext applicationContext, HttpServletRequest request) throws InvalidAuthenticationTokenException, UnknownObserveWebUserForDatabaseException, BadObserveWebUserPasswordException, UnknownObserveWebUserException { ObserveWebRequestSecurityContext securityContext = null; String authenticationToken = getRequestHeaderOrParameterValueOrNull(request, REQUEST_AUTHENTICATION_TOKEN); 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 28a2972..40fd4b2 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,6 @@ package fr.ird.observe.application.web.controller.v1; -import com.google.common.base.Optional; 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.configuration.ObserveDataSourceConnection; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionRest; @@ -78,14 +76,7 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport 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); - } + String authenticationToken = getSecurityApplicationContext().registerDataSourceConfiguration(dataSourceConfiguration); return authenticationToken; 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 deleted file mode 100644 index 1ced100..0000000 --- a/observe-application-web/src/main/java/fr/ird/observe/application/web/security/DataSourceConfigurationAlreadyRegistredException.java +++ /dev/null @@ -1,27 +0,0 @@ -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/ObserveWebSecurityApplicationContext.java b/observe-application-web/src/main/java/fr/ird/observe/application/web/security/ObserveWebSecurityApplicationContext.java index 6aff7aa..5210310 100644 --- 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 @@ -118,15 +118,16 @@ public class ObserveWebSecurityApplicationContext implements Closeable { } /** - * Récupére la configuration de la data source associé à l'utilisateur et à la base passé en paramètre. + * Récupére la configuration de la source de données associée à l'utilisateur et à la base passée en paramètre. + * + * Si la base n'est pas spécifiée, on utilise alors la base par défaut du serveur. * * @param userLogin le login de l'utilisateur * @param optionalDatabaseName le nom de la base à utiliser - * @return + * @return la configuration de source de données associée à l'utilisateur et la base donnée * @throws UnknownObserveWebUserForDatabaseException - * @throws DataSourceConfigurationAlreadyRegistredException */ - public ObserveDataSourceConfiguration getDataSourceConfiguration(String userLogin, Optional<String> optionalDatabaseName) throws UnknownObserveWebUserForDatabaseException, DataSourceConfigurationAlreadyRegistredException { + public ObserveDataSourceConfiguration getDataSourceConfiguration(String userLogin, Optional<String> optionalDatabaseName) throws UnknownObserveWebUserForDatabaseException { // Get database name String databaseName; @@ -158,32 +159,15 @@ public class ObserveWebSecurityApplicationContext implements Closeable { } - 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); - } + public String registerDataSourceConfiguration(ObserveDataSourceConfiguration dataSourceConfiguration) { // 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 { + public ObserveDataSourceConfiguration getDataSourceConfiguration(String userLogin, String userPassword, Optional<String> optionalDatabaseName) throws UnknownObserveWebUserException, BadObserveWebUserPasswordException, UnknownObserveWebUserForDatabaseException { // Get user Optional<? extends ObserveWebUser> optionalUser = users.getUserByLogin(userLogin); 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 index ecd3de4..c2edd9f 100644 --- 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 @@ -8,6 +8,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.UUID; import java.util.concurrent.TimeUnit; @@ -18,7 +19,7 @@ import java.util.concurrent.TimeUnit; * * @author Tony Chemit - chemit@codelutin.com */ -public class ObserveWebSecurityAuthenticationTokenCache { +public class ObserveWebSecurityAuthenticationTokenCache implements Closeable { /** Logger. */ private static final Log log = LogFactory.getLog(ObserveWebSecurityAuthenticationTokenCache.class); @@ -50,11 +51,6 @@ public class ObserveWebSecurityAuthenticationTokenCache { 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()) { @@ -78,7 +74,9 @@ public class ObserveWebSecurityAuthenticationTokenCache { authenticationTokenCache.invalidateAll(); } + @Override public void close() { removeAllAuthenticationTokens(); } + } diff --git a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java index b3fb694..79b0e86 100644 --- a/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java +++ b/observe-services-rest/src/test/java/fr/ird/observe/services/service/DataSourceServiceRestTest.java @@ -29,17 +29,15 @@ public class DataSourceServiceRestTest { @Rule public final TestMethodResource testMethodResource = new TestMethodResource(testClassResource); - protected DataSourceService service; - @Before public void setUp() throws Exception { ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); - service = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); + //TODO Tester si le serveur est accessible sinon on ignore le test boolean serverExist = true; - + Assume.assumeTrue("Serveur " + dataSourceConfiguration.getServerUrl() + " no found", serverExist); } @@ -48,6 +46,7 @@ public class DataSourceServiceRestTest { public void testOpenNotExistingDatabase() throws IOException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); + DataSourceService service = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); service.open(dataSourceConfiguration); } @@ -56,17 +55,19 @@ public class DataSourceServiceRestTest { public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { ObserveDataSourceConfigurationRest dataSourceConfiguration = testMethodResource.getDataSourceConfiguration(); - ObserveDataSourceConnection dataSourceConnection = service.open(dataSourceConfiguration); - Assert.assertNotNull(dataSourceConnection); - Assert.assertNotNull(dataSourceConnection.getAuthenticationToken()); - - service.close(); - dataSourceConnection = service.open(dataSourceConfiguration); + DataSourceService service1 = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); + ObserveDataSourceConnection dataSourceConnection = service1.open(dataSourceConfiguration); Assert.assertNotNull(dataSourceConnection); Assert.assertNotNull(dataSourceConnection.getAuthenticationToken()); - service.close(); + DataSourceService service2 = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); + ObserveDataSourceConnection dataSourceConnection2 = service2.open(dataSourceConfiguration); + Assert.assertNotNull(dataSourceConnection2); + Assert.assertNotNull(dataSourceConnection2.getAuthenticationToken()); + + service1.close(); + service2.close(); } @@ -77,6 +78,7 @@ public class DataSourceServiceRestTest { DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); + DataSourceService service = testClassResource.newService(dataSourceConfiguration, DataSourceService.class); service.create(dataSourceConfiguration, dataSourceCreateConfiguration); } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/7463 in repository observe. See http://git.codelutin.com/observe.git commit f7d8d849f0cfd49fea56a4e1854430b5900d8f6d Author: Tony CHEMIT <chemit@codelutin.com> Date: Sun Sep 6 12:27:05 2015 +0200 Ajout de la méthode DataSourceService.canConnect --- .../controller/v1/DataSourceServiceController.java | 5 + .../services/service/DataSourceService.java | 3 + .../DatabaseConnexionNotAuthorizedException.java | 5 + .../service/DatabaseNotFoundException.java | 6 +- .../ird/observe/services/ObserveServiceTopia.java | 4 + .../services/service/DataSourceServiceTopia.java | 101 +++++++++++++++++++-- .../service/DataSourceServiceTopiaTest.java | 67 ++++++++++++++ 7 files changed, 180 insertions(+), 11 deletions(-) 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 40fd4b2..b8eb0c5 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 @@ -28,6 +28,11 @@ public class DataSourceServiceController extends ObserveServiceControllerSupport } @Override + public void canConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { + service.canConnect(dataSourceConfiguration); + } + + @Override public ObserveDataSourceConnectionRest create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { ObserveDataSourceConnection observeDataSourceConnection = service.create(dataSourceConfiguration, dataSourceCreateConfiguration); diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java index 2a9ab95..376bed0 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DataSourceService.java @@ -16,6 +16,9 @@ import fr.ird.observe.services.spi.NoDataAccess; public interface DataSourceService extends ObserveService { @NoDataAccess + void canConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException; + + @NoDataAccess ObserveDataSourceConnection create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException; @NoDataAccess diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseConnexionNotAuthorizedException.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseConnexionNotAuthorizedException.java index 243303e..844940c 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseConnexionNotAuthorizedException.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseConnexionNotAuthorizedException.java @@ -26,4 +26,9 @@ public class DatabaseConnexionNotAuthorizedException extends Exception { this.dataSourceConfiguration = dataSourceConfiguration; } + public DatabaseConnexionNotAuthorizedException(Throwable cause, ObserveDataSourceConfiguration dataSourceConfiguration) { + super(cause); + this.dataSourceConfiguration = dataSourceConfiguration; + } + } diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseNotFoundException.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseNotFoundException.java index ed47185..3ba2458 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseNotFoundException.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/DatabaseNotFoundException.java @@ -5,7 +5,6 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; /** * Exception à renvoyer quand la data source correspondant à une configuration n'existe pas. * - * Voir {@link ObserveDataSourceConfiguration#datasourceExists()} * Created on 23/08/15. * * @author Tony Chemit - chemit@codelutin.com @@ -20,6 +19,11 @@ public class DatabaseNotFoundException extends Exception { this.dataSourceConfiguration = dataSourceConfiguration; } + public DatabaseNotFoundException(String message,ObserveDataSourceConfiguration dataSourceConfiguration) { + super(message); + this.dataSourceConfiguration = dataSourceConfiguration; + } + public ObserveDataSourceConfiguration getDataSourceConfiguration() { return dataSourceConfiguration; } 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 5014aa5..54930e8 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 @@ -138,6 +138,10 @@ public class ObserveServiceTopia implements ObserveService { return referenceLocale; } + public Locale getApplicationLocale() { + return serviceContext.getApplicationLocale(); + } + public <E extends TopiaEntity> E getEntityFromReference(Class<E> entityType, ReferenceDto referenceDto) { Preconditions.checkNotNull(referenceDto, "'referenceDto' can't be null"); String id = referenceDto.getId(); diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java index ee25055..0b3f44a 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/DataSourceServiceTopia.java @@ -1,12 +1,16 @@ package fr.ird.observe.services.service; import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import fr.ird.observe.ObserveTopiaApplicationContext; +import fr.ird.observe.ObserveTopiaConfiguration; +import fr.ird.observe.ObserveTopiaConfigurationFactory; import fr.ird.observe.services.ObserveServiceTopia; import fr.ird.observe.services.ObserveTopiaApplicationContextFactory; import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaH2; +import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaPG; import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopiaSupport; import fr.ird.observe.services.configuration.ObserveDataSourceConnectionTopia; import fr.ird.observe.services.dto.DataSourceCreateConfigurationDto; @@ -14,9 +18,14 @@ import fr.ird.observe.services.dto.DataSourceCreateWithNoReferentialImportExcept import fr.ird.observe.services.dto.IncompatibleDataSourceCreateConfigurationException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.jdbc.JdbcHelper; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.nuiton.i18n.I18n.l; /** * Created on 21/08/15. @@ -29,6 +38,86 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS private static final Log log = LogFactory.getLog(DataSourceServiceTopia.class); @Override + public void canConnect(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { + + Preconditions.checkState(dataSourceConfiguration instanceof ObserveDataSourceConfigurationTopiaSupport); + ObserveDataSourceConfigurationTopiaSupport dataSourceConfigurationTopiaSupport = (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration; + + if (dataSourceConfigurationTopiaSupport.isH2Database()) { + + ObserveDataSourceConfigurationTopiaH2 h2DataSourceConfiguration = (ObserveDataSourceConfigurationTopiaH2) dataSourceConfigurationTopiaSupport; + + // On vérifie que le fichier de la base existe + Path databasePath = h2DataSourceConfiguration.getDirectory() + .toPath() + .resolve(h2DataSourceConfiguration.getDbName() + ".h2.db"); + + if (!Files.exists(databasePath)) { + + String message = l(getApplicationLocale(), "observe.services.topia.error.h2.database.notFound"); + throw new DatabaseNotFoundException(message, dataSourceConfiguration); + + } + + // On vérifier que la base n'est pas déjà en cours d'utilisation + Path databaseLockPath = h2DataSourceConfiguration.getDirectory() + .toPath() + .resolve(h2DataSourceConfiguration.getDbName() + ".lock.db"); + if (Files.exists(databaseLockPath)) { + + String message = l(getApplicationLocale(), "observe.services.topia.error.h2.database.locked"); + throw new DatabaseConnexionNotAuthorizedException(message, dataSourceConfiguration); + } + + // On tente une connection à la base + ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forH2Database(h2DataSourceConfiguration.getDirectory(), + h2DataSourceConfiguration.getDbName(), + h2DataSourceConfiguration.getUsername(), + new String(h2DataSourceConfiguration.getPassword()), + false, + false, + false, + false); + + + try { + new JdbcHelper(topiaConfiguration).runSelectOnString("SELECT 1;"); + } catch (Exception e) { + + // Authentification refusée + String message = l(getApplicationLocale(), "observe.services.topia.error.h2.database.badAuthentication"); + throw new DatabaseConnexionNotAuthorizedException(message, e, dataSourceConfiguration); + + } + + + } else { + + ObserveDataSourceConfigurationTopiaPG pgDataSourceConfiguration = (ObserveDataSourceConfigurationTopiaPG) dataSourceConfigurationTopiaSupport; + // On tente une connexion au serveur + ObserveTopiaConfiguration topiaConfiguration = ObserveTopiaConfigurationFactory.forPostgresqlDatabase(pgDataSourceConfiguration.getJdbcUrl(), + pgDataSourceConfiguration.getUsername(), + new String(pgDataSourceConfiguration.getPassword()), + false, + false, + false, + false); + + try { + new JdbcHelper(topiaConfiguration).runSelectOnString("SELECT 1;"); + } catch (Exception e) { + + // Authentification refusée + String message = l(getApplicationLocale(), "observe.services.topia.error.pg.database.badAuthentication"); + throw new DatabaseConnexionNotAuthorizedException(message, e, dataSourceConfiguration); + + } + + } + + } + + @Override public ObserveDataSourceConnectionTopia create(ObserveDataSourceConfiguration dataSourceConfiguration, DataSourceCreateConfigurationDto dataSourceCreateConfiguration) throws IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException { dataSourceCreateConfiguration.validateConfiguration(); @@ -137,18 +226,10 @@ public class DataSourceServiceTopia extends ObserveServiceTopia implements DataS @Override public ObserveDataSourceConnectionTopia open(ObserveDataSourceConfiguration dataSourceConfiguration) throws DatabaseNotFoundException, DatabaseConnexionNotAuthorizedException { - //FIXME - if (false) { - throw new DatabaseNotFoundException(dataSourceConfiguration); - } - - //FIXME - if (false) { - throw new DatabaseConnexionNotAuthorizedException(dataSourceConfiguration); - } + canConnect(dataSourceConfiguration); ObserveTopiaApplicationContext topiaApplicationContext = ObserveTopiaApplicationContextFactory.getOrCreateTopiaApplicationContext((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration); - return createDataSourceConnection( (ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getAuthenticationToken()); + return createDataSourceConnection((ObserveDataSourceConfigurationTopiaSupport) dataSourceConfiguration, topiaApplicationContext.getAuthenticationToken()); } diff --git a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java index 7d0aae4..ddefd91 100644 --- a/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java +++ b/observe-services-topia/src/test/java/fr/ird/observe/services/service/DataSourceServiceTopiaTest.java @@ -10,6 +10,8 @@ import fr.ird.observe.services.configuration.ObserveDataSourceConfigurationTopia 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.dto.referential.GearDto; +import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Ignore; @@ -61,6 +63,71 @@ public class DataSourceServiceTopiaTest { } @Test + public void testCanConnect() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException, InterruptedException { + + ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); + + try { + service.canConnect(dataSourceConfiguration); + Assert.fail(); + } catch (DatabaseNotFoundException e) { + Assert.assertTrue(true); + } + + DataSourceCreateConfigurationDto dataSourceCreateConfiguration = new DataSourceCreateConfigurationDto(); + dataSourceCreateConfiguration.setCanCreateEmptyDatabase(true); + service.create(dataSourceConfiguration, dataSourceCreateConfiguration); + + // Base déjà en cours d'utilisation + try { + service.canConnect(dataSourceConfiguration); + Assert.fail(); + } catch (DatabaseConnexionNotAuthorizedException e) { + Assert.assertTrue(true); + } + + service.close(); + + //FIXME Il faut attendre jusqu'à ce que le lock soit supprimé + Thread.sleep(1000); + + service.canConnect(dataSourceConfiguration); + + char[] password = dataSourceConfiguration.getPassword(); + + try { + dataSourceConfiguration.setPassword('b'); + service.canConnect(dataSourceConfiguration); + Assert.fail(); + } catch (DatabaseConnexionNotAuthorizedException e) { + Assert.assertTrue(true); + } + + dataSourceConfiguration.setPassword(password); + service.open(dataSourceConfiguration); + + // La base n'est pas encore lockée + ReferentialService referentialService = applicationContextResource.newService(dataSourceConfiguration, ReferentialService.class); + referentialService.getReferentialReferenceSet(GearDto.class); + + // Base déjà en cours d'utilisation + try { + service.canConnect(dataSourceConfiguration); + Assert.fail(); + } catch (DatabaseConnexionNotAuthorizedException e) { + Assert.assertTrue(true); + } + + service.close(); + + //FIXME Il faut attendre jusqu'à ce que le lock soit supprimé + Thread.sleep(1000); + + service.canConnect(dataSourceConfiguration); + + } + + @Test public void testOpen() throws IOException, IncompatibleDataSourceCreateConfigurationException, DataSourceCreateWithNoReferentialImportException, DatabaseConnexionNotAuthorizedException, DatabaseNotFoundException { ObserveDataSourceConfigurationTopiaH2 dataSourceConfiguration = dataSourceResource.getDataSourceConfiguration(); -- 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