blob: fa3acb55ca9ecdf30a699777423b115f88e96713 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.roller.weblogger.ui.rendering.velocity;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.pojos.TemplateRendition;
import org.apache.roller.weblogger.pojos.TemplateRendition.RenditionType;
import org.apache.roller.weblogger.pojos.WeblogTemplate;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
/**
* The RollerResourceLoader is a Velocity template loader which loads templates
* from custom themes.
*
* RollerResourceLoader makes use of WebloggerFactory.
*
* @author <a href="mailto:lance@brainopolis.com">Lance Lavandowska</a>
* @version $Id: RollerResourceLoader.java,v 1.9 2005/01/15 03:32:49 snoopdave
* Exp $
*/
public class RollerResourceLoader extends ResourceLoader {
private static Log logger = LogFactory.getLog(RollerResourceLoader.class);
public void init(ExtendedProperties configuration) {
if (logger.isDebugEnabled()) {
logger.debug(configuration);
}
}
/**
* Get an InputStream so that the Runtime can build a template with it.
*
* @param name
* name of template
* @return InputStream containing template
* @throws ResourceNotFoundException
*/
public InputStream getResourceStream(String name) {
logger.debug("Looking for: " + name);
if (name == null || name.length() == 0) {
throw new ResourceNotFoundException(
"Need to specify a template name!");
}
// theme templates name are <template>|<deviceType>
RenditionType renditionType = RenditionType.STANDARD;
if (name.contains("|")) {
String[] pair = name.split("\\|");
name = pair[0];
renditionType = RenditionType.valueOf(pair[1].toUpperCase());
}
logger.debug(" Actually, it's " + name);
try {
WeblogTemplate page = WebloggerFactory.getWeblogger()
.getWeblogManager().getTemplate(name);
if (page == null) {
throw new ResourceNotFoundException(
"RollerResourceLoader: page \"" + name + "\" not found");
}
String contents = "";
TemplateRendition templateCode = page.getTemplateRendition(renditionType);
if (templateCode == null && renditionType != RenditionType.STANDARD) {
// fall back to standard rendition if mobile or other unavailable
templateCode = page.getTemplateRendition(RenditionType.STANDARD);
}
if (templateCode != null) {
contents = templateCode.getTemplate();
}
return new ByteArrayInputStream(contents.getBytes("UTF-8"));
} catch (UnsupportedEncodingException uex) {
// This should never actually happen. We expect UTF-8 in all JRE
// installation.
// This rethrows as a Runtime exception after logging.
logger.error(uex);
throw new RuntimeException(uex);
} catch (Exception re) {
String msg = "RollerResourceLoader Error: "
+ "database problem trying to load resource " + name;
logger.error(msg, re);
throw new ResourceNotFoundException(msg);
}
}
/**
* Files loaded by this resource loader are not reloadable here, as they are
* stored in custom themes and there is no way velocity can trigger a
* reload.
*
* @see org.apache.velocity.runtime.resource.loader.ResourceLoader#isSourceModified(org.apache.velocity.runtime.resource.Resource)
*/
public boolean isSourceModified(Resource resource) {
return false;
}
/**
* Defaults to return 0.
*
* @see org.apache.velocity.runtime.resource.loader.ResourceLoader#getLastModified(org.apache.velocity.runtime.resource.Resource)
*/
public long getLastModified(Resource resource) {
return 0;
}
}