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    
015    package org.apache.tapestry5.corelib.components;
016    
017    import org.apache.tapestry5.ComponentResources;
018    import org.apache.tapestry5.MarkupWriter;
019    import org.apache.tapestry5.annotations.Parameter;
020    import org.apache.tapestry5.annotations.SupportsInformalParameters;
021    import org.apache.tapestry5.ioc.annotations.Inject;
022    import org.apache.tapestry5.ioc.internal.util.InternalUtils;
023    
024    import 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
033    public 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    }