View Javadoc
1   package it.com.atlassian.plugin.osgi.spring;
2   
3   import com.atlassian.plugin.JarPluginArtifact;
4   import com.atlassian.plugin.osgi.PluginInContainerTestBase;
5   import com.atlassian.plugin.test.PluginJarBuilder;
6   import org.junit.Test;
7   
8   import java.io.File;
9   
10  import static org.junit.Assert.assertEquals;
11  
12  public class TestApplicationContextPreProcessor extends PluginInContainerTestBase {
13      @Test
14      public void testCustomPreProcessor() throws Exception {
15          new PluginJarBuilder("testPreProcessor")
16                  .addFormattedResource("atlassian-plugin.xml",
17                          "<atlassian-plugin name='Test' key='test.pre.plugin' pluginsVersion='2'>",
18                          "    <plugin-info>",
19                          "        <version>1.0</version>",
20                          "    </plugin-info>",
21                          "    <component key='obj' class='my.CustomProcessor' public='true' interface='com.atlassian.plugin.osgi.spring.external.ApplicationContextPreProcessor'/>",
22                          "</atlassian-plugin>")
23                  .addFormattedJava("my.StaticFieldBeanFactoryPostProcessor",
24                          "package my;",
25                          "import org.springframework.beans.BeansException;",
26                          "import org.springframework.beans.factory.config.BeanDefinition;",
27                          "import org.springframework.beans.factory.config.BeanFactoryPostProcessor;",
28                          "import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;",
29                          "public class StaticFieldBeanFactoryPostProcessor implements BeanFactoryPostProcessor {",
30                          "    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {",
31                          "        String[] names = beanFactory.getBeanDefinitionNames();" +
32                                  "        for (int x=0; x<names.length; x++) {",
33                          "            BeanDefinition def = beanFactory.getBeanDefinition(names[x]);",
34                          "            try {",
35                          "                Class clazz = beanFactory.getBeanClassLoader().loadClass(def.getBeanClassName());",
36                          "                if (clazz.getField('name') != null) {",
37                          "                    clazz.getField('name').set(clazz, 'changed');",
38                          "                }",
39                          "            }",
40                          "            catch (Exception e) {",
41                          "                throw new RuntimeException(e);",
42                          "            }",
43                          "        }",
44                          "    }",
45                          "}")
46                  .addFormattedJava("my.CustomProcessor",
47                          "package my;",
48                          "import com.atlassian.plugin.osgi.spring.external.ApplicationContextPreProcessor;",
49                          "import org.osgi.framework.Bundle;",
50                          "import org.springframework.context.ConfigurableApplicationContext;",
51                          "public class CustomProcessor implements ApplicationContextPreProcessor {",
52                          "  public boolean isSpringPoweredBundle(Bundle bundle) { return true; }",
53                          "  public void process(Bundle bundle, ConfigurableApplicationContext applicationContext) {",
54                          "    applicationContext.addBeanFactoryPostProcessor(new StaticFieldBeanFactoryPostProcessor());",
55                          "  }",
56                          "}")
57                  .build(pluginsDir);
58          initPluginManager();
59  
60          File plugin = new PluginJarBuilder("testPreProcessor")
61                  .addFormattedResource("atlassian-plugin.xml",
62                          "<atlassian-plugin name='Test' key='test.pre.client' pluginsVersion='2'>",
63                          "    <plugin-info>",
64                          "        <version>1.0</version>",
65                          "    </plugin-info>",
66                          "    <component key='obj' class='my.Foo' />",
67                          "</atlassian-plugin>")
68                  .addFormattedJava("my.Foo",
69                          "package my;",
70                          "public class Foo {",
71                          "  public volatile static String name = 'original';",
72                          "}")
73                  .build();
74          pluginController.installPlugins(new JarPluginArtifact(plugin));
75  
76          Class<Object> fooClass = pluginAccessor.getPlugin("test.pre.client").loadClass("my.Foo", null);
77          assertEquals("changed", fooClass.getField("name").get(fooClass));
78      }
79  }