View Javadoc

1   /*
2    * $Id: PluginDescriptorParser.java 22155 2011-06-08 20:35:15Z aperepel $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          // parse plugins
45          final File pluginsDir = new File(appDir, "plugins");
46          // TODO decide if we want to support 'exploded' plugins, for now no
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              // must unpack as there's no straightforward way for a ClassLoader to use a jar within another jar/zip
60              final File tmpDir = new File(MuleContainerBootstrapUtils.getMuleTmpDir(),
61                                           appDescriptor.getAppName() + "/plugins/" + pluginName);
62              // TODO fix unzip impl to not stumble over existing dirs
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 }