View Javadoc
1   package com.atlassian.plugin.factories;
2   
3   import com.atlassian.plugin.Application;
4   import com.atlassian.plugin.PluginArtifact;
5   import com.atlassian.plugin.PluginParseException;
6   import com.atlassian.plugin.parsers.DescriptorParser;
7   import com.atlassian.plugin.parsers.DescriptorParserFactory;
8   
9   import java.io.InputStream;
10  import java.util.Set;
11  import java.util.function.Predicate;
12  
13  import static com.google.common.base.Preconditions.checkNotNull;
14  import static org.apache.commons.io.IOUtils.closeQuietly;
15  
16  /**
17   * @since 3.0
18   */
19  public abstract class AbstractPluginFactory implements PluginFactory {
20  
21      protected final DescriptorParserFactory descriptorParserFactory;
22      protected final Set<Application> applications;
23  
24      protected AbstractPluginFactory(DescriptorParserFactory descriptorParserFactory, Set<Application> applications) {
25          this.descriptorParserFactory = checkNotNull(descriptorParserFactory);
26          this.applications = checkNotNull(applications);
27      }
28  
29      /**
30       * Determines if this deployer can handle this artifact by looking for the plugin descriptor
31       *
32       * @param pluginArtifact The artifact to test
33       * @return The plugin key, null if it cannot load the plugin
34       * @throws com.atlassian.plugin.PluginParseException If there are exceptions parsing the plugin configuration
35       */
36      public String canCreate(PluginArtifact pluginArtifact) throws PluginParseException {
37          return getPluginKeyFromDescriptor(pluginArtifact);
38      }
39  
40      protected final boolean hasDescriptor(PluginArtifact pluginArtifact) {
41          InputStream descriptorStream = null;
42          try {
43              descriptorStream = getDescriptorInputStream(pluginArtifact);
44              return descriptorStream != null;
45          } finally {
46              closeQuietly(descriptorStream);
47          }
48      }
49  
50      protected final String getPluginKeyFromDescriptor(PluginArtifact pluginArtifact) {
51          String pluginKey = null;
52          InputStream descriptorStream = null;
53          try {
54              descriptorStream = getDescriptorInputStream(pluginArtifact);
55              if (descriptorStream != null) {
56                  final DescriptorParser descriptorParser = descriptorParserFactory.getInstance(descriptorStream, applications);
57                  if (isValidPluginsVersion().test(descriptorParser.getPluginsVersion())) {
58                      pluginKey = descriptorParser.getKey();
59                  }
60              }
61          } finally {
62              closeQuietly(descriptorStream);
63          }
64          return pluginKey;
65      }
66  
67      protected abstract InputStream getDescriptorInputStream(PluginArtifact pluginArtifact);
68  
69      protected abstract Predicate<Integer> isValidPluginsVersion();
70  }