0 Replies Latest reply on Aug 18, 2008 2:57 PM by Gio Cosmiano

    ClassCastException when rendering JSF page after long running query

    Gio Cosmiano Newbie

      Hello,


      I'm getting this ClassCastException error after a long running query in which works just fine when querying subset data. It doesn't seem to appear as TM is timing out so I'm not sure what's happening. It seems though that during JSF rendering cycle it couldn't find the right object when referencing it thru EL or it found it from the wrong classloader context. Any help would be appreciated.


      Our environment is using JBoss 4.2.2GA, Seam 2.0.1GA, Richfaces 3.2.1


      Thanks, Gio


      2008-08-16 17:45:02,953 ERROR [STDERR] Aug 16, 2008 5:45:02 PM com.sun.facelets.FaceletViewHandler handleRenderException
      SEVERE: Error Rendering View[/queries/QuerySupervisorPercentToPlanReport.xhtml]
      javax.el.ELException: Error reading 'dataModelPagination' on type org.javassist.tmp.java.lang.Object_$$_javassist_15
      at javax.el.BeanELResolver.getValue(BeanELResolver.java:66)
      at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
      at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
      at org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:53)
      at org.jboss.el.parser.AstValue.getValue(AstValue.java:67)
      at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
      at org.jboss.seam.core.Expressions$1.getValue(Expressions.java:111)
      at org.jboss.seam.navigation.Param.getStringValueFromModel(Param.java:133)
      at org.jboss.seam.navigation.Pages.getStringValuesFromModel(Pages.java:690)
      at org.jboss.seam.ui.component.UISeamCommandBase.getUrl(UISeamCommandBase.java:51)
      at org.jboss.seam.ui.renderkit.LinkRendererBase.doEncodeBegin(LinkRendererBase.java:26)
      at org.jboss.seam.ui.util.cdk.RendererBase.encodeBegin(RendererBase.java:79)
      at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:788)
      at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:280)
      at org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
      at org.richfaces.renderkit.html.MenuItemRenderer.doEncodeEnd(MenuItemRenderer.java:269)
      at org.richfaces.renderkit.html.MenuItemRenderer.doEncodeEnd(MenuItemRenderer.java:288)
      at org.ajax4jsf.renderkit.RendererBase.encodeEnd(RendererBase.java:135)
      at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:836)
      at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:286)
      at org.richfaces.renderkit.html.AbstractMenuRenderer.encodeItems(AbstractMenuRenderer.java:185)
      at org.richfaces.renderkit.html.AbstractMenuRenderer.processLayer(AbstractMenuRenderer.java:152)
      at org.richfaces.renderkit.html.AbstractMenuRenderer.encodeChildren(AbstractMenuRenderer.java:134)
      at org.richfaces.renderkit.html.DropDownMenuRendererBase.encodeChildren(DropDownMenuRendererBase.java:115)
      at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
      at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
      at org.richfaces.renderkit.html.ToolBarGroupRenderer.encodeChildren(ToolBarGroupRenderer.java:81)
      at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
      at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
      at org.richfaces.renderkit.html.ToolBarRendererBase.encodeChildren(ToolBarRendererBase.java:104)
      at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
      at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
      at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
      at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
      at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
      at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
      at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
      at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
      at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
      at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
      at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:68)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154)
      at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260)
      at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366)
      at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493)
      at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
      at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
      at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)
      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
      at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
      at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
      at java.lang.Thread.run(Thread.java:595)
      Caused by: java.lang.ClassCastException: com.czncorp.cap.ccst.util.DataModelPagination
      at $Proxy256.getDataModelPagination(Unknown Source)
      at sun.reflect.GeneratedMethodAccessor788.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.jboss.seam.util.Reflections.invoke(Reflections.java:21)
      at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
      at org.jboss.seam.intercept.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:76)
      at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
      at org.jboss.seam.ejb.RemoveInterceptor.aroundInvoke(RemoveInterceptor.java:41)
      at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
      at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
      at org.jboss.seam.intercept.ClientSideInterceptor.invoke(ClientSideInterceptor.java:54)
      at org.javassist.tmp.java.lang.Object_$$_javassist_15.getDataModelPagination(Object_$$_javassist_15.java)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccess
      2008-08-16 17:45:02,960 ERROR [STDERR] orImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
      ... 81 more
      


      package com.czncorp.cap.ccst.util;
      
      import java.util.ArrayList;
      import java.util.List;
      
      import javax.faces.model.DataModel;
      
      import org.jboss.seam.contexts.Contexts;
      import org.jboss.seam.jsf.ListDataModel;
      
      import com.czncorp.cap.ccst.Constants;
      
      public class DataModelPagination<T>
      implements java.io.Serializable {
      
      protected int pageSize = 0;
      protected int pageNumber = 0;
      protected int totalPages = 0;
      protected int totalRecords = 0;
      protected List<T> dataList = null;
      protected List<T> currentList = null;
      protected String componentName = null;
      protected DataModel dataModel = null;
      private boolean firstLoad = false;
      
      public DataModelPagination() {
      }
      
      public List<T> getDataList() {
      return dataList;
      }
      
      public void setDataList(List<T> dataList) {
      this.dataList = dataList;
      }
      
      public T getSelectedDataRow() {
      DataModel dm = (ListDataModel)Contexts.getConversationContext().get(componentName);
      return (T)dm.getRowData();
      }
      
      public T getSelectedDataFromDataModel() {
      return (dataModel == null ? null : (T)dataModel.getRowData());
      }
      
      /*
      * Check for firstLoad because of multiple calls to this method
      * due to dataModelPagination.currentPage references in JSF pages
      * such as 1st, next, previous, last and if empty
      *
      * firstLoad is always set to true every time the first page is loaded
      * or going to a new page via next, previous, first or last page links
      *
      * Also, for some reason, the row selected from dataModel is not being
      * returned to client using the method above,
      * getDataModel().getSelectedDataFromDataModel(), but works
      * just fine when its being managed by seam so I'm putting the dataModel
      * on the conversational context then reference it from JSF pages as
      * #{dmMaintainEntity} or #{dmQueryEntity} as oppose to referencing it
      * using #{dataModelPagination.dataModel} ==> Gio Cosmiano
      *
      */
      public List<T> getCurrentPage() {
      if (isFirstLoad()) {
      setFirstLoad(false);
      dataModel = null;
      currentList = getPagedData();
      if (currentList != null && currentList.size() > 0) {
      dataModel = new ListDataModel(currentList);
      Contexts.getConversationContext().set(componentName, dataModel);
      }
      }
      return currentList;
      }
      
      private List<T> getPagedData() {
      
      List<T> temp = null;
      List<T> list = null;
      
      if (dataList != null && dataList.size() > 0) {
      temp = new ArrayList<T>();
      list = new ArrayList<T>();
      if (isLastPageAvailable()) {
      temp = dataList.subList((pageNumber * pageSize), (pageNumber * pageSize) + pageSize);
      } else {
      temp = dataList.subList((pageNumber * pageSize), totalRecords);
      }
      /*
      * List.subList returns a non-serializable objects so I'm dumping them
      * to a temporary storage before returning them to clients
      * http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4114571#4114571
      */
      if (temp != null && temp.size() > 0) {
      list.addAll(temp);
      }
      }
      
      return list;
      }
      
      public void setPaginationSettings(List<T> list) {
      setPaginationSettings(list, Constants.DEFAULT_MAX_PAGE_SIZE, Constants.ENTITY_DATA_MODEL);
      }
      
      public void setPaginationSettings(List<T> list, int maxPageSize) {
      setPaginationSettings(list, maxPageSize, Constants.ENTITY_DATA_MODEL);
      }
      
      public void setPaginationSettings(List<T> list, String componentName) {
      setPaginationSettings(list, Constants.DEFAULT_MAX_PAGE_SIZE, componentName);
      }
      
      public void setPaginationSettings(List<T> list, int pageSize, String componentName) {
      setPageSize(pageSize);
      setComponentName(componentName);
      pageNumber = 0;
      totalPages = 0;
      totalRecords = 0;
      dataList = list;
         if (dataList != null && dataList.size() > 0) {
         totalRecords = dataList.size();
         totalPages = dataList.size() / this.pageSize;
         if (this.pageSize > 0 && totalRecords % this.pageSize > 0)
         totalPages++;
         if (totalPages > 0)
         totalPages--; // decrement by 1 for 0 based indexing
         }
         setFirstLoad(true);
         getCurrentPage();
      }
      
      public void resetPaginationSize(int pageSize) {
      setPageSize(pageSize);
      pageNumber = 0;
      totalPages = 0;
         if (dataList != null && dataList.size() > 0) {
         totalPages = dataList.size() / this.pageSize;
         if (this.pageSize > 0 && totalRecords % this.pageSize > 0)
         totalPages++;
         if (totalPages > 0)
         totalPages--; // decrement by 1 for 0 based indexing
         }
         setFirstLoad(true);
         getCurrentPage();
      }
      
      public boolean isNextPageAvailable() {
      return totalPages > 0 && pageNumber+1 < totalPages;
      }
      
      public boolean isPreviousPageAvailable() {
      return totalPages > 0 && pageNumber-1 >= 1;
      }
      
      public boolean isFirstPageAvailable() {
      return totalPages > 0 && pageNumber > 0;
      }
      
      public boolean isLastPageAvailable() {
      return totalPages > 0 && pageNumber < totalPages;
      }
      
      public int getNextPage() {
      if (isNextPageAvailable())
      return pageNumber+1;
         else
         return pageNumber;
      }
      
      public int getPreviousPage() {
      if (isPreviousPageAvailable())
         return pageNumber-1;
         else
         return pageNumber;
      }
      
      public int getFirstPage() {
      return 0;
      }
      
      public int getLastPage() {
      return totalPages;
      }
      
      public int getPageSize() {
      return this.pageSize;
      }
      
      public void setPageSize(int pageSize) {
      if (pageSize <= 0)
      pageSize = Constants.DEFAULT_MAX_PAGE_SIZE;
      this.pageSize = pageSize;
      }
      
      public int getPageNumber() {
      return this.pageNumber;
      }
      
      public void setPageNumber(int pageNumber) {
      if (pageNumber >= 0 && pageNumber <= this.totalPages) {
      this.pageNumber = pageNumber;
      } else {
      this.pageNumber = 0;
      }
         setFirstLoad(true);
      getCurrentPage();
      }
      
      public int getTotalPages() {
      return this.totalPages;
      }
      
      public int getTotalRecords() {
      return this.totalRecords;
      }
      
      public String getComponentName() {
      return this.componentName;
      }
      
      public void setComponentName(String componentName) {
      if (componentName == null || componentName.length() == 0 || "".equals(componentName))
      componentName = Constants.ENTITY_DATA_MODEL;
      this.componentName = componentName;
      }
      
      public DataModel getDataModel() {
      return dataModel;
      }
      
      public void setDataModel(DataModel dataModel) {
      this.dataModel = dataModel;
      }
      
      public boolean isFirstLoad() {
      return firstLoad;
      }
      
      public void setFirstLoad(boolean firstLoad) {
      this.firstLoad = firstLoad;
      }
      }
      



      <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                                   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
      
      <ui:composition xmlns="http://www.w3.org/1999/xhtml"
                      xmlns:s="http://jboss.com/products/seam/taglib"
                      xmlns:ui="http://java.sun.com/jsf/facelets"
                      xmlns:f="http://java.sun.com/jsf/core"
                      xmlns:h="http://java.sun.com/jsf/html"
                      xmlns:rich="http://richfaces.org/rich"
                      xmlns:a4j="http://richfaces.org/a4j"
                      template="/layout/template.xhtml">
                             
      <ui:define name="body">
             
      <h:panelGrid columns="1" frame="none" id="mainPanel"
              class="mainPanel" border="0">
          
          <h:messages globalOnly="true" styleClass="message" id="globalMessages"/>
          
          <h:form id="querySupervisorPercentToPlanReportSearch" styleClass="edit">
      
      <rich:panel headerClass="header-panel">
          
      <f:facet name="header">
               <h:outputText value="Supervisor Percent To Plan Search Parameters"/>
              </f:facet>
             
      <h:panelGrid columns="1" frame="none" id="searchPanel"
              class="mainPanel" border="0">
              
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Region</ui:define>
                      <h:selectOneMenu id="regionID" value="#{querySupervisorPercentToPlanReport.dropDownListings.regionID}" required="true">
                       <f:selectItems id="regionDropDownList" value="#{querySupervisorPercentToPlanReport.dropDownListings.regionDropDownList}" />
                          <a4j:support event="onchange" reRender="callcenterID,supervisorID" ajaxSingle="true"
                           action="#{querySupervisorPercentToPlanReport.dropDownListings.buildCallCenterDropDownList}"/>
                      </h:selectOneMenu>
      </s:decorate>
              
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Call Center</ui:define>
                      <h:selectOneMenu id="callcenterID" value="#{querySupervisorPercentToPlanReport.dropDownListings.callcenterID}" required="true"
                       disabled="#{querySupervisorPercentToPlanReport.dropDownListings.regionID == 0}">
                       <f:selectItems id="callCenterDropDownList" value="#{querySupervisorPercentToPlanReport.dropDownListings.callCenterDropDownList}" />
                          <a4j:support event="onchange" reRender="supervisorID" ajaxSingle="true"
                           action="#{querySupervisorPercentToPlanReport.dropDownListings.buildSupervisorDropDownList}"/>
                      </h:selectOneMenu>
                  </s:decorate>
              
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Supervisor</ui:define>
                      <h:selectOneMenu id="supervisorID" value="#{querySupervisorPercentToPlanReport.dropDownListings.supervisorID}" required="true"
                       disabled="#{querySupervisorPercentToPlanReport.dropDownListings.regionID == 0 || querySupervisorPercentToPlanReport.dropDownListings.callcenterID == 0}" >
                       <f:selectItems id="supervisorDropDownList" value="#{querySupervisorPercentToPlanReport.dropDownListings.supervisorDropDownList}" />
                      </h:selectOneMenu>
                  </s:decorate>
              
                  <s:decorate template="/layout/display.xhtml">
                      <ui:define name="label">Period</ui:define>
                      <h:selectOneMenu id="periodID" value="#{querySupervisorPercentToPlanReport.dropDownListings.periodID}" required="true">
                       <s:selectItems id="periodDropDownList" value="#{querySupervisorPercentToPlanReport.dropDownListings.periodDropDownList}"
                       var="list" itemValue="#{list.value}" label="#{list.label}" />
                      </h:selectOneMenu>
                  </s:decorate>
              
                  <s:decorate template="/layout/display.xhtml">
               <div class="actionButtons">
              <h:commandButton id="search" value="Search"
              action="#{querySupervisorPercentToPlanReport.generateResultQueryList}" />
               </div>
                  </s:decorate>
      
      <a4j:status>
      <f:facet name="start">
      <h:graphicImage value="/images/ajax_status_rotating_orange.gif"/>
      </f:facet>
      </a4j:status>
      
      </h:panelGrid>
      
              </rich:panel>
      
          </h:form>
      
          <br/>
          
      <rich:panel headerClass="header-panel"
           rendered="#{not empty querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.currentPage}" >
          
              <f:facet name="header">
              <h:outputText value="Consultant Product Mix Totals"/>
          </f:facet>
          
      <h:form id="queryConsultantSubSummaryReportListing" styleClass="edit">
          
           <div class="results" id="queryConsultantProdMixSubDetails" >
                     
           <rich:dataTable var="record" id="queryConsultantProdMixSubDetails"
      value="#{dmQuerySupervisorConsultantProductMixSubSummary}"
               rendered="#{not empty querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.currentPage}"
      onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
                   onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
      cellpadding="0" cellspacing="0"
      width="700" border="0"
               >
                 
      <f:facet name="header">
      <rich:columnGroup>
      <rich:column><h:outputText value="Consultant" styleClass="columnHeader"/></rich:column>
      <rich:column><h:outputText value="Product Mix" styleClass="columnHeader"/></rich:column>
      <rich:column><h:outputText value="Revenue" styleClass="columnHeader"/></rich:column>
      <!--
      <rich:column><h:outputText value="Units" styleClass="columnHeader"/></rich:column>
      <rich:column><h:outputText value="Revenue" styleClass="columnHeader"/></rich:column>
      <rich:column><h:outputText value="% to Revenue" styleClass="columnHeader"/></rich:column>
      -->
      </rich:columnGroup>
      </f:facet>
      
      <rich:column colspan="3">
                   <h:outputText value="#{record.summary.id.lastName}, #{record.summary.id.firstName}" />
                   </rich:column>
      
      <rich:subTable var="record2" value="#{record.details}"
      onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
                   onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" >
      
      <rich:column>
                   <rich:spacer />
                   <f:facet name="footer">
      <h:outputText value="Totals for #{record.summary.id.lastName}, #{record.summary.id.firstName}" />
                   </f:facet>
                   </rich:column>
      <rich:column>
                   <h:outputText value="#{record2.id.productMixDesc}" />
                   <f:facet name="footer">
      <rich:spacer />
                   </f:facet>
                   </rich:column>
      <!--
      <rich:column>
      <h:outputText value="#{record2.id.units}" >
      <f:convertNumber pattern="###,###,##0"/>
      </h:outputText>
                   <f:facet name="footer">
      <h:outputText value="#{record.summary.id.units}" >
      <f:convertNumber pattern="###,###,##0"/>
      </h:outputText>
                   </f:facet>
           </rich:column>
      -->
      <rich:column>
                   <h:outputText value="#{record2.id.revenue}" >
                   <f:convertNumber type="currency" currencySymbol="$" />
                   </h:outputText>
                   <f:facet name="footer">
      <h:outputText value="#{record.summary.id.revenue}" >
           <f:convertNumber type="currency" currencySymbol="$" />
               </h:outputText>
                   </f:facet>
      </rich:column>
      <!--
      <rich:column>
               <h:outputText value="#{record2.id.percentToRevenue}%" />
                   <f:facet name="footer">
                   <rich:spacer />
                   </f:facet>
                   </rich:column>
      -->
                   </rich:subTable>
                 
      <f:facet name="footer">
      <rich:columnGroup>
      <rich:column>
      <h:outputText value="Totals"/>
      </rich:column>
      <rich:column><rich:spacer/></rich:column>
      <!--
      <rich:column>
                   <h:outputText value="#{querySupervisorPercentToPlanReport.resultProductMixSummary.id.units}" >
      <f:convertNumber pattern="###,###,##0"/>
               </h:outputText>
      </rich:column>
      -->
      <rich:column>
      <h:outputText value="#{querySupervisorPercentToPlanReport.resultProductMixSummary.id.revenue}" >
               <f:convertNumber type="currency" currencySymbol="$" />
                   </h:outputText>
      </rich:column>
      <!--
      <rich:column><rich:spacer/></rich:column>
      -->
      </rich:columnGroup>
      </f:facet>
      
           </rich:dataTable>
      
      </div>
          
           <div class="tableControl">
      
      <h:outputText value="Page #{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.pageNumber + 1} of #{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.totalPages + 1}"
              rendered="#{not empty querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.currentPage}" />
            
               <s:link view="/queries/QuerySupervisorPercentToPlanReport.xhtml"
                   rendered="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.firstPageAvailable}"
                   value="#{messages.left}#{messages.left} First Page"
                       id="firstPage">
                 <f:param name="pageNumber" value="0"/>
               </s:link>
              
               <s:link view="/queries/QuerySupervisorPercentToPlanReport.xhtml"
                   rendered="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.previousPageAvailable}"
                      value="#{messages.left} Previous Page"
                        id="previousPage">
                   <f:param name="pageNumber"
                       value="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.previousPage}"/>
               </s:link>
              
               <s:link view="/queries/QuerySupervisorPercentToPlanReport.xhtml"
                   rendered="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.nextPageAvailable}"
                      value="Next Page #{messages.right}"
                         id="nextPage">
                   <f:param name="pageNumber"
                       value="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.nextPage}"/>
               </s:link>
              
               <s:link view="/queries/QuerySupervisorPercentToPlanReport.xhtml"
                   rendered="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.lastPageAvailable}"
                      value="Last Page #{messages.right}#{messages.right}"
                         id="lastPage">
                   <f:param name="pageNumber"
                       value="#{querySupervisorPercentToPlanReport.dmConsultantProductMixSubSummary.lastPage}"/>
               </s:link>
              
           </div>
      
           </h:form>
      
          </rich:panel>
      
          <br/>
           </rich:dataTable>
      
      </div>
      
           </h:form>
      
          </rich:panel>
      
      </h:panelGrid>
          
      </ui:define>
      
      </ui:composition>