package org.analogweb.core.direction;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import org.analogweb.DirectionFormatter;
import org.analogweb.DirectionFormatterAware;
import org.analogweb.RequestContext;

/**
 * テキストフォーマットが可能な{@link org.analogweb.Direction}の実装です。
 * @author snowgoose
 */
public abstract class TextFormattable<T extends TextFormattable<T>> extends TextFormat<T> implements
        DirectionFormatterAware<T> {

    private Object source;
    private DirectionFormatter formatter;

    public TextFormattable() {
        super();
    }

    public TextFormattable(String input, String contentType, String charset) {
        super(input, contentType, charset);
    }

    public TextFormattable(String input) {
        super(input);
    }

    public TextFormattable(Object source) {
        this.source = source;
    }

    protected Object getSource() {
        return this.source;
    }

    /**
     * 現在のフォーマット可能な{@link DirectionFormatter}を取得します。<br/>
     * 自分のクラスに適切な{@link DirectionFormatter}が
     * {@link DirectionFormatters}のインスタンスに登録されている必要があります。
     * @return {@link ReplaceableFormatWriter}
     */
    protected DirectionFormatter getFormatter() {
        return this.formatter;
    }

    @Override
    public void render(RequestContext context) throws IOException, ServletException {
        HttpServletResponse response = context.getResponse();
        response.setContentType(getContentType());
        Object toXml = getSource();
        if (toXml == null) {
            super.writeToStream(response.getOutputStream());
            return;
        }
        DirectionFormatter formatter = getFormatter();
        if (formatter == null) {
            formatter = getDefaultFormatter();
        }
        formatter.formatAndWriteInto(context, getCharset(), toXml);
    }

    /**
     * デフォルトの{@link ReplaceableFormatWriter}によって特定のフォーマットへのレンダリングを行います。<br/>
     * この{@link ReplaceableFormatWriter}は全ての{@link TextFormattable}のインスタンスに適用されます。
     */
    protected abstract DirectionFormatter getDefaultFormatter();

    /**
     * 指定した{@link DirectionFormatter}によって特定のフォーマットのレンダリングを行います。<br/>
     * @param <T> フォーマットする対象の型
     * @param formatter {@link DirectionFormatter}
     */
    @Override
    @SuppressWarnings("unchecked")
    public T attach(DirectionFormatter formatter) {
        this.formatter = formatter;
        return (T) this;
    }

    @Override
    public String toString() {
        DirectionFormatter f;
        return String.format("%s with %s", getClass(),
                (f = getFormatter()) == null ? "default-formatter" : f);
    }

}

@@ -2190,24 +2190,78 @@
 %E3%82%92%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%3Cbr/%3E%0A
+     * %E6%97%A2%E3%81%AB%7B@link DirectionFormatter%7D%E3%81%8C%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E7%84%A1%E8%A6%96%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A
      * @para
@@ -2435,24 +2435,66 @@
 ormatter) %7B%0A
+        if (this.formatter == null) %7B%0A    
         this
@@ -2513,24 +2513,34 @@
  formatter;%0A
+        %7D%0A
         retu

Use first DirectionFormatter