Hello all,
 
I'm attempting to create a sortable dataTable based on the simpleCarList example in the source code. The dataTable builds correctly, but it just won't sort for me.  I've read through the similar posts on the mailing list, but I can't see anything significantly different from what I'm doing (other than property names).  One curious thing is that the sorting arrow (of the commandSortHeader) only show up in my first column.  I hope one of the many accomplished programmers on this list can point out what I'm missing.  Here's my code so far:
 
JSP:
...
<h:form>
  <x:dataTable styleClass="standardTable"
         var="data"
         rowClasses="evenrow, oddrow"
         value="#{RfpList.rfps}"
         sortColumn="#{RfpList.sort}"
         sortAscending="#{RfpList.ascending}"
         preserveDataModel="true"
         preserveSort="true">
 
    <f:facet name="header">
      <h:outputText value="Table Header"/>
    </f:facet>
 
    <h:column>
      <f:facet name="header">
        <x:commandSortHeader columnName="title" arrow="true">
          <h:outputText value="Title"/>
        </x:commandSortHeader>
      </f:facet>
      <h:commandLink action="">
        <h:outputText value="#{data.title}"/>
        <f:param name="rfpId" value="#{data.rfpID}"/>
      </h:commandLink>
    </h:column>
 
    <h:column>
      <f:facet name="header">
        <x:commandSortHeader columnName="closeDate" arrow="true">
          <h:outputText value="Close Date"/>
        </x:commandSortHeader>
      </f:facet>
      <h:outputText value="#{data.closeDate}"/>
    </h:column>
 
  </x:dataTable>
</h:form>
...         
End JSP
 
SortableRfpList.java:
public class SortableRfpList extends SortableList {
    dbConnectionInfo db = new dbConnectionInfo();
    private List<Rfp> _rfps;
    String allRfps = "Select * from " + db.getOracleOwner() + ".RFP";
 
    public SortableRfpList() {
        super("title");
        try {
            Connection conn = db.getConnection();
            PreparedStatement ps = conn.prepareStatement(allRfps);
            ResultSet rs = ps.executeQuery();
            _rfps = new ArrayList<Rfp>();
            while (rs.next()) {
                _rfps.add(new Rfp(rs.getInt("ID"), rs.getString("title"), rs.getDate("end_date")));
            }
        } catch (SQLException sqle) {
            System.out.println("Sql exception in constructor: "+ sqle.getMessage());
            sqle.printStackTrace();
        } catch (Exception e){
            System.out.println("Exception in constructor: " + e.getMessage());
            e.printStackTrace();
        }
    }
 
    public List getRfps(){
        try{
        sort(getSort(), isAscending());
        } catch (Exception e){
            System.out.println("problem in getRfps: " +e.getMessage());
            e.printStackTrace();
        }
        return _rfps;
    }
 
    protected boolean isDefaultAscending(String sortColumn){
        return true;
    }
 
    protected void sort(final String column, final boolean ascending){
        Comparator<Rfp> comparator = new Comparator(){
            public int compare(Object o1, Object o2){
                Rfp rfp1 = (Rfp)o1;
                Rfp rfp2 = (Rfp)o2;
                if (column == null) {
                    return 0;
                }
                if (column.equals("title")){
                    return ascending ? rfp1.getTitle().compareTo(rfp2.getTitle()):
                            rfp2.getTitle().compareTo((rfp1.getTitle()));
                } else if (column.equals("closeDate")) {
                    return ascending ? rfp1.getCloseDate().compareTo(rfp2.getCloseDate()):
                            rfp2.getCloseDate().compareTo((rfp1.getCloseDate()));
                }
                else return 0;
            }
        };
        Collections.sort(_rfps, comparator);
    }
}
End SortableRfpList.java
 
SortableList.java:
public abstract class SortableList {
    private String _sort;
    private boolean _ascending;
 
    protected SortableList(String defaultSortColumn)
    {
        _sort = defaultSortColumn;
        _ascending = isDefaultAscending(defaultSortColumn);
    }
 
    /**
     * Sort the list.
     */
    protected abstract void sort(String column, boolean ascending);
 
    /**
     * Is the default sort direction for the given column "ascending" ?
     */
    protected abstract boolean isDefaultAscending(String sortColumn);
 

    public void sort(String sortColumn)
    {
        if (sortColumn == null)
        {
            throw new IllegalArgumentException("Argument sortColumn must not be null.");
        }
 
        if (_sort.equals(sortColumn))
        {
            //current sort equals new sortColumn -> reverse sort order
            _ascending = !_ascending;
        }
        else
        {
            //sort new column in default direction
            _sort = sortColumn;
            _ascending = isDefaultAscending(_sort);
        }
 
        sort(_sort, _ascending);
    }
 
    public String getSort()
    {
        return _sort;
    }
 
    public void setSort(String sort)
    {
        _sort = sort;
    }
 
    public boolean isAscending()
    {
        return _ascending;
    }
 
    public void setAscending(boolean ascending)
    {
        _ascending = ascending;
    }
}
End SortableList.java
 

This is the Exception that is thrown in the getRfps() method of SortableRfpList.java
 
java.lang.NullPointerException
 at java.lang.String.compareTo(String.java:997)
 at npp.admin.SortableRfpList$1.compare(SortableRfpList.java:69)
 at java.util.Arrays.mergeSort(Arrays.java:1284)
 at java.util.Arrays.mergeSort(Arrays.java:1296)
 at java.util.Arrays.sort(Arrays.java:1223)
 at java.util.Collections.sort(Collections.java:159)
 at npp.admin.SortableRfpList.sort(SortableRfpList.java:78)
 at npp.admin.SortableRfpList.getRfps(SortableRfpList.java:48)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at com.sun.faces.el.PropertyResolverImpl.getValue(PropertyResolverImpl.java:79)
 at com.sun.faces.el.impl.ArraySuffix.evaluate(ArraySuffix.java:167)
 at com.sun.faces.el.impl.ComplexValue.evaluate(ComplexValue.java:151)
 at com.sun.faces.el.impl.UnaryOperatorExpression.evaluate(UnaryOperatorExpression.java:167)
 at com.sun.faces.el.impl.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluatorImpl.java:243)
 at com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:173)
 at com.sun.faces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:154)
 at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:315)
 at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getChildren(HtmlBasicRenderer.java:460)
 at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:437)
 at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:130)
 at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:701)
 at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:435)
 at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:233)
 at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:701)
 at javax.faces.webapp.UIComponentTag.encodeChildren(UIComponentTag.java:607)
 at javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:544)
 at com.sun.faces.taglib.html_basic.PanelGridTag.doEndTag(PanelGridTag.java:460)
 at org.apache.jsp.admin.rfp.pendingRFPs_jsp._jspx_meth_h_panelGrid_0(org.apache.jsp.admin.rfp.pendingRFPs_jsp:266)
 at org.apache.jsp.admin.rfp.pendingRFPs_jsp._jspx_meth_f_view_0(org.apache.jsp.admin.rfp.pendingRFPs_jsp:174)
 at org.apache.jsp.admin.rfp.pendingRFPs_jsp._jspService(org.apache.jsp.admin.rfp.pendingRFPs_jsp:121)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:463)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:398)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
 at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:322)
 at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:130)
 at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
 at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
 at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
 at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:667)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
 at java.lang.Thread.run(Thread.java:595)

Reply via email to