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
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
31
32
33
34
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 }