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">
...
<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: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>
<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>
<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
</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 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();
}
}
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;
}
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;
}
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
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;
public abstract class SortableList {
private String _sort;
private boolean _ascending;
protected SortableList(String
defaultSortColumn)
{
_sort = defaultSortColumn;
_ascending = isDefaultAscending(defaultSortColumn);
}
{
_sort = defaultSortColumn;
_ascending = isDefaultAscending(defaultSortColumn);
}
/**
* Sort the list.
*/
protected abstract void sort(String column, boolean ascending);
* 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);
* 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);
}
{
//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;
}
{
return _sort;
}
public void setSort(String sort)
{
_sort = sort;
}
{
_sort = sort;
}
public boolean isAscending()
{
return _ascending;
}
{
return _ascending;
}
public void setAscending(boolean
ascending)
{
_ascending = ascending;
}
}
End SortableList.java
{
_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)
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)

