r595 - in trunk: sammoa-application/src/main/java/fr/ulr/sammoa/application sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence sammoa-ui-swing sammoa-ui-swing/src/main sammoa-ui-swing/src/main/filtered-resources sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing sammoa-ui-swing/src/main/resources/i18n
Author: fdesbois Date: 2012-09-25 15:51:43 +0200 (Tue, 25 Sep 2012) New Revision: 595 Url: http://forge.codelutin.com/repositories/revision/sammoa/595 Log: fixes #1383 : clean persistence open connection Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/PersistenceException.java trunk/sammoa-ui-swing/src/main/filtered-resources/ trunk/sammoa-ui-swing/src/main/filtered-resources/sammoa.properties Removed: trunk/sammoa-ui-swing/src/main/filters/ Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaContext.java trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDatabase.java trunk/sammoa-ui-swing/pom.xml trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaContext.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaContext.java 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaContext.java 2012-09-25 13:51:43 UTC (rev 595) @@ -28,6 +28,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; +import fr.ulr.sammoa.persistence.PersistenceException; import fr.ulr.sammoa.persistence.SammoaPersistence; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; @@ -57,10 +58,7 @@ protected final LoadingCache<Class<? extends SammoaService>, SammoaService> services; public SammoaContext(SammoaConfig config) { - this(config, new SammoaPersistence( - config.getApplicationConfig().getFlatOptions(), - config.getAutoCommitDelay()) - ); + this(config, new SammoaPersistence()); } public SammoaContext(SammoaConfig config, SammoaPersistence persistence) { @@ -110,7 +108,7 @@ service.close(); } - public void open() { + public void open() throws PersistenceException { persistence.open( config.getApplicationConfig().getFlatOptions(), config.getAutoCommitDelay() Added: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/PersistenceException.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/PersistenceException.java (rev 0) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/PersistenceException.java 2012-09-25 13:51:43 UTC (rev 595) @@ -0,0 +1,55 @@ +package fr.ulr.sammoa.persistence; + +/* + * #%L + * SAMMOA :: Persistence + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Throwables; + +/** + * Created: 25/09/12 + * + * @author fdesbois <florian.desbois@codelutin.com> + */ +public class PersistenceException extends Exception { + + protected String dbUrl; + + public PersistenceException(String message, String dbUrl, Throwable cause) { + super(message, cause); + this.dbUrl = dbUrl; + } + + public String getDbUrl() { + return dbUrl; + } + + public String getMessageWithCause() { + String result = getMessage(); + Throwable cause = Throwables.getRootCause(this); + if (cause != this) { + result += " : " + cause.getMessage(); + } + return result; + } +} Property changes on: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/PersistenceException.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java =================================================================== --- trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-persistence/src/main/java/fr/ulr/sammoa/persistence/SammoaPersistence.java 2012-09-25 13:51:43 UTC (rev 595) @@ -28,7 +28,6 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaNotFoundException; import org.nuiton.topia.TopiaRuntimeException; import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.persistence.TopiaEntity; @@ -40,7 +39,7 @@ * Persistence context for SAMMOA. This class must be used for all transaction * management. An {@link AutoSaveListener} will be used to commit all entities * changed every {@code autoCommitDelay} defined in constructor - * {@link #SammoaPersistence(Properties, long)}. + * {@link #open(Properties, long)}. * <p/> * You will create a transaction with {@link #beginTransaction()} and on finally * block call {@link #endTransaction(TopiaContext)}. @@ -64,19 +63,6 @@ protected SammoaDbMeta dbMetas; /** - * Constructor of SammoaPersistence with {@code dbConfiguration} for - * {@link TopiaContextFactory#getContext(Properties)} and {@code autoCommitDelay} - * for {@link AutoSaveListener}. - * - * @param dbConfiguration Configuration for Topia - * @param autoCommitDelay Delay in milliseconds for auto commit period - * @see #open(Properties, long) - */ - public SammoaPersistence(Properties dbConfiguration, long autoCommitDelay) { - open(dbConfiguration, autoCommitDelay); - } - - /** * Open the Persistence with {@code dbConfiguration} for * {@link TopiaContextFactory#getContext(Properties)} and {@code autoCommitDelay} * for {@link AutoSaveListener}. You can't open an already opened context. @@ -84,8 +70,10 @@ * * @param dbConfiguration Configuration for Topia * @param autoCommitDelay Delay in milliseconds for auto commit period + * @throws PersistenceException if database connection can't be opened */ - public void open(Properties dbConfiguration, long autoCommitDelay) { + public void open(Properties dbConfiguration, long autoCommitDelay) + throws PersistenceException { Preconditions.checkState(rootContext == null); this.dbConfiguration = dbConfiguration; @@ -95,6 +83,26 @@ SammoaDAOHelper.getImplementationClassesAsString()); autoSaveListener = new AutoSaveListener(this, autoCommitDelay); + + // Retrieve the rootContext and try opening a transaction to check + // the connection + TopiaContext tx = null; + try { + rootContext = TopiaContextFactory.getContext(dbConfiguration); + tx = rootContext.beginTransaction(); + + } catch (TopiaException ex) { + throw new PersistenceException( + "Error opening database connection", + (String) dbConfiguration.get("hibernate.connection.url"), + ex + ); + + } finally { + if (tx != null) { + closeContext(tx); + } + } } /** @@ -143,13 +151,8 @@ /** @return the main TopiaContext where all other transactions are opened */ public TopiaContext getRootContext() { - if (rootContext == null) { - try { - rootContext = TopiaContextFactory.getContext(dbConfiguration); - } catch (TopiaNotFoundException e) { - throw new TopiaRuntimeException(e); - } - } + Preconditions.checkState(rootContext != null, + "You have to open the persistence to use rootContext"); return rootContext; } Modified: trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDatabase.java =================================================================== --- trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDatabase.java 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-persistence/src/test/java/fr/ulr/sammoa/persistence/SammoaDatabase.java 2012-09-25 13:51:43 UTC (rev 595) @@ -24,6 +24,7 @@ */ package fr.ulr.sammoa.persistence; +import com.google.common.base.Throwables; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaEntity; @@ -55,7 +56,12 @@ @Override protected void onDbConfigurationCreate(Properties configuration, File testDir, String dbPath) { - persistence = new SammoaPersistence(configuration, autoCommitDelay); + persistence = new SammoaPersistence(); + try { + persistence.open(configuration, autoCommitDelay); + } catch (PersistenceException ex) { + throw Throwables.propagate(ex); + } } @Override Modified: trunk/sammoa-ui-swing/pom.xml =================================================================== --- trunk/sammoa-ui-swing/pom.xml 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-ui-swing/pom.xml 2012-09-25 13:51:43 UTC (rev 595) @@ -230,7 +230,7 @@ <resources> <resource> - <directory>src/main/filters</directory> + <directory>src/main/filtered-resources</directory> <filtering>true</filtering> <includes> <include>*.properties</include> Copied: trunk/sammoa-ui-swing/src/main/filtered-resources/sammoa.properties (from rev 594, trunk/sammoa-ui-swing/src/main/filters/sammoa.properties) =================================================================== --- trunk/sammoa-ui-swing/src/main/filtered-resources/sammoa.properties (rev 0) +++ trunk/sammoa-ui-swing/src/main/filtered-resources/sammoa.properties 2012-09-25 13:51:43 UTC (rev 595) @@ -0,0 +1,39 @@ +### +# #%L +# SAMMOA :: UI Swing +# +# $Id$ +# $HeadURL$ +# %% +# Copyright (C) 2012 UMS 3462, Code Lutin +# %% +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program. If not, see +# <http://www.gnu.org/licenses/gpl-3.0.html>. +# #L% +### +## DB Configuration +hibernate.hbm2ddl.auto=update +hibernate.show_sql=false + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.connection.url=jdbc:h2:file:${db.directory}/sammoa +hibernate.connection.username=sa +hibernate.connection.password=sa +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaConnectionProvider + +sammoa.version=${project.version} +sammoa.url=${project.url} +sammoa.inceptionYear=${project.inceptionYear} +sammoa.organizationName=${license.organizationName} Property changes on: trunk/sammoa-ui-swing/src/main/filtered-resources/sammoa.properties ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/MainUIHandler.java 2012-09-25 13:51:43 UTC (rev 595) @@ -37,6 +37,7 @@ import fr.ulr.sammoa.application.flightController.FlightState; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; +import fr.ulr.sammoa.persistence.PersistenceException; import fr.ulr.sammoa.ui.swing.campaign.CampaignUI; import fr.ulr.sammoa.ui.swing.flight.FlightUI; import fr.ulr.sammoa.ui.swing.home.HomeUI; @@ -248,7 +249,11 @@ closeSammoa(false); // Re-open the context - context.open(); + try { + context.open(); + } catch (PersistenceException ex) { + ErrorDialogUI.showError(ex); + } MainUI mainUI = new MainUI(context); mainUI.setVisible(true); Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/SammoaUIContext.java 2012-09-25 13:51:43 UTC (rev 595) @@ -30,6 +30,7 @@ import fr.ulr.sammoa.application.SammoaService; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; +import fr.ulr.sammoa.persistence.PersistenceException; import org.apache.commons.io.IOUtils; import org.nuiton.widget.SwingSession; @@ -51,8 +52,6 @@ protected String flightId; - protected boolean validationMode; - public static SammoaUIContext newUIContext(SammoaContext context) { Preconditions.checkNotNull(context); uiContext = new SammoaUIContext(context); @@ -149,7 +148,7 @@ return mainUIHandler.getUI().getScreen() == SammoaScreen.VALIDATION; } - public void open() { + public void open() throws PersistenceException { context.open(); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-09-25 13:51:43 UTC (rev 595) @@ -26,7 +26,9 @@ import fr.ulr.sammoa.application.SammoaConfig; import fr.ulr.sammoa.application.SammoaContext; +import fr.ulr.sammoa.persistence.PersistenceException; import fr.ulr.sammoa.ui.swing.util.LogFileInitializer; +import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import jaxx.runtime.SwingUtil; import org.nuiton.i18n.I18n; import org.nuiton.i18n.init.DefaultI18nInitializer; @@ -38,6 +40,8 @@ import java.io.File; import java.util.Locale; +import static org.nuiton.i18n.I18n._; + /** * Created: 16/05/12 * @@ -55,33 +59,58 @@ // Create application context SammoaContext appContext = new SammoaContext(config); - // Create ui context - SammoaUIContext context = SammoaUIContext.newUIContext(appContext); + try { + // Create ui context + final SammoaUIContext context = SammoaUIContext.newUIContext(appContext); - // Initialize log file - File logFile = config.getLogFile(); - if (logFile != null) { - new LogFileInitializer(logFile).addFileAppender(); - } + // Use shutdownHook to close context on System.exit + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - // Initialize i18n - Locale locale = config.getLocale(); - I18n.init(new DefaultI18nInitializer("sammoa-ui-swing"), locale); + @Override + public void run() { + if (logger.isInfoEnabled()) { + logger.info("Close context on shutdown"); + } + context.close(); + } + })); - // Prepare ui look&feel and load ui properties - try { - SwingUtil.initNimbusLoookAndFeel(); - } catch (Exception e) { - // could not find nimbus look-and-feel - if (logger.isWarnEnabled()) { - logger.warn("Failed to init nimbus look and feel"); + context.open(); + + // Initialize log file + File logFile = config.getLogFile(); + if (logFile != null) { + new LogFileInitializer(logFile).addFileAppender(); } - } - UIManager.put("BlockingLayerUI.blockingColor", new Color(50, 50, 50)); + // Initialize i18n + Locale locale = config.getLocale(); + I18n.init(new DefaultI18nInitializer("sammoa-ui-swing"), locale); - MainUI mainUI = new MainUI(context); - mainUI.setVisible(true); + // Prepare ui look&feel and load ui properties + try { + SwingUtil.initNimbusLoookAndFeel(); + } catch (Exception e) { + // could not find nimbus look-and-feel + if (logger.isWarnEnabled()) { + logger.warn("Failed to init nimbus look and feel"); + } + } + + UIManager.put("BlockingLayerUI.blockingColor", new Color(50, 50, 50)); + + MainUI mainUI = new MainUI(context); + mainUI.setVisible(true); + + } catch (PersistenceException ex) { + if (logger.isErrorEnabled()) { + logger.error("Error during db connection", ex); + } + SammoaUtil.showErrorMessage(null, _("sammoa.messageDialog.persistence.error", + ex.getDbUrl(), + ex.getMessageWithCause())); + System.exit(1); + } } } Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-25 09:54:48 UTC (rev 594) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-09-25 13:51:43 UTC (rev 595) @@ -173,6 +173,7 @@ sammoa.messageDialog.map.export.success=Map (with %s rows in dbf) was successfully exported in directory\n\n%s sammoa.messageDialog.mapOrDbf.exportFile.alreadyExists=Export Shape file (%s)\nor dbf file (%s) already exists.\n\nConfirm to override it? sammoa.messageDialog.observers.import.success=%1$d observers are successfully imported +sammoa.messageDialog.persistence.error=An error occurs with SAMMOA database at address '%s'\:\n%s sammoa.messageDialog.sammoa.backup.success=Sammoa was successfully backup in file\n\n%s sammoa.messageDialog.sammoa.export.success=Sammoa was successfully exported in file\n\n%s sammoa.messageDialog.sammoa.exportFile.alreadyExists=Export File %s already exists.\n\nConfirm to override it?
participants (1)
-
fdesbois@users.forge.codelutin.com