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
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
41
42
43
44
45
46 public String canCreate(PluginArtifact pluginArtifact) throws PluginParseException
47 {
48 return getPluginKeyFromDescriptor(pluginArtifact);
49 }
50
51
52
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 }