View Javadoc

1   package org.directwebremoting.guice.spring;
2   
3   import com.google.inject.Provider;
4   
5   import java.io.Closeable;
6   import java.io.IOException;
7   
8   import org.directwebremoting.util.Logger;
9   
10  import org.springframework.beans.factory.BeanFactory;
11  import org.springframework.beans.factory.DisposableBean;
12  
13  
14  /**
15   * Lazily creates a singleton BeanFactory and, when {@code close()} is 
16   * called, destroys it if it exists and is a {@code DisposableBean}.
17   */
18  class CloseableBeanFactoryProvider implements Closeable, Provider<BeanFactory> 
19  {    
20      CloseableBeanFactoryProvider(BeanFactoryLoader loader)
21      {
22          this.loader = loader;
23      }
24      
25      public synchronized BeanFactory get() {
26          if (beanFactory == null)
27          {
28              beanFactory = loader.loadBeanFactory();
29          }
30          return beanFactory;
31      }
32      
33      public synchronized void close() throws IOException 
34      {
35          if (beanFactory != null && beanFactory instanceof DisposableBean)
36          {
37              try 
38              {
39                  ((DisposableBean) beanFactory).destroy();
40                  log.info("Destroyed BeanFactory from Guice provider.");
41              } 
42              catch (IOException e) 
43              {
44                  log.info("Caught IO exception destroying BeanFactory: " + e);
45                  throw e;
46              } 
47              catch (Exception e) 
48              {
49                  log.info("Unexpected exception while destroying BeanFactory: " + e);
50                  throw new RuntimeException(e);
51              }
52          }
53      }
54      
55      private final BeanFactoryLoader loader;
56      
57      /* @GuardedBy("this") */ private BeanFactory beanFactory;
58  
59      /**
60       * The log stream
61       */
62      private static final Logger log = Logger.getLogger(CloseableBeanFactoryProvider.class);
63  }