Package org.pirkaengine.core.template

Source Code of org.pirkaengine.core.template.BindTemplate

package org.pirkaengine.core.template;

import static org.pirkaengine.core.util.Logger.*;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.Map;

import org.pirkaengine.core.PirkaRuntimeException;
import org.pirkaengine.core.RenderException;
import org.pirkaengine.core.Renderer;
import org.pirkaengine.core.expression.Function;


/**
* テンプレートにモデルを紐づけたレンダラークラス.
* <p>
* このクラスではTemplateとModel(viewModel)を1:1に紐付ける。<br />
* また、Rendererを実装し、テンプレートのレンダリング機能を実装する。
* </p>
* @author shuji.w6e
* @since 0.1.0
*/
public class BindTemplate implements Renderer {
    /** Template */
    private final XhtmlTemplate template;
    /** Model */
    private final Map<String, Object> viewModel;
    /** Script Functions */
    private final Map<String, Function> scriptFunctions;

    /**
     * コンストラクタ.
     * @param template
     * @param viewModel
     * @param scriptFunctions
     */
    public BindTemplate(XhtmlTemplate template, Map<String, Object> viewModel, Map<String, Function> scriptFunctions) {
        this.template = template;
        this.viewModel = viewModel;
        this.scriptFunctions = scriptFunctions;
    }

    /*
     * (non-Javadoc)
     * @see org.pirkaengine.core.Renderer#render()
     */
    @Override
    public String render() throws RenderException {
        try {
            StringBuilder text = new StringBuilder();
            for (Node node : this.template.nodeList) {
                text.append(node.getText(viewModel, scriptFunctions));
            }
            return text.toString();
        } catch (PirkaRuntimeException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw e;
        } catch (RuntimeException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw new RenderException(e);
        }
    }

    /*
     * (non-Javadoc)
     * @see org.pirkaengine.core.Renderer#render(java.io.OutputStream)
     */
    @Override
    public void render(OutputStream output) throws RenderException {
        render(output, "UTF-8");
    }
   
    /*
     * (non-Javadoc)
     * @see org.pirkaengine.core.Renderer#render(java.io.OutputStream, java.lang.String)
     */
    @Override
    public void render(OutputStream output, String charset) throws RenderException {
        if (charset == null) throw new IllegalArgumentException("charset is null.");
        render(output, Charset.forName(charset));
    }
   
    /*
     * (non-Javadoc)
     * @see org.pirkaengine.core.Renderer#render(java.io.OutputStream, java.nio.charset.Charset)
     */
    @Override
    public void render(OutputStream output, Charset charset) throws RenderException {
        if (output == null) throw new IllegalArgumentException("output is null.");
        if (charset == null) throw new IllegalArgumentException("charset is null.");
        Writer writer = null;
        try {
            writer = new OutputStreamWriter(output, charset);
            writeTemplate(writer);
        } catch (IOException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw new RenderException(e);
        } catch (PirkaRuntimeException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw e;
        } catch (RuntimeException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw new RenderException(e);
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     * @see org.pirkaengine.core.Renderer#render(java.io.Writer)
     */
    @Override
    public void render(Writer writer) throws RenderException {
        if (writer == null) throw new IllegalArgumentException("writer is null.");
        try {
            writeTemplate(writer);
        } catch (IOException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw new RenderException(e);
        } catch (PirkaRuntimeException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw e;
        } catch (RuntimeException e) {
            error("Rendering Error: " + this.template.templateName, e);
            throw new RenderException(e);
        }
    }

    private void writeTemplate(Writer writer) throws IOException {
        assert writer != null;
        for (Node node : this.template.nodeList) {
            writer.write(node.getText(viewModel, scriptFunctions));
        }
        writer.flush();
    }

}
TOP

Related Classes of org.pirkaengine.core.template.BindTemplate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.