1 33 34 package com.icesoft.faces.application; 35 36 import com.icesoft.faces.component.NamespacingViewRoot; 37 import com.icesoft.faces.context.BridgeExternalContext; 38 import com.icesoft.faces.context.BridgeFacesContext; 39 import com.icesoft.faces.context.DOMResponseWriter; 40 import com.icesoft.faces.webapp.http.servlet.ServletExternalContext; 41 import com.icesoft.faces.webapp.parser.JspPageToDocument; 42 import com.icesoft.faces.webapp.parser.Parser; 43 import com.icesoft.faces.webapp.parser.ImplementationUtil; 44 import com.icesoft.faces.webapp.xmlhttp.PersistentFacesCommonlet; 45 import com.icesoft.jasper.Constants; 46 import com.icesoft.util.SeamUtilities; 47 import org.apache.commons.logging.Log; 48 import org.apache.commons.logging.LogFactory; 49 50 import javax.faces.FacesException; 51 import javax.faces.application.StateManager; 52 import javax.faces.application.ViewHandler; 53 import javax.faces.component.NamingContainer; 54 import javax.faces.component.StateHolder; 55 import javax.faces.component.UIComponent; 56 import javax.faces.component.UIData; 57 import javax.faces.component.UIViewRoot; 58 import javax.faces.context.ExternalContext; 59 import javax.faces.context.FacesContext; 60 import javax.faces.context.ResponseWriter; 61 import javax.faces.render.RenderKitFactory; 62 import java.beans.Beans ; 63 import java.io.IOException ; 64 import java.io.InputStream ; 65 import java.io.InputStreamReader ; 66 import java.io.Reader ; 67 import java.net.URI ; 68 import java.net.URISyntaxException ; 69 import java.net.URL ; 70 import java.net.URLConnection ; 71 import java.net.URLEncoder ; 72 import java.util.Arrays ; 73 import java.util.HashMap ; 74 import java.util.Iterator ; 75 import java.util.Locale ; 76 import java.util.Map ; 77 78 83 public class D2DViewHandler extends ViewHandler { 84 protected static Log log = LogFactory.getLog(D2DViewHandler.class); 86 87 static { 88 if (log.isInfoEnabled()) { 89 log.info(new ProductInfo().toString()); } 91 } 92 93 private final static String DELEGATE_NONIFACE = 94 "com.icesoft.faces.delegateNonIface"; 95 private final static String ACTION_URL_SUFFIX = 96 "com.icesoft.faces.actionURLSuffix"; 97 private final static String RELOAD_INTERVAL = 98 "com.icesoft.faces.reloadInterval"; 99 private final static String DO_JSF_STATE_MANAGEMENT = 100 "com.icesoft.faces.doJSFStateManagement"; 101 public final static String INCLUDE_OPEN_AJAX_HUB = 102 "com.icesoft.faces.openAjaxHub"; 103 private final static String LAST_LOADED_KEY = "_lastLoaded"; 104 private final static String LAST_CHECKED_KEY = "_lastChecked"; 105 public static final String DOM_CONTEXT_TABLE = 107 "com.icesoft.faces.sessionAuxiliaryData"; 108 public static final String CHAR_ENCODING = "UTF-8"; 109 public static final String HTML_CONTENT_TYPE = 110 "text/html;charset=" + CHAR_ENCODING; 111 112 public static final String DEFAULT_VIEW_ID = "default"; 113 114 private String actionURLSuffix; 115 protected boolean delegateNonIface = false; 116 protected boolean delegateNonIfaceDefault = false; 117 protected boolean jsfStateManagement; 118 protected long reloadInterval; 120 protected long reloadIntervalDefault = 2; 121 private boolean parametersInitialized = false; 122 123 protected Parser parser; 124 private ViewHandler delegate; 125 126 127 public D2DViewHandler() { 128 try { 129 InputStream inputStream = this.getClass().getResourceAsStream("serializedTagToComponentMapFull.ser"); 130 parser = new Parser(inputStream); 131 } catch (IOException e) { 132 throw new RuntimeException (e); 133 } 134 } 135 136 public D2DViewHandler(ViewHandler delegate) { 137 this(); 138 this.delegate = delegate; 139 } 140 141 public void renderView(FacesContext context, UIViewRoot viewToRender) 143 throws IOException , FacesException { 144 initializeParameters(context); 145 if (delegateView(viewToRender.getViewId())) { 146 delegate.renderView(context, viewToRender); 147 return; 148 } 149 150 if (log.isTraceEnabled()) { 151 log.trace("renderView(FC,UIVR) BEFORE renderResponse " + 152 "viewToRender.getViewId(): " + viewToRender.getViewId()); 153 } 154 renderResponse(context); 155 156 if (jsfStateManagement) { 157 StateManager stateMgr = context.getApplication().getStateManager(); 158 stateMgr.saveSerializedView(context); 159 } 161 162 164 } 165 166 167 174 public UIViewRoot createView(FacesContext context, String viewId) { 175 initializeParameters(context); 176 177 if (delegateView(viewId)) { 178 return delegate.createView(context, viewId); 179 } 180 181 UIViewRoot root = new NamespacingViewRoot(context); 182 root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT); 184 185 Map contextServletTable = 186 getContextServletTable(context); 187 if (null == viewId) { 188 root.setViewId("default"); 189 context.setViewRoot(root); 190 contextServletTable 191 .put(DOMResponseWriter.RESPONSE_VIEWROOT, root); 192 Locale locale = calculateLocale(context); 193 root.setLocale(locale); 194 return root; 195 } 196 197 root.setViewId(viewId); 198 context.setViewRoot(root); 199 contextServletTable.put(DOMResponseWriter.RESPONSE_VIEWROOT, root); 200 201 return root; 202 } 203 204 214 public UIViewRoot restoreView(FacesContext context, String viewId) { 215 this.initializeParameters(context); 216 217 218 if (delegateView(viewId)) { 219 return delegate.restoreView(context, viewId); 220 } 221 222 UIViewRoot currentRoot = context.getViewRoot(); 223 ExternalContext externalContext = context.getExternalContext(); 225 226 if (externalContext instanceof ServletExternalContext) { 227 228 ServletExternalContext servletExternalContext = 229 (ServletExternalContext) externalContext; 230 231 servletExternalContext.setRequestServletPath(viewId); 232 233 if (null != externalContext.getRequestPathInfo()) { 234 servletExternalContext.setRequestPathInfo(viewId); 236 } 237 238 if (SeamUtilities.isSeamEnvironment()) { 239 if (servletExternalContext.getRequestParameterMap().remove( 240 PersistentFacesCommonlet.SEAM_LIFECYCLE_SHORTCUT) != null) { 241 242 if (log.isTraceEnabled()) { 243 log.trace("Seam Keyword shortcut found, new ViewRoot"); 244 } 245 return null; 246 } else { 247 if (log.isTraceEnabled()) { 248 log.trace("No Seam Keyword shortcut found"); 249 } 250 } 251 } 252 } 253 254 if (null != currentRoot && 255 mungeViewId(viewId) 256 .equals(mungeViewId( 257 currentRoot.getViewId()))) { 258 return currentRoot; 260 } 261 262 Map contextServletTable = 263 getContextServletTable(context); 264 Map domResponseContexts; 265 if (contextServletTable 266 .containsKey(DOMResponseWriter.RESPONSE_CONTEXTS_TABLE)) { 267 domResponseContexts = (Map ) contextServletTable 268 .get(DOMResponseWriter.RESPONSE_CONTEXTS_TABLE); 269 } else { 270 domResponseContexts = new HashMap (); 271 contextServletTable.put(DOMResponseWriter.RESPONSE_CONTEXTS_TABLE, 272 domResponseContexts); 273 } 274 275 UIViewRoot root = null; 276 277 root = (UIViewRoot) contextServletTable 278 .get(DOMResponseWriter.RESPONSE_VIEWROOT); 279 280 if ((null != root) && (null != viewId) && 281 (mungeViewId(viewId).equals(mungeViewId(root.getViewId())))) { 282 } 283 284 return root; 285 } 286 287 288 private static Map getContextServletTables(FacesContext context) { 289 Map sessionMap = context.getExternalContext().getSessionMap(); 290 String viewNumber = "-"; 291 if (context instanceof BridgeFacesContext) { 292 viewNumber = ((BridgeFacesContext) context).getViewNumber(); 293 } 294 295 String treeKey = viewNumber + "/" + DOM_CONTEXT_TABLE; 296 Map contextTable; 297 if (sessionMap.containsKey(treeKey)) { 298 contextTable = (Map ) sessionMap.get(treeKey); 299 } else { 300 contextTable = new HashMap (); 301 sessionMap.put(treeKey, contextTable); 302 } 303 304 return contextTable; 305 } 306 307 public static Map getContextServletTable(FacesContext context) { 308 Map domContextTables = getContextServletTables(context); 309 String servletRequestPath = 310 getServletRequestPath(context); 311 if (domContextTables.containsKey(servletRequestPath)) { 312 return (Map ) domContextTables.get(servletRequestPath); 313 } else { 314 Map domContextTable = new HashMap (); 315 domContextTables.put(servletRequestPath, domContextTable); 316 return domContextTable; 317 } 318 } 319 320 public static String getServletRequestPath(FacesContext context) { 321 if (Beans.isDesignTime()) { 322 return context.getViewRoot().getViewId(); 324 } 325 ExternalContext externalContext = context.getExternalContext(); 326 if (externalContext instanceof BridgeExternalContext) { 327 String uri = ((BridgeExternalContext) externalContext) 328 .getRequestURI(); 329 if (null == uri) { 330 if (log.isWarnEnabled()) { 331 log 332 .warn("Failing over to default request path"); 333 } 334 uri = "default"; 335 336 } 337 return uri; 338 } 339 return (externalContext.getRequestContextPath() + 340 externalContext.getRequestServletPath()); 341 } 342 343 public static String getServletRequestPath(ExternalContext externalContext, 344 String viewId) { 345 if (externalContext == null) { 346 throw new IllegalStateException ("ExternalContext is null"); 347 } 348 return externalContext.getRequestContextPath() + viewId; 349 } 350 351 public String getActionURL(FacesContext context, String viewId) { 352 if (delegateView(viewId)) { 354 return delegate.getActionURL(context, viewId); 355 } 356 357 if (viewId.indexOf("://") >= 0) { 358 return viewId; 359 } 360 361 if (viewId.charAt(0) != '/') { 362 throw new IllegalArgumentException ( 363 "viewId " + viewId + "does not begin with '/'"); 364 } 365 366 if (null != actionURLSuffix) { 368 viewId = 369 viewId.substring(0, viewId.lastIndexOf(".")) + 370 actionURLSuffix; 371 } 372 373 return context.getExternalContext().getRequestContextPath() + viewId; 374 } 375 376 public String getResourceURL(FacesContext context, String path) { 377 if (context == null) { 379 throw new NullPointerException ("context cannot be null"); 380 } 381 382 if (path == null) { 383 throw new NullPointerException ("path cannot be null"); 384 } 385 386 path = encode(path); 389 390 ExternalContext extCtxt = context.getExternalContext(); 391 392 if (isPortlet(extCtxt)) { 397 path = resolveFully(extCtxt, path); 398 } else { 399 if (path.startsWith("/")) { 401 StringBuffer dir = new StringBuffer (); 403 int atoms = extCtxt.getRequestServletPath().split("/").length; 404 while (atoms-- > 2) dir.append("../"); 405 path = URI.create(dir + "." + path).normalize().toString(); 406 } 407 } 409 410 return path; 411 } 412 413 private String encode(String path){ 414 return path.trim().replaceAll(" ","%20"); 415 } 416 417 private boolean isPortlet(ExternalContext extCtxt) { 418 return extCtxt.getRequestMap().get(Constants.PORTLET_KEY) != null; 419 } 420 421 425 private String resolveFully(ExternalContext extCtxt, String resource) { 426 427 String context = extCtxt.getRequestContextPath(); 428 429 if( resource.startsWith("/") ){ 432 return context + resource; 433 } 434 435 String base = context + extCtxt.getRequestServletPath(); 437 try { 438 URI baseURI = new URI (base); 439 URI resourceURI = new URI (resource); 440 URI resolvedURI = baseURI.resolve(resourceURI); 441 return resolvedURI.toString(); 442 443 } catch (URISyntaxException e) { 444 if( log.isWarnEnabled() ){ 445 log.warn( "could not resolve URI's based on" + 446 "\n context : " + extCtxt.getRequestContextPath() + 447 "\n path : " + extCtxt.getRequestServletPath() + 448 "\n resource: " + resource, e ); 449 } 450 return resource; 451 } 452 } 453 454 protected long getTimeAttribute(UIComponent root, String key) { 455 Long timeLong = (Long ) root.getAttributes().get(key); 456 long time = (null == timeLong) ? 0 : 457 timeLong.longValue(); 458 return time; 459 } 460 461 protected void renderResponse(FacesContext facesContext) throws IOException { 462 BridgeFacesContext context = (BridgeFacesContext) facesContext; 463 UIViewRoot root = context.getViewRoot(); 464 String viewId = root.getViewId(); 465 466 if (log.isTraceEnabled()) { 467 log.trace("Rendering " + root + " with " + 468 root.getChildCount() + " children"); 469 } 470 471 clearSession(context); 472 ResponseWriter responseWriter = context.createAndSetResponseWriter(); 473 474 boolean reloadView = false; 475 URLConnection viewConnection = null; 476 477 if ((root.getChildCount() == 0) || (reloadInterval > -1)) { 478 if (viewId.startsWith("/faces")) { 481 viewId = viewId.substring(6); 482 } 483 if (viewId.endsWith(".jpg") || viewId.endsWith(".gif") || 484 viewId.endsWith(".png")) { 485 context.getExternalContext().dispatch(viewId); 486 return; 487 } 488 try { 489 URL viewURL = context.getExternalContext().getResource(viewId); 490 if (null == viewURL) { 491 if (viewId.endsWith(".faces")) { 492 viewId = truncate(".faces", viewId); 493 } else if (viewId.endsWith(".jsf")) { 494 viewId = truncate(".jsf", viewId); 495 } else if (viewId.endsWith(".iface")) { 496 viewId = truncate(".iface", viewId); 497 } else if (viewId.endsWith(".jsp")) { 498 viewId = truncate(".jsp", viewId); 500 } 501 502 viewId = viewId + ".jspx"; 503 viewURL = context.getExternalContext().getResource(viewId); 504 } 505 506 if (null == viewURL) { 507 if (viewId.endsWith(".jspx")) { 508 viewId = truncate(".jspx", viewId) + 509 ".jsp"; 510 } 511 viewURL = context.getExternalContext().getResource(viewId); 512 } 513 514 515 long currentTime = System.currentTimeMillis(); 516 long lastLoaded = getTimeAttribute(root, LAST_LOADED_KEY); 517 long lastChecked = getTimeAttribute(root, LAST_CHECKED_KEY); 518 long lastModified = 0; 519 520 if (currentTime > lastChecked + reloadInterval) { 523 viewConnection = viewURL.openConnection(); 524 lastModified = viewConnection.getLastModified(); 525 root.getAttributes().put(LAST_CHECKED_KEY, 526 new Long (currentTime)); 527 if (lastModified > lastLoaded) { 528 reloadView = true; 529 } 530 } 531 532 } catch (Exception e) { 533 throw new FacesException("Can't find stream for " + viewId, e); 534 } 535 } 536 537 if (reloadView) { 538 Reader viewInput = null; 539 540 try { 541 viewInput = new InputStreamReader ( 542 viewConnection.getInputStream(), CHAR_ENCODING); 543 if (viewId.endsWith(".jsp")) { 544 viewInput = JspPageToDocument.transform(viewInput); 545 } else if (viewId.endsWith(".jspx")) { 546 viewInput = 547 JspPageToDocument.preprocessJspDocument(viewInput); 548 } 549 } catch (Throwable e) { 550 throw new FacesException("Can't read stream for " + viewId, e); 551 } 552 553 try { 555 parser.parse(viewInput, context); 558 root.getAttributes().put(LAST_LOADED_KEY, 559 new Long (System.currentTimeMillis())); 560 561 562 } catch (Throwable e) { 563 throw new FacesException("Can't parse stream for " + viewId + 564 " " + e.getMessage(), e); 565 } 566 567 if (ImplementationUtil.isJSF12()) { 568 if (log.isDebugEnabled()) { 569 log.debug("Rendering outside ViewTag for JSF 1.2"); 570 } 571 responseWriter.startDocument(); 573 renderResponse(context, root); 574 responseWriter.endDocument(); 575 } 576 577 } else { 578 responseWriter.startDocument(); 579 renderResponse(context, root); 580 responseWriter.endDocument(); 581 tracePrintComponentTree(context); 582 } 583 584 } 585 586 protected void renderResponse(FacesContext context, UIComponent component) 587 throws IOException { 588 if (!component.isRendered()) 589 return; 590 591 boolean isUIViewRoot = component instanceof UIViewRoot; 595 if( !isUIViewRoot ) 596 component.encodeBegin(context); 597 598 if (component.getRendersChildren()) { 599 component.encodeChildren(context); 600 } else { 601 Iterator kids = component.getChildren().iterator(); 602 while (kids.hasNext()) { 603 renderResponse(context, (UIComponent) kids.next()); 604 } 605 } 606 607 if( !isUIViewRoot ) 608 component.encodeEnd(context); 609 610 if (component instanceof javax.faces.component.UIData) { 613 StateHolder stateHolder = (StateHolder) component; 614 stateHolder.restoreState(context, stateHolder.saveState(context)); 615 } 616 } 617 618 protected void tracePrintComponentTree(FacesContext context) { 619 tracePrintComponentTree( context, context.getViewRoot() ); 620 } 621 622 protected void tracePrintComponentTree( 623 FacesContext context, UIComponent component) 624 { 625 if (log.isTraceEnabled()) { 626 StringBuffer sb = new StringBuffer (4096); 627 sb.append("tracePrintComponentTree() vvvvvv\n"); 628 tracePrintComponentTree(context, component, 0, sb, null); 629 log.trace(sb.toString()); 630 log.trace("tracePrintComponentTree() ^^^^^^"); 631 } 632 } 633 634 private void tracePrintComponentTree( 635 FacesContext context, UIComponent component, 636 int levels, StringBuffer sb, String facetName) 637 { 638 if( component == null ) { 639 sb.append("null\n"); 640 return; 641 } 642 final String PREFIX_WHITESPACE = " "; 643 StringBuffer prefix = new StringBuffer (64); 644 for (int i = 0; i < levels; i++) 645 prefix.append(PREFIX_WHITESPACE); 646 prefix.append("<"); 647 String compStr = component.toString(); 648 649 StringBuffer open = new StringBuffer (512); 650 open.append(prefix); 651 open.append(compStr); 652 Map facetsMap = component.getFacets(); 653 boolean hasKids = component.getChildCount() > 0; 654 boolean hasFacets = (facetsMap != null) && (facetsMap.size() > 0); 655 boolean hasUnderlings = hasKids | hasFacets; 656 if (!hasUnderlings) 657 open.append("/"); 658 open.append(">"); 659 if( facetName != null ) { 660 open.append(" facetName: "); 661 open.append(facetName); 662 } 663 open.append(" id: "); 664 open.append(component.getId()); 665 if( component.getParent() != null ) { 666 open.append(" clientId: "); 667 open.append(component.getClientId(context)); 668 } 669 if(hasKids) { 670 open.append(" kids: "); 671 open.append(Integer.toString(component.getChildCount())); 672 } 673 if(hasFacets) { 674 open.append(" facets: "); 675 open.append(Integer.toString(facetsMap.size())); 676 } 677 if(component.isTransient()) 678 open.append(" TRANSIENT "); 679 sb.append(open.toString()); 680 sb.append('\n'); 681 682 if (hasUnderlings) { 683 if( hasFacets ) { 684 Object [] facetKeys = facetsMap.keySet().toArray(); 685 Arrays.sort(facetKeys); 686 for(int i = 0; i < facetKeys.length; i++) { 687 tracePrintComponentTree( 688 context, (UIComponent) facetsMap.get(facetKeys[i]), 689 levels + 1, sb, facetKeys[i].toString()); 690 } 691 } 692 if( hasKids ) { 693 Iterator kids = component.getChildren().iterator(); 694 while (kids.hasNext()) { 695 tracePrintComponentTree( 696 context, (UIComponent) kids.next(), levels + 1, sb, null); 697 } 698 } 699 700 StringBuffer close = new StringBuffer (512); 701 close.append(prefix); 702 close.append("/"); 703 close.append(compStr); 704 close.append(">"); 705 sb.append(close); 706 sb.append('\n'); 707 } 708 } 709 710 protected void clearSession(FacesContext context) { 711 Map contextServletTable = 712 getContextServletTable(context); 713 contextServletTable.remove(DOMResponseWriter.RESPONSE_CONTEXTS_TABLE); 714 contextServletTable.remove(DOMResponseWriter.RESPONSE_VIEWROOT); 715 contextServletTable.remove(DOMResponseWriter.RESPONSE_DOM); 716 } 717 718 public void writeState(FacesContext context) throws IOException { 719 if (delegateView(context.getViewRoot().getViewId())) { 720 delegate.writeState(context); 721 } 722 } 723 724 public Locale calculateLocale(FacesContext context) { 725 Iterator locales = context.getExternalContext().getRequestLocales(); 726 727 while (locales.hasNext()) { 728 Locale locale = (Locale ) locales.next(); 729 Iterator supportedLocales = context.getApplication() 730 .getSupportedLocales(); 731 732 while (supportedLocales.hasNext()) { 733 Locale supportedLocale = (Locale ) supportedLocales.next(); 734 if (locale.getLanguage() 735 .equals(supportedLocale.getLanguage())) { 736 737 if ((null == supportedLocale.getCountry()) || 738 ("".equals(supportedLocale.getCountry()))) { 739 return supportedLocale; 740 } 741 742 if (locale.equals(supportedLocale)) { 743 return supportedLocale; 744 } 745 746 } 747 } 748 } 749 750 Locale defaultLocale = context.getApplication().getDefaultLocale(); 751 return (null == defaultLocale) ? Locale.getDefault() : defaultLocale; 752 } 753 754 public String calculateRenderKitId(FacesContext context) { 755 return delegate.calculateRenderKitId(context); 756 } 757 758 public static boolean isValueReference(String value) { 759 if ((value.indexOf("#{") != -1) && 760 (value.indexOf("#{") < value.indexOf('}'))) { 761 return true; 762 } 763 return false; 764 } 765 766 775 public static UIComponent findComponent(String clientId, UIComponent base) { 776 String delimeter = String.valueOf(NamingContainer.SEPARATOR_CHAR); 782 if (clientId.startsWith(delimeter)) { 783 while (base.getParent() != null) { 785 base = base.getParent(); 786 } 787 clientId = clientId.substring(1); 789 } else { 790 while (base.getParent() != null) { 792 if (base instanceof NamingContainer) { 793 break; 794 } 795 base = base.getParent(); 796 } 797 } 798 String id = null; 800 UIComponent result = null; 801 while (clientId.length() > 0) { 802 int separator = clientId.indexOf(NamingContainer.SEPARATOR_CHAR); 803 if (base instanceof UIData) { 804 if (separator >= 0) { 805 clientId = clientId.substring(separator + 1); 806 } 807 separator = clientId.indexOf(NamingContainer.SEPARATOR_CHAR); 808 } 809 if (separator >= 0) { 810 id = clientId.substring(0, separator); 811 clientId = clientId.substring(separator + 1); 812 } else { 813 id = clientId; 814 clientId = ""; 815 } 816 result = findComponent(base, id); 817 if ((result == null) || (clientId.length() == 0)) { 818 break; } 820 if (result instanceof NamingContainer) { 821 result = findComponent(clientId, result); 822 break; 823 } 824 } 825 826 return result; 827 } 828 829 private static String truncate(String remove, String input) { 830 return input.substring(0, input.length() - remove.length()); 831 } 832 833 private boolean delegateView(String viewId) { 836 Map requestMap = FacesContext.getCurrentInstance() 837 .getExternalContext().getRequestMap(); 838 if (PersistentFacesCommonlet.PERSISTENT.equals( 841 requestMap.get(PersistentFacesCommonlet.SERVLET_KEY))) { 842 return false; 843 } 844 if (delegateNonIface) { 845 return (!viewId.endsWith(".iface")); 846 } 847 return false; 848 } 849 850 private void initializeParameters(FacesContext context) { 851 if (parametersInitialized) { 852 return; 853 } 854 855 ExternalContext ec = context.getExternalContext(); 856 String delegateNonIfaceParameter = ec.getInitParameter(DELEGATE_NONIFACE); 857 String reloadIntervalParameter = ec.getInitParameter(RELOAD_INTERVAL); 858 String jsfStateManagementParameter = ec.getInitParameter(DO_JSF_STATE_MANAGEMENT); 859 actionURLSuffix = ec.getInitParameter(ACTION_URL_SUFFIX); 860 delegateNonIface = delegateNonIfaceParameter == null ? delegateNonIfaceDefault : Boolean.valueOf(delegateNonIfaceParameter).booleanValue(); 861 try { 862 reloadInterval = Long.parseLong(reloadIntervalParameter) * 1000; 863 } catch (NumberFormatException e) { 864 reloadInterval = reloadIntervalDefault * 1000; 865 } 866 jsfStateManagement = Boolean.valueOf(jsfStateManagementParameter).booleanValue(); 867 if (!jsfStateManagement) { 868 log.debug("JSF State Management not provided"); 869 } 870 parametersInitialized = true; 871 } 872 873 private static String mungeViewId(String viewId) { 877 String defaultSuffix = FacesContext.getCurrentInstance() 878 .getExternalContext() 879 .getInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME); 880 String suffix = defaultSuffix != null ? 881 defaultSuffix : ViewHandler.DEFAULT_SUFFIX; 882 883 int dot = viewId.lastIndexOf('.'); 884 if (dot == -1) { 885 log 886 .error("Assumed extension mapping, but there is no extension in " + 887 viewId); 888 } else { 889 viewId = viewId.substring(0, dot) + suffix; 890 } 891 892 return viewId; 893 } 894 895 private static UIComponent findComponent(UIComponent uiComponent, 896 String componentId) { 897 UIComponent component = null; 898 UIComponent child = null; 899 900 if (componentId.equals(uiComponent.getId())) { 901 return uiComponent; 902 } 903 Iterator children = uiComponent.getFacetsAndChildren(); 904 while (children.hasNext() && (component == null)) { 905 child = (UIComponent) children.next(); 906 if (!(child instanceof NamingContainer)) { 907 component = findComponent(child, componentId); 908 if (component != null) { 909 break; 910 } 911 } else if (componentId.endsWith(child.getId())) { 912 component = child; 913 break; 914 } 915 } 916 return component; 917 } 918 } 919 | Popular Tags |