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