package com.jspxcms.core.generatepage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Collections; import java.util.HashMap; import java.util.Map; import com.jspxcms.common.freemarker.Freemarkers; import com.jspxcms.common.web.PathResolver; import com.jspxcms.core.domain.Node; import com.jspxcms.core.domain.Site; import com.jspxcms.core.support.ForeContext; import freemarker.ext.servlet.FreemarkerServlet; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; /** * PNode * * @author liufang * */ public abstract class PNode { public static void generate(Node node, Configuration config, PathResolver resolver) throws IOException, TemplateException { if (node == null || !node.getGenerate()) { return; } Site site = node.getSite(); Template template = config.getTemplate(node.getTemplate()); Map<String, Object> rootMap = new HashMap<String, Object>(); rootMap.put(FreemarkerServlet.KEY_APPLICATION, Collections.EMPTY_MAP); rootMap.put(FreemarkerServlet.KEY_SESSION, Collections.EMPTY_MAP); rootMap.put(FreemarkerServlet.KEY_REQUEST, Collections.EMPTY_MAP); rootMap.put(Freemarkers.KEY_PARAMETERS, Collections.EMPTY_MAP); rootMap.put(Freemarkers.KEY_PARAMETER_VALUES, Collections.EMPTY_MAP); rootMap.put("node", node); Integer total = 1; int staticPage = node.getStaticPageOrDef(); for (int page = 1; page <= total && page <= staticPage; page++) { String path = node.getUrlStatic(page, false, true); String filename = resolver.getPath(path); File file = new File(filename); file.getParentFile().mkdirs(); // TODO like info:InfoText,title,text. rootMap.put("text", node.getText()); String url = node.getUrlStatic(page); ForeContext.setData(rootMap, null, site, url); ForeContext.setPage(rootMap, page, node); FileOutputStream fos = null; Writer out = null; try { fos = new FileOutputStream(file); out = new OutputStreamWriter(fos, "UTF-8"); ForeContext.resetTotalPages(); template.process(rootMap, out); total = ForeContext.getTotalPages(); if (total == null || total < 1) { total = 1; } } finally { if (out != null) { out.flush(); out.close(); } if (fos != null) { fos.close(); } } } } }