View Javadoc

1   package com.atlassian.plugin.webresource;
2   
3   import com.atlassian.plugin.PluginAccessor;
4   import com.atlassian.plugin.elements.ResourceLocation;
5   import com.atlassian.plugin.servlet.DownloadableResource;
6   import com.atlassian.plugin.webresource.transformer.WebResourceTransformerModuleDescriptor;
7   import org.apache.commons.lang.Validate;
8   import org.dom4j.Element;
9   import org.slf4j.Logger;
10  import org.slf4j.LoggerFactory;
11  
12  import java.util.Collections;
13  import java.util.LinkedHashMap;
14  import java.util.List;
15  import java.util.Map;
16  
17  /**
18   * Represents a set of transformer invocations for a specific web resource set and extension.  Transformers are retrieved
19   * from the plugin system on request, not plugin initialisation, since plugin start order is indeterminate.
20   *
21   * @since 2.5.0
22   */
23  class WebResourceTransformation
24  {
25      private final String extension;
26      private final Map<String, Element> transformerElements;
27      private Logger log = LoggerFactory.getLogger(WebResourceTransformation.class);
28  
29      WebResourceTransformation(Element element)
30      {
31          Validate.notNull(element.attribute("extension"));
32          
33          this.extension = "." + element.attributeValue("extension");
34  
35          LinkedHashMap<String, Element> transformers = new LinkedHashMap<String, Element>();
36          for (Element transformElement : (List<Element>)element.elements("transformer"))
37          {
38              transformers.put(transformElement.attributeValue("key"), transformElement);
39          }
40          transformerElements = Collections.unmodifiableMap(transformers);
41      }
42  
43      boolean matches(ResourceLocation location)
44      {
45          String loc = location.getLocation();
46          if (loc == null || "".equals(loc.trim()))
47          {
48              loc = location.getName();
49          }
50          return loc.endsWith(extension);
51      }
52  
53      DownloadableResource transformDownloadableResource(PluginAccessor pluginAccessor, DownloadableResource resource, ResourceLocation resourceLocation, String filePath)
54      {
55          DownloadableResource lastResource = resource;
56          for (Map.Entry<String, Element> entry : transformerElements.entrySet())
57          {
58              boolean found = false;
59              for (WebResourceTransformerModuleDescriptor descriptor : pluginAccessor.getEnabledModuleDescriptorsByClass(WebResourceTransformerModuleDescriptor.class))
60              {
61                  if (descriptor.getKey().equals(entry.getKey()))
62                  {
63                      found = true;
64                      lastResource = descriptor.getModule().transform(entry.getValue(), resourceLocation, filePath, lastResource);
65                  }
66              }
67              if (!found)
68              {
69                  log.warn("Web resource transformer " + entry.getKey() + " not found for resource " + resourceLocation.getName() + ", skipping");
70              }
71          }
72          return lastResource;
73      }
74  
75  }