diff --git a/plugin/pom.xml b/plugin/pom.xml index a26a7c51..f89c9f23 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -100,18 +100,6 @@ ${fecru.version} provided - - com.atlassian.fisheye - fisheye-jar - ${fecru.version} - provided - - - com.atlassian.fisheye - atlassian-fisheye-dependencies - - - junit junit @@ -179,13 +167,13 @@ com.atlassian.plugins atlassian-plugins-webresource - ${plugins.version} + ${webresource.plugins.version} provided com.atlassian.plugins atlassian-plugins-webfragment - ${plugins.version} + ${webfragment.plugins.version} provided @@ -311,6 +299,7 @@ com.atlassian.plugins.rest.common.security, com.atlassian.sal.api.*;version="(2.4,3.0]", org.apache.commons.lang.*;version="2.4", + com.atlassian.fisheye.spi.services, com.atlassian.jira.config;resolution:=optional, *;resolution:=optional @@ -531,7 +520,9 @@ 3.1-m2 2.6.1 firefox-3.6 - 2.13.4 + 3.0.8 + 3.0.2 + 3.0.0 2.5.0 2.5.0 1.1.1 diff --git a/plugin/src/main/java/com/atlassian/labs/speakeasy/descriptor/external/webfragment/SpeakeasyWebItemModuleDescriptor.java b/plugin/src/main/java/com/atlassian/labs/speakeasy/descriptor/external/webfragment/SpeakeasyWebItemModuleDescriptor.java index 47465b73..90bcc2b1 100644 --- a/plugin/src/main/java/com/atlassian/labs/speakeasy/descriptor/external/webfragment/SpeakeasyWebItemModuleDescriptor.java +++ b/plugin/src/main/java/com/atlassian/labs/speakeasy/descriptor/external/webfragment/SpeakeasyWebItemModuleDescriptor.java @@ -13,6 +13,8 @@ import com.atlassian.plugin.web.descriptors.WebItemModuleDescriptor; import com.atlassian.plugin.webresource.UrlMode; import com.atlassian.plugin.webresource.WebResourceManager; +import com.atlassian.plugin.webresource.WebResourceUrlProvider; + import org.dom4j.Element; import org.osgi.framework.BundleContext; @@ -31,13 +33,20 @@ public class SpeakeasyWebItemModuleDescriptor extends AbstractModuleDescriptor trackedPlugins = new CopyOnWriteArraySet(); - public ConventionDescriptorGeneratorServiceFactory(final ModuleFactory moduleFactory, final BundleContext bundleContext, final PluginAccessor pluginAccessor, HostContainer hostContainer, DescriptorGeneratorManagerImpl descriptorGeneratorManager, JsonToElementParser jsonToElementParser, WebResourceManager webResourceManager, PluginEventManager pluginEventManager, final PluginController pluginController, JsonManifestHandler jsonManifestHandler) + public ConventionDescriptorGeneratorServiceFactory( + final ModuleFactory moduleFactory, + final BundleContext bundleContext, + final PluginAccessor pluginAccessor, + HostContainer hostContainer, + DescriptorGeneratorManagerImpl descriptorGeneratorManager, + JsonToElementParser jsonToElementParser, + WebResourceManager webResourceManager, + PluginEventManager pluginEventManager, + final PluginController pluginController, + JsonManifestHandler jsonManifestHandler, + WebResourceUrlProvider webResourceUrlProvider) { this.moduleFactory = moduleFactory; this.bundleContext = bundleContext; @@ -54,6 +68,7 @@ public ConventionDescriptorGeneratorServiceFactory(final ModuleFactory moduleFac this.webResourceManager = webResourceManager; this.pluginController = pluginController; this.jsonManifestHandler = jsonManifestHandler; + this.webResourceUrlProvider = webResourceUrlProvider; } public Object getService(Bundle bundle, ServiceRegistration registration) @@ -117,7 +132,7 @@ private void registerSpeakeasyWebItems(Bundle bundle, Plugin plugin) { for (Element element : jsonToElementParser.createWebItems(plugin.getResourceAsStream("ui/web-items.json"))) { - SpeakeasyWebItemModuleDescriptor descriptor = new SpeakeasyWebItemModuleDescriptor(moduleFactory, bundleContext, descriptorGeneratorManager, webResourceManager); + SpeakeasyWebItemModuleDescriptor descriptor = new SpeakeasyWebItemModuleDescriptor(moduleFactory, bundleContext, descriptorGeneratorManager, webResourceManager, webResourceUrlProvider); descriptor.init(plugin, element); bundle.getBundleContext().registerService(ModuleDescriptor.class.getName(), descriptor, null); } diff --git a/plugin/src/main/java/com/atlassian/labs/speakeasy/model/Settings.java b/plugin/src/main/java/com/atlassian/labs/speakeasy/model/Settings.java index 02d7fe34..49234271 100644 --- a/plugin/src/main/java/com/atlassian/labs/speakeasy/model/Settings.java +++ b/plugin/src/main/java/com/atlassian/labs/speakeasy/model/Settings.java @@ -1,14 +1,10 @@ package com.atlassian.labs.speakeasy.model; -import com.cenqua.fisheye.config1.Admins; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; import javax.xml.bind.annotation.*; -import java.util.Arrays; import java.util.Set; -import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Sets.newHashSet; /** diff --git a/plugin/src/main/java/com/atlassian/labs/speakeasy/product/FecruProductAccessor.java b/plugin/src/main/java/com/atlassian/labs/speakeasy/product/FecruProductAccessor.java index 1d97e9f9..932fbab3 100644 --- a/plugin/src/main/java/com/atlassian/labs/speakeasy/product/FecruProductAccessor.java +++ b/plugin/src/main/java/com/atlassian/labs/speakeasy/product/FecruProductAccessor.java @@ -1,11 +1,12 @@ package com.atlassian.labs.speakeasy.product; -import com.atlassian.fecru.user.User; import com.atlassian.fisheye.spi.data.MailMessageData; import com.atlassian.labs.speakeasy.util.PomProperties; +import com.atlassian.sal.api.user.UserProfile; import com.atlassian.templaterenderer.TemplateRenderer; -import com.cenqua.fisheye.mail.Mailer; -import com.cenqua.fisheye.user.UserManager; +import com.atlassian.fisheye.spi.services.MailService; +import com.atlassian.sal.api.user.UserManager; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,10 +21,10 @@ public class FecruProductAccessor implements ProductAccessor { private final PomProperties pomProperties; private final UserManager userManager; private final TemplateRenderer templateRenderer; - private final Mailer mailer; + private final MailService mailer; public FecruProductAccessor(PomProperties pomProperties, TemplateRenderer templateRenderer, UserManager userManager, - Mailer mailer) { + MailService mailer) { this.pomProperties = pomProperties; this.templateRenderer = templateRenderer; @@ -36,13 +37,11 @@ public String getSdkName() { return "fecru"; } - public String getProfilePath() - { + public String getProfilePath() { return "/plugins/servlet/speakeasy/user"; } - public String getTargetUsernameFromCondition(Map context) - { + public String getTargetUsernameFromCondition(Map context) { return null; } @@ -57,9 +56,8 @@ public String getDataVersion() { public void sendEmail(EmailOptions options) { String toName = options.getToName(); String toEmail = options.getToEmail(); - if (options.getToUsername() != null) - { - final User user = getUser(options.getToUsername()); + if (options.getToUsername() != null) { + final UserProfile user = getUser(options.getToUsername()); if (user == null) { return; } @@ -67,7 +65,7 @@ public void sendEmail(EmailOptions options) { log.warn("No email found for username: " + options.getToUsername()); return; } - toName = user.getDisplayName(); + toName = user.getFullName(); toEmail = user.getEmail(); } @@ -79,8 +77,7 @@ public void sendEmail(EmailOptions options) { message.setFromDisplayName(options.getFromName()); message.addRecipient(toEmail); - if (options.getReplyToEmail() != null) - { + if (options.getReplyToEmail() != null) { // todo: api doesn't seem to support this? } @@ -93,19 +90,18 @@ public void sendEmail(EmailOptions options) { } } - private String render(String templateName, Map context) throws IOException { + private String render(String templateName, Map context) throws IOException { StringWriter writer = new StringWriter(); templateRenderer.render(templateName, context, writer); return writer.toString(); } - private User getUser(String username) { - try { - return userManager.getUser(username); - } catch (Exception e) { - log.warn("Could not find user by username: " + username, e); - return null; + private UserProfile getUser(String username) { + UserProfile profile = userManager.getUserProfile(username); + if (profile == null) { + log.warn("Could not find user by username: " + username); } + return profile; } } diff --git a/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/AdminServlet.java b/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/AdminServlet.java index 9e3b8718..0330d119 100644 --- a/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/AdminServlet.java +++ b/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/AdminServlet.java @@ -6,6 +6,7 @@ import com.atlassian.labs.speakeasy.model.Settings; import com.atlassian.plugin.webresource.UrlMode; import com.atlassian.plugin.webresource.WebResourceManager; +import com.atlassian.plugin.webresource.WebResourceUrlProvider; import com.atlassian.plugins.rest.common.json.JaxbJsonMarshaller; import com.atlassian.sal.api.user.UserManager; import com.atlassian.templaterenderer.TemplateRenderer; @@ -32,14 +33,22 @@ public class AdminServlet extends HttpServlet private final UserManager userManager; private final WebResourceManager webResourceManager; private final JaxbJsonMarshaller jsonMarshaller; + private final WebResourceUrlProvider webResourceUrlProvider; - public AdminServlet(SpeakeasyService speakeasyService, UserManager userManager, TemplateRenderer templateRenderer, WebResourceManager webResourceManager, JaxbJsonMarshaller jsonMarshaller) + public AdminServlet( + SpeakeasyService speakeasyService, + UserManager userManager, + TemplateRenderer templateRenderer, + WebResourceManager webResourceManager, + JaxbJsonMarshaller jsonMarshaller, + WebResourceUrlProvider webResourceUrlProvider) { this.speakeasyService = speakeasyService; this.userManager = userManager; this.templateRenderer = templateRenderer; this.webResourceManager = webResourceManager; this.jsonMarshaller = jsonMarshaller; + this.webResourceUrlProvider = webResourceUrlProvider; } @Override @@ -62,7 +71,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se render("templates/admin.vm", ImmutableMap.builder(). put("user", user). put("contextPath", req.getContextPath()). - put("staticResourcesPrefix", webResourceManager.getStaticResourcePrefix(UrlMode.RELATIVE)). + put("staticResourcesPrefix", webResourceUrlProvider.getStaticResourcePrefix(UrlMode.RELATIVE)). put("settings", new JsRenderer(jsonMarshaller.marshal(settings))). put("permissionsJson", new JsRenderer(jsonMarshaller.marshal(Permission.ALL))). put("permissions", Permission.ALL). diff --git a/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/CssVariableTransformer.java b/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/CssVariableTransformer.java index 8b2e5187..7415f512 100644 --- a/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/CssVariableTransformer.java +++ b/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/CssVariableTransformer.java @@ -4,8 +4,8 @@ import com.atlassian.plugin.elements.ResourceLocation; import com.atlassian.plugin.servlet.DownloadableResource; import com.atlassian.plugin.webresource.UrlMode; -import com.atlassian.plugin.webresource.WebResourceManager; -import com.atlassian.plugin.webresource.transformer.AbstractStringTransformedDownloadableResource; +import com.atlassian.plugin.webresource.WebResourceUrlProvider; +import com.atlassian.plugin.webresource.transformer.CharSequenceDownloadableResource; import com.atlassian.plugin.webresource.transformer.WebResourceTransformer; import com.atlassian.sal.api.xsrf.XsrfTokenAccessor; import com.atlassian.sal.api.xsrf.XsrfTokenValidator; @@ -16,15 +16,18 @@ */ public class CssVariableTransformer implements WebResourceTransformer { - private final WebResourceManager webResourceManager; private final XsrfTokenAccessor xsrfTokenAccessor; private final XsrfTokenValidator xsrfTokenValidator; + private final WebResourceUrlProvider webResourceUrlProvider; - public CssVariableTransformer(WebResourceManager webResourceManager, XsrfTokenAccessor xsrfTokenAccessor, XsrfTokenValidator xsrfTokenValidator) + public CssVariableTransformer( + XsrfTokenAccessor xsrfTokenAccessor, + XsrfTokenValidator xsrfTokenValidator, + WebResourceUrlProvider webResourceUrlProvider) { - this.webResourceManager = webResourceManager; this.xsrfTokenAccessor = xsrfTokenAccessor; this.xsrfTokenValidator = xsrfTokenValidator; + this.webResourceUrlProvider = webResourceUrlProvider; } public DownloadableResource transform(Element configElement, ResourceLocation location, String filePath, DownloadableResource nextResource) @@ -32,7 +35,7 @@ public DownloadableResource transform(Element configElement, ResourceLocation lo return new CssVariableDownloadableResource(nextResource, configElement); } - private class CssVariableDownloadableResource extends AbstractStringTransformedDownloadableResource + private class CssVariableDownloadableResource extends CharSequenceDownloadableResource { private final Element configElement; @@ -43,18 +46,19 @@ public CssVariableDownloadableResource(DownloadableResource originalResource, El } @Override - protected String transform(String originalContent) + protected CharSequence transform(CharSequence originalSequence) { - String content = originalContent.replace("@staticResourcePrefix", webResourceManager.getStaticResourcePrefix(UrlMode.RELATIVE) + "/download/resources"); + String originalContent = originalSequence.toString(); + String content = originalContent.replace("@staticResourcePrefix", webResourceUrlProvider.getStaticResourcePrefix(UrlMode.RELATIVE) + "/download/resources"); String fullModuleKey = configElement.attributeValue("fullModuleKey"); if (fullModuleKey != null) { - content = content.replace("@modulePrefix", webResourceManager.getStaticResourcePrefix(UrlMode.RELATIVE) + "/download/resources/" + fullModuleKey); + content = content.replace("@modulePrefix", webResourceUrlProvider.getStaticResourcePrefix(UrlMode.RELATIVE) + "/download/resources/" + fullModuleKey); } String imagesModuleKey = configElement.attributeValue("imagesModuleKey"); if (imagesModuleKey != null) { - content = content.replace("@imagesPrefix", webResourceManager.getStaticResourcePrefix(UrlMode.RELATIVE) + "/download/resources/" + imagesModuleKey); + content = content.replace("@imagesPrefix", webResourceUrlProvider.getStaticResourcePrefix(UrlMode.RELATIVE) + "/download/resources/" + imagesModuleKey); } return content; } diff --git a/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/UserProfileRenderer.java b/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/UserProfileRenderer.java index 6c64d556..f0942f49 100644 --- a/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/UserProfileRenderer.java +++ b/plugin/src/main/java/com/atlassian/labs/speakeasy/ui/UserProfileRenderer.java @@ -13,6 +13,7 @@ import com.atlassian.plugin.web.WebInterfaceManager; import com.atlassian.plugin.webresource.UrlMode; import com.atlassian.plugin.webresource.WebResourceManager; +import com.atlassian.plugin.webresource.WebResourceUrlProvider; import com.atlassian.sal.api.ApplicationProperties; import com.atlassian.sal.api.user.UserManager; import com.atlassian.sal.api.xsrf.XsrfTokenAccessor; @@ -58,10 +59,25 @@ public class UserProfileRenderer private final XsrfTokenAccessor xsrfTokenAccessor; private final XsrfTokenValidator xsrfTokenValidator; private final ApplinkPanelRenderer applinkPanelRenderer; + private final WebResourceUrlProvider webResourceUrlProvider; private final FirefoxXpi firefoxXpi; @Autowired - public UserProfileRenderer(PluginAccessor pluginAccessor, TemplateRenderer templateRenderer, SpeakeasyService speakeasyService, UserManager userManager, WebResourceManager webResourceManager, ProductAccessor productAccessor, CommonJsModulesAccessor commonJsModulesAccessor, WebInterfaceManager webInterfaceManager, XsrfTokenAccessor xsrfTokenAccessor, XsrfTokenValidator xsrfTokenValidator, ApplicationProperties applicationProperties, FirefoxXpi firefoxXpi, ApplinkPanelRenderer applinkPanelRenderer) + public UserProfileRenderer( + PluginAccessor pluginAccessor, + TemplateRenderer templateRenderer, + SpeakeasyService speakeasyService, + UserManager userManager, + WebResourceManager webResourceManager, + ProductAccessor productAccessor, + CommonJsModulesAccessor commonJsModulesAccessor, + WebInterfaceManager webInterfaceManager, + XsrfTokenAccessor xsrfTokenAccessor, + XsrfTokenValidator xsrfTokenValidator, + ApplicationProperties applicationProperties, + FirefoxXpi firefoxXpi, + ApplinkPanelRenderer applinkPanelRenderer, + WebResourceUrlProvider webResourceUrlProvider) { this.templateRenderer = templateRenderer; this.commonJsModulesAccessor = commonJsModulesAccessor; @@ -71,6 +87,7 @@ public UserProfileRenderer(PluginAccessor pluginAccessor, TemplateRenderer templ this.applicationProperties = applicationProperties; this.firefoxXpi = firefoxXpi; this.applinkPanelRenderer = applinkPanelRenderer; + this.webResourceUrlProvider = webResourceUrlProvider; this.plugin = pluginAccessor.getPlugin("com.atlassian.labs.speakeasy-plugin"); this.speakeasyService = speakeasyService; this.userManager = userManager; @@ -106,7 +123,7 @@ public void render(HttpServletRequest req, HttpServletResponse resp, Writer outp put("availablePlugins", filter(plugins.getPlugins(), new AvailablePluginsFilter())). put("rowRenderer", new RowRenderer(req.getContextPath(), plugin)). put("jsdocRenderer", new JsDocRenderer(plugin, commonJsModulesAccessor.getAllPublicCommonJsModules())). - put("staticResourcesPrefix", webResourceManager.getStaticResourcePrefix(UrlMode.RELATIVE)). + put("staticResourcesPrefix", webResourceUrlProvider.getStaticResourcePrefix(UrlMode.RELATIVE)). put("product", productAccessor.getSdkName()). put("devmode", devMode). put("canAuthor", speakeasyService.canAuthorExtensions(user)). diff --git a/plugin/src/main/resources/atlassian-plugin.xml b/plugin/src/main/resources/atlassian-plugin.xml index 0895c72f..49f2b04d 100644 --- a/plugin/src/main/resources/atlassian-plugin.xml +++ b/plugin/src/main/resources/atlassian-plugin.xml @@ -111,6 +111,7 @@ + @@ -118,6 +119,7 @@ + @@ -135,7 +137,6 @@ application="jira"/> -