1
2
3
4
5
6
7
8
9
10
11 package org.mule.module.launcher.plugin;
12
13 import org.mule.module.launcher.descriptor.ApplicationDescriptor;
14 import org.mule.module.reboot.MuleContainerBootstrapUtils;
15 import org.mule.util.FileUtils;
16 import org.mule.util.StringUtils;
17
18 import java.io.File;
19 import java.io.FileReader;
20 import java.io.IOException;
21 import java.util.Arrays;
22 import java.util.Collections;
23 import java.util.HashSet;
24 import java.util.Properties;
25 import java.util.Set;
26
27 import org.apache.commons.io.filefilter.SuffixFileFilter;
28
29 public class PluginDescriptorParser
30 {
31 protected static final String PROPERTY_LOADER_OVERRIDE = "loader.override";
32
33 private ApplicationDescriptor appDescriptor;
34 private File appDir;
35
36 public PluginDescriptorParser(ApplicationDescriptor appDescriptor, File appDir)
37 {
38 this.appDescriptor = appDescriptor;
39 this.appDir = appDir;
40 }
41
42 public Set<PluginDescriptor> parse() throws IOException
43 {
44
45 final File pluginsDir = new File(appDir, "plugins");
46
47 String[] pluginZips = pluginsDir.list(new SuffixFileFilter(".zip"));
48 if (pluginZips == null || pluginZips.length == 0)
49 {
50 return Collections.emptySet();
51 }
52
53 Arrays.sort(pluginZips);
54 Set<PluginDescriptor> pds = new HashSet<PluginDescriptor>(pluginZips.length);
55
56 for (String pluginZip : pluginZips)
57 {
58 final String pluginName = StringUtils.removeEnd(pluginZip, ".zip");
59
60 final File tmpDir = new File(MuleContainerBootstrapUtils.getMuleTmpDir(),
61 appDescriptor.getAppName() + "/plugins/" + pluginName);
62
63 FileUtils.unzip(new File(pluginsDir, pluginZip), tmpDir);
64 final PluginDescriptor pd = new PluginDescriptor();
65 pd.setName(pluginName);
66 pd.setAppDescriptor(appDescriptor);
67
68 final File pluginPropsFile = new File(tmpDir, "plugin.properties");
69 if (pluginPropsFile.exists())
70 {
71 Properties props = new Properties();
72 props.load(new FileReader(pluginPropsFile));
73
74 final String overrideString = props.getProperty(PROPERTY_LOADER_OVERRIDE);
75 if (StringUtils.isNotBlank(overrideString))
76 {
77 Set<String> values = new HashSet<String>();
78 final String[] overrides = overrideString.split(",");
79 Collections.addAll(values, overrides);
80 pd.setLoaderOverride(values);
81 }
82 }
83
84 PluginClasspath cp = PluginClasspath.from(tmpDir);
85 pd.setClasspath(cp);
86 pds.add(pd);
87 }
88
89 return pds;
90 }
91
92 public ApplicationDescriptor getAppDescriptor()
93 {
94 return appDescriptor;
95 }
96
97 public File getAppDir()
98 {
99 return appDir;
100 }
101 }