1 package com.atlassian.plugin.factories;
2
3 import com.atlassian.plugin.ModuleDescriptorFactory;
4 import com.atlassian.plugin.Plugin;
5 import com.atlassian.plugin.PluginArtifact;
6 import com.atlassian.plugin.PluginParseException;
7 import com.atlassian.plugin.XmlPluginArtifact;
8 import com.atlassian.plugin.impl.XmlDynamicPlugin;
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.atlassian.plugin.parsers.XmlDescriptorParserFactory;
13
14 import org.apache.commons.io.IOUtils;
15 import org.apache.commons.lang.Validate;
16 import org.dom4j.DocumentException;
17
18 import java.io.FileInputStream;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.util.Arrays;
22 import java.util.Collections;
23 import java.util.HashSet;
24 import java.util.Set;
25
26
27
28
29
30
31 public class XmlDynamicPluginFactory implements PluginFactory
32 {
33 private final DescriptorParserFactory descriptorParserFactory;
34 private final Set<String> applicationKeys;
35
36
37
38
39 @Deprecated
40 public XmlDynamicPluginFactory()
41 {
42 this(Collections.<String> emptySet());
43 }
44
45
46
47
48
49 public XmlDynamicPluginFactory(final String applicationKey)
50 {
51 this(new HashSet<String>(Arrays.asList(applicationKey)));
52 }
53
54
55
56
57
58 public XmlDynamicPluginFactory(final Set<String> applicationKeys)
59 {
60 descriptorParserFactory = new XmlDescriptorParserFactory();
61 Validate.notNull(applicationKeys, "applicationKeys");
62 this.applicationKeys = applicationKeys;
63 }
64
65
66
67
68 @Deprecated
69 public Plugin create(final DeploymentUnit deploymentUnit, final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
70 {
71 return create(new XmlPluginArtifact(deploymentUnit.getPath()), moduleDescriptorFactory);
72 }
73
74
75
76
77
78
79
80
81
82 public Plugin create(final PluginArtifact pluginArtifact, final ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
83 {
84 Validate.notNull(pluginArtifact, "The plugin artifact must not be null");
85 Validate.notNull(moduleDescriptorFactory, "The module descriptor factory must not be null");
86
87 InputStream pluginDescriptor = null;
88 try
89 {
90 pluginDescriptor = new FileInputStream(pluginArtifact.toFile());
91
92 final DescriptorParser parser = descriptorParserFactory.getInstance(pluginDescriptor,
93 applicationKeys.toArray(new String[applicationKeys.size()]));
94 return parser.configurePlugin(moduleDescriptorFactory, new XmlDynamicPlugin());
95 }
96 catch (final RuntimeException e)
97 {
98 throw new PluginParseException(e);
99 }
100 catch (final IOException e)
101 {
102 throw new PluginParseException();
103 }
104 finally
105 {
106 IOUtils.closeQuietly(pluginDescriptor);
107 }
108 }
109
110
111
112
113
114
115
116
117 public String canCreate(final PluginArtifact pluginArtifact) throws PluginParseException
118 {
119 Validate.notNull(pluginArtifact, "The plugin artifact must not be null");
120 final InputStream descriptorStream = pluginArtifact.getInputStream();
121 if (descriptorStream == null)
122 {
123 return null;
124 }
125 try
126 {
127 final DescriptorParser descriptorParser = descriptorParserFactory.getInstance(descriptorStream,
128 applicationKeys.toArray(new String[applicationKeys.size()]));
129 return descriptorParser.getKey();
130 }
131 catch (final PluginParseException ex)
132 {
133 if (!(ex.getCause() instanceof DocumentException))
134 {
135 throw ex;
136 }
137 return null;
138 }
139 finally
140 {
141 IOUtils.closeQuietly(descriptorStream);
142 }
143 }
144 }