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 }