/*
* Weblounge: Web Content Management System
* Copyright (c) 2012 The Weblounge Team
* http://weblounge.o2it.ch
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package ch.entwine.weblounge.common.impl.util;
import ch.entwine.weblounge.common.impl.language.LanguageUtils;
import ch.entwine.weblounge.common.language.Language;
import ch.entwine.weblounge.common.site.Site;
import ch.entwine.weblounge.common.url.UrlUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
/**
* This class contains utility methods to handle templates.
*/
public final class TemplateUtils {
/** the logging facility provided by log4j */
private static final Logger logger = LoggerFactory.getLogger(TemplateUtils.class);
/**
* Prevent this static utility class from being instanatiated.
*/
private TemplateUtils() {
// Nothing to do
}
/**
* Replaces the given variable in the source document with the specified
* value. This method replaces <code>${variable}</code> with
* <code>value</code>.
*
* @param src
* the source document
* @param variable
* the variable to replace
* @param value
* the value
* @return the modified source
*/
public static String replace(String src, String variable, String value) {
if (src != null && variable != null && value != null) {
return src.replaceAll("\\$\\{" + variable + "\\}", value);
}
return null;
}
/**
* Replaces the given variables in the source document with the specified
* values.
*
* @param src
* the source document
* @param replacements
* the variables to replace
* @return the modified source
*/
public static String replace(String src, String[][] replacements) {
if (src != null) {
for (int i = 0; i < replacements.length; i++) {
if (replacements[i][0] != null && replacements[i][1] != null) {
String replacement = (replacements[i][1] != null) ? replacements[i][1] : "";
src = src.replaceAll("\\$\\{" + replacements[i][0] + "\\}", replacement);
}
}
return src;
}
return null;
}
/**
* Loads the resource from the classpath. The <code>path</code> denotes the
* path to the resource to load, e. g.
* <code>/ch/o2it/weblounge/test.txt</code>.
*
* @param path
* the resource path
* @return the resource
*/
public static String load(String path) {
InputStream is = TemplateUtils.class.getResourceAsStream(path);
InputStreamReader isr = null;
StringBuffer buf = new StringBuffer();
if (is != null) {
try {
logger.debug("Loading " + path);
isr = new InputStreamReader(is, Charset.forName("UTF-8"));
char[] chars = new char[1024];
int count = 0;
while ((count = isr.read(chars)) > 0) {
for (int i = 0; i < count; i++)
buf.append(chars[i]);
}
return buf.toString();
} catch (Throwable t) {
logger.warn("Error reading " + path + ": " + t.getMessage());
} finally {
IOUtils.closeQuietly(isr);
IOUtils.closeQuietly(is);
}
logger.debug("Editor support (javascript) loaded");
} else {
logger.error("Repository item not found: " + path);
}
return null;
}
/**
* Loads the resource identified by concatenating the package name from
* <code>clazz</code> and <code>path</code> from the classpath.
*
* @param path
* the path relative to the package name of <code>clazz</code>
* @param clazz
* the class
* @return the resource
*/
public static String load(String path, Class<?> clazz) {
if (path == null)
throw new IllegalArgumentException("path cannot be null");
if (clazz == null)
throw new IllegalArgumentException("clazz cannot be null");
String pkg = "/" + clazz.getPackage().getName().replace('.', '/');
InputStream is = clazz.getResourceAsStream(UrlUtils.concat(pkg, path));
InputStreamReader isr = null;
StringBuffer buf = new StringBuffer();
if (is != null) {
try {
logger.debug("Loading " + path);
isr = new InputStreamReader(is, Charset.forName("UTF-8"));
char[] chars = new char[1024];
int count = 0;
while ((count = isr.read(chars)) > 0) {
for (int i = 0; i < count; i++)
buf.append(chars[i]);
}
return buf.toString();
} catch (Throwable t) {
logger.warn("Error reading " + path + ": " + t.getMessage());
} finally {
IOUtils.closeQuietly(isr);
IOUtils.closeQuietly(is);
}
logger.debug("Editor support (javascript) loaded");
} else {
logger.error("Repository item not found: " + path);
}
return null;
}
/**
* Loads the resource identified by concatenating the package name from
* <code>clazz</code> and <code>path</code> from the classpath. If possible,
* the template is returned in the specified language.
*
* @param path
* the path relative to the package name of <code>clazz</code>
* @param clazz
* the class
* @param language
* the requested language
* @return the resource
*/
public static String load(String path, Class<?> clazz, Language language) {
return load(path, clazz, language, null);
}
/**
* Loads the resource identified by concatenating the package name from
* <code>clazz</code> and <code>path</code> from the classpath.
*
* @param path
* the path relative to the package name of <code>clazz</code>
* @param clazz
* the class
* @param language
* the requested language
* @param site
* the associated site
* @return the resource
*/
public static String load(String path, Class<?> clazz, Language language,
Site site) {
if (path == null)
throw new IllegalArgumentException("path cannot be null");
if (clazz == null)
throw new IllegalArgumentException("clazz cannot be null");
String pkg = null;
if (!path.startsWith("/"))
pkg = "/" + clazz.getPackage().getName().replace('.', '/');
// Try to find the template in any of the usual languages
InputStream is = null;
String[] templates = null;
if (site != null)
templates = LanguageUtils.getLanguageVariants(path, language, site.getDefaultLanguage());
else
templates = LanguageUtils.getLanguageVariants(path, language);
for (String template : templates) {
String pathToTemplate = pkg != null ? UrlUtils.concat(pkg, template) : template;
is = clazz.getResourceAsStream(pathToTemplate);
if (is != null) {
path = template;
break;
}
}
// If is is still null, then the template doesn't exist.
if (is == null) {
logger.error("Template " + path + " not found in any language");
return null;
}
// Load the template
InputStreamReader isr = null;
StringBuffer buf = new StringBuffer();
try {
logger.debug("Loading " + path);
isr = new InputStreamReader(is, Charset.forName("UTF-8"));
char[] chars = new char[1024];
int count = 0;
while ((count = isr.read(chars)) > 0) {
for (int i = 0; i < count; i++)
buf.append(chars[i]);
}
return buf.toString();
} catch (Throwable t) {
logger.warn("Error reading " + path + ": " + t.getMessage());
} finally {
IOUtils.closeQuietly(isr);
IOUtils.closeQuietly(is);
}
logger.debug("Template " + path + " loaded");
return null;
}
}