001    package com.khubla.pragmatach.framework.resourceloader;
002    
003    import java.io.InputStream;
004    import java.util.Map;
005    
006    import javax.servlet.ServletContext;
007    
008    import org.slf4j.Logger;
009    import org.slf4j.LoggerFactory;
010    
011    import com.khubla.pragmatach.framework.api.PragmatachException;
012    import com.khubla.pragmatach.framework.plugin.PluginDescriptor;
013    import com.khubla.pragmatach.framework.plugin.PluginDescriptors;
014    
015    /**
016     * @author tome
017     */
018    public class DefaultResourceLoaderImpl implements ResourceLoader {
019       /**
020        * logger
021        */
022       private final Logger logger = LoggerFactory.getLogger(this.getClass());
023       /**
024        * servlet context
025        */
026       private final ServletContext servletContext;
027    
028       /**
029        * ctor
030        */
031       public DefaultResourceLoaderImpl(ServletContext servletContext) {
032          this.servletContext = servletContext;
033       }
034    
035       /**
036        * get a resource using the servlet's class loader
037        */
038       @Override
039       public InputStream getResource(String resource) throws PragmatachException {
040          try {
041             if ((resource.contains("WEB-INF")) || (resource.contains("META-INF")) || (resource.startsWith("."))) {
042                return null;
043             } else {
044                String resourcePath = resource;
045                if (false == resourcePath.startsWith("/")) {
046                   resourcePath = "/" + resourcePath;
047                }
048                /*
049                 * try loading from the web app
050                 */
051                InputStream ret = servletContext.getResourceAsStream(resourcePath);
052                /*
053                 * try loading locally
054                 */
055                if (null == ret) {
056                   ret = DefaultResourceLoaderImpl.class.getResourceAsStream(resourcePath);
057                }
058                /*
059                 * ok, can't find, try the plugins
060                 */
061                if (null == ret) {
062                   /*
063                    * get the plugins
064                    */
065                   final Map<String, PluginDescriptor> plugins = PluginDescriptors.getPlugins();
066                   if (null != plugins) {
067                      for (final PluginDescriptor plugin : plugins.values()) {
068                         ret = plugin.getResource(resource);
069                         if (null != ret) {
070                            /*
071                             * found it!
072                             */
073                            break;
074                         }
075                      }
076                   }
077                }
078                /*
079                 * unable to find, log that
080                 */
081                if (null == ret) {
082                   logger.info("Unable to load resource '" + resource + "'");
083                }
084                /*
085                 * done
086                 */
087                return ret;
088             }
089          } catch (final Exception e) {
090             throw new PragmatachException("Exception in getResource", e);
091          }
092       }
093    }