View Javadoc

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