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 }