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
19
20
21
22
23 public 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 public 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 public 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 public 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 }