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.classloader.PluginClassLoader;
8 import com.atlassian.plugin.impl.DefaultDynamicPlugin;
9 import com.atlassian.plugin.impl.DynamicPlugin;
10 import com.atlassian.plugin.loaders.classloading.DeploymentUnit;
11 import com.atlassian.plugin.parsers.DescriptorParser;
12 import com.atlassian.plugin.parsers.DescriptorParserFactory;
13 import com.atlassian.plugin.parsers.XmlDescriptorParserFactory;
14 import org.apache.commons.io.IOUtils;
15 import org.apache.commons.lang.Validate;
16
17 import java.io.File;
18 import java.io.IOException;
19 import java.io.InputStream;
20 import java.net.URL;
21
22
23
24
25
26
27 public class LegacyDynamicPluginFactory implements PluginFactory
28 {
29 private DescriptorParserFactory descriptorParserFactory;
30 private String pluginDescriptorFileName;
31 private final File tempDirectory;
32
33 public LegacyDynamicPluginFactory(String pluginDescriptorFileName)
34 {
35 this(pluginDescriptorFileName,new File(System.getProperty("java.io.tmpdir")));
36 }
37
38 public LegacyDynamicPluginFactory(String pluginDescriptorFileName, File tempDirectory)
39 {
40 this.tempDirectory = tempDirectory;
41 Validate.notEmpty(pluginDescriptorFileName, "Plugin descriptor name cannot be null or blank");
42 this.descriptorParserFactory = new XmlDescriptorParserFactory();
43 this.pluginDescriptorFileName = pluginDescriptorFileName;
44 }
45
46
47
48
49
50
51
52
53 public Plugin create(DeploymentUnit deploymentUnit, ModuleDescriptorFactory moduleDescriptorFactory) throws PluginParseException
54 {
55 Validate.notNull(deploymentUnit, "The deployment unit must not be null");
56 Validate.notNull(moduleDescriptorFactory, "The module descriptor factory must not be null");
57
58 Plugin plugin = null;
59 InputStream pluginDescriptor = null;
60 PluginClassLoader loader = null;
61 try
62 {
63 loader = new PluginClassLoader(deploymentUnit.getPath(), Thread.currentThread().getContextClassLoader(), tempDirectory);
64 URL pluginDescriptorUrl = loader.getLocalResource(pluginDescriptorFileName);
65 if (pluginDescriptorUrl == null)
66 throw new PluginParseException("No descriptor found in classloader for : " + deploymentUnit);
67
68 pluginDescriptor = pluginDescriptorUrl.openStream();
69
70 DescriptorParser parser = descriptorParserFactory.getInstance(pluginDescriptor);
71 plugin = parser.configurePlugin(moduleDescriptorFactory, createPlugin(deploymentUnit, loader));
72 }
73
74
75 catch (PluginParseException e)
76 {
77 if (loader != null) loader.close();
78 throw e;
79 }
80 catch (RuntimeException e)
81 {
82 if (loader != null) loader.close();
83 throw new PluginParseException(e);
84 }
85 catch (Error e)
86 {
87 if (loader != null) loader.close();
88 throw e;
89 }
90 catch (IOException e)
91 {
92 if (loader != null) loader.close();
93 throw new PluginParseException();
94 } finally
95 {
96 IOUtils.closeQuietly(pluginDescriptor);
97 }
98 return plugin;
99 }
100
101
102
103
104
105
106
107 protected DynamicPlugin createPlugin(DeploymentUnit deploymentUnit, PluginClassLoader loader)
108 {
109 return new DefaultDynamicPlugin(deploymentUnit, loader);
110 }
111
112
113
114
115
116
117
118
119 public String canCreate(PluginArtifact pluginArtifact) throws PluginParseException
120 {
121 Validate.notNull(pluginArtifact, "The plugin artifact must not be null");
122 String pluginKey = null;
123 final InputStream descriptorStream = pluginArtifact.getResourceAsStream(pluginDescriptorFileName);
124 if (descriptorStream != null)
125 {
126 try
127 {
128 final DescriptorParser descriptorParser = descriptorParserFactory.getInstance(descriptorStream);
129
130
131 if (descriptorParser.getPluginsVersion() <= 1)
132 pluginKey = descriptorParser.getKey();
133 } finally
134 {
135 IOUtils.closeQuietly(descriptorStream);
136 }
137 }
138 return pluginKey;
139 }
140 }