PageRenderTime 45ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/refapp-core/src/main/java/com/atlassian/plugin/refimpl/container/beans/PluginSystemBeans.java

https://bitbucket.org/atlassian/atlassian-refapp
Java | 207 lines | 168 code | 26 blank | 13 comment | 0 complexity | f36cf4119dcb7e76a4437f6b02a5739e MD5 | raw file
  1. package com.atlassian.plugin.refimpl.container.beans;
  2. import com.atlassian.plugin.ModuleDescriptorFactory;
  3. import com.atlassian.plugin.PluginAccessor;
  4. import com.atlassian.plugin.PluginController;
  5. import com.atlassian.plugin.SplitStartupPluginSystemLifecycle;
  6. import com.atlassian.plugin.event.PluginEventManager;
  7. import com.atlassian.plugin.hostcontainer.HostContainer;
  8. import com.atlassian.plugin.main.AtlassianPlugins;
  9. import com.atlassian.plugin.main.PluginsConfiguration;
  10. import com.atlassian.plugin.main.PluginsConfigurationBuilder;
  11. import com.atlassian.plugin.manager.PluginPersistentStateStore;
  12. import com.atlassian.plugin.metadata.DefaultPluginMetadataManager;
  13. import com.atlassian.plugin.metadata.PluginMetadataManager;
  14. import com.atlassian.plugin.module.ClassPrefixModuleFactory;
  15. import com.atlassian.plugin.module.ModuleFactory;
  16. import com.atlassian.plugin.module.PrefixDelegatingModuleFactory;
  17. import com.atlassian.plugin.module.PrefixModuleFactory;
  18. import com.atlassian.plugin.osgi.bridge.external.SpringHostContainer;
  19. import com.atlassian.plugin.osgi.container.OsgiContainerManager;
  20. import com.atlassian.plugin.osgi.container.PackageScannerConfiguration;
  21. import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
  22. import com.atlassian.plugin.osgi.module.BeanPrefixModuleFactory;
  23. import com.atlassian.plugin.refimpl.DefaultPluginPersistentStateStore;
  24. import com.atlassian.plugin.refimpl.plugins.RefappHostComponentProvider;
  25. import com.atlassian.plugin.refimpl.plugins.RefappModuleDescriptorFactoryFactory;
  26. import com.atlassian.plugin.refimpl.saldeps.CookieBasedScopeManager;
  27. import com.atlassian.plugin.refimpl.version.HostVersion;
  28. import com.atlassian.plugin.scope.ScopeManager;
  29. import com.atlassian.plugin.servlet.DefaultServletModuleManager;
  30. import com.atlassian.plugin.servlet.ServletModuleManager;
  31. import org.apache.commons.io.FileUtils;
  32. import org.springframework.beans.factory.annotation.Qualifier;
  33. import org.springframework.context.annotation.Bean;
  34. import org.springframework.context.annotation.Configuration;
  35. import org.springframework.context.annotation.Primary;
  36. import org.springframework.web.context.ServletContextAware;
  37. import javax.annotation.Nonnull;
  38. import javax.servlet.ServletContext;
  39. import java.io.File;
  40. import java.net.URL;
  41. import java.util.HashSet;
  42. import java.util.Set;
  43. import static com.atlassian.plugin.refimpl.plugins.PackageScannerConfigurationFactory.getPackageScannerConfiguration;
  44. import static com.atlassian.plugin.refimpl.plugins.RefappApplication.refapp;
  45. import static com.atlassian.plugin.refimpl.servlet.ServletContextUtils.findAndCreateDirectory;
  46. import static com.atlassian.plugin.refimpl.servlet.ServletContextUtils.getBundledPluginDir;
  47. import static com.atlassian.plugin.refimpl.servlet.ServletContextUtils.makeSureDirectoryExists;
  48. import static java.util.Arrays.asList;
  49. import static java.util.Objects.requireNonNull;
  50. /**
  51. * Spring beans relating to the OSGi plugin system.
  52. *
  53. * @since 5.4
  54. */
  55. @Configuration
  56. public class PluginSystemBeans implements ServletContextAware {
  57. private ServletContext servletContext;
  58. @Override
  59. public void setServletContext(@Nonnull final ServletContext servletContext) {
  60. this.servletContext = requireNonNull(servletContext);
  61. }
  62. @Bean
  63. public AtlassianPlugins atlassianPlugins(final PluginsConfiguration pluginsConfiguration) {
  64. return new AtlassianPlugins(pluginsConfiguration);
  65. }
  66. @Bean
  67. public URL bundledPluginDir() {
  68. return getBundledPluginDir(servletContext);
  69. }
  70. @Bean
  71. public File frameworkBundlesDir() {
  72. return findAndCreateDirectory(
  73. servletContext, "framework.bundles", "/WEB-INF/framework-bundles");
  74. }
  75. @Bean
  76. public RefappHostComponentProvider hostComponentProvider() {
  77. return RefappHostComponentProvider.getInstance();
  78. }
  79. @Bean
  80. public HostContainer hostContainer() {
  81. return new SpringHostContainer();
  82. }
  83. @Bean
  84. public ModuleDescriptorFactory moduleDescriptorFactory(final HostContainer hostContainer) {
  85. return RefappModuleDescriptorFactoryFactory.getInstance(hostContainer);
  86. }
  87. @Bean
  88. public ModuleFactory moduleFactory(final HostContainer hostContainer) {
  89. final Set<PrefixModuleFactory> prefixModuleFactories = new HashSet<>(asList(
  90. new BeanPrefixModuleFactory(),
  91. new ClassPrefixModuleFactory(hostContainer)
  92. ));
  93. return new PrefixDelegatingModuleFactory(prefixModuleFactories);
  94. }
  95. @Bean
  96. public File osgiCache() {
  97. return findAndCreateDirectory(servletContext, "osgi.cache", "/WEB-INF/osgi-cache");
  98. }
  99. @Bean
  100. public OsgiContainerManager osgiContainerManager(final AtlassianPlugins plugins) {
  101. return plugins.getOsgiContainerManager();
  102. }
  103. @Bean
  104. public PackageScannerConfiguration packageScannerConfiguration(final HostVersion hostVersion) {
  105. return getPackageScannerConfiguration(servletContext, hostVersion);
  106. }
  107. @Bean
  108. public PluginAccessor pluginAccessor(final AtlassianPlugins plugins) {
  109. return plugins.getPluginAccessor();
  110. }
  111. @Bean(destroyMethod = "")
  112. public PluginController pluginController(final AtlassianPlugins plugins) {
  113. return plugins.getPluginController();
  114. }
  115. @Bean
  116. public File pluginDirectory() {
  117. return makeSureDirectoryExists(servletContext, "/WEB-INF/plugins");
  118. }
  119. @Bean
  120. public PluginEventManager pluginEventManager(final AtlassianPlugins plugins) {
  121. return plugins.getPluginEventManager();
  122. }
  123. @Bean
  124. public PluginMetadataManager pluginMetadataManager() {
  125. return new DefaultPluginMetadataManager();
  126. }
  127. @Bean
  128. public PluginPersistentStateStore pluginPersistentStateStore(@Qualifier("osgiCache") final File osgiCache) {
  129. return new DefaultPluginPersistentStateStore(osgiCache);
  130. }
  131. @Bean
  132. @SuppressWarnings("java:S107")
  133. public PluginsConfiguration pluginsConfiguration(
  134. @Qualifier("bundledPluginDir") final URL bundledPluginDir,
  135. @Qualifier("frameworkBundlesDir") final File frameworkBundlesDir,
  136. @Qualifier("pluginDirectory") final File pluginDirectory,
  137. final ModuleDescriptorFactory moduleDescriptorFactory,
  138. final PackageScannerConfiguration scannerConfig,
  139. final HostComponentProvider hostComponentProvider,
  140. @Qualifier("osgiCache") final File osgiCache,
  141. final PluginPersistentStateStore pluginStateStore,
  142. final ScopeManager scopeManager) {
  143. // When bundledPluginUrl is a directory, bundledPluginCacheDirectory is not used at all.
  144. // But we have to keep it to make the validation happy.
  145. final File legacyBundledPluginCacheDirectory = FileUtils.toFile(bundledPluginDir);
  146. return new PluginsConfigurationBuilder()
  147. .useLegacyDynamicPluginDeployer(true)
  148. .frameworkBundleDirectory(frameworkBundlesDir)
  149. .bundledPluginUrl(bundledPluginDir)
  150. .bundledPluginCacheDirectory(legacyBundledPluginCacheDirectory)
  151. .pluginDirectory(pluginDirectory)
  152. .moduleDescriptorFactory(moduleDescriptorFactory)
  153. .packageScannerConfiguration(scannerConfig)
  154. .hostComponentProvider(hostComponentProvider)
  155. .osgiPersistentCache(osgiCache)
  156. .pluginStateStore(pluginStateStore)
  157. .application(refapp())
  158. .scopeManager(scopeManager)
  159. .build();
  160. }
  161. @Bean
  162. public ScopeManager scopeManager() {
  163. return new CookieBasedScopeManager();
  164. }
  165. @Bean
  166. public ServletModuleManager servletModuleManager(
  167. final PluginEventManager pluginEventManager, final ScopeManager scopeManager) {
  168. return new DefaultServletModuleManager(servletContext, pluginEventManager, scopeManager);
  169. }
  170. @Bean(destroyMethod = "") // RefappLauncher calls its shutdown() method at the appropriate time
  171. @Primary
  172. public SplitStartupPluginSystemLifecycle pluginSystemLifecycle(final AtlassianPlugins plugins) {
  173. /*
  174. The returned object is actually a DefaultPluginManager, which apart from implementing
  175. SplitStartupPluginSystemLifecycle also implements PluginAccessor and PluginController. However, there are
  176. separate bean definitions for those latter two types, so if you get an error about too many beans of those
  177. types, qualify your bean lookup with the relevant bean name, i.e. "pluginAccessor" or "pluginController".
  178. */
  179. return plugins.getPluginSystemLifecycle();
  180. }
  181. }