View Javadoc

1   package com.atlassian.plugin.factories;
2   
3   import com.atlassian.plugin.Application;
4   import com.atlassian.plugin.JarPluginArtifact;
5   import com.atlassian.plugin.ModuleDescriptorFactory;
6   import com.atlassian.plugin.Plugin;
7   import com.atlassian.plugin.PluginArtifact;
8   import com.atlassian.plugin.PluginParseException;
9   import com.atlassian.plugin.loaders.classloading.DeploymentUnit;
10  import com.atlassian.plugin.parsers.DescriptorParser;
11  import com.atlassian.plugin.parsers.DescriptorParserFactory;
12  import com.google.common.base.Predicate;
13  import org.apache.commons.io.IOUtils;
14  import org.apache.commons.lang.Validate;
15  import org.slf4j.Logger;
16  import org.slf4j.LoggerFactory;
17  
18  import java.io.InputStream;
19  import java.util.Set;
20  
21  import static com.google.common.base.Preconditions.checkNotNull;
22  
23  /**
24   * @since 2.14
25   */
26  public abstract class AbstractPluginFactory implements PluginFactory
27  {
28      protected final Logger log = LoggerFactory.getLogger(this.getClass());
29  
30      protected final DescriptorParserFactory descriptorParserFactory;
31      protected final Set<Application> applications;
32  
33      protected AbstractPluginFactory(DescriptorParserFactory descriptorParserFactory, Set<Application> applications)
34      {
35          this.descriptorParserFactory = checkNotNull(descriptorParserFactory);
36          this.applications = checkNotNull(applications);
37      }
38  
39      /**
40       * Determines if this deployer can handle this artifact by looking for the plugin descriptor
41       *
42       * @param pluginArtifact The artifact to test
43       * @return The plugin key, null if it cannot load the plugin
44       * @throws com.atlassian.plugin.PluginParseException If there are exceptions parsing the plugin configuration
45       */
46      public String canCreate(PluginArtifact pluginArtifact) throws PluginParseException
47      {
48          return getPluginKeyFromDescriptor(pluginArtifact);
49      }
50  
51      /**
52       * @deprecated Since 2.2.0, use {@link #create(com.atlassian.plugin.PluginArtifact, com.atlassian.plugin.ModuleDescriptorFactory)} instead
53       */
54      @Deprecated
55      public final Plugin create(DeploymentUnit deploymentUnit, ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
56      {
57          Validate.notNull(deploymentUnit, "The deployment unit is required");
58          return create(new JarPluginArtifact(deploymentUnit.getPath()), moduleDescriptorFactory);
59      }
60  
61      protected final String getPluginKeyFromDescriptor(PluginArtifact pluginArtifact)
62      {
63          String pluginKey = null;
64          InputStream descriptorStream = null;
65          try
66          {
67              descriptorStream = getDescriptorInputStream(pluginArtifact);
68              if (descriptorStream != null)
69              {
70                  final DescriptorParser descriptorParser = descriptorParserFactory.getInstance(descriptorStream, applications.toArray(new Application[applications.size()]));
71                  if (isValidPluginsVersion().apply(descriptorParser.getPluginsVersion()))
72                  {
73                      pluginKey = descriptorParser.getKey();
74                  }
75              }
76          }
77          finally
78          {
79              IOUtils.closeQuietly(descriptorStream);
80          }
81          return pluginKey;
82      }
83  
84      protected abstract InputStream getDescriptorInputStream(PluginArtifact pluginArtifact);
85  
86      protected abstract Predicate<Integer> isValidPluginsVersion();
87  }