1 package com.atlassian.plugin.main;
2
3 import com.atlassian.plugin.DefaultPluginManager;
4 import com.atlassian.plugin.PluginAccessor;
5 import com.atlassian.plugin.PluginController;
6 import com.atlassian.plugin.PluginParseException;
7 import com.atlassian.plugin.event.PluginEventManager;
8 import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
9 import com.atlassian.plugin.loaders.BundledPluginLoader;
10 import com.atlassian.plugin.loaders.DirectoryPluginLoader;
11 import com.atlassian.plugin.loaders.PluginLoader;
12 import com.atlassian.plugin.osgi.container.OsgiContainerManager;
13 import com.atlassian.plugin.osgi.container.felix.FelixOsgiContainerManager;
14 import com.atlassian.plugin.osgi.factory.OsgiBundleFactory;
15 import com.atlassian.plugin.osgi.factory.OsgiPluginFactory;
16 import com.atlassian.plugin.repositories.FilePluginInstaller;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.util.ArrayList;
21 import java.util.Arrays;
22 import java.util.List;
23
24 import org.apache.log4j.Logger;
25
26
27
28
29 public class AtlassianPlugins
30 {
31 private OsgiContainerManager osgiContainerManager;
32 private PluginEventManager pluginEventManager;
33 private DefaultPluginManager pluginManager;
34 private PluginsConfiguration pluginsConfiguration;
35 private HotDeployer hotDeployer;
36
37 private static final Logger log = Logger.getLogger(AtlassianPlugins.class);
38
39
40 public static final String TEMP_DIRECTORY_SUFFIX = ".tmp";
41
42
43
44
45
46
47
48
49 public AtlassianPlugins(PluginsConfiguration config)
50 {
51 List<PluginLoader> pluginLoaders = new ArrayList<PluginLoader>();
52 pluginEventManager = new DefaultPluginEventManager();
53
54 osgiContainerManager = new FelixOsgiContainerManager(
55 config.getFrameworkBundlesDirectory(),
56 config.getPackageScannerConfiguration(),
57 config.getHostComponentProvider(),
58 pluginEventManager,
59 config.getBundleCacheDirectory());
60
61 OsgiPluginFactory osgiPluginDeployer = new OsgiPluginFactory(
62 config.getPluginDescriptorFilename(),
63 osgiContainerManager);
64 OsgiBundleFactory osgiBundleDeployer = new OsgiBundleFactory(osgiContainerManager);
65
66 pluginLoaders.add(new DirectoryPluginLoader(
67 config.getPluginDirectory(),
68 Arrays.asList(osgiPluginDeployer, osgiBundleDeployer),
69 pluginEventManager));
70
71 if (config.getBundledPluginUrl() != null)
72 {
73 pluginLoaders.add(new BundledPluginLoader(
74 config.getBundledPluginUrl(),
75 config.getBundledPluginCacheDirectory(),
76 Arrays.asList(osgiPluginDeployer, osgiBundleDeployer),
77 pluginEventManager));
78 }
79
80
81 pluginManager = new DefaultPluginManager(
82 config.getPluginStateStore(),
83 pluginLoaders,
84 config.getModuleDescriptorFactory(),
85 pluginEventManager);
86 pluginManager.setPluginInstaller(new FilePluginInstaller(
87 config.getPluginDirectory()));
88
89 if (config.getHotDeployPollingPeriod() > 0)
90 {
91 hotDeployer = new HotDeployer(pluginManager, config.getHotDeployPollingPeriod());
92 }
93 this.pluginsConfiguration = config;
94
95
96 }
97
98
99
100
101
102
103
104 public void start() throws PluginParseException
105 {
106 pluginManager.init();
107 if (hotDeployer != null && !hotDeployer.isRunning())
108 {
109 hotDeployer.start();
110 }
111 }
112
113
114
115
116 public void stop()
117 {
118 if (hotDeployer != null && hotDeployer.isRunning())
119 {
120 hotDeployer.stop();
121 }
122 pluginManager.shutdown();
123 deleteDirIfTmp(pluginsConfiguration.getBundleCacheDirectory());
124 deleteDirIfTmp(pluginsConfiguration.getFrameworkBundlesDirectory());
125 }
126
127
128
129
130 public OsgiContainerManager getOsgiContainerManager()
131 {
132 return osgiContainerManager;
133 }
134
135
136
137
138 public PluginEventManager getPluginEventManager()
139 {
140 return pluginEventManager;
141 }
142
143
144
145
146 public PluginController getPluginController()
147 {
148 return pluginManager;
149 }
150
151
152
153
154 public PluginAccessor getPluginAccessor()
155 {
156 return pluginManager;
157 }
158
159 private static void deleteDirIfTmp(File dir)
160 {
161 if (dir.getName().endsWith(TEMP_DIRECTORY_SUFFIX))
162 {
163 try
164 {
165 org.apache.commons.io.FileUtils.deleteDirectory(dir);
166 }
167 catch (IOException e)
168 {
169 log.error("Unable to delete directory: " + dir.getAbsolutePath(), e);
170 }
171 }
172 }
173 }