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>.