1   package com.atlassian.plugin.webresource;
2   
3   import com.atlassian.plugin.Plugin;
4   import com.atlassian.plugin.PluginInformation;
5   import com.atlassian.plugin.elements.ResourceDescriptor;
6   import com.atlassian.plugin.elements.ResourceLocation;
7   import com.mockobjects.dynamic.Mock;
8   import org.dom4j.DocumentException;
9   import org.dom4j.DocumentHelper;
10  
11  import java.util.ArrayList;
12  import java.util.Arrays;
13  import java.util.Collections;
14  import java.util.List;
15  import java.util.Map;
16  import java.util.Set;
17  import java.util.TreeMap;
18  
19  public class TestUtils
20  {
21      static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey, final Plugin p)
22      {
23          return createWebResourceModuleDescriptor(completeKey, p, Collections.<ResourceDescriptor>emptyList(), Collections.<String>emptyList());
24      }
25  
26      static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey,
27          final Plugin p, final List<ResourceDescriptor> resourceDescriptors)
28      {
29          return createWebResourceModuleDescriptor(completeKey, p, resourceDescriptors, Collections.<String>emptyList());
30      }
31  
32      static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey,
33          final Plugin p, final List<ResourceDescriptor> resourceDescriptors, final List<String> dependencies)
34      {
35          return createWebResourceModuleDescriptor(completeKey, p, resourceDescriptors, dependencies, Collections.<String>emptySet());
36      }
37  
38      static WebResourceModuleDescriptor createWebResourceModuleDescriptor(final String completeKey,
39          final Plugin p, final List<ResourceDescriptor> resourceDescriptors, final List<String> dependencies, final Set<String> contexts)
40      {
41          return new WebResourceModuleDescriptor()
42          {
43              @Override
44              public String getCompleteKey()
45              {
46                  return completeKey;
47              }
48  
49              @Override
50              public List<ResourceDescriptor> getResourceDescriptors()
51              {
52                  return resourceDescriptors;
53              }
54  
55              @Override
56              public List<ResourceDescriptor> getResourceDescriptors(String type)
57              {
58                  return resourceDescriptors;
59              }
60  
61              @Override
62              public String getPluginKey()
63              {
64                  return p.getKey();
65              }
66  
67              @Override
68              public Plugin getPlugin()
69              {
70                  return p;
71              }
72  
73              @Override
74              public List<String> getDependencies()
75              {
76                  return dependencies;
77              }
78  
79              @Override
80              public Set<String> getContexts()
81              {
82                  return contexts;
83              }
84  
85              @Override
86              public ResourceLocation getResourceLocation(String type, String name)
87              {
88                  if ("download".equals(type))
89                  {
90                      return new ResourceLocation("", name, type, "", "", Collections.<String, String>emptyMap());
91                  }
92                  return super.getResourceLocation(type, name);
93              }
94          };
95      }
96  
97      static List<ResourceDescriptor> createResourceDescriptors(String... resourceNames) throws DocumentException
98      {
99          List<ResourceDescriptor> resourceDescriptors = new ArrayList<ResourceDescriptor>();
100         for(String resourceName : resourceNames)
101         {
102             resourceDescriptors.add(createResourceDescriptor(resourceName));
103         }
104         return resourceDescriptors;
105     }
106 
107     static ResourceDescriptor createResourceDescriptor(String resourceName) throws DocumentException
108     {
109         return createResourceDescriptor(resourceName, new TreeMap<String, String>());
110     }
111 
112     static ResourceDescriptor createResourceDescriptor(String resourceName, Map<String, String> parameters) throws DocumentException
113     {
114         String xml = "<resource type=\"download\" name=\"" + resourceName + "\" location=\"/includes/css/" + resourceName + "\">\n" +
115                             "<param name=\"source\" value=\"webContextStatic\"/>\n";
116 
117         if(resourceName.indexOf("ie") != -1)
118             parameters.put("ieonly", "true");
119 
120         for(String key : parameters.keySet())
121         {
122             xml += "<param name=\"" + escapeXMLCharacters(key) + "\" value=\"" + escapeXMLCharacters(parameters.get(key)) + "\"/>\n";
123         }
124         
125         xml += "</resource>";
126         return new ResourceDescriptor(DocumentHelper.parseText(xml).getRootElement());
127     }
128 
129     static void setupSuperbatchTestContent(TestResourceBatchingConfiguration resourceBatchingConfiguration, Mock mockPluginAccessor, Plugin testPlugin)
130             throws DocumentException
131     {
132         resourceBatchingConfiguration.enabled = true;
133 
134         ResourceDescriptor masterCssResource = TestUtils.createResourceDescriptor("master.css");
135         ResourceDescriptor ieOnlyasterCssResource = TestUtils.createResourceDescriptor("master.css", Collections.singletonMap("ieonly", "true"));
136         ResourceDescriptor irrelevantParameterCssResource = TestUtils.createResourceDescriptor("two.css", Collections.singletonMap("fish", "true"));
137         ResourceDescriptor masterJavascriptResource = TestUtils.createResourceDescriptor("master.js");
138 
139         ResourceDescriptor pluginCssResource = TestUtils.createResourceDescriptor("plugin.css");
140         ResourceDescriptor pluginJsResource = TestUtils.createResourceDescriptor("plugin.js");
141 
142         WebResourceModuleDescriptor master = TestUtils.createWebResourceModuleDescriptor("test.atlassian:superbatch", testPlugin, Arrays.asList(masterCssResource, ieOnlyasterCssResource, masterJavascriptResource, irrelevantParameterCssResource));
143         WebResourceModuleDescriptor plugin = TestUtils.createWebResourceModuleDescriptor("test.atlassian:superbatch2", testPlugin, Arrays.asList(pluginCssResource, pluginJsResource));
144 
145         mockPluginAccessor.matchAndReturn("getEnabledPluginModule", "test.atlassian:superbatch", master);
146         mockPluginAccessor.matchAndReturn("getEnabledPluginModule", "test.atlassian:superbatch2", plugin);
147         mockPluginAccessor.matchAndReturn("getEnabledPluginModule", "test.atlassian:missing-plugin", null);
148     }
149 
150     private static String escapeXMLCharacters(String input)
151     {
152         return input.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt");
153     }
154 
155     static Plugin createTestPlugin()
156     {
157         return createTestPlugin("test.atlassian", "1");
158     }
159 
160     static Plugin createTestPlugin(String pluginKey, String version)
161     {
162         final Mock mockPlugin = new Mock(Plugin.class);
163         PluginInformation pluginInfo = new PluginInformation();
164         pluginInfo.setVersion(version);
165         mockPlugin.matchAndReturn("getPluginInformation", pluginInfo);
166         mockPlugin.matchAndReturn("getKey", pluginKey);
167 
168         return (Plugin) mockPlugin.proxy();
169     }
170 }