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 }