001// Copyright 2007, 2008, 2011 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry5.corelib.components;
016
017import org.apache.tapestry5.ComponentResources;
018import org.apache.tapestry5.MarkupWriter;
019import org.apache.tapestry5.annotations.Parameter;
020import org.apache.tapestry5.annotations.SupportsInformalParameters;
021import org.apache.tapestry5.ioc.annotations.Inject;
022import org.apache.tapestry5.ioc.internal.util.InternalUtils;
023
024import java.text.Format;
025
026/**
027 * A component for formatting output. If the component is represented in the template using an element, then the element
028 * (plus any informal parameters) will be output around the formatted value.
029 * 
030 * @tapestrydoc
031 */
032@SupportsInformalParameters
033public class Output
034{
035    /**
036     * The value to be output (before formatting). If the formatted value is blank, no output is produced.
037     */
038    @Parameter(required = true, autoconnect = true)
039    private Object value;
040
041    /**
042     * The format to be applied to the object.
043     */
044    @Parameter(required = true, allowNull = false)
045    private Format format;
046
047    /**
048     * If true, the default, then output is filtered, escaping any reserved characters. If false, the output is written
049     * raw.
050     */
051    @Parameter
052    private boolean filter = true;
053
054    /**
055     * The element name, derived from the component template. This can even be overridden manually if desired (for
056     * example, to sometimes render a surrounding element and other times not).
057     */
058    @Parameter("componentResources.elementName")
059    private String elementName;
060
061    @Inject
062    private ComponentResources resources;
063
064
065    boolean beginRender(MarkupWriter writer)
066    {
067        if (value == null) return false;
068
069        String formatted = format.format(value);
070
071        if (InternalUtils.isNonBlank(formatted))
072        {
073            if (elementName != null)
074            {
075                writer.element(elementName);
076
077                resources.renderInformalParameters(writer);
078            }
079
080            if (filter) writer.write(formatted);
081            else writer.writeRaw(formatted);
082
083            if (elementName != null) writer.end();
084        }
085
086        return false;
087    }
088
089    // For testing.
090
091    void setup(Object value, Format format, boolean filter, String elementName, ComponentResources resources)
092    {
093        this.value = value;
094        this.format = format;
095        this.filter = filter;
096        this.elementName = elementName;
097        this.resources = resources;
098    }
099}