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