001: /*
002: * Copyright 2002-2005 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.ui.freemarker;
018:
019: import java.io.IOException;
020: import java.io.InputStreamReader;
021: import java.io.Reader;
022:
023: import freemarker.cache.TemplateLoader;
024: import org.apache.commons.logging.Log;
025: import org.apache.commons.logging.LogFactory;
026:
027: import org.springframework.core.io.Resource;
028: import org.springframework.core.io.ResourceLoader;
029:
030: /**
031: * FreeMarker TemplateLoader adapter that loads via a Spring ResourceLoader.
032: * Used by FreeMarkerConfigurationFactory for any resource loader path that
033: * cannot be resolved to a java.io.File.
034: *
035: * <p>Note that this loader does not allow for modification detection:
036: * Use FreeMarker's default TemplateLoader for java.io.File resources.
037: *
038: * @author Juergen Hoeller
039: * @since 14.03.2004
040: * @see FreeMarkerConfigurationFactory#setTemplateLoaderPath
041: * @see freemarker.template.Configuration#setDirectoryForTemplateLoading
042: */
043: public class SpringTemplateLoader implements TemplateLoader {
044:
045: protected final Log logger = LogFactory.getLog(getClass());
046:
047: private final ResourceLoader resourceLoader;
048:
049: private final String templateLoaderPath;
050:
051: /**
052: * Create a new SpringTemplateLoader.
053: * @param resourceLoader the Spring ResourceLoader to use
054: * @param templateLoaderPath the template loader path to use
055: */
056: public SpringTemplateLoader(ResourceLoader resourceLoader,
057: String templateLoaderPath) {
058: this .resourceLoader = resourceLoader;
059: if (!templateLoaderPath.endsWith("/")) {
060: templateLoaderPath += "/";
061: }
062: this .templateLoaderPath = templateLoaderPath;
063: if (logger.isInfoEnabled()) {
064: logger
065: .info("SpringTemplateLoader for FreeMarker: using resource loader ["
066: + this .resourceLoader
067: + "] and template loader path ["
068: + this .templateLoaderPath + "]");
069: }
070: }
071:
072: public Object findTemplateSource(String name) throws IOException {
073: if (logger.isDebugEnabled()) {
074: logger.debug("Looking for FreeMarker template with name ["
075: + name + "]");
076: }
077: Resource resource = this .resourceLoader
078: .getResource(this .templateLoaderPath + name);
079: return (resource.exists() ? resource : null);
080: }
081:
082: public Reader getReader(Object templateSource, String encoding)
083: throws IOException {
084: Resource resource = (Resource) templateSource;
085: try {
086: return new InputStreamReader(resource.getInputStream(),
087: encoding);
088: } catch (IOException ex) {
089: if (logger.isDebugEnabled()) {
090: logger.debug("Could not find FreeMarker template: "
091: + resource);
092: }
093: throw ex;
094: }
095: }
096:
097: public long getLastModified(Object templateSource) {
098: return -1;
099: }
100:
101: public void closeTemplateSource(Object templateSource)
102: throws IOException {
103: }
104:
105: }
|