1 33 34 package com.icesoft.faces.webapp.parser; 35 36 import org.apache.commons.logging.Log; 37 import org.apache.commons.logging.LogFactory; 38 39 import javax.faces.FacesException; 40 import javax.faces.component.UIComponent; 41 import javax.faces.component.UIViewRoot; 42 import javax.faces.context.FacesContext; 43 import javax.faces.webapp.UIComponentBodyTag; 44 import javax.faces.webapp.UIComponentTag; 45 import javax.servlet.jsp.JspException ; 46 import javax.servlet.jsp.JspWriter ; 47 import javax.servlet.jsp.PageContext ; 48 import javax.servlet.jsp.tagext.Tag ; 49 import java.io.IOException ; 50 import java.io.InputStream ; 51 import java.io.PrintWriter ; 52 import java.io.Reader ; 53 import java.util.HashSet ; 54 import java.util.Iterator ; 55 import java.util.Set ; 56 57 72 public class Parser { 73 private static final Log log = LogFactory.getLog(Parser.class); 74 private JsfJspDigester digester; 75 76 public Parser(InputStream fis) throws IOException { 77 digester = new JsfJspDigester(); 79 digester.setNamespaceAware(true); 80 digester.setValidating(false); 81 digester.setUseContextClassLoader(false); 82 digester.setClassLoader(this.getClass().getClassLoader()); 83 84 try { 85 TagToComponentMap map = TagToComponentMap.loadFrom(fis); 86 digester.addRuleSet(new ComponentRuleSet(map, "")); 87 } catch (ClassNotFoundException e) { 88 throw new IOException (e.getMessage()); 89 } 90 } 91 92 102 public void parse(Reader page, FacesContext context) 103 throws java.io.IOException , org.xml.sax.SAXException { 104 StubPageContext pageContext = new StubPageContext(); 106 StubHttpServletResponse response = new StubHttpServletResponse(); 108 pageContext.initialize(null, null, response, null, false, 1024, false); 109 Set componentIds = new HashSet (); 110 111 XhtmlTag rootTag = new XhtmlTag(); 113 rootTag.setTagName("ICEtag"); 114 rootTag.setParent(null); 115 TagWire rootWire = new TagWire(); 116 rootWire.setTag(rootTag); 117 118 synchronized (this) { 119 digester.clear(); 120 digester.push(rootTag); 121 digester.push(rootWire); 122 digester.parse(page); 123 } 124 125 try { 126 String viewTagClassName = digester.getViewTagClassName(); 127 if (null == viewTagClassName) 128 throw new IllegalStateException ( 129 "ICEfaces parser unable to determine JSF implementation ViewTag class."); 130 Tag viewTag = (Tag) Class.forName(viewTagClassName).newInstance(); 131 viewTag.setParent(null); 132 rootWire.setTag(viewTag); 133 134 executeJspLifecycle(rootWire, pageContext, context, componentIds); 135 pageContext.removeAttribute( 136 "javax.faces.webapp.COMPONENT_TAG_STACK", 137 PageContext.REQUEST_SCOPE); 138 } catch (Exception e) { 139 log.error("Failed to execute JSP lifecycle.", e); 140 throw new FacesException("Failed to execute JSP lifecycle.", e); 141 } 142 } 143 144 154 public void executeJspLifecycle(TagWire wire, PageContext pageContext, 155 FacesContext facesContext, Set componentIds) 156 throws JspException { 157 boolean processingViewTag = false; 159 Tag tag = wire.getTag(); 160 tag.setPageContext(pageContext); 161 tag.doStartTag(); 163 164 if (tag instanceof UIComponentTag) { 165 UIComponentTag compTag = (UIComponentTag) tag; 166 UIComponent myComponent = compTag.getComponentInstance(); 167 168 if (myComponent != null) { 169 if (myComponent instanceof UIViewRoot) { 170 myComponent.setId("_view"); 171 processingViewTag = true; 172 } 173 174 String componentId = myComponent.getClientId(facesContext); 175 if (componentIds.contains(componentId)) 176 throw new IllegalStateException ( 177 "Duplicate component ID : " + componentId); 178 componentIds.add(componentId); 179 } 180 } 181 182 Iterator children = wire.getChildren().iterator(); 184 while (children.hasNext()) { 185 TagWire childWire = (TagWire) children.next(); 186 executeJspLifecycle(childWire, pageContext, facesContext, 187 componentIds); 188 } 189 if (!processingViewTag && tag instanceof UIComponentBodyTag) { 191 UIComponentBodyTag bodyTag = (UIComponentBodyTag) tag; 192 if (bodyTag.getBodyContent() == null) { 193 JspWriter jspWriter = 196 new JspWriterImpl(new PrintWriter (System.out)); 197 BodyContentImpl imp = new BodyContentImpl(jspWriter); 198 bodyTag.setBodyContent(imp); 199 } 200 bodyTag.doAfterBody(); 201 } 202 tag.doEndTag(); 204 } 205 } 206 | Popular Tags |