View Javadoc

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