1   package com.atlassian.plugin.osgi.factory.transform.stage;
2   
3   import com.atlassian.plugin.PluginAccessor;
4   import com.atlassian.plugin.JarPluginArtifact;
5   import com.atlassian.plugin.osgi.SomeInterface;
6   import com.atlassian.plugin.osgi.factory.transform.TransformContext;
7   import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
8   import com.atlassian.plugin.test.PluginJarBuilder;
9   
10  import org.dom4j.DocumentException;
11  import org.dom4j.DocumentHelper;
12  import org.dom4j.Element;
13  
14  import java.io.File;
15  import java.io.IOException;
16  
17  import junit.framework.TestCase;
18  
19  public class TestComponentImportSpringStage extends TestCase
20  {
21      public void testTransform() throws IOException, DocumentException
22      {
23          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
24  
25          // interface as attribute
26          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
27          Element component = pluginRoot.addElement("component-import");
28          component.addAttribute("key", "foo");
29          component.addAttribute("interface", "my.Foo");
30          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo'");
31  
32          // interface as element
33          pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
34          component = pluginRoot.addElement("component-import");
35          component.addAttribute("key", "foo");
36          final Element inf = component.addElement("interface");
37          inf.setText("my.IFoo");
38          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.IFoo'");
39  
40      }
41  
42      public void testTransformWithCustomFilter() throws IOException, DocumentException
43      {
44          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
45  
46          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
47          Element component = pluginRoot.addElement("component-import");
48          component.addAttribute("key", "foo");
49          component.addAttribute("interface", "my.Foo");
50          component.addAttribute("filter", "(foo=bar)");
51          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo' and @filter='(foo=bar)']'");
52      }
53  
54      public void testTransformForOneApp() throws IOException, DocumentException
55      {
56          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
57  
58          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
59          Element component = pluginRoot.addElement("component-import");
60          component.addAttribute("key", "foo");
61          component.addAttribute("interface", "my.Foo");
62          component.addAttribute("application", "bob");
63          SpringTransformerTestHelper.transform(stage, pluginRoot, "not(osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo')");
64  
65          pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
66          component = pluginRoot.addElement("component-import");
67          component.addAttribute("key", "foo");
68          component.addAttribute("interface", "my.Foo");
69          component.addAttribute("application", "foo");
70          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo'");
71      }
72  
73      public void testTransformImportEvenUnusedPackages() throws Exception, DocumentException
74      {
75          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
76          final File jar = new PluginJarBuilder().addFormattedResource("atlassian-plugin.xml", "<atlassian-plugin>",
77              "  <component-import key='foo' interface='com.atlassian.plugin.osgi.SomeInterface' />", "</atlassian-plugin>").build();
78  
79          final TransformContext context = new TransformContext(null, SystemExports.NONE, new JarPluginArtifact(jar), null, PluginAccessor.Descriptor.FILENAME);
80          stage.execute(context);
81          assertTrue(context.getExtraImports().contains(SomeInterface.class.getPackage().getName()));
82  
83      }
84  }