View Javadoc
1   package com.atlassian.plugin.main;
2   
3   import com.atlassian.plugin.osgi.container.PackageScannerConfiguration;
4   import org.apache.commons.io.IOUtils;
5   import org.apache.log4j.Logger;
6   import org.apache.log4j.PropertyConfigurator;
7   
8   import java.io.File;
9   import java.io.IOException;
10  import java.io.InputStream;
11  import java.util.Collections;
12  import java.util.Properties;
13  import java.util.concurrent.TimeUnit;
14  
15  import static com.atlassian.plugin.main.PackageScannerConfigurationBuilder.packageScannerConfiguration;
16  import static com.atlassian.plugin.main.PluginsConfigurationBuilder.pluginsConfiguration;
17  
18  /**
19   * Simple standalone class for starting the plugin framework. Creates a directory called "plugins" in the current directory
20   * and scans it every 5 seconds for new plugins.
21   * <p>
22   * For embedded use, use the {@link AtlassianPlugins} facade directly
23   */
24  public class Main {
25      public static void main(final String[] args) {
26          initialiseLogger();
27          final File pluginDir = new File("plugins");
28  
29          if (pluginDir.mkdir()) {
30              System.out.println("Created plugins directory " + pluginDir.getAbsolutePath());
31          } else if (pluginDir.isDirectory()) {
32              System.out.println("Using existing plugins directory " + pluginDir.getAbsolutePath());
33          } else {
34              System.out.println("Cannot create plugins directory " + pluginDir.getAbsolutePath());
35          }
36  
37          final PackageScannerConfiguration packageScannerConfiguration = packageScannerConfiguration()
38                  .packagesToInclude("org.apache.*", "com.atlassian.*", "org.dom4j*")
39                  .packagesVersions(Collections.singletonMap("org.apache.log4j", "1.2.16"))
40                  .build();
41          final PluginsConfiguration config = pluginsConfiguration()
42                  .pluginDirectory(pluginDir)
43                  .packageScannerConfiguration(packageScannerConfiguration)
44                  .hotDeployPollingFrequency(5, TimeUnit.SECONDS)
45                  .build();
46          final AtlassianPlugins plugins = new AtlassianPlugins(config);
47  
48          Runtime.getRuntime().addShutdownHook(new Thread(() -> {
49              System.out.println("Cleaning up...");
50              plugins.getPluginSystemLifecycle().shutdown();
51              plugins.destroy();
52          }));
53  
54          plugins.afterPropertiesSet();
55          plugins.getPluginSystemLifecycle().init();
56  
57          // Keep the vm alive - kill it with a SIGHUP to test shutdown
58          try {
59              final Object waitable = new Object();
60              // We're synchronizing just so we can wait() to block the thread, so the fact it's a local is moot.
61              //noinspection SynchronizationOnLocalVariableOrMethodParameter
62              synchronized (waitable) {
63                  waitable.wait();
64              }
65          } catch (final InterruptedException e) {
66              // ignore, but now the wait is over
67          }
68      }
69  
70      private static void initialiseLogger() {
71          final Properties logProperties = new Properties();
72  
73          try (InputStream in = Main.class.getResourceAsStream("/log4j-standalone.properties")) {
74              logProperties.load(in);
75              PropertyConfigurator.configure(logProperties);
76              Logger.getLogger(Main.class).info("Logging initialized.");
77          } catch (final IOException e) {
78              throw new RuntimeException("Unable to load logging");
79          }
80      }
81  }