Coverage Report - net.wotonomy.web.WODynamicElement
 
Classes in this File Line Coverage Branch Coverage Complexity
WODynamicElement
0% 
0% 
2.231
 
 1  
 /*
 2  
 Wotonomy: OpenStep design patterns for pure Java applications.
 3  
 Copyright (C) 2000 Blacksmith, Inc.
 4  
 
 5  
 This library is free software; you can redistribute it and/or
 6  
 modify it under the terms of the GNU Lesser General Public
 7  
 License as published by the Free Software Foundation; either
 8  
 version 2.1 of the License, or (at your option) any later version.
 9  
 
 10  
 This library is distributed in the hope that it will be useful,
 11  
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 13  
 Lesser General Public License for more details.
 14  
 
 15  
 You should have received a copy of the GNU Lesser General Public
 16  
 License along with this library; if not, see http://www.gnu.org
 17  
 */
 18  
 
 19  
 package net.wotonomy.web;
 20  
 
 21  
 import java.util.Enumeration;
 22  
 import java.util.HashMap;
 23  
 import java.util.Map;
 24  
 
 25  
 import net.wotonomy.foundation.NSArray;
 26  
 import net.wotonomy.foundation.NSDictionary;
 27  
 import net.wotonomy.foundation.NSMutableDictionary;
 28  
 
 29  
 /**
 30  
 * The base class for dynamic WOElements.  Dynamic elements
 31  
 * are expected to do something useful with user-entered data
 32  
 * in the request and with any binding associations with the
 33  
 * context's current WOComponent.
 34  
 *
 35  
 * @author michael@mpowers.net
 36  
 * @author $Author: cgruber $
 37  
 * @version $Revision: 905 $
 38  
 */
 39  
 public abstract class WODynamicElement
 40  
     extends WOElement
 41  
 {
 42  
         protected String name;
 43  
         protected WOElement rootElement;
 44  
     protected NSDictionary associations;   
 45  
 
 46  
     /**
 47  
         * The default constructor.
 48  
         */
 49  0
     protected WODynamicElement ()
 50  0
     {
 51  0
             name = null;
 52  0
             associations = new NSMutableDictionary();
 53  0
             rootElement = null;
 54  0
     }
 55  
     
 56  
     /**
 57  
     * Required constructor specifying the class name of the component,
 58  
     * a map of associations, and the root element of the tree that 
 59  
     * contains this element (which may be null).  The map keys 
 60  
     * correspond to properties of this element, and the values are
 61  
     * associations to be applied to the context's current component.
 62  
     */
 63  
     public WODynamicElement (
 64  
             String aName, NSDictionary anAssociationMap, WOElement aRootElement)
 65  
     {
 66  0
             this();
 67  0
             name = aName;
 68  0
             associations = anAssociationMap;
 69  0
             rootElement = aRootElement;
 70  0
     }
 71  
 
 72  
     /**
 73  
     * Package access only.  Called to initialize the component with 
 74  
     * the proper context before the start of the request-response cycle.
 75  
     * If the context has a current component, that component becomes
 76  
     * this component's parent.
 77  
     */
 78  
     void ensureAwakeInContext (WOContext aContext)
 79  
     {
 80  0
         if ( rootElement != null )
 81  
         {
 82  0
             rootElement.ensureAwakeInContext( aContext );
 83  
         }
 84  0
     }
 85  
 
 86  
     /**
 87  
      * Use this method to get a map with the properties that start with
 88  
      * a question mark. These are supposed to go at the end of a URL, and it is
 89  
      * very useful for components that generate URLs, specially with direct
 90  
      * actions.
 91  
      * @param c The component where the values of the properties have to be
 92  
      * retrieved from.
 93  
      */
 94  
     Map urlFields(WOComponent c) {
 95  0
         HashMap map = new HashMap(associations.count());
 96  0
         Enumeration enumeration = associations.keyEnumerator();
 97  0
         while (enumeration.hasMoreElements()) {
 98  0
             String key = (String)enumeration.nextElement();
 99  0
             if (key.charAt(0) == '?') {
 100  0
                 map.put(key.substring(1), valueForProperty(key, c));
 101  
             }
 102  0
         }
 103  0
         return map;
 104  
     }
 105  
 
 106  
     /** Convenience method for getting the value of an association. */
 107  
     Object valueForProperty(String key, WOComponent c) {
 108  0
         WOAssociation a = (WOAssociation)associations.objectForKey(key);
 109  0
         if (a != null)
 110  0
             return a.valueInComponent(c);
 111  0
         return null;
 112  
     }
 113  
 
 114  
     /** Convenience method for getting the string value of an association. */
 115  
     String stringForProperty(String key, WOComponent c) {
 116  0
         WOAssociation a = (WOAssociation)associations.objectForKey(key);
 117  0
         Object result = null;
 118  0
         if (a != null) result = a.valueInComponent(c);
 119  0
         if ( result == null ) return null;
 120  0
         return result.toString();
 121  
     }
 122  
 
 123  
     /** Convenience method for getting the string value of an association. */
 124  
     boolean booleanForProperty(String key, WOComponent c) {
 125  0
         WOAssociation a = (WOAssociation)associations.objectForKey(key);
 126  0
         Object result = null;
 127  0
         if (a != null) result = a.valueInComponent(c);
 128  0
         if ( result == null ) return false;
 129  0
         if ( result.toString().toLowerCase().equals( "true" ) ) return true;
 130  0
         return Boolean.TRUE.equals( result );
 131  
     }
 132  
 
 133  
     /** Convenience method for setting the value of an association. */
 134  
     void setValueForProperty(String key, Object value, WOComponent c) {
 135  0
         WOAssociation a = (WOAssociation)associations.objectForKey(key);
 136  0
         if ( a != null && a.isValueSettable() ) 
 137  0
             a.setValue(value, c);
 138  0
     }
 139  
 
 140  
     /** this method composes a String suitable for inclusion inside a HTML tag. It includes
 141  
         the key-value pairs of all the associations not mentioned in the standardProperties
 142  
         parameter. This is very useful for including extra properties in tags without having to worry
 143  
         if the HTML specification has changed or if non-standard tags are being used.
 144  
         @param c The component where the associations' values should be retrieved from.
 145  
         @param standardProperties An array of Strings with all the associations that should be
 146  
         excluded from the resulting string. */
 147  
     String additionalHTMLProperties(WOComponent c, NSArray standardProperties) {
 148  0
         Enumeration enumeration = associations.keyEnumerator();
 149  0
         StringBuffer buf = new StringBuffer();
 150  0
         while (enumeration.hasMoreElements()) {
 151  0
             String key = (String)enumeration.nextElement();
 152  0
             if (!(standardProperties.containsObject(key) || key.charAt(0)=='?')) {
 153  0
                 buf.append(' ');
 154  0
                 buf.append(key);
 155  0
                 buf.append("=\"");
 156  0
                 buf.append(valueForProperty(key, c));
 157  0
                 buf.append('\"');
 158  
             }
 159  0
         }
 160  0
         return buf.toString();
 161  
     }
 162  
 
 163  
     /**
 164  
         * This method is called to retrieve user-entered data from
 165  
         * the request.  WOElements should retrieve data from the 
 166  
         * request based on their elementID and set values in the 
 167  
         * context's current WOComponent, typically those values that
 168  
         * are associated with the element in the binding.  This 
 169  
         * implementation does nothing.
 170  
         */
 171  
     public void takeValuesFromRequest (WORequest aRequest, WOContext aContext)
 172  
     {
 173  
             
 174  0
         }
 175  
 
 176  
     /**
 177  
     * This method is called on all objects and elements of the 
 178  
     * application until a non-null value is returned.
 179  
     * WOElements should first check to see if they are the
 180  
     * target of an action by checking the WOContext's senderID
 181  
     * to see if it matches this element's elementID.  
 182  
     * If this element is the target, it should perform an 
 183  
     * appropriate action on the context's current WOComponent,
 184  
     * usually the action specified in the binding, and return
 185  
     * the result of that action.  This implementation returns null.
 186  
     */
 187  
     public WOActionResults invokeAction (WORequest aRequest, WOContext aContext)
 188  
     {
 189  0
             return null;
 190  
     }
 191  
     
 192  
     /**
 193  
     * This method is called on all elements of the content tree
 194  
     * to build a response to a user request.  The message should 
 195  
     * be forwarded to any child elements so that the entire tree
 196  
     * is traversed.  This implementation does nothing.
 197  
     */
 198  
     public void appendToResponse (WOResponse aResponse, WOContext aContext)
 199  
     {
 200  
             // does nothing
 201  0
     }
 202  
     
 203  
     public WOResponse generateResponse() 
 204  
     {
 205  0
         return null;
 206  
     }
 207  
 
 208  
 }