You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by James Reynolds <Ja...@intermountainmail.org> on 2006/02/02 19:23:59 UTC

Trouble with Sorting DataTable

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="#{RFPdetail.loadRFP}">
        <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.jav
a:39)
 at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.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(UnaryOperatorExpr
ession.java:167)
 at
com.sun.faces.el.impl.ExpressionEvaluatorImpl.evaluate(ExpressionEvaluat
orImpl.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:31
5)
 at
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getChildren(HtmlBas
icRenderer.java:460)
 at
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(Htm
lBasicRenderer.java:437)
 at
com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRen
derer.java:130)
 at
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.jav
a:701)
 at
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(Htm
lBasicRenderer.java:435)
 at
com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRende
rer.java:233)
 at
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.jav
a: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.ap
ache.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.admi
n.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.ja
va: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(Applica
tionFilterChain.java:252)
 at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:173)
 at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatc
her.java:672)
 at
org.apache.catalina.core.ApplicationDispatcher.processRequest(Applicatio
nDispatcher.java:463)
 at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDisp
atcher.java:398)
 at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispat
cher.java:301)
 at
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.j
ava:322)
 at
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.jav
a: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(Applica
tionFilterChain.java:252)
 at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:173)
 at
org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(Extensi
onsFilter.java:122)
 at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applica
tionFilterChain.java:202)
 at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilt
erChain.java:173)
 at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValv
e.java:213)
 at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValv
e.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:1
48)
 at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:86
9)
 at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.proc
essConnection(Http11BaseProtocol.java:667)
 at
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint
.java:527)
 at
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollow
erWorkerThread.java:80)
 at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool
.java:684)
 at java.lang.Thread.run(Thread.java:595)