Coverage Report - org.kuali.rice.krad.uif.component.PropertyReplacer
 
Classes in this File Line Coverage Branch Coverage Complexity
PropertyReplacer
0%
0/23
0%
0/14
1.875
 
 1  
 /**
 2  
  * Copyright 2005-2011 The Kuali Foundation
 3  
  *
 4  
  * Licensed under the Educational Community License, Version 2.0 (the "License");
 5  
  * you may not use this file except in compliance with the License.
 6  
  * You may obtain a copy of the License at
 7  
  *
 8  
  * http://www.opensource.org/licenses/ecl2.php
 9  
  *
 10  
  * Unless required by applicable law or agreed to in writing, software
 11  
  * distributed under the License is distributed on an "AS IS" BASIS,
 12  
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  
  * See the License for the specific language governing permissions and
 14  
  * limitations under the License.
 15  
  */
 16  
 package org.kuali.rice.krad.uif.component;
 17  
 
 18  
 import java.io.Serializable;
 19  
 import java.util.ArrayList;
 20  
 import java.util.List;
 21  
 import java.util.Map;
 22  
 
 23  
 /**
 24  
  * Configuration for replacing a property value based on a condition
 25  
  *
 26  
  * <p>
 27  
  * A <code>Component</code> may be configured with one or more <code>PropertyReplacer</code> instances. Each defines
 28  
  * a condition to evaluate during the apply model phase, and if that condition succeeds the property on the component
 29  
  * given by {@link #getPropertyName()}, will be replaced with the value given by {@link #getReplacement()}. Conditions
 30  
  * are defined using an expression language and may reference any variables available in the component's context.
 31  
  * </p>
 32  
  *
 33  
  * <p>
 34  
  * Property replacers can be used to change out an entire Component or List/Map of Components. For example, based on a
 35  
  * condition you might want to display a <code>TextControl</code> or <code>RadioControl</code> for an
 36  
  * <code>InputField</code>. You can define the field with a text control, then include a property replacer as
 37  
  * follows:
 38  
  * <pre>
 39  
         <bean parent="PropertyReplacer" p:propertyName="control"
 40  
               p:condition="field1 eq '10985'" p:replacement-ref="RadioControl"/>
 41  
  *
 42  
  * </pre>
 43  
  *
 44  
  * Note <code>Component</code> contains a <code>List</code> or property replacers which will be evaluated in the order
 45  
  * contained within the list. So in the above example if we wanted to now add a further condition which sets the control
 46  
  * to a checkbox, we would just add another property replacer bean.
 47  
  * <pre>
 48  
  *   <property name="propertyReplacers">
 49  
        <list>
 50  
         <bean parent="PropertyReplacer" p:propertyName="control"
 51  
               p:condition="field1 eq '10985'" p:replacement-ref="RadioControl"/>
 52  
         <bean parent="PropertyReplacer" p:propertyName="control"
 53  
               p:condition="field1 eq '11456'" p:replacement-ref="CheckboxControl"/>
 54  
  *     </list>
 55  
  *   </property>
 56  
  * </pre>
 57  
  *
 58  
  * Property replacers may be used to substitute primitive properties as well, such as Strings
 59  
  * </p>
 60  
  *
 61  
  * @author Kuali Rice Team (rice.collab@kuali.org)
 62  
  */
 63  
 public class PropertyReplacer extends ConfigurableBase implements Serializable {
 64  
     private static final long serialVersionUID = -8405429643299461398L;
 65  
 
 66  
     private String propertyName;
 67  
     private String condition;
 68  
     private Object replacement;
 69  
 
 70  
     public PropertyReplacer() {
 71  0
         super();
 72  0
     }
 73  
 
 74  
     /**
 75  
      * Returns a list of nested components
 76  
      *
 77  
      * <p>
 78  
      * All nested components will be returned in the list. Current assumption is that
 79  
      * <code>PropertyReplacer</code> can only contain a <code>Component</code>, <code>List</code> or
 80  
      * <code>Map</code> for nested components
 81  
      * </p>
 82  
      *
 83  
      * @return List<Component> nested components
 84  
      */
 85  
     public List<Component> getNestedComponents() {
 86  0
         ArrayList<Component> nestedComponents = new ArrayList<Component>();
 87  0
         if (replacement instanceof Component) {
 88  0
             nestedComponents.add(((Component) replacement));
 89  0
         } else if (replacement instanceof List) {
 90  0
             for (Object replacementItem : (List<?>) replacement) {
 91  0
                 if (replacementItem instanceof Component) {
 92  0
                     nestedComponents.add((Component) replacementItem);
 93  
                 }
 94  
             }
 95  0
         } else if (replacement instanceof Map) {
 96  0
             for (Object replacementItem : ((Map<?, ?>) replacement).values()) {
 97  0
                 if (replacementItem instanceof Component) {
 98  0
                     nestedComponents.add((Component) replacementItem);
 99  
                 }
 100  
             }
 101  
         }
 102  
 
 103  0
         return nestedComponents;
 104  
     }
 105  
 
 106  
     /**
 107  
      * Name of the property on the Component the property replacer is associated with that
 108  
      * will be set when the condition for the replacer succeeds
 109  
      *
 110  
      * <p>
 111  
      * Note the property name must be readable/writable on the component. The property name may
 112  
      * be nested, and include Map or List references.
 113  
      * </p>
 114  
      *
 115  
      * @return String property name to set
 116  
      */
 117  
     public String getPropertyName() {
 118  0
         return this.propertyName;
 119  
     }
 120  
 
 121  
     /**
 122  
      * Setter for the property name that will be set
 123  
      *
 124  
      * @param propertyName
 125  
      */
 126  
     public void setPropertyName(String propertyName) {
 127  0
         this.propertyName = propertyName;
 128  0
     }
 129  
 
 130  
     /**
 131  
      * Gives the expression that should be evaluated to determine whether or not
 132  
      * the property replacement should be made
 133  
      *
 134  
      * <p>
 135  
      * Expression follows SPEL and may access any model data along with any variables
 136  
      * available in the context for the Component. The expression should evaluate to
 137  
      * a boolean. If the resulting boolean is true, the object given by {@link #getReplacement()}
 138  
      * will be set as the value for the associated property on the component. If the resulting
 139  
      * boolean is false, no action will take place
 140  
      * </p>
 141  
      *
 142  
      * <p>
 143  
      * Note the value does not need to contain the expression placeholder @{}
 144  
      * </p>
 145  
      *
 146  
      * @return String expression that should be evaluated
 147  
      * @see org.kuali.rice.krad.uif.service.ExpressionEvaluatorService
 148  
      * @see org.kuali.rice.krad.uif.UifConstants.ContextVariableNames
 149  
      */
 150  
     public String getCondition() {
 151  0
         return this.condition;
 152  
     }
 153  
 
 154  
     /**
 155  
      * Setter for the replacement condition
 156  
      *
 157  
      * @param condition
 158  
      */
 159  
     public void setCondition(String condition) {
 160  0
         this.condition = condition;
 161  0
     }
 162  
 
 163  
     /**
 164  
      * Gives the Object that should be used to set the property value if the replacers condition
 165  
      * evaluates to true
 166  
      *
 167  
      * <p>
 168  
      * Note the configured Object must be valid for the type given by the property on the Component. Standard
 169  
      * property editors will be used for setting the property value
 170  
      * </p>
 171  
      *
 172  
      * @return Object instance to set
 173  
      */
 174  
     public Object getReplacement() {
 175  0
         return this.replacement;
 176  
     }
 177  
 
 178  
     /**
 179  
      * Setter for the replacement Object
 180  
      *
 181  
      * @param replacement
 182  
      */
 183  
     public void setReplacement(Object replacement) {
 184  0
         this.replacement = replacement;
 185  0
     }
 186  
 
 187  
 }