Coverage Report - org.webmacro.resource.TemplateLoaderHelper
 
Classes in this File Line Coverage Branch Coverage Complexity
TemplateLoaderHelper
0%
0/34
0%
0/6
2.222
TemplateLoaderHelper$FTReloadContext
0%
0/5
0%
0/2
2.222
TemplateLoaderHelper$UrlReloadContext
0%
0/5
0%
0/2
2.222
 
 1  
 /*
 2  
  * Copyright (C) 1998-2000 Semiotek Inc.  All Rights Reserved.
 3  
  *
 4  
  * Redistribution and use in source and binary forms, with or without
 5  
  * modification, are permitted under the terms of either of the following
 6  
  * Open Source licenses:
 7  
  *
 8  
  * The GNU General Public License, version 2, or any later version, as
 9  
  * published by the Free Software Foundation
 10  
  * (http://www.fsf.org/copyleft/gpl.html);
 11  
  *
 12  
  *  or
 13  
  *
 14  
  * The Semiotek Public License (http://webmacro.org/LICENSE.)
 15  
  *
 16  
  * This software is provided "as is", with NO WARRANTY, not even the
 17  
  * implied warranties of fitness to purpose, or merchantability. You
 18  
  * assume all risks and liabilities associated with its use.
 19  
  *
 20  
  * See www.webmacro.org for more information on the WebMacro project.
 21  
  */
 22  
 package org.webmacro.resource;
 23  
 
 24  
 import java.io.File;
 25  
 import java.io.IOException;
 26  
 import java.net.URL;
 27  
 import java.net.URLConnection;
 28  
 
 29  
 import org.webmacro.Broker;
 30  
 import org.webmacro.InitException;
 31  
 import org.webmacro.ResourceException;
 32  
 import org.webmacro.Template;
 33  
 import org.webmacro.TemplateException;
 34  
 import org.webmacro.engine.FileTemplate;
 35  
 import org.webmacro.engine.StreamTemplate;
 36  
 import org.webmacro.util.Settings;
 37  
 
 38  
 /**
 39  
  * Helper class for template loaders to actuall load a Template.
 40  
  * This class should be used for loading templates from URLs
 41  
  * or files. Thus, the template loader only has to care for
 42  
  * locating the template.
 43  
  * <br>
 44  
  * This class will take care of loading the template and setting
 45  
  * up a correct reload context, depending on the protocol used.
 46  
  * @author Sebastian Kanthak (sebastian.kanthak@muehlheim.de)
 47  
  */
 48  
 public class TemplateLoaderHelper
 49  
 {
 50  
 
 51  
     private Broker broker;
 52  
     private ReloadDelayDecorator reloadDelay;
 53  
 
 54  
     /**
 55  
      * Construct a new TemplateLoaderHelper object.
 56  
      */
 57  
     public TemplateLoaderHelper ()
 58  
     {
 59  0
         super();
 60  0
     }
 61  
 
 62  
     /**
 63  
      * Initialize this object.
 64  
      * @param b broker to use
 65  
      * @param config configuration to initialize from
 66  
      */
 67  
     public void init (Broker b, Settings config) throws InitException
 68  
     {
 69  0
         this.broker = b;
 70  0
         reloadDelay = new ReloadDelayDecorator();
 71  0
         reloadDelay.init(b, config);
 72  0
     }
 73  
 
 74  
     /**
 75  
      * Load a template from a file.
 76  
      * This will load the template from the specified file and
 77  
      * set up an appropriate reload context, if ce is not null.
 78  
      * It will use the check-for-reload delay specified for protocol
 79  
      * file.
 80  
      * @param file file to load template from
 81  
      * @param ce cache element for reload context or null, if no caching is used.
 82  
      * @return loaded template
 83  
      * @exception ResourceException if template could not be loaded or parsed.
 84  
      */
 85  
     public Template load (File file, CacheElement ce) throws ResourceException
 86  
     {
 87  0
         Template t = new FileTemplate(broker, file);
 88  0
         parseTemplate(t);
 89  0
         if (ce != null)
 90  
         {
 91  0
             CacheReloadContext reloadContext = new FTReloadContext(file, file.lastModified());
 92  0
             ce.setReloadContext(reloadDelay.decorate("file", reloadContext));
 93  
         }
 94  0
         return t;
 95  
     }
 96  
 
 97  
     /**
 98  
      * Load a template from an url.
 99  
      * This will load the template from the specified url and
 100  
      * set up an appropriate reload context, if ce is not null.
 101  
      * It will use the check-for-reload delay specified for the url's
 102  
      * protocol. If protocl is "file", the more efficient file operations
 103  
      * of java are used.
 104  
      * @param url url to load template from
 105  
      * @param ce cache element for reload context or null, if no caching is used.
 106  
      * @return loaded template
 107  
      * @exception ResourceException if template could not be loaded or parsed.
 108  
      */
 109  
     public Template load (URL url, CacheElement ce) throws ResourceException
 110  
     {
 111  0
         if (url.getProtocol().equals("file"))
 112  
         {
 113  
             // handle files directly, because it is more efficient
 114  0
             File file = new File(url.getFile());
 115  0
             return load(file, ce);
 116  
         }
 117  
         else
 118  
         {
 119  
             try
 120  
             {
 121  0
                 URLConnection conn = url.openConnection();
 122  0
                 long lastMod = conn.getLastModified();
 123  0
                 String encoding = conn.getContentEncoding();
 124  
                 // encoding may be null. Will be handled by StreamTemplate
 125  0
                 Template t = new StreamTemplate(broker, conn.getInputStream(), encoding);
 126  0
                 t.setName(url.toExternalForm());
 127  0
                 parseTemplate(t);
 128  0
                 if (ce != null)
 129  
                 {
 130  0
                     CacheReloadContext reloadContext = new UrlReloadContext(url, lastMod);
 131  0
                     ce.setReloadContext(reloadDelay.decorate(url.getProtocol(), reloadContext));
 132  
                 }
 133  0
                 return t;
 134  
             }
 135  0
             catch (IOException e)
 136  
             {
 137  0
                 throw new InvalidResourceException("IOException while reading template from " + url, e);
 138  
             }
 139  
         }
 140  
     }
 141  
 
 142  
     /**
 143  
      * Encapsulates calls to Template.parse and wraps
 144  
      * checked exceptions into ResourceExceptions.
 145  
      */
 146  
     private void parseTemplate (Template template) throws ResourceException
 147  
     {
 148  
         try
 149  
         {
 150  0
             template.parse();
 151  
         }
 152  0
         catch (IOException e)
 153  
         {
 154  0
             throw new InvalidResourceException("IOException while reading template " + template.getName(), e);
 155  
         }
 156  0
         catch (TemplateException e)
 157  
         {
 158  0
             throw new InvalidResourceException("Error while parsing template: " + template.getName(), e);
 159  0
         }
 160  0
     }
 161  
 
 162  
     /**
 163  
      * ReloadContext for file templates.  Uses last-modified to determine
 164  
      * if resource should be reloaded.
 165  
      */
 166  
     private static class FTReloadContext extends CacheReloadContext
 167  
     {
 168  
 
 169  
         private File file;
 170  
         private long lastModified;
 171  
 
 172  
         public FTReloadContext (File f, long lastModified)
 173  0
         {
 174  0
             this.file = f;
 175  0
             this.lastModified = lastModified;
 176  0
         }
 177  
 
 178  
         public boolean shouldReload ()
 179  
         {
 180  0
             return (lastModified != file.lastModified());
 181  
         }
 182  
     }
 183  
 
 184  
     /**
 185  
      * ReloadContext for url templates.  Uses last-modified to determine
 186  
      * if resource should be reloaded.
 187  
      */
 188  
     private static class UrlReloadContext extends CacheReloadContext
 189  
     {
 190  
 
 191  
         private long lastModified;
 192  
         private URL url;
 193  
 
 194  
         public UrlReloadContext (URL url, long lastModified)
 195  0
         {
 196  0
             this.url = url;
 197  0
             this.lastModified = lastModified;
 198  0
         }
 199  
 
 200  
         public boolean shouldReload ()
 201  
         {
 202  0
             return (lastModified != UrlProvider.getUrlLastModified(url));
 203  
         }
 204  
     }
 205  
 }
 206