View Javadoc

1   package org.apache.velocity.runtime.resource;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.    
20   */
21  
22  import org.apache.velocity.runtime.RuntimeServices;
23  import org.apache.velocity.runtime.RuntimeConstants;
24  
25  import org.apache.velocity.runtime.resource.loader.ResourceLoader;
26  
27  import org.apache.velocity.exception.ResourceNotFoundException;
28  import org.apache.velocity.exception.ParseErrorException;
29  
30  /**
31   * This class represent a general text resource that
32   * may have been retrieved from any number of possible
33   * sources.
34   *
35   * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
36   * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
37   * @version $Id: Resource.java 463298 2006-10-12 16:10:32Z henning $
38   */
39  public abstract class Resource
40  {
41      protected RuntimeServices rsvc = null;
42  
43      /**
44       * The template loader that initially loaded the input
45       * stream for this template, and knows how to check the
46       * source of the input stream for modification.
47       */
48      protected ResourceLoader resourceLoader;
49  
50      /**
51       * The number of milliseconds in a minute, used to calculate the
52       * check interval.
53       */
54      protected static final long MILLIS_PER_SECOND =  1000;
55  
56      /**
57       * How often the file modification time is checked (in seconds).
58       */
59      protected long modificationCheckInterval = 0;
60  
61      /**
62       * The file modification time (in milliseconds) for the cached template.
63       */
64      protected long lastModified = 0;
65  
66      /**
67       * The next time the file modification time will be checked (in
68       * milliseconds).
69       */
70      protected long nextCheck = 0;
71  
72      /**
73       *  Name of the resource
74       */
75      protected String name;
76  
77      /**
78       *  Character encoding of this resource
79       */
80      protected String encoding = RuntimeConstants.ENCODING_DEFAULT;
81  
82      /**
83       *  Resource might require ancillary storage of some kind
84       */
85      protected Object data = null;
86  
87      /**
88       *  Default constructor
89       */
90      public Resource()
91      {
92      }
93  
94      /**
95       * @param rs
96       */
97      public void setRuntimeServices( RuntimeServices rs )
98      {
99          rsvc = rs;
100     }
101 
102     /**
103      * Perform any subsequent processing that might need
104      * to be done by a resource. In the case of a template
105      * the actual parsing of the input stream needs to be
106      * performed.
107      *
108      * @return Whether the resource could be processed successfully.
109      * For a {@link org.apache.velocity.Template} or {@link
110      * org.apache.velocity.runtime.resource.ContentResource}, this
111      * indicates whether the resource could be read.
112      * @exception ResourceNotFoundException Similar in semantics as
113      * returning <code>false</code>.
114      * @throws ParseErrorException
115      * @throws Exception
116      */
117     public abstract boolean process()
118         throws ResourceNotFoundException, ParseErrorException, Exception;
119 
120     /**
121      * @return True if source has been modified.
122      */
123     public boolean isSourceModified()
124     {
125         return resourceLoader.isSourceModified(this);
126     }
127 
128     /**
129      * Set the modification check interval.
130      * @param modificationCheckInterval The interval (in seconds).
131      */
132     public void setModificationCheckInterval(long modificationCheckInterval)
133     {
134         this.modificationCheckInterval = modificationCheckInterval;
135     }
136 
137     /**
138      * Is it time to check to see if the resource
139      * source has been updated?
140      * @return True if resource must be checked.
141      */
142     public boolean requiresChecking()
143     {
144         /*
145          *  short circuit this if modificationCheckInterval == 0
146          *  as this means "don't check"
147          */
148 
149         if (modificationCheckInterval <= 0 )
150         {
151            return false;
152         }
153 
154         /*
155          *  see if we need to check now
156          */
157 
158         return ( System.currentTimeMillis() >= nextCheck );
159     }
160 
161     /**
162      * 'Touch' this template and thereby resetting
163      * the nextCheck field.
164      */
165     public void touch()
166     {
167         nextCheck = System.currentTimeMillis() + ( MILLIS_PER_SECOND *  modificationCheckInterval);
168     }
169 
170     /**
171      * Set the name of this resource, for example
172      * test.vm.
173      * @param name
174      */
175     public void setName(String name)
176     {
177         this.name = name;
178     }
179 
180     /**
181      * Get the name of this template.
182      * @return The name of this template.
183      */
184     public String getName()
185     {
186         return name;
187     }
188 
189     /**
190      *  set the encoding of this resource
191      *  for example, "ISO-8859-1"
192      * @param encoding
193      */
194     public void setEncoding( String encoding )
195     {
196         this.encoding = encoding;
197     }
198 
199     /**
200      *  get the encoding of this resource
201      *  for example, "ISO-8859-1"
202      * @return The encoding of this resource.
203      */
204     public String getEncoding()
205     {
206         return encoding;
207     }
208 
209 
210     /**
211      * Return the lastModifed time of this
212      * resource.
213      * @return The lastModifed time of this resource.
214      */
215     public long getLastModified()
216     {
217         return lastModified;
218     }
219 
220     /**
221      * Set the last modified time for this
222      * resource.
223      * @param lastModified
224      */
225     public void setLastModified(long lastModified)
226     {
227         this.lastModified = lastModified;
228     }
229 
230     /**
231      * Return the template loader that pulled
232      * in the template stream
233      * @return The resource loader for this resource.
234      */
235     public ResourceLoader getResourceLoader()
236     {
237         return resourceLoader;
238     }
239 
240     /**
241      * Set the template loader for this template. Set
242      * when the Runtime determines where this template
243      * came from the list of possible sources.
244      * @param resourceLoader
245      */
246     public void setResourceLoader(ResourceLoader resourceLoader)
247     {
248         this.resourceLoader = resourceLoader;
249     }
250 
251     /**
252      * Set arbitrary data object that might be used
253      * by the resource.
254      * @param data
255      */
256     public void setData(Object data)
257     {
258         this.data = data;
259     }
260 
261     /**
262      * Get arbitrary data object that might be used
263      * by the resource.
264      * @return The data object for this resource.
265      */
266     public Object getData()
267     {
268         return data;
269     }
270 }