View Javadoc

1   package com.atlassian.sal.spring.component;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   
6   import org.apache.commons.logging.Log;
7   import org.apache.commons.logging.LogFactory;
8   import org.springframework.beans.BeansException;
9   import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
10  import org.springframework.beans.factory.support.DefaultListableBeanFactory;
11  import org.springframework.context.ApplicationContext;
12  import org.springframework.context.ApplicationContextAware;
13  import org.springframework.context.support.AbstractApplicationContext;
14  import org.springframework.transaction.PlatformTransactionManager;
15  import org.springframework.transaction.TransactionDefinition;
16  import org.springframework.transaction.TransactionStatus;
17  import org.springframework.transaction.support.DefaultTransactionDefinition;
18  
19  import com.atlassian.sal.spi.HostContextAccessor;
20  
21  /**
22   * Implements the host context accessor for Spring environments
23   */
24  public class SpringHostContextAccessor implements HostContextAccessor, ApplicationContextAware
25  {
26      private ApplicationContext applicationContext;
27      private final PlatformTransactionManager transactionManager;
28      private static final Log log = LogFactory.getLog(SpringHostContextAccessor.class);
29  
30      public SpringHostContextAccessor(final PlatformTransactionManager transactionManager)
31      {
32          this.transactionManager = transactionManager;
33      }
34  
35      @SuppressWarnings("unchecked")
36  	public <T> Map<String, T> getComponentsOfType(final Class<T> iface)
37      {
38          try
39  		{
40          	return applicationContext.getBeansOfType(iface);
41  		} catch (final RuntimeException ex)
42  		{
43  			// This exception will start occuring after removing bean from the context (eg: disabling plugin)
44  			// until next restart of Confluence. See https://studio.atlassian.com/browse/JST-509
45  			log.debug(ex,ex);
46              final Map<String, T> results = new HashMap<String, T>();
47              if (applicationContext instanceof AbstractApplicationContext)
48              {
49                  final AbstractApplicationContext abstractApplicationContext = (AbstractApplicationContext) applicationContext;
50                  final ConfigurableListableBeanFactory beanFactory = abstractApplicationContext.getBeanFactory();
51                  if (beanFactory instanceof DefaultListableBeanFactory)
52                  {
53                      final DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
54                      final String[] beanDefinitionNames = defaultListableBeanFactory.getBeanDefinitionNames();
55                      for (final String beanName : beanDefinitionNames)
56  					{
57                          try
58                          {
59                              final Object bean = defaultListableBeanFactory.getBean(beanName);
60                              if (bean != null && iface.isAssignableFrom(bean.getClass()))
61                              {
62                                  results.put(beanName, (T) bean);
63                              }
64                          } catch (final BeansException e)
65                          {
66                              // ignore
67                          }
68                      }
69                  }
70              }
71              return results;
72          }
73  
74  
75  
76      }
77  
78      public Object doInTransaction(final HostTransactionCallback callback)
79      {
80          final org.springframework.transaction.support.TransactionTemplate txTemplate =
81                  new org.springframework.transaction.support.TransactionTemplate(transactionManager, getTransactionDefinition());
82          return txTemplate.execute(new org.springframework.transaction.support.TransactionCallback()
83          {
84              public Object doInTransaction(final TransactionStatus transactionStatus)
85              {
86                  try
87                  {
88                      return callback.doInTransaction();
89                  }
90                  catch (final RuntimeException e)
91                  {
92                      //rollback if something weird happened.
93                      transactionStatus.setRollbackOnly();
94                      throw e;
95                  }
96              }
97          });
98      }
99  
100     public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException
101     {
102         this.applicationContext = applicationContext;
103     }
104 
105     protected DefaultTransactionDefinition getTransactionDefinition()
106     {
107         final DefaultTransactionDefinition def = new DefaultTransactionDefinition();
108         def.setName("PluginReadWriteTx");
109         def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
110         def.setReadOnly(false);
111         return def;
112     }
113 
114 
115 
116 }
117