PageRenderTime 73ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/plugin/src/main/java/com/atlassian/labs/speakeasy/manager/ExtensionBuilder.java

https://github.com/mrdon/speakeasy-plugin
Java | 225 lines | 197 code | 19 blank | 9 comment | 44 complexity | ffd88ee0b9c13bfaf871dd88f80b5fc6 MD5 | raw file
  1. package com.atlassian.labs.speakeasy.manager;
  2. import com.atlassian.labs.speakeasy.commonjs.descriptor.CommonJsModulesDescriptor;
  3. import com.atlassian.labs.speakeasy.data.SpeakeasyData;
  4. import com.atlassian.labs.speakeasy.manager.convention.JsonManifestHandler;
  5. import com.atlassian.labs.speakeasy.model.Extension;
  6. import com.atlassian.labs.speakeasy.model.UserExtension;
  7. import com.atlassian.labs.speakeasy.model.JsonManifest;
  8. import com.atlassian.labs.speakeasy.util.ExtensionValidate;
  9. import com.atlassian.plugin.ModuleDescriptor;
  10. import com.atlassian.plugin.Plugin;
  11. import com.atlassian.plugin.PluginAccessor;
  12. import com.atlassian.plugin.impl.UnloadablePlugin;
  13. import com.atlassian.sal.api.user.UserManager;
  14. import com.atlassian.sal.api.user.UserProfile;
  15. import org.osgi.framework.BundleContext;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Component;
  18. import java.util.List;
  19. import java.util.Set;
  20. import static com.google.common.collect.Sets.newHashSet;
  21. /**
  22. *
  23. */
  24. @Component
  25. class ExtensionBuilder
  26. {
  27. private final PermissionManager permissionManager;
  28. private final UserManager userManager;
  29. private final SpeakeasyData data;
  30. private final JsonManifestHandler jsonManifestHandler;
  31. private final PluginAccessor pluginAccessor;
  32. private final BundleContext bundleContext;
  33. @Autowired
  34. public ExtensionBuilder(PermissionManager permissionManager, UserManager userManager, SpeakeasyData data, JsonManifestHandler jsonManifestHandler, PluginAccessor pluginAccessor, BundleContext bundleContext)
  35. {
  36. this.permissionManager = permissionManager;
  37. this.userManager = userManager;
  38. this.data = data;
  39. this.jsonManifestHandler = jsonManifestHandler;
  40. this.pluginAccessor = pluginAccessor;
  41. this.bundleContext = bundleContext;
  42. }
  43. public Extension build(Plugin plugin) throws PluginOperationFailedException
  44. {
  45. return buildGlobal(plugin, new Extension(plugin));
  46. }
  47. public UserExtension build(Plugin plugin, String userName, Iterable<Plugin> speakeasyPlugins) throws PluginOperationFailedException
  48. {
  49. UserExtension extension = buildGlobal(plugin, new UserExtension(plugin));
  50. boolean canAuthor = permissionManager.canAuthorExtensions(userName);
  51. List<String> accessList = data.getUsersList(plugin.getKey());
  52. boolean isAuthor = userName.equals(extension.getAuthor());
  53. boolean hasFavorited = data.getFavorites(plugin.getKey()).contains(userName);
  54. boolean pureSpeakeasy = ExtensionValidate.isPureSpeakeasyExtension(bundleContext, plugin);
  55. if (extension.isAvailable())
  56. {
  57. extension.setEnabled(accessList.contains(userName));
  58. extension.setCanEnable(!extension.isEnabled());
  59. extension.setCanDisable(extension.isEnabled());
  60. }
  61. boolean canEdit = isAuthor && pureSpeakeasy && canAuthor;
  62. extension.setCanEdit(canEdit);
  63. extension.setCanUninstall(canEdit);
  64. extension.setCanFork(!extension.isFork() && pureSpeakeasy && canAuthor);
  65. extension.setCanFavorite(!hasFavorited);
  66. extension.setCanDownload(pureSpeakeasy && canAuthor);
  67. // if the user has already forked this, don't let them fork again
  68. if (!extension.isFork())
  69. {
  70. for (Plugin plug : speakeasyPlugins)
  71. {
  72. if (extension.getKey().equals(Extension.getForkedPluginKey(plug.getKey())) && userName.equals(getPluginAuthor(plug)))
  73. {
  74. extension.setCanFork(false);
  75. }
  76. }
  77. }
  78. // if the user is an admin and admins aren't allowed to enable
  79. if (!permissionManager.canEnableExtensions(userName))
  80. {
  81. extension.setCanEnable(false);
  82. extension.setCanFork(false);
  83. extension.setCanEdit(false);
  84. }
  85. // global extensions are quite limited
  86. final boolean isGlobalExtension = data.isGlobalExtension(plugin.getKey());
  87. if (isGlobalExtension)
  88. {
  89. extension.setCanEnable(false);
  90. extension.setCanDisable(false);
  91. extension.setEnabled(true);
  92. extension.setCanEdit(false);
  93. extension.setCanUninstall(false);
  94. extension.setCanFork(false);
  95. }
  96. // forks of global extensions can't be enabled
  97. if (data.isGlobalExtension(extension.getForkedPluginKey()))
  98. {
  99. extension.setCanEnable(false);
  100. }
  101. if (userManager.isAdmin(userName))
  102. {
  103. // if already a global extension, allow the admin to disable it
  104. if (isGlobalExtension)
  105. {
  106. extension.setCanDisableGlobally(true);
  107. extension.setCanEdit(true);
  108. extension.setCanUninstall(true);
  109. }
  110. else
  111. {
  112. extension.setCanEnableGlobally(true);
  113. }
  114. }
  115. return extension;
  116. }
  117. private <T extends Extension> T buildGlobal(Plugin plugin, T extension) throws PluginOperationFailedException
  118. {
  119. String author = getPluginAuthor(plugin);
  120. extension.setAuthor(author);
  121. UserProfile profile = userManager.getUserProfile(author);
  122. extension.setAuthorDisplayName(profile != null && profile.getFullName() != null
  123. ? profile.getFullName()
  124. : author);
  125. extension.setAuthorEmail(profile != null ? profile.getEmail() : "unknown@example.com");
  126. List<String> accessList = data.getUsersList(plugin.getKey());
  127. extension.setNumUsers(accessList.size());
  128. extension.setNumFavorites(data.getFavorites(plugin.getKey()).size());
  129. if (plugin.getResource("/" + JsonManifest.ATLASSIAN_EXTENSION_PATH) != null)
  130. {
  131. JsonManifest mf = jsonManifestHandler.read(plugin);
  132. extension.setDescription(mf.getDescription());
  133. extension.setName(mf.getName());
  134. extension.setExtension("zip");
  135. }
  136. // try to detect a failed install of a zip plugin
  137. else if (plugin instanceof UnloadablePlugin &&
  138. plugin.getModuleDescriptor("modules") != null &&
  139. plugin.getModuleDescriptor("images") != null &&
  140. plugin.getModuleDescriptor("css") != null)
  141. {
  142. extension.setExtension("zip");
  143. extension.setName(plugin.getName());
  144. extension.setDescription(((UnloadablePlugin) plugin).getErrorText());
  145. }
  146. else if (plugin.getResource("/atlassian-plugin.xml") != null)
  147. {
  148. extension.setExtension("jar");
  149. }
  150. else
  151. {
  152. extension.setExtension("xml");
  153. }
  154. if (extension.getName() == null)
  155. {
  156. extension.setName(extension.getKey());
  157. }
  158. if (extension.getDescription() == null)
  159. {
  160. extension.setDescription("");
  161. }
  162. if (pluginAccessor.isPluginEnabled(plugin.getKey()))
  163. {
  164. Set<String> unresolvedExternalModuleDependencies = findUnresolvedCommonJsDependencies(plugin);
  165. if (unresolvedExternalModuleDependencies.isEmpty())
  166. {
  167. extension.setAvailable(true);
  168. }
  169. else
  170. {
  171. extension.setDescription("Unable to find modules: " + unresolvedExternalModuleDependencies);
  172. }
  173. }
  174. else if (plugin instanceof UnloadablePlugin)
  175. {
  176. extension.setDescription(((UnloadablePlugin)plugin).getErrorText());
  177. }
  178. extension.setFork(extension.getForkedPluginKey() != null);
  179. return extension;
  180. }
  181. private Set<String> findUnresolvedCommonJsDependencies(Plugin plugin)
  182. {
  183. Set<String> unresolved = newHashSet();
  184. for (ModuleDescriptor descriptor : plugin.getModuleDescriptors())
  185. {
  186. if (descriptor instanceof CommonJsModulesDescriptor)
  187. {
  188. unresolved.addAll(((CommonJsModulesDescriptor)descriptor).getUnresolvedExternalModuleDependencies());
  189. }
  190. }
  191. return unresolved;
  192. }
  193. private String getPluginAuthor(Plugin plugin)
  194. {
  195. String author = data.getPluginAuthor(plugin.getKey());
  196. if (author == null)
  197. {
  198. author = plugin.getPluginInformation().getVendorName();
  199. }
  200. if (author == null)
  201. {
  202. author = "(unknown)";
  203. }
  204. return author;
  205. }
  206. }