package com.atlassian.labs.speakeasy.descriptor.external.webfragment; import com.atlassian.labs.speakeasy.descriptor.external.ConditionGenerator; import com.atlassian.labs.speakeasy.descriptor.external.DescriptorGenerator; import com.atlassian.labs.speakeasy.descriptor.external.DescriptorGeneratorManager; import com.atlassian.labs.speakeasy.util.ClassOverwrittingPlugin; import com.atlassian.plugin.Plugin; import com.atlassian.plugin.PluginParseException; import com.atlassian.plugin.descriptors.AbstractModuleDescriptor; import com.atlassian.plugin.module.ModuleFactory; import com.atlassian.plugin.web.WebInterfaceManager; import com.atlassian.plugin.web.descriptors.DefaultWebItemModuleDescriptor; import com.atlassian.plugin.web.descriptors.WebItemModuleDescriptor; import com.atlassian.plugin.webresource.UrlMode; import com.atlassian.plugin.webresource.WebResourceManager; import org.dom4j.Element; import org.osgi.framework.BundleContext; import java.util.Collections; import java.util.List; import static com.atlassian.labs.speakeasy.descriptor.DescriptorGeneratorManagerImpl.getStatefulKey; /** * */ public class SpeakeasyWebItemModuleDescriptor extends AbstractModuleDescriptor<Void> implements DescriptorGenerator<WebItemModuleDescriptor> { private Element originalElement; private final BundleContext bundleContext; private final DescriptorGeneratorManager descriptorGeneratorManager; private WebInterfaceManager webInterfaceManager; private final WebResourceManager webResourceManager; public SpeakeasyWebItemModuleDescriptor(ModuleFactory moduleFactory, BundleContext bundleContext, DescriptorGeneratorManager descriptorGeneratorManager, WebResourceManager webResourceManager) { super(moduleFactory); this.bundleContext = bundleContext; this.descriptorGeneratorManager = descriptorGeneratorManager; this.webResourceManager = webResourceManager; } @Override public void init(Plugin plugin, Element element) throws PluginParseException { super.init(plugin, element); this.originalElement = element; this.webInterfaceManager = (WebInterfaceManager) bundleContext.getService(bundleContext.getServiceReference(WebInterfaceManager.class.getName())); } @Override public Void getModule() { return null; } @Override public void enabled() { super.enabled(); descriptorGeneratorManager.registerGenerator(getPluginKey(), getKey(), this); } @Override public void disabled() { super.disabled(); descriptorGeneratorManager.unregisterGenerator(getPluginKey(), getKey()); } public Iterable<WebItemModuleDescriptor> getDescriptorsToExposeForUsers(ConditionGenerator conditionGenerator, long state) { WebItemModuleDescriptor descriptor; try { Class cls = getClass().getClassLoader().loadClass("com.atlassian.confluence.plugin.descriptor.web.descriptors.ConfluenceWebItemModuleDescriptor"); descriptor = (WebItemModuleDescriptor) cls.newInstance(); } catch (Exception e) { // not confluence so try JIRA try { // Yes, this all sucks Class cls = getClass().getClassLoader().loadClass("com.atlassian.jira.plugin.webfragment.descriptors.JiraWebItemModuleDescriptor"); Class ctx = getClass().getClassLoader().loadClass("com.atlassian.jira.security.JiraAuthenticationContext"); Class mgrClass = getClass().getClassLoader().loadClass("com.atlassian.jira.ComponentManager"); Object mgr = mgrClass.getMethod("getInstance").invoke(mgrClass); descriptor = (WebItemModuleDescriptor) cls.getConstructor(ctx, WebInterfaceManager.class).newInstance( mgrClass.getMethod("getJiraAuthenticationContext").invoke(mgr), webInterfaceManager ); } catch (Exception ex) { // not JIRA or confluence so ignore descriptor = new DefaultWebItemModuleDescriptor(webInterfaceManager); } } Element userElement = (Element) originalElement.clone(); userElement.addAttribute("key", getStatefulKey(userElement.attributeValue("key"), state)); conditionGenerator.addConditionElement(userElement); resolveLinkPaths(state, userElement); descriptor.init(new ClassOverwrittingPlugin(getPlugin()), userElement); return Collections.singleton(descriptor); } private void resolveLinkPaths(long stateKey, Element element) { if ("link".equals(element.getName())) { String url = element.getTextTrim(); if (!url.startsWith("/") && !url.startsWith("http")) { element.setText(getImageUrl(getPluginKey(), stateKey, url)); } } for (Element e : (List<Element>)element.elements()) { resolveLinkPaths(stateKey, e); } } private String getImageUrl(String pluginKey, long stateKey, String fileName) { String fullUrl = webResourceManager.getStaticResourcePrefix(UrlMode.AUTO) + "/download/resources/" + pluginKey + ":images-" + stateKey + "/" + fileName; if (!fullUrl.startsWith("/s")) { fullUrl = fullUrl.substring(fullUrl.indexOf("/s")); } return fullUrl; } }