package
com.bluelotussoftware.example.richfaces;
import
com.bluelotussoftware.example.richfaces.model.Customer;
import
com.bluelotussoftware.example.richfaces.ssb.CustomerFacade;
import
com.bluelotussoftware.jsf.utils.JSFUtils;
import
java.io.Serializable;
import
java.util.ArrayList;
import
java.util.Comparator;
import
java.util.List;
import
javax.annotation.PostConstruct;
import
javax.ejb.EJB;
import
javax.enterprise.context.SessionScoped;
import
javax.faces.application.Application;
import
javax.faces.component.html.HtmlOutputText;
import
javax.faces.context.FacesContext;
import
javax.inject.Named;
import
org.richfaces.component.SortOrder;
import
org.richfaces.component.UIColumn;
import
org.richfaces.component.UIColumnGroup;
import
org.richfaces.component.UICommandLink;
import
org.richfaces.component.UIDataTable;
/**
* <p>
Proof of Concept #1 Programmatic RichFaces data table
* <code><rich:dataTable/></code> with server side sorting</p>
*
* <p>
<strong>Note:</strong> Please note that the scope must be set to session
* for the object holding a reference to the bound datatable.</p>
*
* @author John Yeary
* @version 1.0
*/
@Named
@SessionScoped
public
class
DataTable1
implements
Serializable {
private
static
final
long
serialVersionUID = 3733919546663290317L;
private
List<customer> customers;
private
SortOrder nameSortOrder = SortOrder.unsorted;
private
SortOrder creditSortOrder = SortOrder.unsorted;
private
SortOrder phoneSortOrder = SortOrder.unsorted;
@EJB
private
CustomerFacade cf;
private
UIDataTable dataTable;
public
DataTable1() {
customers =
new
ArrayList<customer>();
}
@PostConstruct
private
void
init() {
customers.addAll(cf.findAll());
Class<?>[] klazz =
new
Class<?>[]{};
Application application = FacesContext.getCurrentInstance().getApplication();
dataTable = (UIDataTable) application.createComponent(UIDataTable.COMPONENT_TYPE);
dataTable.setVar(
"customer"
);
dataTable.setValue(customers);
UICommandLink clink = (UICommandLink) application.createComponent(UICommandLink.COMPONENT_TYPE);
clink.setValueExpression(
"value"
, JSFUtils.createValueExpression(
"#{dataTable1.customerColumnHeader}"
, String.
class
));
clink.setActionExpression(JSFUtils.createMethodExpression(
"#{dataTable1.nsort()}"
, String.
class
, klazz));
clink.setRender(
"dataTable"
);
UICommandLink clink1 = (UICommandLink) application.createComponent(UICommandLink.COMPONENT_TYPE);
clink1.setValue(
"Phone"
);
clink1.setActionExpression(JSFUtils.createMethodExpression(
"#{dataTable1.psort()}"
, String.
class
, klazz));
clink1.setRender(
"dataTable"
);
UICommandLink clink2 = (UICommandLink) application.createComponent(UICommandLink.COMPONENT_TYPE);
clink2.setValue(
"Credit Limit"
);
clink2.setActionExpression(JSFUtils.createMethodExpression(
"#{dataTable1.csort()}"
, String.
class
, klazz));
clink2.setRender(
"dataTable"
);
HtmlOutputText htmlOutputText = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
htmlOutputText.setValueExpression(
"value"
, JSFUtils.createValueExpression(
"#{customer.name}"
, String.
class
));
HtmlOutputText htmlOutputText1 = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
htmlOutputText1.setValueExpression(
"value"
, JSFUtils.createValueExpression(
"#{customer.phone}"
, String.
class
));
HtmlOutputText htmlOutputText2 = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
htmlOutputText2.setValueExpression(
"value"
, JSFUtils.createValueExpression(
"#{dataTable1.format(customer.creditLimit)}"
, String.
class
));
htmlOutputText2.setValueExpression(
"rendered"
, JSFUtils.createValueExpression(
"#{customer.creditLimit gt 25000}"
, Boolean.
class
));
UIColumn column = (UIColumn) application.createComponent(UIColumn.COMPONENT_TYPE);
column.setValueExpression(
"sortBy"
, JSFUtils.createValueExpression(
"#{customer.name}"
, String.
class
));
column.setValueExpression(
"sortOrder"
, JSFUtils.createValueExpression(
"#{dataTable1.nameSortOrder}"
, SortOrder.
class
));
UIColumn column1 = (UIColumn) application.createComponent(UIColumn.COMPONENT_TYPE);
column1.setValueExpression(
"sortBy"
, JSFUtils.createValueExpression(
"#{customer.phone}"
, String.
class
));
column1.setValueExpression(
"sortOrder"
, JSFUtils.createValueExpression(
"#{dataTable1.phoneSortOrder}"
, SortOrder.
class
));
column1.setValueExpression(
"comparator"
, JSFUtils.createValueExpression(
"#{dataTable1.phoneComparator}"
, Comparator.
class
));
UIColumn column2 = (UIColumn) application.createComponent(UIColumn.COMPONENT_TYPE);
column2.setValueExpression(
"sortBy"
, JSFUtils.createValueExpression(
"#{customer.creditLimit}"
, String.
class
));
column2.setValueExpression(
"sortOrder"
, JSFUtils.createValueExpression(
"#{dataTable1.creditSortOrder}"
, SortOrder.
class
));
column2.setValueExpression(
"comparator"
, JSFUtils.createValueExpression(
"#{dataTable1.creditComparator}"
, Comparator.
class
));
column.setHeader(clink);
column.getChildren().add(htmlOutputText);
column1.setHeader(clink1);
column1.getChildren().add(htmlOutputText1);
column2.setHeader(clink2);
column2.getChildren().add(htmlOutputText2);
UIColumn hcolumn = (UIColumn) application.createComponent(UIColumn.COMPONENT_TYPE);
hcolumn.setColspan(
3
);
HtmlOutputText columnText = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
columnText.setValue(
"Customer Information"
);
hcolumn.getChildren().add(columnText);
UIColumnGroup columnGroup = (UIColumnGroup) application.createComponent(UIColumnGroup.COMPONENT_TYPE);
columnGroup.getChildren().add(hcolumn);
dataTable.setHeader(columnGroup);
dataTable.getChildren().add(column);
dataTable.getChildren().add(column1);
dataTable.getChildren().add(column2);
}
public
UIDataTable getDataTable() {
return
dataTable;
}
public
void
setDataTable(UIDataTable dataTable) {
this
.dataTable = dataTable;
}
public
List<customer> getCustomers() {
return
customers;
}
public
SortOrder getNameSortOrder() {
return
nameSortOrder;
}
public
SortOrder getCreditSortOrder() {
return
creditSortOrder;
}
public
SortOrder getPhoneSortOrder() {
return
phoneSortOrder;
}
/**
* Customer name sorting enumeration "three position switch":
* default (unsorted), ascending, and descending.
*/
public
void
nsort() {
creditSortOrder = SortOrder.unsorted;
phoneSortOrder = SortOrder.unsorted;
switch
(nameSortOrder) {
case
unsorted: {
nameSortOrder = SortOrder.ascending;
break
;
}
case
ascending: {
nameSortOrder = SortOrder.descending;
break
;
}
case
descending: {
nameSortOrder = SortOrder.unsorted;
break
;
}
}
}
/**
* Credit limit sorting enumeration "three position switch":
* default (unsorted), ascending, and descending.
*/
public
void
csort() {
nameSortOrder = SortOrder.unsorted;
phoneSortOrder = SortOrder.unsorted;
switch
(creditSortOrder) {
case
unsorted: {
creditSortOrder = SortOrder.ascending;
break
;
}
case
ascending: {
creditSortOrder = SortOrder.descending;
break
;
}
case
descending: {
creditSortOrder = SortOrder.unsorted;
break
;
}
}
}
/**
* Phone sorting enumeration "three position switch": default
* (unsorted), ascending, and descending.
*/
public
void
psort() {
nameSortOrder = SortOrder.unsorted;
creditSortOrder = SortOrder.unsorted;
switch
(phoneSortOrder) {
case
unsorted: {
phoneSortOrder = SortOrder.ascending;
break
;
}
case
ascending: {
phoneSortOrder = SortOrder.descending;
break
;
}
case
descending: {
phoneSortOrder = SortOrder.unsorted;
break
;
}
}
}
public
Comparator<customer> getPhoneComparator() {
return
new
Comparator<customer>() {
@Override
public
int
compare(Customer o1, Customer o2) {
return
o1.getPhone().compareTo(o2.getPhone());
}
};
}
public
Comparator<customer> getCreditComparator() {
return
new
Comparator<customer>() {
@Override
public
int
compare(Customer o1, Customer o2) {
return
o1.getCreditLimit().compareTo(o2.getCreditLimit());
}
};
}
/**
* This method returns the customer name header with the specified sort
* order based on the current {@link SortOrder}.
*
* @return customer name header with the specified sort order.
*/
public
String getCustomerColumnHeader() {
switch
(nameSortOrder) {
case
unsorted: {
return
"Customer Name"
;
}
default
: {
return
"Customer Name ("
+ nameSortOrder +
")"
;
}
}
}
/**
* Generates custom formatted USD currency value based on {@code Integer}.
*
* @param value The value to be formatted.
* @return $USD formatted value.
*/
public
String format(Integer value) {
return
String.format(
"$ %1$,d"
, value);
}
}