| Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||||||
| WODynamicElement | 
 | 
 | 2.230769230769231;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 | } |