View Javadoc

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