package org.genedb.web.mvc.view;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;
import java.io.File;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class FileCheckingFreemarkerViewResolver implements ViewResolver, ApplicationContextAware {
private Logger logger = Logger.getLogger(FileCheckingFreemarkerViewResolver.class);
private Map<String, FreeMarkerView> validViews = Maps.newHashMap();
// private String initialPrefix;
private String prefix;
private int order;
public void setOrder(int order) {
this.order = order;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public void setAppCxt(WebApplicationContext appCxt) {
this.appCxt = appCxt;
}
private String suffix;
private WebApplicationContext appCxt;
public void postConstruction() {
String initialPrefix = prefix.substring(1);
logger.error("Prefix is "+initialPrefix);
String basePath = appCxt.getServletContext().getRealPath("/");
String viewRoot = basePath + initialPrefix;
logger.error(String.format("Checking views under '%s'", viewRoot));
File viewRootDir = new File(viewRoot);
List<File> subFiles = getAllSubfiles(viewRootDir);
for (File file : subFiles) {
String filePath = file.getAbsolutePath();
String f2 = filePath.substring(viewRoot.length(), filePath.length()-4);
FreeMarkerView view = new FreeMarkerView();
view.setUrl(filePath);
view.setApplicationContext(appCxt);
validViews.put(f2, view);
logger.error(String.format("Peri Adding view names '%s'", f2));
}
}
private List<File> getAllSubfiles(File root) {
List<File> ret = Lists.newArrayList();
File[] children = root.listFiles();
for (File child : children) {
if (child.isDirectory()) {
ret.addAll(getAllSubfiles(child));
} else {
if (child.getName().endsWith(suffix)) {
ret.add(child);
}
}
}
return ret;
}
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
logger.error(String.format("Looking up '%s'", viewName));
if (!validViews.containsKey(viewName)) {
return null;
}
return validViews.get(viewName);
}
@Override
public void setApplicationContext(ApplicationContext cxt) throws BeansException {
appCxt = (WebApplicationContext) cxt;
}
}