package com.atlassian.labs.speakeasy.commonjs.descriptor; import com.atlassian.labs.speakeasy.commonjs.CommonJsModules; import com.atlassian.labs.speakeasy.util.BundleUtil; import com.atlassian.labs.speakeasy.util.WebResourceUtil; import com.atlassian.plugin.ModuleDescriptor; import com.atlassian.plugin.Plugin; import com.atlassian.plugin.PluginAccessor; import com.atlassian.plugin.PluginParseException; import com.atlassian.plugin.descriptors.AbstractModuleDescriptor; import com.atlassian.plugin.event.PluginEventManager; import com.atlassian.plugin.hostcontainer.HostContainer; import com.atlassian.plugin.module.ModuleFactory; import com.atlassian.plugin.osgi.factory.OsgiPlugin; import com.atlassian.util.concurrent.NotNull; import org.dom4j.Element; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import java.util.Collections; import java.util.List; import java.util.Set; import static com.google.common.collect.Sets.newHashSet; /** * */ public class CommonJsModulesDescriptor extends AbstractModuleDescriptor<CommonJsModules> { private String location = "/modules"; private final ModuleFactory moduleFactory; private final BundleContext bundleContext; private final PluginEventManager pluginEventManager; private final PluginAccessor pluginAccessor; private final HostContainer hostContainer; private Bundle pluginBundle; private volatile CommonJsModules modules; private volatile GeneratedDescriptorsManager generatedDescriptorsManager; private volatile Element originalElement; private volatile Set<String> explicitPublicModules; public CommonJsModulesDescriptor(ModuleFactory moduleFactory, BundleContext bundleContext, HostContainer hostContainer, PluginAccessor pluginAccessor) { super(moduleFactory); this.moduleFactory = moduleFactory; this.bundleContext = bundleContext; this.hostContainer = hostContainer; this.pluginEventManager = (PluginEventManager) bundleContext.getService(bundleContext.getServiceReference(PluginEventManager.class.getName())); this.pluginAccessor = pluginAccessor; } @Override public void init(@NotNull Plugin plugin, @NotNull Element element) throws PluginParseException { super.init(plugin, element); if (element.attribute("location") != null) { location = element.attributeValue("location"); } this.originalElement = element; this.explicitPublicModules = newHashSet(); for (Element e : (List<Element>)element.elements("public-module")) { explicitPublicModules.add(e.getTextTrim()); } } @Override public CommonJsModules getModule() { return modules; } public Element getOriginalElement() { return originalElement; } public Set<String> getExplicitPublicModules() { return explicitPublicModules; } @Override public void enabled() { super.enabled(); if (generatedDescriptorsManager == null) { pluginBundle = BundleUtil.findBundleForPlugin(bundleContext, plugin.getKey()); modules = new CommonJsModules(this, pluginBundle, location); generatedDescriptorsManager = new GeneratedDescriptorsManager(pluginBundle, modules, pluginAccessor, pluginEventManager, this); } } @Override public void disabled() { super.disabled(); if (generatedDescriptorsManager != null) { generatedDescriptorsManager.close(); } generatedDescriptorsManager = null; pluginBundle = null; } public Set<String> getUnresolvedExternalModuleDependencies() { return generatedDescriptorsManager != null ? generatedDescriptorsManager.getUnresolvedExternalDependencies() : Collections.<String>emptySet(); } public ModuleDescriptor createIndividualModuleDescriptor() { return WebResourceUtil.instantiateDescriptor(moduleFactory, hostContainer); } String getLocation() { return location; } public String getModulesWebResourceCompleteKey() { return getCompleteKey() + "-modules"; } protected Bundle getPluginBundle() { return pluginBundle; } }