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
58
59 /**
60 * The log stream
61 */
62 private static final Logger log = Logger.getLogger(CloseableBeanFactoryProvider.class);
63 }