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 685724 2008-08-13 23:12:12Z nbubna $
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 * Resource type (RESOURCE_TEMPLATE or RESOURCE_CONTENT)
89 */
90 protected int type;
91
92 /**
93 * Default constructor
94 */
95 public Resource()
96 {
97 }
98
99 /**
100 * @param rs
101 */
102 public void setRuntimeServices( RuntimeServices rs )
103 {
104 rsvc = rs;
105 }
106
107 /**
108 * Perform any subsequent processing that might need
109 * to be done by a resource. In the case of a template
110 * the actual parsing of the input stream needs to be
111 * performed.
112 *
113 * @return Whether the resource could be processed successfully.
114 * For a {@link org.apache.velocity.Template} or {@link
115 * org.apache.velocity.runtime.resource.ContentResource}, this
116 * indicates whether the resource could be read.
117 * @exception ResourceNotFoundException Similar in semantics as
118 * returning <code>false</code>.
119 * @throws ParseErrorException
120 * @throws Exception
121 */
122 public abstract boolean process()
123 throws ResourceNotFoundException, ParseErrorException, Exception;
124
125 /**
126 * @return True if source has been modified.
127 */
128 public boolean isSourceModified()
129 {
130 return resourceLoader.isSourceModified(this);
131 }
132
133 /**
134 * Set the modification check interval.
135 * @param modificationCheckInterval The interval (in seconds).
136 */
137 public void setModificationCheckInterval(long modificationCheckInterval)
138 {
139 this.modificationCheckInterval = modificationCheckInterval;
140 }
141
142 /**
143 * Is it time to check to see if the resource
144 * source has been updated?
145 * @return True if resource must be checked.
146 */
147 public boolean requiresChecking()
148 {
149 /*
150 * short circuit this if modificationCheckInterval == 0
151 * as this means "don't check"
152 */
153
154 if (modificationCheckInterval <= 0 )
155 {
156 return false;
157 }
158
159 /*
160 * see if we need to check now
161 */
162
163 return ( System.currentTimeMillis() >= nextCheck );
164 }
165
166 /**
167 * 'Touch' this template and thereby resetting
168 * the nextCheck field.
169 */
170 public void touch()
171 {
172 nextCheck = System.currentTimeMillis() + ( MILLIS_PER_SECOND * modificationCheckInterval);
173 }
174
175 /**
176 * Set the name of this resource, for example
177 * test.vm.
178 * @param name
179 */
180 public void setName(String name)
181 {
182 this.name = name;
183 }
184
185 /**
186 * Get the name of this template.
187 * @return The name of this template.
188 */
189 public String getName()
190 {
191 return name;
192 }
193
194 /**
195 * set the encoding of this resource
196 * for example, "ISO-8859-1"
197 * @param encoding
198 */
199 public void setEncoding( String encoding )
200 {
201 this.encoding = encoding;
202 }
203
204 /**
205 * get the encoding of this resource
206 * for example, "ISO-8859-1"
207 * @return The encoding of this resource.
208 */
209 public String getEncoding()
210 {
211 return encoding;
212 }
213
214
215 /**
216 * Return the lastModifed time of this
217 * resource.
218 * @return The lastModifed time of this resource.
219 */
220 public long getLastModified()
221 {
222 return lastModified;
223 }
224
225 /**
226 * Set the last modified time for this
227 * resource.
228 * @param lastModified
229 */
230 public void setLastModified(long lastModified)
231 {
232 this.lastModified = lastModified;
233 }
234
235 /**
236 * Return the template loader that pulled
237 * in the template stream
238 * @return The resource loader for this resource.
239 */
240 public ResourceLoader getResourceLoader()
241 {
242 return resourceLoader;
243 }
244
245 /**
246 * Set the template loader for this template. Set
247 * when the Runtime determines where this template
248 * came from the list of possible sources.
249 * @param resourceLoader
250 */
251 public void setResourceLoader(ResourceLoader resourceLoader)
252 {
253 this.resourceLoader = resourceLoader;
254 }
255
256 /**
257 * Set arbitrary data object that might be used
258 * by the resource.
259 * @param data
260 */
261 public void setData(Object data)
262 {
263 this.data = data;
264 }
265
266 /**
267 * Get arbitrary data object that might be used
268 * by the resource.
269 * @return The data object for this resource.
270 */
271 public Object getData()
272 {
273 return data;
274 }
275
276 /**
277 * Sets the type of this Resource (RESOURCE_TEMPLATE or RESOURCE_CONTENT)
278 * @since 1.6
279 */
280 public void setType(int type)
281 {
282 this.type = type;
283 }
284
285 /**
286 * @return type code of the Resource
287 * @since 1.6
288 */
289 public int getType()
290 {
291 return type;
292 }
293 }