1   package com.atlassian.plugin.osgi;
2   
3   import com.atlassian.plugin.DefaultModuleDescriptorFactory;
4   import com.atlassian.plugin.hostcontainer.DefaultHostContainer;
5   import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
6   import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
7   import com.atlassian.plugin.test.PluginJarBuilder;
8   
9   import java.util.concurrent.Callable;
10  
11  public class TestPluginFrameworkWarmRestart extends PluginInContainerTestBase
12  {
13      public void testWarmRestart() throws Exception
14      {
15          final DefaultModuleDescriptorFactory factory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
16          factory.addModuleDescriptor("object", ObjectModuleDescriptor.class);
17  
18          final HostComponentProvider prov = new HostComponentProvider()
19          {
20              private int count = 1;
21              public void provide(ComponentRegistrar registrar)
22              {
23                  registrar.register(Callable.class).forInstance(new Callable()
24                  {
25                      public Object call()
26                      {
27                          return "count:"+(count++)+"-";
28                      }
29                  });
30  
31              }
32          };
33  
34          new PluginJarBuilder("testWarmRestart")
35                  .addFormattedResource("atlassian-plugin.xml",
36                          "<atlassian-plugin name='Test' key='test.plugin' pluginsVersion='2'>",
37                          "    <plugin-info>",
38                          "        <version>1.0</version>",
39                          "    </plugin-info>",
40                          "    <object key='obj' class='my.Foo'/>",
41                          "    <object key='obj-disabled' class='my.Foo'/>",
42                          "</atlassian-plugin>")
43                  .addFormattedJava("my.Foo",
44                          "package my;",
45                          "import java.util.concurrent.Callable;",
46                          "public class Foo implements Callable {",
47                          "   private Callable host;",
48                          "   public Foo(Callable host) { this.host = host; }",
49                          "   public Object call() throws Exception { return ((String)host.call()) + System.identityHashCode(this); }",
50                          "}")
51                  .build(pluginsDir);
52          initPluginManager(prov, factory);
53          pluginManager.disablePluginModule("test.plugin:obj-disabled");
54  
55          assertEquals(1, pluginManager.getEnabledPlugins().size());
56          assertEquals(1, pluginManager.getEnabledModulesByClass(Callable.class).size());
57          assertEquals("Test", pluginManager.getPlugin("test.plugin").getName());
58          assertEquals("my.Foo", pluginManager.getPlugin("test.plugin").getModuleDescriptor("obj").getModule().getClass().getName());
59          String value = (String) pluginManager.getEnabledModulesByClass(Callable.class).get(0).call();
60          assertTrue(value.startsWith("count:1-"));
61          String id = value.substring("count:1-".length());
62  
63          pluginManager.warmRestart();
64  
65          assertEquals(1, pluginManager.getEnabledPlugins().size());
66          assertEquals(1, pluginManager.getEnabledModulesByClass(Callable.class).size());
67          assertEquals("Test", pluginManager.getPlugin("test.plugin").getName());
68          assertEquals("my.Foo", pluginManager.getPlugin("test.plugin").getModuleDescriptor("obj").getModule().getClass().getName());
69          String value2 = (String) pluginManager.getEnabledModulesByClass(Callable.class).get(0).call();
70          assertTrue(value2.startsWith("count:2-"));
71          String id2 = value2.substring("count:2-".length());
72  
73          assertNotSame(id, id2);
74  
75      }
76  }