View Javadoc

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