zweb/src/main/java/org/zkoss/web/servlet/dsp/action/AbstractAction.java

Summary

Maintainability
A
25 mins
Test Coverage
/* AbstractAction.java

    Purpose:
        
    Description:
        
    History:
        Wed Sep  7 14:55:38     2005, Created by tomyeh

Copyright (C) 2005 Potix Corporation. All Rights Reserved.

{{IS_RIGHT
    This program is distributed under LGPL Version 2.1 in the hope that
    it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.web.servlet.dsp.action;

import java.io.IOException;
import java.io.StringWriter;

import org.zkoss.lang.Strings;
import org.zkoss.web.servlet.dsp.DspException;
import org.zkoss.xml.XMLs;

/**
 * A skeletal implementation to simplify the implementation of actions.
 *
 * @author tomyeh
 */
public abstract class AbstractAction implements Action {
    private boolean _if = true;
    private boolean _unless = false;

    /** Returns the if condition.
     * If the if condition is false, this tag is ignored.
     * If the unless condition ({@link #getUnless}) is true, this tag is
     * ignored, too.
     * Tags deriving from this class shall invoke {@link #isEffective} to
     * know the result.
     *
     * <p>Default: true.
     */
    public boolean getIf() {
        return _if;
    }

    /** Sets the if condition.
     */
    public void setIf(boolean ifcond) {
        _if = ifcond;
    }

    /** Returns the unless condition.
     * If the unless condition is true, this tag is ignored.
     * If the if condition ({@link #getIf}) is true, this tag is ignored, too.
     * Tags deriving from this class shall invoke {@link #isEffective} to
     * know the result.
     *
     * <p>Default: false.
     */
    public boolean getUnless() {
        return _unless;
    }

    /** Sets the unless condition.
     */
    public void setUnless(boolean unless) {
        _unless = unless;
    }

    /** Returns whether this tag is effective. If false, this tag does nothing
     * (as if not specified at all).
     */
    public boolean isEffective() {
        return _if && !_unless;
    }

    //-- Utilities --//
    /** Returns one of {@link ActionContext#PAGE_SCOPE}, {@link ActionContext#REQUEST_SCOPE},
     * {@link ActionContext#SESSION_SCOPE} and {@link ActionContext#APPLICATION_SCOPE}
     * of the specified scope name.
     *
     * @param scope one of "page", "request", "session" and "application".
     */
    protected static final int toScope(String scope) {
        return "request".equals(scope) ? ActionContext.REQUEST_SCOPE
                : "session".equals(scope) ? ActionContext.SESSION_SCOPE
                        : "application".equals(scope) ? ActionContext.APPLICATION_SCOPE : ActionContext.PAGE_SCOPE;
    }

    /** Appends an attribute to the string buffer,
     * if <code>attrValue</code> is not null.
     */
    protected static final void append(StringBuffer sb, String attrName, String attrValue) {
        if (attrValue != null)
            sb.append(' ').append(attrName).append("=\"").append(XMLs.encodeAttribute(attrValue)).append('"');
        //it might contain " or other special characters
    }

    /** Appends an attribute to the string buffer,
     * if <code>avail</code> is true.
     */
    protected static //not final, e.g., xul has different format
    void append(StringBuffer sb, String attrName, boolean avail) {
        if (avail)
            sb.append(' ').append(attrName);
    }

    /** Appends an attribute to the string buffer.
     */
    protected static final void append(StringBuffer sb, String attrName, int val) {
        sb.append(' ').append(attrName).append("=\"").append(Integer.toString(val)).append('"');
    }

    //package-level utilities//
    /** Returns the output for rendering fragment, or null if
     * trim is false.
     *
     * <p>The return value is passed to {@link #renderFragment}
     * directly.
     */
    /*package*/ static StringWriter getFragmentOut(ActionContext ac, boolean trim) throws IOException {
        return trim && !(ac.getOut() instanceof StringWriter) ? new StringWriter() : null;
    }

    /** Invokes ac.renderFragment() and trim the output if trim is true.
     *
     * @param out the return value of {@link #getFragmentOut}.
     */
    /*package*/ static void renderFragment(ActionContext ac, StringWriter out, boolean trim)
            throws DspException, IOException {
        if (trim) {
            final StringBuffer buf = (out != null ? out : (StringWriter) ac.getOut()).getBuffer();
            //ac.getOut must be StringWriter if out is null and trim
            final int index = buf.length();
            ac.renderFragment(out);
            Strings.trim(buf, index);
        } else {
            ac.renderFragment(out);
        }
    }
}