View Javadoc

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