This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository echobase. See http://git.codelutin.com/echobase.git commit d5540af0fef35e75b70b261621cada0c1163bbbf Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Jan 15 13:50:42 2015 +0100 review Lizmap service --- .../services/service/spatial/GisService.java | 192 ++----------- .../services/service/spatial/LizmapRepository.java | 305 +++++++++++++++++++++ .../service/spatial/SpatialDataService.java | 8 +- 3 files changed, 329 insertions(+), 176 deletions(-) diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/GisService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/GisService.java index 6a14962..e8f98f6 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/GisService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/GisService.java @@ -26,31 +26,20 @@ import com.google.common.base.Preconditions; import com.google.common.io.Files; import fr.ifremer.echobase.EchoBaseTechnicalException; import fr.ifremer.echobase.config.EchoBaseConfiguration; -import fr.ifremer.echobase.entities.WorkingDbConfiguration; import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.io.EchoBaseIOUtil; import fr.ifremer.echobase.persistence.JdbcConfiguration; import fr.ifremer.echobase.services.EchoBaseServiceSupport; -import fr.ifremer.echobase.services.service.UserDbPersistenceService; -import fr.ifremer.echobase.services.service.workingDb.WorkingDbConfigurationService; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.HierarchicalINIConfiguration; -import org.apache.commons.configuration.SubnodeConfiguration; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import javax.inject.Inject; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.net.URL; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; import java.util.Scanner; /** @@ -74,16 +63,6 @@ public class GisService extends EchoBaseServiceSupport { private static final String QGIS_RESOURCES = "/gis/lizmap/resources/"; - private static final String[] TO_REPLACE = new String[]{"-", "."}; - - private static final String[] REPLACEMENT_LIST = new String[]{"", ""}; - - @Inject - private WorkingDbConfigurationService workingDbConfigurationService; - - @Inject - private UserDbPersistenceService persistenceService; - public static void copyQgisDefaultTemplateFileIfNecessary(EchoBaseConfiguration configuration) throws IOException { File qgisDefaultTemplateFile = configuration.getQgisDefaultTemplateFile(); @@ -137,182 +116,51 @@ public class GisService extends EchoBaseServiceSupport { } /** - * Generate maps files for this database. + * Add given working db to lizmap. * * @param conf data base connexion configuration */ - public void generateMaps(JdbcConfiguration conf) { - - File lizmapTarget = getConfiguration().getLizmapProjectsDirectory(); + public void registerWorkingDb(JdbcConfiguration conf) { - if (!lizmapTarget.isDirectory()) { - throw new EchoBaseTechnicalException("Map target (" + lizmapTarget.getAbsolutePath() + ") is not directory"); - } - - String repositoryName = getRepositoryName(conf); - - if (log.isInfoEnabled()) { - log.info("Lizmap repository name: " + repositoryName); - } - - File repositoryDirectory = new File(lizmapTarget, repositoryName); - EchoBaseIOUtil.forceMkdir(repositoryDirectory); - - // Add repository in Lizmap config - updateLizmapConfigFile(conf, repositoryName, repositoryDirectory); - - // Add authorization in Lizmap database - updateLizmapAuthorizations(repositoryName); - - for (Voyage voyage : persistenceService.getAllVoyages()) { - generateMap(conf, voyage, repositoryDirectory); - } + LizmapRepository lizmapRepository = newLizmapRepository(conf); + lizmapRepository.register(); } - public String getRepositoryUrl(JdbcConfiguration conf) { + public String getVoyageMapUrl(JdbcConfiguration conf, Voyage voyage) { - String repositoryName = getRepositoryName(conf); - String repositoryUrl = getConfiguration().getLizmapApplicationUrl() + "?" + "repository=" + repositoryName; + LizmapRepository lizmapRepository = newLizmapRepository(conf); + String repositoryUrl = lizmapRepository.getVoyageMapUrl(voyage); return repositoryUrl; } - protected void updateLizmapConfigFile(JdbcConfiguration conf, String repositoryName, File repository) { - - WorkingDbConfiguration workingDbConfiguration - = workingDbConfigurationService.getWorkingDbConfigurationByUrl(conf.getUrl()); - - File lizmapConfigFile = getConfiguration().getLizmapApplicationConfigFile(); - - try { - - HierarchicalINIConfiguration lizmapIni = new HierarchicalINIConfiguration(lizmapConfigFile); - - SubnodeConfiguration section = lizmapIni.getSection("repository:" + repositoryName); - section.setProperty("label", "\"" + workingDbConfiguration.getDescription() + "\""); - section.setProperty("path", repository.getAbsolutePath() + "/"); - - BufferedWriter writer = Files.newWriter(lizmapConfigFile, Charsets.UTF_8); - try { - lizmapIni.save(writer); - writer.close(); - } finally { - - IOUtils.closeQuietly(writer); - } - - } catch (ConfigurationException e) { - throw new EchoBaseTechnicalException("Could not load Lizmap config", e); - } catch (IOException e) { - throw new EchoBaseTechnicalException("Could not save Lizmap config", e); - } - - } - - public void updateLizmapAuthorizations(String repositoryName) { - - String lizmapJdbcUrl = getConfiguration().getLizmapApplicationJdbcUrl(); - Connection connection = null; - - try { - connection = DriverManager.getConnection(lizmapJdbcUrl); - connection.setAutoCommit(false); - - executeQuery(connection, "INSERT OR REPLACE INTO jacl2_rights " + - "(id_aclsbj, id_aclgrp, id_aclres, canceled) " + - "VALUES " + - "('lizmap.repositories.view', '__anonymous', '" + repositoryName + "', 0);"); - - executeQuery(connection, "INSERT OR REPLACE INTO jacl2_rights " + - "(id_aclsbj, id_aclgrp, id_aclres, canceled) " + - "VALUES " + - "('lizmap.repositories.view', 'admins', '" + repositoryName + "', 0);"); - - connection.commit(); - - connection.close(); - - } catch (SQLException e) { - throw new EchoBaseTechnicalException("Could not create rights in lizmap", e); - } finally { - try { - if (connection != null && !connection.isClosed()) { - connection.close(); - } - } catch (SQLException e) { - //FIXME We should never throw an exception in finally block - throw new EchoBaseTechnicalException("Could not create rights in lizmap", e); - } - } - } - - protected void executeQuery(Connection connection, String query) throws SQLException { - - if (log.isInfoEnabled()) { - log.info("Execute sql query to lizmap: " + query); - } - - Statement statement = connection.createStatement(); - - try { - statement.execute(query); - - statement.close(); - - } finally { - - if (statement != null) { - statement.close(); - } - - } - - } - - protected String getRepositoryName(JdbcConfiguration conf) { - - String url = conf.getUrl(); - - //TODO Use a regex - int hostIndex = START_JDBC_URL.length() - 1; - int portIndex = url.indexOf(':', hostIndex); - int dbnameIndex = url.indexOf("/", portIndex); - - String dbname = url.substring(dbnameIndex + 1); - String host = url.substring(hostIndex + 1, portIndex); - String port = url.substring(portIndex + 1, dbnameIndex); - - String repository = getConfiguration().getLizmapRepositoryName() + host + port + dbname; - - repository = StringUtils.replaceEach(repository, TO_REPLACE, REPLACEMENT_LIST); - - return repository; - } - /** * Generate map files for this database and this voyage. * - * @param conf data base connexion configuration - * @param voyage voyage for this map - * @param repositoryDirectory Lizmap repository - * @return Name of project map + * @param conf data base connexion configuration + * @param voyage voyage for this map */ - protected String generateMap(JdbcConfiguration conf, Voyage voyage, File repositoryDirectory) { + public void generateMap(JdbcConfiguration conf, Voyage voyage) { Preconditions.checkNotNull(conf); Preconditions.checkNotNull(voyage); - String voyageName = voyage.getName(); + LizmapRepository lizmapRepository = newLizmapRepository(conf); + + File repositoryDirectory = lizmapRepository.getRepositoryDirectory(); + EchoBaseIOUtil.forceMkdir(repositoryDirectory); String[] templateValues = getTemplateValues(conf, voyage); - generateFileFromTemplate(getConfiguration().getQgisTemplateFile(), new File(repositoryDirectory, voyageName + ".qgs"), templateValues); + generateFileFromTemplate(getConfiguration().getQgisTemplateFile(), lizmapRepository.getQGisFile(voyage), templateValues); - generateFileFromTemplate(getConfiguration().getLizmapTemplateFile(), new File(repositoryDirectory, voyageName + ".qgs.cfg"), templateValues); + generateFileFromTemplate(getConfiguration().getLizmapTemplateFile(), lizmapRepository.getLizmapFile(voyage), templateValues); - return voyageName; + } + protected LizmapRepository newLizmapRepository(JdbcConfiguration conf) { + return LizmapRepository.newLizmapRepository(getConfiguration(), conf); } /** @@ -323,7 +171,7 @@ public class GisService extends EchoBaseServiceSupport { * @param templateValues values to used in the template * @return file generated */ - public File generateFileFromTemplate(File templateFile, File target, String... templateValues) { + protected File generateFileFromTemplate(File templateFile, File target, String... templateValues) { if (!target.exists()) { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/LizmapRepository.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/LizmapRepository.java new file mode 100644 index 0000000..f9fc3da --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/LizmapRepository.java @@ -0,0 +1,305 @@ +package fr.ifremer.echobase.services.service.spatial; + +import com.google.common.base.Charsets; +import com.google.common.base.Preconditions; +import com.google.common.io.Files; +import fr.ifremer.echobase.EchoBaseTechnicalException; +import fr.ifremer.echobase.config.EchoBaseConfiguration; +import fr.ifremer.echobase.entities.data.Voyage; +import fr.ifremer.echobase.persistence.JdbcConfiguration; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.HierarchicalINIConfiguration; +import org.apache.commons.configuration.SubnodeConfiguration; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * Created on 1/14/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.8 + */ +public class LizmapRepository { + + /** Logger. */ + private static final Log log = LogFactory.getLog(LizmapRepository.class); + + public static class LizmapRepositoryConfiguration { + + private final JdbcConfiguration jdbcConfiguration; + + private final EchoBaseConfiguration configuration; + + LizmapRepositoryConfiguration(JdbcConfiguration jdbcConfiguration, EchoBaseConfiguration configuration) { + this.jdbcConfiguration = jdbcConfiguration; + this.configuration = configuration; + } + + public File getLizmapTemplateFile() { + return configuration.getLizmapTemplateFile(); + } + + public File getLizmapProjectsDirectory() { + return configuration.getLizmapProjectsDirectory(); + } + + public File getLizmapApplicationConfigFile() { + return configuration.getLizmapApplicationConfigFile(); + } + + public String getLizmapApplicationJdbcUrl() { + return configuration.getLizmapApplicationJdbcUrl(); + } + + public String getLizmapApplicationUrl() { + return configuration.getLizmapApplicationMapUrl(); + } + + public String getLizmapRepositoryName() { + return configuration.getLizmapRepositoryName(); + } + + public String getUrl() { + return jdbcConfiguration.getUrl(); + } + + public String getLogin() { + return jdbcConfiguration.getLogin(); + } + + public String getPassword() { + return jdbcConfiguration.getPassword(); + } + } + + private final LizmapRepositoryConfiguration configuration; + + private static final String START_JDBC_URL = "jdbc:postgresql://"; + + private static final String[] TO_REPLACE = new String[]{"-", "."}; + + private static final String[] REPLACEMENT_LIST = new String[]{"", ""}; + + public static LizmapRepository newLizmapRepository(EchoBaseConfiguration configuration, JdbcConfiguration conf) { + + LizmapRepositoryConfiguration lizmapRepositoryConfiguration = new LizmapRepositoryConfiguration(conf, configuration); + + File lizmapTarget = configuration.getLizmapProjectsDirectory(); + + if (!lizmapTarget.isDirectory()) { + throw new EchoBaseTechnicalException("Map target (" + lizmapTarget.getAbsolutePath() + ") is not directory"); + } + + LizmapRepository result = new LizmapRepository(lizmapRepositoryConfiguration); + return result; + + } + + protected LizmapRepository(LizmapRepositoryConfiguration configuration) { + + this.configuration = configuration; + + } + + private String repositoryName; + + private File repositoryDirectory; + + public String getRepositoryName() { + + if (repositoryName == null) { + + String url = configuration.getUrl(); + + //TODO Use a regex + int hostIndex = START_JDBC_URL.length() - 1; + int portIndex = url.indexOf(':', hostIndex); + int dbnameIndex = url.indexOf("/", portIndex); + + String dbname = url.substring(dbnameIndex + 1); + String host = url.substring(hostIndex + 1, portIndex); + String port = url.substring(portIndex + 1, dbnameIndex); + + repositoryName = configuration.getLizmapRepositoryName() + host + port + dbname; + repositoryName = StringUtils.replaceEach(repositoryName, TO_REPLACE, REPLACEMENT_LIST); + + } + + return repositoryName; + + } + + public File getRepositoryDirectory() { + + if (repositoryDirectory == null) { + + String repoName = getRepositoryName(); + repositoryDirectory = new File(configuration.getLizmapProjectsDirectory(), repoName); + + } + + return repositoryDirectory; + + } + + public String getVoyageMapUrl(Voyage voyage) { + + String repoName = getRepositoryName(); + String repositoryUrl = configuration.getLizmapApplicationUrl() + "?" + "repository=" + repoName + "&project=" + voyage.getName(); + return repositoryUrl; + + } + + public void register() { + + String repoName = getRepositoryName(); + + if (log.isDebugEnabled()) { + log.debug("Check if repository named " + repoName + " need to be registered by lizmap"); + } + + File configurationPath = configuration.getLizmapApplicationConfigFile(); + + if (log.isDebugEnabled()) { + log.debug("Use Lizmap configuration file: " + configurationPath); + } + HierarchicalINIConfiguration iniConfiguration; + + try { + iniConfiguration = new HierarchicalINIConfiguration(configurationPath); + } catch (ConfigurationException e) { + throw new EchoBaseTechnicalException("Could not load Lizmap config", e); + } + + SubnodeConfiguration section = iniConfiguration.getSection("repository:" + repoName); + + if (section.isEmpty()) { + + if (log.isInfoEnabled()) { + log.info("Register repository " + repoName + " to Lizmap."); + } + + // Add repository in Lizmap config + updateLizmapConfigFile(iniConfiguration, section, repoName); + + // Add authorization in Lizmap database + updateLizmapAuthorizations(); + + } + + } + + public File getQGisFile(Voyage voyage) { + + return new File(getRepositoryDirectory(), voyage.getName() + ".qgs"); + + + } + + public File getLizmapFile(Voyage voyage) { + + return new File(getRepositoryDirectory(), voyage.getName() + ".qgs.cfg"); + + } + + protected void updateLizmapConfigFile(HierarchicalINIConfiguration iniConfiguration, SubnodeConfiguration section, String repoName) { + + Preconditions.checkArgument(section.isEmpty()); + + File configurationPath = configuration.getLizmapApplicationConfigFile(); + + if (log.isInfoEnabled()) { + log.info("Add Section " + repoName + " to lizmap configuration file."); + } + + section.setProperty("label", repoName); + section.setProperty("path", getRepositoryDirectory().getAbsolutePath() + "/"); + + if (log.isInfoEnabled()) { + log.info("Save lizmap configuration file at " + configurationPath); + } + + try (BufferedWriter writer = Files.newWriter(configurationPath, Charsets.UTF_8)) { + + iniConfiguration.save(writer); + + } catch (IOException | ConfigurationException e) { + throw new EchoBaseTechnicalException("Could not save Lizmap config", e); + } + + } + + protected void updateLizmapAuthorizations() { + + Connection connection = null; + + try { + connection = DriverManager.getConnection(configuration.getLizmapApplicationJdbcUrl()); + connection.setAutoCommit(false); + + String repoName = getRepositoryName(); + + if (log.isInfoEnabled()) { + log.info("Add credentials for repository " + repoName + " in Lizmap."); + } + + executeQuery(connection, "INSERT OR REPLACE INTO jacl2_rights " + + "(id_aclsbj, id_aclgrp, id_aclres, canceled) " + + "VALUES " + + "('lizmap.repositories.view', '__anonymous', '" + repoName + "', 0);"); + + executeQuery(connection, "INSERT OR REPLACE INTO jacl2_rights " + + "(id_aclsbj, id_aclgrp, id_aclres, canceled) " + + "VALUES " + + "('lizmap.repositories.view', 'admins', '" + repoName + "', 0);"); + + connection.commit(); + + connection.close(); + + } catch (SQLException e) { + throw new EchoBaseTechnicalException("Could not create rights in lizmap", e); + } finally { + try { + if (connection != null && !connection.isClosed()) { + connection.close(); + } + } catch (SQLException e) { + //FIXME We should never throw an exception in finally block + throw new EchoBaseTechnicalException("Could not create rights in lizmap", e); + } + } + } + + protected void executeQuery(Connection connection, String query) throws SQLException { + + if (log.isDebugEnabled()) { + log.debug("Execute sql query to lizmap: " + query); + } + + Statement statement = connection.createStatement(); + + try { + statement.execute(query); + + statement.close(); + + } finally { + + if (statement != null) { + statement.close(); + } + + } + + } +} diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialDataService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialDataService.java index 13c2f8d..ff555b9 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialDataService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialDataService.java @@ -99,7 +99,7 @@ public class SpatialDataService extends EchoBaseServiceSupport { * * @since 2.8 */ - public void updatePostgisData() { + public void computespatialData() { if (persistenceContext.isSpatialStructureFound()) { @@ -110,21 +110,21 @@ public class SpatialDataService extends EchoBaseServiceSupport { log.info("Will try to compute operation spatial data from temp table..."); } persistenceService.executeSQL("SELECT echobase_fill_operation_spatial_table();"); - TILE_LOG.log(time, "updatePostgisData::echobase_fill_operation_spatial_table"); + TILE_LOG.log(time, "computespatialData::echobase_fill_operation_spatial_table"); time = TimeLog.getTime(); if (log.isInfoEnabled()) { log.info("Will try to compute cell spatial data from temp table..."); } persistenceService.executeSQL("SELECT echobase_fill_cell_spatial_table();"); - TILE_LOG.log(time, "updatePostgisData::echobase_fill_cell_spatial_table"); + TILE_LOG.log(time, "computespatialData::echobase_fill_cell_spatial_table"); time = TimeLog.getTime(); if (log.isInfoEnabled()) { log.info("Will try to refresh all spatial views..."); } persistenceService.executeSQL("SELECT echobase_refresh_views();"); - TILE_LOG.log(time, "updatePostgisData::echobase_refresh_views"); + TILE_LOG.log(time, "computespatialData::echobase_refresh_views"); persistenceService.commit(); } catch (Exception e) { throw new EchoBaseTechnicalException("Could not compute spatial data", e); -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.