View Javadoc

1   package com.atlassian.plugin.impl;
2   
3   import com.atlassian.plugin.JarPluginArtifact;
4   import com.atlassian.plugin.PluginArtifact;
5   import com.atlassian.plugin.PluginArtifactBackedPlugin;
6   import com.atlassian.plugin.classloader.PluginClassLoader;
7   import com.atlassian.plugin.loaders.classloading.DeploymentUnit;
8   import org.apache.commons.lang.Validate;
9   
10  import java.io.InputStream;
11  import java.net.URL;
12  
13  /**
14   * A dynamically loaded plugin is loaded through the plugin class loader.
15   */
16  public class DefaultDynamicPlugin extends AbstractPlugin implements PluginArtifactBackedPlugin
17  {
18      private final PluginArtifact pluginArtifact;
19      private final PluginClassLoader loader;
20  
21      public DefaultDynamicPlugin(final DeploymentUnit deploymentUnit, final PluginClassLoader loader)
22      {
23          this(new JarPluginArtifact(deploymentUnit.getPath()), loader);
24      }
25  
26      public DefaultDynamicPlugin(final PluginArtifact pluginArtifact, final PluginClassLoader loader)
27      {
28          Validate.notNull(pluginArtifact, "The plugin artifact cannot be null");
29          Validate.notNull(loader, "The plugin class loader cannot be null");
30          this.pluginArtifact = pluginArtifact;
31          this.loader = loader;
32      }
33  
34      public <T> Class<T> loadClass(final String clazz, final Class<?> callingClass) throws ClassNotFoundException
35      {
36          @SuppressWarnings("unchecked")
37          final Class<T> result = (Class<T>) loader.loadClass(clazz);
38          return result;
39      }
40  
41      public boolean isUninstallable()
42      {
43          return true;
44      }
45  
46      public URL getResource(final String name)
47      {
48          return loader.getResource(name);
49      }
50  
51      public InputStream getResourceAsStream(final String name)
52      {
53          return loader.getResourceAsStream(name);
54      }
55  
56      public ClassLoader getClassLoader()
57      {
58          return loader;
59      }
60  
61      /**
62       * This plugin is dynamically loaded, so returns true.
63       *
64       * @return true
65       */
66      public boolean isDynamicallyLoaded()
67      {
68          return true;
69      }
70  
71      /**
72       * @deprecated Since 2.2.0, use {@link #getPluginArtifact()} instead
73       */
74      public DeploymentUnit getDeploymentUnit()
75      {
76          return new DeploymentUnit(pluginArtifact.toFile());
77      }
78  
79      /**
80       * @since 2.2.0
81       */
82      public PluginArtifact getPluginArtifact()
83      {
84          return pluginArtifact;
85      }
86  
87      public boolean isDeleteable()
88      {
89          return true;
90      }
91  
92      public boolean isBundledPlugin()
93      {
94          return false;
95      }
96  
97      @Override
98      protected void uninstallInternal()
99      {
100         loader.close();
101     }
102 }