| 1 33 package com.icesoft.faces.context; 34 35 import com.icesoft.faces.application.D2DViewHandler; 36 import com.icesoft.faces.el.ELContextImpl; 37 import com.icesoft.faces.webapp.command.CommandQueue; 38 import com.icesoft.faces.webapp.http.common.Configuration; 39 import org.apache.commons.logging.Log; 40 import org.apache.commons.logging.LogFactory; 41 import org.w3c.dom.Document ; 42 import org.w3c.dom.Element ; 43 import org.w3c.dom.NodeList ; 44 45 import javax.el.ELContext; 46 import javax.faces.FactoryFinder; 47 import javax.faces.application.Application; 48 import javax.faces.application.ApplicationFactory; 49 import javax.faces.application.FacesMessage; 50 import javax.faces.component.UIViewRoot; 51 import javax.faces.context.ExternalContext; 52 import javax.faces.context.FacesContext; 53 import javax.faces.context.ResponseStream; 54 import javax.faces.context.ResponseWriter; 55 import javax.faces.render.RenderKit; 56 import javax.faces.render.RenderKitFactory; 57 import java.io.IOException ; 58 import java.util.ArrayList ; 59 import java.util.Arrays ; 60 import java.util.Collections ; 61 import java.util.HashMap ; 62 import java.util.Iterator ; 63 import java.util.List ; 64 import java.util.Map ; 65 import java.util.Vector ; 66 67 public class BridgeFacesContext extends FacesContext { 69 private static final Log log = LogFactory.getLog(BridgeFacesContext.class); 70 private Application application; 71 private BridgeExternalContext externalContext; 72 private HashMap faceMessages = new HashMap (); 73 private boolean renderResponse; 74 private boolean responseComplete; 75 private ResponseStream responseStream; 76 private ResponseWriter responseWriter; 77 private DOMSerializer domSerializer; 78 private UIViewRoot viewRoot; 79 private String iceFacesId; 80 private String viewNumber; 81 private CommandQueue commandQueue; 82 private Configuration configuration; 83 84 public BridgeFacesContext(BridgeExternalContext externalContext, String view, String icefacesID, CommandQueue commandQueue, Configuration configuration) { 85 setCurrentInstance(this); 86 this.externalContext = externalContext; 87 this.viewNumber = view; 88 this.iceFacesId = icefacesID; 89 this.commandQueue = commandQueue; 90 this.configuration = configuration; 91 this.application = ((ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY)).getApplication(); 92 this.externalContext = externalContext; 93 this.switchToNormalMode(); 94 } 95 96 public void setCurrentInstance() { 97 setCurrentInstance(this); 98 } 99 100 public Application getApplication() { 101 return application; 102 } 103 104 public void setApplication(Application application) { 105 this.application = application; 106 } 107 108 public Iterator getClientIdsWithMessages() { 109 return faceMessages.keySet().iterator(); 110 } 111 112 public ExternalContext getExternalContext() { 113 return this.externalContext; 114 } 115 116 public void setExternalContext(ExternalContext externalContext) { 117 } 119 120 public ELContext getELContext() { 121 ELContext elContext = new ELContextImpl(application); 122 elContext.putContext(FacesContext.class, this); 123 UIViewRoot root = getViewRoot(); 124 if (null != root) { 125 elContext.setLocale(root.getLocale()); 126 } 127 128 return elContext; 129 } 130 131 public FacesMessage.Severity getMaximumSeverity() { 132 throw new UnsupportedOperationException (); 133 } 134 135 140 public Iterator getMessages() { 141 142 ArrayList buffer = new ArrayList (); 145 Iterator i = faceMessages.values().iterator(); 146 while (i.hasNext()) { 147 buffer.addAll((Vector ) i.next()); 148 } 149 150 return buffer.iterator(); 151 } 152 153 161 public Iterator getMessages(String clientId) { 162 try { 163 return ((Vector ) faceMessages.get(clientId)).iterator(); 164 } catch (NullPointerException e) { 165 if (log.isDebugEnabled()) { 166 log.debug("Cannot find clientId " + clientId + 167 "from facesMessages"); 168 } 169 return Collections.EMPTY_LIST.iterator(); 170 } 171 } 172 173 public RenderKit getRenderKit() { 174 UIViewRoot viewRoot = getViewRoot(); 175 if (null == viewRoot) { 176 return (null); 177 } 178 String renderKitId = viewRoot.getRenderKitId(); 179 if (null == renderKitId) { 180 return (null); 181 } 182 183 RenderKitFactory renderKitFactory = (RenderKitFactory) 184 FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); 185 RenderKit renderKit = renderKitFactory.getRenderKit(this, renderKitId); 186 return (renderKit); 187 } 188 189 public boolean getRenderResponse() { 190 return this.renderResponse; 191 } 192 193 public boolean getResponseComplete() { 194 return this.responseComplete; 195 } 196 197 public ResponseStream getResponseStream() { 198 return this.responseStream; 199 } 200 201 public void setResponseStream(ResponseStream responseStream) { 202 this.responseStream = responseStream; 203 } 204 205 public ResponseWriter getResponseWriter() { 206 return responseWriter; 207 } 208 209 public void setResponseWriter(ResponseWriter responseWriter) { 210 this.responseWriter = responseWriter; 211 } 212 213 public ResponseWriter createAndSetResponseWriter() throws IOException { 214 return responseWriter = new DOMResponseWriter(this, domSerializer, configuration); 215 } 216 217 public void switchToNormalMode() { 218 try { 219 domSerializer = new NormalModeSerializer(this, externalContext.getWriter("UTF-8")); 220 } catch (IOException e) { 221 throw new RuntimeException (e); 222 } 223 } 224 225 public void switchToPushMode() { 226 228 if (responseWriter != null) { 246 Document document = ((DOMResponseWriter) responseWriter).getDocument(); 247 domSerializer = new PushModeSerializer(document, commandQueue); 248 } 249 } 250 251 public UIViewRoot getViewRoot() { 252 if (null == viewRoot) { 253 Map contextServletTable = D2DViewHandler.getContextServletTable(this); 254 if (null != contextServletTable) { 255 viewRoot = (UIViewRoot) contextServletTable 256 .get(DOMResponseWriter.RESPONSE_VIEWROOT); 257 } 258 } 259 260 return this.viewRoot; 261 } 262 263 public void setViewRoot(UIViewRoot viewRoot) { 264 Map contextServletTable = D2DViewHandler.getContextServletTable(this); 266 if (null != contextServletTable) { 267 if (viewRoot != null) { 268 contextServletTable 269 .put(DOMResponseWriter.RESPONSE_VIEWROOT, viewRoot); 270 } else { 271 contextServletTable.remove(DOMResponseWriter.RESPONSE_VIEWROOT); 272 } 273 } 274 responseWriter = null; 275 this.viewRoot = viewRoot; 276 } 277 278 public String getIceFacesId() { 279 return iceFacesId; 280 } 281 282 286 public String getViewNumber() { 287 return viewNumber; 288 } 289 290 295 public String getFocusId() { 296 Map map = externalContext.getRequestParameterMap(); 297 return (String ) (map.containsKey("focus") ? map.get("focus") : ""); 298 } 299 300 303 public void setFocusId(String focusId) { 304 externalContext.getRequestParameterMap().put("focus", focusId); 305 } 306 307 314 public void addMessage(String clientId, FacesMessage message) { 315 if (message == null) { 316 throw new IllegalArgumentException ("Message is null"); 317 } 318 if (faceMessages.containsKey(clientId)) { 319 ((Vector ) faceMessages.get(clientId)).addElement(message); 320 } else { 321 Vector vector = new Vector (); 322 vector.add(message); 323 faceMessages.put(clientId, vector); 324 } 325 } 326 327 public void renderResponse() { 328 this.renderResponse = true; 329 } 330 331 public void responseComplete() { 332 this.responseComplete = true; 333 } 334 335 public void resetRenderResponse() { 336 this.renderResponse = false; 337 } 338 339 345 public void release() { 346 faceMessages.clear(); 347 renderResponse = false; 348 responseComplete = false; 349 setCurrentInstance(null); 350 } 351 352 public void dispose() { 353 String key = viewNumber + "/" + D2DViewHandler.DOM_CONTEXT_TABLE; 354 externalContext.getSessionMap().remove(key); 355 } 356 357 public void applyBrowserDOMChanges() { 358 if (responseWriter == null) return; 359 Document document = ((DOMResponseWriter) responseWriter).getDocument(); 360 if (document == null) return; 361 Map parameters = externalContext.getRequestParameterValuesMap(); 362 363 NodeList inputElements = document.getElementsByTagName("input"); 364 int inputElementsLength = inputElements.getLength(); 365 for (int i = 0; i < inputElementsLength; i++) { 366 Element inputElement = (Element ) inputElements.item(i); 367 String id = inputElement.getAttribute("id"); 368 if (!"".equals(id) && parameters.containsKey(id)) { 369 String value = ((String []) parameters.get(id))[0]; 370 inputElement.setAttribute("value", value); 371 } 372 } 373 374 NodeList textareaElements = document.getElementsByTagName("textarea"); 375 int textareaElementsLength = textareaElements.getLength(); 376 for (int i = 0; i < textareaElementsLength; i++) { 377 Element textareaElement = (Element ) textareaElements.item(i); 378 String id = textareaElement.getAttribute("id"); 379 if (!"".equals(id) && parameters.containsKey(id)) { 380 String value = ((String []) parameters.get(id))[0]; 381 textareaElement.getFirstChild() 382 .setNodeValue(value); } 384 } 385 386 NodeList selectElements = document.getElementsByTagName("select"); 387 int selectElementsLength = selectElements.getLength(); 388 for (int i = 0; i < selectElementsLength; i++) { 389 Element selectElement = (Element ) selectElements.item(i); 390 String id = selectElement.getAttribute("id"); 391 if (!"".equals(id) && parameters.containsKey(id)) { 392 List values = Arrays.asList((String []) parameters.get(id)); 393 394 NodeList optionElements = 395 selectElement.getElementsByTagName("option"); 396 int optionElementsLength = optionElements.getLength(); 397 for (int j = 0; j < optionElementsLength; j++) { 398 Element optionElement = (Element ) optionElements.item(j); 399 if (values.contains(optionElement.getAttribute("value"))) { 400 optionElement.setAttribute("selected", "selected"); 401 } else { 402 optionElement.removeAttribute("selected"); 403 } 404 } 405 } 406 } 407 } 408 } 409 | Popular Tags |