blob: 58293332a307e61e1d9a9827ee16fec2d44c917b [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.
*/
/*
* ThemeResourceLoader.java
*
* Created on June 28, 2005, 12:25 PM
*/
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.pojos.TemplateRendition.RenditionType;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.themes.ThemeNotFoundException;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.business.themes.ThemeManager;
import org.apache.roller.weblogger.pojos.Theme;
import org.apache.roller.weblogger.pojos.ThemeTemplate;
/**
* The ThemeResourceLoader is a Velocity template loader which loads templates
* from shared themes.
*
* @author Allen Gilliland
*/
public class ThemeResourceLoader extends ResourceLoader {
private static Log logger = LogFactory.getFactory().getInstance(
ThemeResourceLoader.class);
public void init(ExtendedProperties configuration) {
logger.debug(configuration);
}
/**
* @throws ResourceNotFoundException
*/
public InputStream getResourceStream(String name) {
if (log.isDebugEnabled()) {
logger.debug("Looking for: " + name);
}
if (name == null || name.length() < 1) {
throw new ResourceNotFoundException(
"Need to specify a template name!");
}
RenditionType renditionType = RenditionType.STANDARD;
if (name.contains("|")) {
String[] pair = name.split("\\|");
name = pair[0];
renditionType = RenditionType.valueOf(pair[1].toUpperCase());
}
try {
// parse the name ... theme templates name are
// <theme>:<template>|<deviceType>
String[] split = name.split(":", 2);
if (split.length < 2) {
throw new ResourceNotFoundException("Invalid ThemeRL key "
+ name);
}
// lookup the template from the proper theme
ThemeManager themeMgr = WebloggerFactory.getWeblogger()
.getThemeManager();
Theme theme = themeMgr.getTheme(split[0]);
ThemeTemplate template = theme.getTemplateByName(split[1]);
if (template == null) {
throw new ResourceNotFoundException("Template [" + split[1]
+ "] doesn't seem to be part of theme [" + split[0]
+ "]");
}
final String contents;
if (template.getTemplateRendition(renditionType) != null) {
contents = template.getTemplateRendition(renditionType).getTemplate();
} else if (renditionType != RenditionType.STANDARD
&& template.getTemplateRendition(RenditionType.STANDARD) != null) {
// fall back to standard rendition type if others not defined
contents = template.getTemplateRendition(RenditionType.STANDARD).getTemplate();
} else {
throw new ResourceNotFoundException("Rendering [" + renditionType.name()
+ "] of Template [" + split[1] + "] not found.");
}
if (log.isDebugEnabled()) {
logger.debug("Resource found!");
}
// return the input stream
return new ByteArrayInputStream(contents.getBytes("UTF-8"));
} catch (UnsupportedEncodingException uex) {
// We expect UTF-8 in all JRE installation.
// This rethrows as a Runtime exception after logging.
logger.error(uex);
throw new RuntimeException(uex);
} catch (ThemeNotFoundException tnfe) {
String msg = "ThemeResourceLoader Error: " + tnfe.getMessage();
logger.error(msg, tnfe);
throw new ResourceNotFoundException(msg);
} catch (WebloggerException re) {
String msg = "RollerResourceLoader Error: " + re.getMessage();
logger.error(msg, re);
throw new ResourceNotFoundException(msg);
}
}
/**
* Files loaded by this resource loader are not reloadable here, as they are
* stored in shared 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;
}
/**
* @see org.apache.velocity.runtime.resource.loader.ResourceLoader#getLastModified(org.apache.velocity.runtime.resource.Resource)
*/
public long getLastModified(Resource resource) {
return 0;
}
}