PageRenderTime 27ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/import/plugins3-plugin/src/main/java/com/atlassian/labs/plugins3/extender/Plugins3ApplicationContextPreProcessor.java

https://bitbucket.org/mrdon/p3
Java | 138 lines | 97 code | 14 blank | 27 comment | 2 complexity | 80eaa5545fd3eb8a789d925cde83e364 MD5 | raw file
  1. package com.atlassian.labs.plugins3.extender;
  2. import com.atlassian.labs.plugins3.api.annotation.Component;
  3. import com.atlassian.labs.plugins3.api.annotation.PluginModule;
  4. import com.atlassian.labs.plugins3.spring.HostComponentBeanFactoryPostProcessor;
  5. import com.atlassian.plugin.Plugin;
  6. import com.atlassian.plugin.PluginAccessor;
  7. import com.atlassian.plugin.osgi.spring.external.ApplicationContextPreProcessor;
  8. import com.atlassian.plugin.osgi.util.OsgiHeaderUtil;
  9. import com.google.common.collect.Sets;
  10. import org.osgi.framework.Bundle;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.slf4j.helpers.MarkerIgnoringBase;
  14. import org.springframework.beans.BeansException;
  15. import org.springframework.beans.factory.BeanFactory;
  16. import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
  17. import org.springframework.beans.factory.annotation.CustomAutowireConfigurer;
  18. import org.springframework.beans.factory.config.BeanDefinitionHolder;
  19. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  20. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  21. import org.springframework.beans.factory.support.BeanDefinitionDefaults;
  22. import org.springframework.beans.factory.support.BeanDefinitionRegistry;
  23. import org.springframework.beans.factory.xml.ParserContext;
  24. import org.springframework.beans.factory.xml.XmlReaderContext;
  25. import org.springframework.context.ApplicationContext;
  26. import org.springframework.context.ConfigurableApplicationContext;
  27. import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
  28. import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
  29. import org.springframework.core.type.filter.AnnotationTypeFilter;
  30. import org.w3c.dom.Element;
  31. import javax.inject.Inject;
  32. import javax.inject.Named;
  33. import java.util.Set;
  34. import static java.util.Arrays.asList;
  35. /**
  36. *
  37. */
  38. public class Plugins3ApplicationContextPreProcessor implements ApplicationContextPreProcessor
  39. {
  40. private final PluginAccessor pluginAccessor;
  41. private static final Logger log = LoggerFactory.getLogger(Plugins3ApplicationContextPreProcessor.class);
  42. public Plugins3ApplicationContextPreProcessor(PluginAccessor pluginAccessor)
  43. {
  44. this.pluginAccessor = pluginAccessor;
  45. }
  46. public boolean isSpringPoweredBundle(Bundle bundle)
  47. {
  48. try
  49. {
  50. bundle.loadClass("AtlassianPlugin");
  51. return true;
  52. }
  53. catch (ClassNotFoundException e)
  54. {
  55. return false;
  56. }
  57. }
  58. public void process(Bundle bundle, final ConfigurableApplicationContext configurableApplicationContext)
  59. {
  60. final AutowiredAnnotationBeanPostProcessor autowireProcessor = new AutowiredAnnotationBeanPostProcessor();
  61. autowireProcessor.setAutowiredAnnotationType(Inject.class);
  62. final Plugin plugin = pluginAccessor.getPlugin(OsgiHeaderUtil.getPluginKey(bundle));
  63. configurableApplicationContext.addBeanFactoryPostProcessor(new BeanFactoryPostProcessor()
  64. {
  65. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
  66. {
  67. beanFactory.addBeanPostProcessor(autowireProcessor);
  68. //beanFactory.addBeanPostProcessor(new CommonAnnotationBeanPostProcessor());
  69. String scanPackage = plugin.getPluginInformation().getParameters().get("scanPackage");
  70. if (scanPackage != null)
  71. {
  72. scanForModules(beanFactory, configurableApplicationContext, scanPackage);
  73. }
  74. }
  75. });
  76. CustomAutowireConfigurer configurer = new CustomAutowireConfigurer();
  77. configurer.setCustomQualifierTypes(Sets.newHashSet(Named.class));
  78. configurableApplicationContext.addBeanFactoryPostProcessor(configurer);
  79. configurableApplicationContext.addBeanFactoryPostProcessor(new HostComponentBeanFactoryPostProcessor());
  80. }
  81. private void scanForModules(ConfigurableListableBeanFactory beanFactory, ConfigurableApplicationContext configurableApplicationContext, String... basePackages)
  82. {
  83. long start = System.currentTimeMillis();
  84. ClassPathBeanDefinitionScanner scanner = configureScanner(configurableApplicationContext, beanFactory);
  85. scanner.setIncludeAnnotationConfig(false);
  86. int beansFound = scanner.scan(basePackages);
  87. log.info("Found {} modules for in package bases {} in {} ms", new Object[]{beansFound, asList(basePackages), (System.currentTimeMillis() - start)});
  88. }
  89. protected ClassPathBeanDefinitionScanner createScanner(BeanFactory beanFactory)
  90. {
  91. return new ClassPathBeanDefinitionScanner((BeanDefinitionRegistry)beanFactory, false);
  92. }
  93. protected ClassPathBeanDefinitionScanner configureScanner(ApplicationContext applicationContext, BeanFactory beanFactory)
  94. {
  95. //boolean useDefaultFilters = true;
  96. //if (element.hasAttribute(USE_DEFAULT_FILTERS_ATTRIBUTE)) {
  97. // useDefaultFilters = Boolean.valueOf(element.getAttribute(USE_DEFAULT_FILTERS_ATTRIBUTE));
  98. //}
  99. // Delegate bean definition registration to scanner class.
  100. ClassPathBeanDefinitionScanner scanner = createScanner(beanFactory);
  101. scanner.addIncludeFilter(new AnnotationTypeFilter(PluginModule.class));
  102. scanner.setResourceLoader(applicationContext);
  103. scanner.setBeanDefinitionDefaults(new BeanDefinitionDefaults());
  104. //scanner.setAutowireCandidatePatterns(parserContext.getDelegate().getAutowireCandidatePatterns());
  105. /*
  106. try {
  107. parseBeanNameGenerator(element, scanner);
  108. }
  109. catch (Exception ex) {
  110. readerContext.error(ex.getMessage(), readerContext.extractSource(element), ex.getCause());
  111. }
  112. try {
  113. parseScope(element, scanner);
  114. }
  115. catch (Exception ex) {
  116. readerContext.error(ex.getMessage(), readerContext.extractSource(element), ex.getCause());
  117. }
  118. parseTypeFilters(element, scanner, readerContext);
  119. */
  120. return scanner;
  121. }
  122. }