r3855 - branches/pollen-1.5.x/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui
Author: tchemit Date: 2013-10-21 22:15:23 +0200 (Mon, 21 Oct 2013) New Revision: 3855 Url: http://chorem.org/projects/pollen/repository/revisions/3855 Log: fixes #954: Can't hot-deploy application when using h2 database Modified: branches/pollen-1.5.x/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenApplicationListener.java Modified: branches/pollen-1.5.x/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenApplicationListener.java =================================================================== --- branches/pollen-1.5.x/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenApplicationListener.java 2013-09-13 13:10:21 UTC (rev 3854) +++ branches/pollen-1.5.x/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenApplicationListener.java 2013-10-21 20:15:23 UTC (rev 3855) @@ -42,15 +42,22 @@ import org.nuiton.i18n.I18n; import org.nuiton.i18n.init.DefaultI18nInitializer; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaException; +import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.framework.TopiaUtil; import org.nuiton.util.FileUtil; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import java.beans.Introspector; import java.io.File; import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Date; import java.util.Locale; import java.util.Map; @@ -146,11 +153,16 @@ @Override public void contextDestroyed(ServletContextEvent sce) { - if (log.isInfoEnabled()) { log.info("Application is ending at " + new Date() + "..."); } + // see http://wiki.apache.org/commons/Logging/FrequentlyAskedQuestions#A_memory_lea... + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + LogFactory.release(contextClassLoader); + + Introspector.flushCaches(); + ServletContext servletContext = sce.getServletContext(); PollenApplicationContext applicationContext = PollenApplicationContext.get(servletContext); @@ -161,7 +173,7 @@ closePollenNotifierWorker(applicationContext.getPollenNotifierWorker()); // close topia root context to pollen db - closeRootcontext(applicationContext.getRootContext()); + closeRootcontext((TopiaContextImplementor) applicationContext.getRootContext()); } } @@ -230,24 +242,59 @@ } } - private void closeRootcontext(TopiaContext rootContext) { + private void closeRootcontext(TopiaContextImplementor rootContext) { if (rootContext != null) { if (log.isInfoEnabled()) { log.info("Shuting down RootContext... " + rootContext); } - if (!rootContext.isClosed()) { - try { - rootContext.closeContext(); - } catch (TopiaException te) { - if (log.isErrorEnabled()) { - log.error("Could not close rootContext", te); + + String dialectName = (String) rootContext.getConfig().get(TopiaContextFactory.CONFIG_DIALECT); + + try { + if (!rootContext.isClosed()) { + try { + rootContext.closeContext(); + } catch (TopiaException te) { + if (log.isErrorEnabled()) { + log.error("Could not close rootContext", te); + } } } + } finally { + if (dialectName.contains("H2Dialect")) { + try { + releaseH2RootContext(rootContext); + } catch (SQLException e) { + if (log.isErrorEnabled()) { + log.error("Could not shutdown h2 databse", e); + } + } + } } } } + private void releaseH2RootContext(TopiaContext context) throws SQLException { + + TopiaContextImplementor rootContext = ((TopiaContextImplementor) context).getRootContext(); + + String url = (String) rootContext.getConfig().get(TopiaContextFactory.CONFIG_URL); + String login = (String) rootContext.getConfig().get(TopiaContextFactory.CONFIG_USER); + String password = (String) rootContext.getConfig().get(TopiaContextFactory.CONFIG_PASS); + + Connection conn = DriverManager.getConnection(url, login, password); + + try { + Statement statement = conn.createStatement(); + statement.execute("SHUTDOWN;"); + statement.close(); + conn.close(); + } finally { + conn.close(); + } + } + protected void initDB(PollenApplicationContext applicationContext) throws TopiaException { ActionContext context = ActionContext.getContext();
participants (1)
-
tchemit@users.chorem.org