| 1 33 34 package com.icesoft.faces.webapp.parser; 35 36 import org.apache.commons.digester.Digester; 37 import org.apache.commons.digester.Rule; 38 import org.apache.commons.digester.RuleSetBase; 39 import org.apache.commons.logging.Log; 40 import org.apache.commons.logging.LogFactory; 41 import org.xml.sax.Attributes ; 42 import org.xml.sax.helpers.AttributesImpl ; 43 44 import javax.servlet.jsp.tagext.Tag ; 45 import java.util.Enumeration ; 46 import java.util.Hashtable ; 47 48 49 57 public class ComponentRuleSet extends RuleSetBase { 58 59 62 private TagToComponentMap map; 63 private String viewTagClass; 64 private String ruleNamespace; 65 private static String TAG_NEST = "*/"; 66 private static Class setPropertiesRuleClass = null; 67 private static boolean isJSF12 = false; 68 69 private static final Log log = LogFactory.getLog(ComponentRuleSet.class); 70 71 static { 72 try { 73 setPropertiesRuleClass = 74 Class.forName( 75 "org.apache.commons.digester.SetPropertiesRule"); 76 setPropertiesRuleClass = 77 Class.forName( 78 "com.icesoft.faces.webapp.parser.ELSetPropertiesRule"); 79 if (log.isDebugEnabled()) { 80 log.debug( 81 "ICEfaces using JSF 1.2 JSP tags."); 82 } 83 isJSF12 = true; 84 } catch (Throwable t) { 85 if (log.isDebugEnabled()) { 87 log.debug( 88 "No JSF 1.2 classes found. Running in JSF 1.1 environment"); 89 } 90 } 91 } 92 93 99 public ComponentRuleSet(TagToComponentMap mp, String namespaceURI) { 100 super(); 101 map = mp; 102 ruleNamespace = namespaceURI; 103 } 104 105 110 public static boolean isJSF12() { 111 return isJSF12; 112 } 113 114 119 public void addRuleInstances(Digester digester) { 120 121 Hashtable table = map.getTagToComponentMap(); 122 Enumeration keys = table.keys(); 123 TagRule tagRule = new TagRule(); 124 XhtmlTagRule xhtmlTagRule = new XhtmlTagRule(); 125 126 digester.setRuleNamespaceURI(ruleNamespace); 127 128 while (keys.hasMoreElements()) { 129 String key = (String ) keys.nextElement(); 130 String tagType = (String ) table.get(key); 131 132 if (!key.equals("view")) { 133 136 137 digester.addObjectCreate(TAG_NEST + key, tagType); 139 140 if (tagType.equals(XhtmlTag.class.getName())) { 141 digester.addObjectCreate(TAG_NEST + key, 143 "com.icesoft.faces.webapp.parser.TagWire"); 144 digester.addRule(TAG_NEST + key, xhtmlTagRule); 145 } else { 146 try { 148 digester.addRule(TAG_NEST + key, 149 (Rule) setPropertiesRuleClass 150 .newInstance()); 151 } catch (Exception e) { 152 if (log.isDebugEnabled()) { 153 log.debug(e.getMessage(), e); 154 } 155 } 156 digester.addObjectCreate(TAG_NEST + key, 157 "com.icesoft.faces.webapp.parser.TagWire"); 158 digester.addRule(TAG_NEST + key, tagRule); 159 } 160 } else { 161 ((JsfJspDigester) digester).setViewTagClassName(tagType); 163 viewTagClass = tagType; 164 } 165 } 166 } 167 168 169 public String getViewTagClass() { 170 return viewTagClass; 171 } 172 } 173 174 177 abstract class BaseRule extends Rule { 178 179 182 public BaseRule() { 183 super(); 184 } 185 186 194 public void body(String namespace, String name, String text) { 195 196 String bodyText = text.trim(); 197 if (bodyText.length() > 0) { 198 TagWire wire = (TagWire) digester.peek(); 199 Tag child = (Tag ) digester.peek(1); 200 IceOutputTextTag bodyTextTag = new IceOutputTextTag(); 201 TagWire newWire = new TagWire(); 202 bodyTextTag.setValue(bodyText); 203 wireUpTheTag((Tag ) bodyTextTag, child, newWire, wire); 204 } 205 } 206 207 217 protected void wireUpTheTag(Tag child, Tag parent, 218 TagWire childWire, TagWire parentWire) { 219 220 child.setParent(parent); 221 childWire.setTag(child); 222 parentWire.addChild(childWire); 223 } 224 225 233 protected void dealWithPreceedingBodyText(Tag parent, TagWire parentWire) { 234 237 238 240 String bodyText = ((JsfJspDigester) digester).stealParentBodyText(); 241 if (bodyText != null) { 242 IceOutputTextTag bodyTextTag = new IceOutputTextTag(); 243 TagWire wire = new TagWire(); 244 bodyTextTag.setValue(bodyText); 245 wireUpTheTag((Tag ) bodyTextTag, parent, wire, parentWire); 246 } 247 } 248 } 249 250 254 final class TagRule extends BaseRule { 255 256 259 public TagRule() { 260 super(); 261 } 262 263 270 public void begin(Attributes attributes) throws Exception { 271 272 TagWire wire = (TagWire) digester.peek(); 274 Tag child = (Tag ) digester.peek(1); 275 TagWire parentWire = (TagWire) digester.peek(2); 276 Tag parent = (Tag ) digester.peek(3); 277 278 Attributes cloned = clone(attributes); 279 wire.setAttributes(cloned); 280 281 dealWithPreceedingBodyText(parent, parentWire); 283 284 wireUpTheTag(child, parent, wire, parentWire); 286 } 287 288 294 private Attributes clone(Attributes attributes) { 295 Attributes clone = new AttributesImpl (attributes); 296 for (int i = 0; i < clone.getLength(); i++) { 297 String name = attributes.getQName(i); 298 String value = attributes.getValue(name); 299 ((AttributesImpl ) clone).setLocalName(i, name); 300 ((AttributesImpl ) clone).setValue(i, value); 301 } 302 return clone; 303 } 304 } 305 306 310 final class XhtmlTagRule extends BaseRule { 311 312 315 public XhtmlTagRule() { 316 super(); 317 } 318 319 327 public void begin(Attributes attributes) throws Exception { 328 329 TagWire wire = (TagWire) digester.peek(); 331 XhtmlTag child = (XhtmlTag) digester.peek(1); 332 TagWire parentWire = (TagWire) digester.peek(2); 333 Tag parent = (Tag ) digester.peek(3); 334 335 child.setAttributes((Attributes ) (new AttributesImpl (attributes))); 337 338 child.setTagName(new String (digester.getCurrentElementName())); 340 341 dealWithPreceedingBodyText(parent, parentWire); 343 344 wireUpTheTag((Tag ) child, parent, wire, parentWire); 346 } 347 } 348 | Popular Tags |