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
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
44
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
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
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