1 23 package com.sun.enterprise.tools.jsfext.layout; 24 25 import com.sun.enterprise.tools.jsfext.layout.descriptor.LayoutComponent; 26 import com.sun.enterprise.tools.jsfext.layout.descriptor.LayoutDefinition; 27 import com.sun.enterprise.tools.jsfext.layout.descriptor.LayoutElement; 28 import com.sun.enterprise.tools.jsfext.layout.descriptor.LayoutFacet; 29 import com.sun.enterprise.tools.jsfext.layout.descriptor.Resource; 30 31 import java.io.IOException ; 32 import java.io.OutputStreamWriter ; 33 import java.util.Iterator ; 34 import java.util.Locale ; 35 36 import javax.faces.FactoryFinder; 37 import javax.faces.application.StateManager; 38 import javax.faces.application.StateManager.SerializedView; 39 import javax.faces.application.ViewHandler; 40 import javax.faces.component.UIComponent; 41 import javax.faces.component.UIViewRoot; 42 import javax.faces.context.ExternalContext; 43 import javax.faces.context.FacesContext; 44 import javax.faces.context.ResponseWriter; 45 import javax.faces.render.RenderKit; 46 import javax.faces.render.RenderKitFactory; 47 48 import javax.servlet.ServletRequest ; 49 import javax.servlet.ServletResponse ; 50 51 56 57 75 public class LayoutViewHandler extends ViewHandler { 76 77 82 public LayoutViewHandler(ViewHandler oldViewHandler) { 83 _oldViewHandler = oldViewHandler; 84 } 85 86 94 public UIViewRoot createView(FacesContext context, String viewId) { 95 Locale locale = null; 96 String renderKitId = null; 97 98 if (context.getViewRoot() != null) { 102 locale = context.getViewRoot().getLocale(); 103 renderKitId = context.getViewRoot().getRenderKitId(); 104 } 105 106 LayoutViewRoot viewRoot = new LayoutViewRoot(); 108 viewRoot.setViewId(viewId); 109 viewRoot.setLayoutDefinitionKey(viewId); 110 if (context.getViewRoot() == null) { 113 context.setViewRoot(viewRoot); 114 } 115 116 if (locale == null) { 119 locale = calculateLocale(context); 120 } 121 viewRoot.setLocale(locale); 122 123 if (renderKitId == null) { 125 renderKitId = calculateRenderKitId(context); 126 } 127 viewRoot.setRenderKitId(renderKitId); 128 129 LayoutDefinition def = viewRoot.getLayoutDefinition(context); 131 if (def != null) { 132 Iterator it = def.getResources().iterator(); 134 Resource resource = null; 135 while (it.hasNext()) { 136 resource = (Resource) it.next(); 137 resource.getFactory().getResource(context, resource); 139 } 140 141 buildUIComponentTree(context, viewRoot, def); 143 } 144 145 return viewRoot; 147 } 148 149 152 protected void buildUIComponentTree(FacesContext context, UIComponent parent, LayoutElement elt) { 153 Iterator it = elt.getChildLayoutElements().iterator(); 156 LayoutElement childElt; 157 UIComponent child = null; 158 while (it.hasNext()) { 159 childElt = (LayoutElement) it.next(); 160 if (childElt instanceof LayoutFacet) { 161 if (!((LayoutFacet) childElt).isRendered()) { 162 buildUIComponentTree(context, parent, childElt); 164 } 165 } if (childElt instanceof LayoutComponent) { 168 try { 169 UIComponent useParent = parent; 172 if ((EDITOR_ENABLED) && _editArea) { 173 useParent = createWrapperComponent(context, parent, childElt.getId(context, parent)); 175 } 176 child = ((LayoutComponent) childElt). 178 getChild(context, useParent); 179 180 191 if (((LayoutComponent) childElt).getOption(com.sun.enterprise.tools.jsfext.layout.xml.XMLLayoutDefinitionReader.EDITABLE) != null) { 192 _editArea = true; 193 194 buildUIComponentTree(context, child, childElt); 196 197 _editArea = false; 198 } else { 199 buildUIComponentTree(context, child, childElt); 201 } 202 } catch (IOException ex) { 203 throw new RuntimeException (ex); 204 } 205 } else { 206 buildUIComponentTree(context, parent, childElt); 207 } 208 } 209 } 210 211 private UIComponent createWrapperComponent(FacesContext context, UIComponent parent, String id) { 213 com.sun.enterprise.tools.jsfext.component.EditorComponent wrapper = new com.sun.enterprise.tools.jsfext.component.EditorComponent(); 214 wrapper.setId(id + "_editor"); 215 parent.getChildren().add(wrapper); 216 return wrapper; 217 } 218 220 226 public UIViewRoot restoreView(FacesContext context, String viewId) { 227 UIViewRoot root = _oldViewHandler.restoreView(context, viewId); 229 230 return root; 232 } 233 234 237 public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException { 238 LayoutDefinition def = null; 240 if (viewToRender instanceof LayoutViewRoot) { 241 def = ((LayoutViewRoot) viewToRender).getLayoutDefinition(context); 242 } 243 244 if (def == null) { 245 _oldViewHandler.renderView(context, viewToRender); 247 } else { 248 ResponseWriter writer = setupResponseWriter(context); 250 writer.startDocument(); 251 252 UIComponent target = (UIComponent) context.getExternalContext(). 254 getRequestMap().get(LAVA_CHANNEL_TARGET_KEY); 255 if (target != null) { 256 renderComponent(context, target); 257 } else { 258 def.encode(context, viewToRender); 261 } 262 263 writer.endDocument(); 265 } 266 } 267 268 private static void renderComponent(FacesContext context, UIComponent comp) throws IOException { 269 if (!comp.isRendered()) { 270 return; 271 } 272 273 comp.encodeBegin(context); 274 if (comp.getRendersChildren()) { 275 comp.encodeChildren(context); 276 } else { 277 UIComponent child = null; 278 Iterator it = comp.getChildren().iterator(); 279 while (it.hasNext()) { 280 child = (UIComponent) it.next(); 281 renderComponent(context, child); 282 } 283 } 284 comp.encodeEnd(context); 285 } 286 287 290 private ResponseWriter setupResponseWriter(FacesContext context) throws IOException { 291 ResponseWriter writer = context.getResponseWriter(); 292 if (writer != null) { 293 return writer; 295 } 296 297 ExternalContext extCtx = context.getExternalContext(); 298 ServletResponse response = (ServletResponse ) extCtx.getResponse(); 299 300 RenderKitFactory renderFactory = (RenderKitFactory) 301 FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); 302 RenderKit renderKit = 303 renderFactory.getRenderKit(context, 304 context.getViewRoot().getRenderKitId()); 305 String contentTypeList = (String ) extCtx.getRequestHeaderMap().get("Accept"); 306 if (!contentTypeList.toLowerCase().contains("text/html")) { 307 contentTypeList += ",text/html;q=1.0"; 308 } 309 writer = 310 renderKit.createResponseWriter( 311 new OutputStreamWriter (response.getOutputStream()), 312 contentTypeList, 313 ((ServletRequest ) extCtx.getRequest()).getCharacterEncoding()); 314 context.setResponseWriter(writer); 315 response.setContentType("text/html"); 319 return writer; 320 } 321 322 332 public void writeState(FacesContext context) throws IOException { 333 UIViewRoot root = context.getViewRoot(); 335 if ((root == null) || !(root instanceof LayoutViewRoot) 336 || (((LayoutViewRoot) root). 337 getLayoutDefinition(context) == null)) { 338 _oldViewHandler.writeState(context); 340 } else { 341 StateManager stateManager = 343 context.getApplication().getStateManager(); 344 SerializedView view = stateManager.saveSerializedView(context); 345 346 if (stateManager.isSavingStateInClient(context)) { 347 stateManager.writeState(context, view); 348 } 349 } 350 } 351 352 366 public String getResourceURL(FacesContext context, String path) { 367 return _oldViewHandler.getResourceURL(context, path); 368 } 369 370 382 public String getActionURL(FacesContext context, String viewId) { 383 return _oldViewHandler.getActionURL(context, viewId); 384 } 385 386 395 public Locale calculateLocale(FacesContext context) { 396 return _oldViewHandler.calculateLocale(context); 397 } 398 399 409 public String calculateRenderKitId(FacesContext context) { 410 return _oldViewHandler.calculateRenderKitId(context); 411 } 412 413 417 public static final String LAVA_CHANNEL_KEY = "lavaChannel"; 418 419 private ViewHandler _oldViewHandler = null; 420 static final String LAVA_CHANNEL_TARGET_KEY = "_lavaChannelTarget"; 421 private static final boolean EDITOR_ENABLED = true; 422 private boolean _editArea = false; } 424 | Popular Tags |