package cn.bran.japid.template; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.Map; import java.util.TreeMap; import cn.bran.japid.util.StringBundler; public abstract class JapidTemplateBaseWithStringBundler { StringBundler out; protected Map<String, String> headers = new TreeMap<String, String>(); { headers.put("Content-Type", "text/html; charset=utf-8"); } /** * to keep track of all the action invocations by #{invoke} tag */ protected TreeMap<Integer, cn.bran.japid.template.ActionRunner> actionRunners = new TreeMap<Integer, cn.bran.japid.template.ActionRunner>(); public TreeMap<Integer, cn.bran.japid.template.ActionRunner> getActionRunners() { return actionRunners; } public void setActionRunners(TreeMap<Integer, cn.bran.japid.template.ActionRunner> actionRunners) { this.actionRunners = actionRunners; } public void setOut(StringBundler out) { this.out = out; } protected StringBundler getOut() { return out; } // public JapidTemplateBase() { // // }; public JapidTemplateBaseWithStringBundler(int capacity) { this.out = new StringBundler(capacity); } // don't use it since it will lead to new instance of stringencoder Charset UTF8 = Charset.forName("UTF-8"); final protected void p(String s) { writeString(s); } final protected void pln(String s) { writeString(s); out.append('\n'); } /** * @param s * @throws IOException * @throws UnsupportedEncodingException */ private void writeString(String s) { // ByteBuffer bb = StringUtils.encodeUTF8(s); // out.write(bb.array(), 0, bb.position()); // ok my code is slower in large trunk of data if (s != null && !s.isEmpty()) out.append(s); } // final protected void pln(byte[] ba) { // try { // out.write(ba); // out.write('\n'); // } catch (IOException e) { // throw new RuntimeException(e); // } // } final protected void p(Object s) { if (s != null) { writeString(s.toString()); // out.append(s); } } final protected void pln(Object s) { if (s != null) writeString(s.toString()); pln(); } final protected void pln() { out.append('\n'); } /** * The template pattern to implement the template/layout relationship. Clients call a template's * render(), which store params in fields and calls in super class's layout, which does the whole page * layout and calls back child's doLayout to get the child content. */ protected void layout() { doLayout(); } protected abstract void doLayout(); static protected byte[] getBytes(String src) { if (src == null || src.length() == 0) return new byte[] {}; try { return src.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } @Override public String toString() { return this.out.toString(); } }