package org.genedb.web.mvc.view;
import org.apache.log4j.Logger;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import com.google.common.collect.Lists;
public class FileCheckingInternalResourceViewResolver extends InternalResourceViewResolver {
private Logger logger = Logger.getLogger(FileCheckingInternalResourceViewResolver.class);
private Set<String> validViews = new HashSet<String>();
public void postConstruction() {
String prefix = getPrefix().substring(1);
logger.debug("Prefix is "+prefix);
WebApplicationContext appCxt = getWebApplicationContext();
String basePath = appCxt.getServletContext().getRealPath("/");
String viewRoot = basePath + prefix;
logger.info(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);
validViews.add(f2);
logger.info(String.format("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(getSuffix())) {
ret.add(child);
}
}
}
return ret;
}
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
if (!validViews.contains(viewName)) {
return null;
}
return super.resolveViewName(viewName, locale);
}
}