View Javadoc

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