/* ====================================================================
*
* Copyright (C) 2007 - 2015 GeoSolutions S.A.S.
* http://www.geo-solutions.it
*
* GPLv3 + Classpath exception
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.
*
* ====================================================================
*
* This software consists of voluntary contributions made by developers
* of GeoSolutions. For more information on GeoSolutions, please see
* <http://www.geo-solutions.it/>.
*
*/
package it.geosolutions.geostore.services.rest.auditing;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.apache.commons.io.FileUtils;
import java.io.File;
final class AuditingTemplates {
private static final String HEADER = "header.ftl";
private static final String BODY = "body.ftl";
private static final String FOOTER = "footer.ftl";
private final File templatesDirectory;
private final Template headerTemplate;
private final Template bodyTemplate;
private final Template footerTemplate;
private final long headerTemplateChecksum;
private final long bodyTemplateChecksum;
private final long footerTemplateChecksum;
AuditingTemplates(String templatesDirectoryPath) {
this(templatesDirectoryPath, null, null, null);
}
AuditingTemplates(String templatesDirectoryPath, Long headerTemplateChecksum,
Long bodyTemplateChecksum, Long footerTemplateChecksum) {
templatesDirectory = getTemplatesDirectory(templatesDirectoryPath);
Configuration configuration = getConfiguration();
headerTemplate = getTemplate(configuration, HEADER);
bodyTemplate = getTemplate(configuration, BODY);
footerTemplate = getTemplate(configuration, FOOTER);
this.headerTemplateChecksum = headerTemplateChecksum == null ?
checksum(new File(templatesDirectory, "header.ftl")) : headerTemplateChecksum;
this.bodyTemplateChecksum = bodyTemplateChecksum == null ?
checksum(new File(templatesDirectory, "body.ftl")) : bodyTemplateChecksum;
this.footerTemplateChecksum = footerTemplateChecksum == null ?
checksum(new File(templatesDirectory, "footer.ftl")) : footerTemplateChecksum;
}
Template getHeaderTemplate() {
return headerTemplate;
}
Template getBodyTemplate() {
return bodyTemplate;
}
Template getFooterTemplate() {
return footerTemplate;
}
AuditingTemplates checkForNewTemplates(String candidateTemplatesDirectoryPath) {
File candidateTemplatesDirectory = getTemplatesDirectory(candidateTemplatesDirectoryPath);
long candidateHeaderTemplateChecksum = checksum(new File(templatesDirectory, "header.ftl"));
long candidateBodyTemplateChecksum = checksum(new File(templatesDirectory, "body.ftl"));
long candidateFooterTemplateChecksum = checksum(new File(templatesDirectory, "footer.ftl"));
if (templatesDirectory.compareTo(candidateTemplatesDirectory) != 0
|| headerTemplateChecksum == candidateHeaderTemplateChecksum
|| bodyTemplateChecksum == candidateBodyTemplateChecksum
|| footerTemplateChecksum == candidateFooterTemplateChecksum) {
return new AuditingTemplates(candidateTemplatesDirectoryPath, candidateHeaderTemplateChecksum,
candidateBodyTemplateChecksum, candidateFooterTemplateChecksum);
}
return null;
}
private File getTemplatesDirectory(String templatesDirectoryPath) {
File file = new File(templatesDirectoryPath);
if (!file.exists()) {
throw new AuditingException("Templates directory '%s' does not exists.", templatesDirectoryPath);
}
return file;
}
private Configuration getConfiguration() {
try {
Configuration configuration = new Configuration();
configuration.setDirectoryForTemplateLoading(templatesDirectory);
configuration.setDefaultEncoding("UTF-8");
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
return configuration;
} catch (Exception exception) {
throw new AuditingException(exception, "Error initiating templates configuration from directory '%s'.",
templatesDirectory.getPath());
}
}
private Template getTemplate(Configuration configuration, String templateName) {
try {
return configuration.getTemplate(templateName);
} catch (Exception exception) {
throw new AuditingException(exception, "Error getting template '%s'.", templateName);
}
}
private long checksum(File file) {
try {
return FileUtils.checksumCRC32(file);
} catch (Exception exception) {
throw new AuditingException(exception, "Error computign checksum of file '%s'.", file.getPath());
}
}
}