001 // Copyright 2006, 2007, 2008, 2012 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; 016 017 import org.apache.tapestry5.ioc.AnnotationProvider; 018 import org.apache.tapestry5.ioc.Messages; 019 import org.apache.tapestry5.ioc.Resource; 020 import org.apache.tapestry5.model.ComponentModel; 021 import org.apache.tapestry5.runtime.Component; 022 import org.apache.tapestry5.runtime.PageLifecycleCallbackHub; 023 import org.apache.tapestry5.runtime.PageLifecycleListener; 024 025 import java.lang.annotation.Annotation; 026 import java.util.List; 027 028 /** 029 * Provides a component instance with the resources provided by the framework. In many circumstances, the resources 030 * object can be considered the component itself; in others, it is the {@linkplain #getComponent() component property}, 031 * an instance of a class provided by the application developer (though transformed in many ways while being loaded) 032 * that is the true component. In reality, it is the combination of the resources object with the user class instance 033 * that forms the components; neither is useful without the other. 034 */ 035 public interface ComponentResources extends ComponentResourcesCommon 036 { 037 /** 038 * Returns the base resource for the component, which will represent the class's location within the classpath (this 039 * is used to resolve relative assets). 040 */ 041 Resource getBaseResource(); 042 043 /** 044 * Returns the component model object that defines the behavior of the component. 045 */ 046 ComponentModel getComponentModel(); 047 048 /** 049 * Returns the component this object provides resources for. 050 */ 051 Component getComponent(); 052 053 /** 054 * Returns the component which contains this component, or null for the root component. For mixins, this returns the 055 * componet to which the mixin is attached. 056 */ 057 Component getContainer(); 058 059 /** 060 * Returns the {@link ComponentResources} for the container, or null if the this is the root component (that has no 061 * container). As a special case, for a mixin, this returns the core component's resources. 062 */ 063 ComponentResources getContainerResources(); 064 065 /** 066 * Returns the {@link Messages} from the container, or null if this is the root component (with no container). As a 067 * special case, for a mixin, this return the core component's messages. 068 */ 069 Messages getContainerMessages(); 070 071 /** 072 * Returns the page that contains this component. Technically, the page itself is an internal object in Tapestry and 073 * this returns the root component of the actual page, but from an application developer point of view, this is the 074 * page. 075 */ 076 Component getPage(); 077 078 /** 079 * Returns an embedded component, given the component's id. 080 * 081 * @param embeddedId 082 * selects the embedded component (case is ignored) 083 * @throws org.apache.tapestry5.ioc.util.UnknownValueException 084 * if this component does not contain a component with the given id 085 */ 086 087 Component getEmbeddedComponent(String embeddedId); 088 089 /** 090 * Returns true if the named parameter is bound, false if not. 091 */ 092 boolean isBound(String parameterName); 093 094 /** 095 * Obtains an annotation provided by a parameter. 096 * 097 * @param parameterName 098 * name of parameter to search for the annotation 099 * @param annotationType 100 * the type of annotation 101 * @return the annotation if found or null otherwise 102 */ 103 <T extends Annotation> T getParameterAnnotation(String parameterName, Class<T> annotationType); 104 105 /** 106 * Indentifies all parameters that are not formal parameters and writes each as a attribute/value pair into the 107 * current element of the markup writer. 108 * 109 * @param writer 110 * to which {@link MarkupWriter#attributes(Object[]) attributes} will be written 111 */ 112 void renderInformalParameters(MarkupWriter writer); 113 114 /** 115 * Returns the message catalog for this component. 116 */ 117 Messages getMessages(); 118 119 /** 120 * Returns the actual type of the bound parameter, or null if the parameter is not bound. This is primarily used 121 * with property bindings, and is used to determine the actual type of the property, rather than the type of 122 * parameter (remember that type coercion automatically occurs, which can mask significant differences between the 123 * parameter type and the bound property type). 124 * 125 * @param parameterName 126 * used to select the parameter (case is ignored) 127 * @return the type of the bound parameter, or null if the parameter is not bound 128 * @see Binding#getBindingType() 129 */ 130 Class getBoundType(String parameterName); 131 132 /** 133 * Returns an annotation provider, used to obtain annotations related to the parameter. 134 * 135 * @param parameterName 136 * used to select the parameter (case is ignored) 137 * @return the annotation provider, or null if the parameter is not bound 138 */ 139 AnnotationProvider getAnnotationProvider(String parameterName); 140 141 /** 142 * Used to access an informal parameter that's a Block. 143 * 144 * @param parameterName 145 * the name of the informal parameter (case is ignored) 146 * @return the informal Block parameter, or null if not bound 147 */ 148 Block getBlockParameter(String parameterName); 149 150 /** 151 * Returns a previously stored render variable. 152 * 153 * @param name 154 * of the variable (case will be ignored) 155 * @return the variable's value 156 * @throws IllegalArgumentException 157 * if the name doesn't correspond to a stored value 158 */ 159 Object getRenderVariable(String name); 160 161 /** 162 * Stores a render variable, accessible with the provided name. 163 * 164 * @param name 165 * of value to store 166 * @param value 167 * value to store (may not be null) 168 * @throws IllegalStateException 169 * if the component is not currently rendering 170 */ 171 void storeRenderVariable(String name, Object value); 172 173 /** 174 * Adds a listener object that will be notified about page lifecycle events. 175 * 176 * @deprecated In 5.3.4, use {@link #getPageLifecycleCallbackHub()} instead 177 */ 178 void addPageLifecycleListener(PageLifecycleListener listener); 179 180 /** 181 * Provides access to an object that can be used to register callbacks for page lifecycle events. 182 * 183 * @return the hub 184 * @since 5.3.4 185 */ 186 PageLifecycleCallbackHub getPageLifecycleCallbackHub(); 187 188 /** 189 * Removes a previously added listener. 190 * 191 * @since 5.2.0 192 * @deprecated in 5.3.4, not necessary with {@link PageLifecycleCallbackHub#addPageLoadedCallback(Runnable)}. 193 */ 194 void removePageLifecycleListener(PageLifecycleListener listener); 195 196 /** 197 * Discards all persistent field changes for the page containing the component. Changes are eliminated from 198 * persistent storage (such as the {@link org.apache.tapestry5.services.Session}) which will take effect in the 199 * <em>next</em> request (the attached page instance is not affected). 200 */ 201 void discardPersistentFieldChanges(); 202 203 /** 204 * Returns the name of element that represents the component in its template, or null if not known. 205 * 206 * @return the element name or null 207 */ 208 String getElementName(); 209 210 /** 211 * Returns a list of the names of any informal parameters bound to this component. 212 * 213 * @return the name sorted alphabetically 214 * @see org.apache.tapestry5.annotations.SupportsInformalParameters 215 */ 216 List<String> getInformalParameterNames(); 217 218 /** 219 * Reads an informal parameter and {@linkplain org.apache.tapestry5.ioc.services.TypeCoercer coercers} the bound 220 * value to the indicated type. 221 * 222 * @param name 223 * name of informal parameter 224 * @param type 225 * output value type 226 * @return instance of type 227 */ 228 <T> T getInformalParameter(String name, Class<T> type); 229 230 /** 231 * Returns true if these resources represent a mixin to another component. The component is the 232 * {@linkplain #getContainerResources() container} of this resources. 233 * 234 * @since 5.2.0 235 */ 236 boolean isMixin(); 237 }