View Javadoc
1   package com.atlassian.activeobjects.external;
2   
3   import net.java.ao.Transaction;
4   import org.springframework.beans.BeansException;
5   import org.springframework.beans.factory.config.BeanPostProcessor;
6   
7   import static com.atlassian.activeobjects.tx.TransactionalProxy.isAnnotated;
8   import static com.atlassian.activeobjects.tx.TransactionalProxy.transactional;
9   import static com.google.common.base.Preconditions.checkNotNull;
10  
11  /**
12   * <p>This is the class that processes the {@link com.atlassian.activeobjects.tx.Transactional} annotation
13   * within a plugin.</p>
14   * <p>Simply add this snippet of code in your plugin descriptor:</p>
15   * <code>
16   * &lt;component key="tx-annotation-processor" class="com.atlassian.activeobjects.external.TransactionalAnnotationProcessor" /&gt;
17   * </code>
18   * <p><strong>Note:</strong> This class does not live in the {@link com.atlassian.activeobjects.tx} package in order to
19   * be available to plugins without any additional imports (OSGi wise).</p>
20   *
21   * @see com.atlassian.activeobjects.tx.Transactional
22   */
23  public final class TransactionalAnnotationProcessor implements BeanPostProcessor {
24      private final ActiveObjects ao;
25  
26      public TransactionalAnnotationProcessor(ActiveObjects ao) {
27          // AO-283, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6588239
28          // prevent a sun (Oracle) JVM deadlock.
29          Transaction.class.getAnnotations();
30  
31  
32          this.ao = checkNotNull(ao);
33      }
34  
35      public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
36          return o;
37      }
38  
39      public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
40          return isAnnotated(o.getClass()) ? transactional(ao, o) : o;
41      }
42  }