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 }