001    package com.khubla.pragmatach.framework.plugin;
002    
003    import java.io.InputStream;
004    import java.net.JarURLConnection;
005    import java.net.URL;
006    import java.net.URLClassLoader;
007    import java.security.AccessController;
008    import java.security.PrivilegedExceptionAction;
009    import java.util.Properties;
010    import java.util.jar.Manifest;
011    
012    import javax.servlet.ServletContext;
013    
014    import com.khubla.pragmatach.framework.api.Plugin;
015    import com.khubla.pragmatach.framework.api.PragmatachException;
016    import com.khubla.pragmatach.framework.resourceloader.DefaultResourceLoaderImpl;
017    
018    /**
019     * @author tome
020     */
021    public class PluginDescriptor {
022            /**
023             * name
024             */
025            public static final String ACTIVATOR = "activator";
026            /**
027             * the jar
028             */
029            private final URL url;
030            /**
031             * the properties
032             */
033            private final Properties properties;
034            /**
035             * plugin
036             */
037            private final Plugin plugin;
038    
039            public PluginDescriptor(URL url, InputStream inputStream,
040                            ServletContext servletContext) throws PragmatachException {
041                    try {
042                            this.url = url;
043                            properties = new Properties();
044                            properties.load(inputStream);
045                            plugin = findPlugin(servletContext);
046                    } catch (final Exception e) {
047                            throw new PragmatachException(e);
048                    }
049            }
050    
051            private Plugin findPlugin(ServletContext servletContext)
052                            throws PragmatachException {
053                    try {
054                            final String activatorClassName = properties.getProperty(ACTIVATOR);
055                            if (null != activatorClassName) {
056                                    final Class<?> clazz = Class.forName(activatorClassName);
057                                    if (null != clazz) {
058                                            final Plugin ret = (Plugin) clazz.newInstance();
059                                            ret.setPluginContext(new PluginContextImpl(
060                                                            new DefaultResourceLoaderImpl(servletContext)));
061                                            return ret;
062                                    }
063                            }
064                            return null;
065                    } catch (final Exception e) {
066                            throw new PragmatachException(e);
067                    }
068            }
069    
070            /**
071             * get the plugin jar manifest
072             */
073            public Manifest getManifest() throws PragmatachException {
074                    try {
075                            final JarURLConnection jarURLConnection = (JarURLConnection) url
076                                            .openConnection();
077                            if (null != jarURLConnection) {
078                                    return jarURLConnection.getManifest();
079                            }
080                            return null;
081                    } catch (final Exception e) {
082                            throw new PragmatachException("Exception in getManifest", e);
083                    }
084            }
085    
086            public String getName() {
087                    return plugin.getName();
088            }
089    
090            public Plugin getPlugin() {
091                    return plugin;
092            }
093    
094            public Properties getProperties() {
095                    return properties;
096            }
097    
098            /**
099             * get a resource from this plugin's jar
100             */
101            public InputStream getResource(String name) throws PragmatachException {
102                    try {
103                            ClassLoader classLoader = null;
104                            classLoader = AccessController
105                                            .doPrivileged(new PrivilegedExceptionAction<ClassLoader>() {
106    
107                                                    @Override
108                                                    public ClassLoader run() throws Exception {
109                                                            return new URLClassLoader(new URL[] { url });
110                                                    }
111                                            });
112                            if (null != classLoader) {
113                                    return classLoader.getResourceAsStream(name);
114                            } else {
115                                    return null;
116                            }
117                    } catch (final Exception e) {
118                            throw new PragmatachException("Exception in getResource", e);
119                    }
120            }
121    
122            public URL getUrl() {
123                    return url;
124            }
125    }