On 02/13/2010 04:40 PM, vmassol (SVN) wrote:
Author: vmassol
Date: 2010-02-13 16:40:57 +0100 (Sat, 13 Feb 2010)
New Revision: 27004
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java
Log:
XWIKI-4893: Make XWiki support recovering from a connection problem with the database
Modified:
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java
===================================================================
---
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java 2010-02-13
12:09:34 UTC (rev 27003)
+++
platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/hibernate/DefaultHibernateSessionFactory.java 2010-02-13
15:40:57 UTC (rev 27004)
@@ -19,7 +19,9 @@
*/
package com.xpn.xwiki.store.hibernate;
+import java.io.File;
import java.io.InputStream;
+import java.net.URL;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
@@ -33,8 +35,8 @@
*
* @version $Id$
* @since 2.0M1
- * @todo this was coded by Artem. Find out why we need this as a component.
*/
+// TODO: This was coded by Artem. Find out why we need this as a component.
@Component
public class DefaultHibernateSessionFactory implements HibernateSessionFactory
{
@@ -45,6 +47,78 @@
{
private static final long serialVersionUID = 1L;
+ /**
+ * Whether the Hibernate Configuration has alreayd been initialized or not. We
do this so that the
+ * Hibernate {@link org.hibernate.cfg.Configuration#configure()} methods can be
called several times in a
+ * row without causing some Duplicate Mapping errors, see our overridden
+ * {@link #getConfigurationInputStream(String)} below.
+ */
+ private boolean isConfigurationInitialized;
+
+ /**
+ * {@inheritDoc}
+ * @see org.hibernate.cfg.Configuration#configure()
+ */
Are you sure there's no need for synchronized? Same for all the others.
+ @Override public Configuration configure()
throws HibernateException
+ {
+ Configuration configuration;
+ if (this.isConfigurationInitialized) {
+ configuration = this;
+ } else {
+ configuration = super.configure();
+ this.isConfigurationInitialized = true;
+ }
+ return configuration;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.hibernate.cfg.Configuration#configure(String)
+ */
+ @Override public Configuration configure(String resource) throws
HibernateException
+ {
+ Configuration configuration;
+ if (this.isConfigurationInitialized) {
+ configuration = this;
+ } else {
+ configuration = super.configure(resource);
+ this.isConfigurationInitialized = true;
+ }
+ return configuration;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.hibernate.cfg.Configuration#configure(java.net.URL)
+ */
+ @Override public Configuration configure(URL url) throws HibernateException
+ {
+ Configuration configuration;
+ if (this.isConfigurationInitialized) {
+ configuration = this;
+ } else {
+ configuration = super.configure(url);
+ this.isConfigurationInitialized = true;
+ }
+ return configuration;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @see org.hibernate.cfg.Configuration#configure(java.io.File)
+ */
+ @Override public Configuration configure(File configFile) throws
HibernateException
+ {
+ Configuration configuration;
+ if (this.isConfigurationInitialized) {
+ configuration = this;
+ } else {
+ configuration = super.configure(configFile);
+ this.isConfigurationInitialized = true;
+ }
+ return configuration;
+ }
+
// there is no #configure(InputStream) so we use #configure(String) and
override #getConfigurationInputStream
@Override
protected InputStream getConfigurationInputStream(String resource) throws
HibernateException
--
Sergiu Dumitriu
http://purl.org/net/sergiu/