Lets trace from the view itself:
In the first row of a dataTable we can have a row entries with the text field that will take the user input string that act as the filter string expression.
<rich:column >
<f:facet name="header">
<h:inputText
value="#{reviewReportController.filter.expForAppraisee}"
id="appraisee" onkeypress="updateAppraisee(event);"/>
</f:facet>
<h:outputText value="#{reviewData.appraisee}" />
</rich:column>
Now we need to define the updateAppraisee(evt) named javascript method as shown below:
function updateAppraisee(e){
//Unless the user presses the enter key donot process the action
if (e.keyCode != 13) {return false}
else{
showProcessingPanel();
fireAjaxForAppraisee($('myForm:reviewReportTable:appraisee').value);
//fire Ajax Event on the inputtext field defined in the above part
return true;
}
}
Now we need to define the method fireAjaxForAppraisee within the <a4j:Form..> as shown below:
<a4j:form>
<a4j:jsFunction name="fireAjaxForAppraisee"
action="#{reviewReportController.filterAppraisee}"
oncomplete="hideProcessingPanel();">
<a4j:actionparam name="param1"
assignTo="#{reviewReportController.filter.expForAppraisee}" />
</a4j:jsFunction>
</a4j:form>
Here:
action:defines which method to be called on the backing bean;
assignTo:defines which input field to be considered for the string input
showProcessingPanel,hideProcessingPanel-js methods used to show/hide the processing panels
param1:the parameter to be sent --here event itself; to the js method
Now lets see what is the actual logic inside the backing bean.
The main method triggered inside the backing bean is as shown below:
public boolean filterAppraisee() {
List reviewFilteredList=this.filterStringExp(getRateAndDateFilteredList());
return true;
}
public List filterStringExp(List iterationList) {
//filter on the basis of review
reviewReportListForDisplay=new ArrayList();
if (this.filter.getExpForReview().trim().length()>0) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.getReview().toLowerCase().matches(".*"+this.filter.getExpForReview().toLowerCase()+".*")) {
reviewReportDTO.setFilteredOut(true);
}
}
}
//filter on the basis of designation
if (this.filter.getExpForDesignation().trim().length()>0) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.getDesignation().toLowerCase().matches(".*"+this.filter.getExpForDesignation().toLowerCase()+".*")) {
reviewReportDTO.setFilteredOut(true);
}
}
}
//filter on the basis of subdepartment
if (this.filter.getExpForSubDepartment().trim().length()>0) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.getSubdepartment().toLowerCase().matches(".*"+this.filter.getExpForSubDepartment().toLowerCase()+".*")) {
reviewReportDTO.setFilteredOut(true);
}
}
}
//filter on the basis of department
if (this.filter.getExpForDepartment().trim().length()>0) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.getDepartment().toLowerCase().matches(".*"+this.filter.getExpForDepartment().toLowerCase()+".*")) {
reviewReportDTO.setFilteredOut(true);
}
}
}
//filter on the basis of appriasee
if (this.filter.getExpForAppraisee().trim().length()>0) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.getAppraisee().toLowerCase().matches(".*"+this.filter.getExpForAppraisee().toLowerCase()+".*")) {
reviewReportDTO.setFilteredOut(true);
}
}
}
//filter on the basis of appriasee
if (this.filter.getExpForAppraiser().trim().length()>0) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.getAppraiser().toLowerCase().matches(".*"+this.filter.getExpForAppraiser().toLowerCase()+".*")) {
reviewReportDTO.setFilteredOut(true);
}
}
}
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
if(!reviewReportDTO.isFilteredOut()){
reviewReportListForDisplay.add(reviewReportDTO);
}
}
return reviewReportListForDisplay;
}
Lets examine the reviewReportDTO bean.
package ......
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.d2.hrm.common.api.core.DTO;
/**
*
* FileName:ReviewReportDTO.java
* Version:1.0
* @author:Ramesh Raj Baral
* @since:Nov 3, 2010
*
*/
/**
* Description:
* <li>this class resembles the report instance for review only</li>
*/
@Entity
@Table(name="...._review_report")
public class ReviewReportDTO implements DTO {
private Long id;
private String appraiser;
private String appraisee;
private String department;
private String subdepartment;
private double rating;
private String review;
private Date reviewdate;
private String appraiserEmail;
private String appraiseeEmail;
private String designation;
private boolean filteredOut=false;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="reviewSeq")
@SequenceGenerator(name="reviewSeq",sequenceName="sq_d2hrm_review_report",allocationSize=1)
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "appraiser")
public String getAppraiser() {
return appraiser;
}
public void setAppraiser(String appraiser) {
this.appraiser = appraiser;
}
@Column(name = "appraisee")
public String getAppraisee() {
return appraisee;
}
public void setAppraisee(String appraisee) {
this.appraisee = appraisee;
}
@Column(name = "department")
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Column(name = "subdepartment")
public String getSubdepartment() {
return subdepartment;
}
public void setSubdepartment(String subdepartment) {
this.subdepartment = subdepartment;
}
@Column(name = "rating")
public double getRating() {
return rating;
}
public void setRating(double rating) {
this.rating = rating;
}
@Column(name = "reviewdate")
public Date getReviewdate() {
return reviewdate;
}
public void setReviewdate(Date reviewdate) {
this.reviewdate = reviewdate;
}
@Column(name = "designation")
public String getDesignation() {
return designation;
}
public void setDesignation(String designation) {
this.designation = designation;
}
@Column(name = "review")
public String getReview() {
return review;
}
public void setReview(String review) {
this.review = review;
}
@Column(name = "appraiser_email")
public String getAppraiserEmail() {
return appraiserEmail;
}
public void setAppraiserEmail(String appraiserEmail) {
this.appraiserEmail = appraiserEmail;
}
@Column(name = "appraisee_email")
public String getAppraiseeEmail() {
return appraiseeEmail;
}
public void setAppraiseeEmail(String appraiseeEmail) {
this.appraiseeEmail = appraiseeEmail;
}
@Override
public String toString() {
/**
* headerName:id
*****************headerName:appraisee
*****************headerName:appraiseeemail
*****************headerName:appraiser
*****************headerName:appraiseremail
*****************headerName:design
*****************headerName:dept
*****************headerName:subdept
*****************headerName:rating
*****************headerName:review
*****************headerName:reviewdate
*/
String a="id="+getId()+",appraisee="+getAppraisee()+",appraiseeemail="+getAppraiseeEmail()+",appraiser="+getAppraiser()+",appraiseremail="+getAppraiserEmail()+",design="+getDesignation()+",dept="+getDepartment()+",subdept="+getSubdepartment()+",rating="+getRating()+",review="+getReview()+",reviewdate="+getReviewdate().toString().split(" ")[0];
return a;
}
@Transient
public boolean isFilteredOut() {
return filteredOut;
}
public void setFilteredOut(boolean filteredOut) {
this.filteredOut = filteredOut;
}
}
The ultimate returning object of the filter method is the list that is assigned to the dataTable on our view.Based on this list the contents of the dataTable on view is dynamically changed.
I used this approach to filter numbers (including the symbol expressions:<,<=,>,>=,=,-) and the date with the fore mentioned expressions.
Now in advance lets examine the numberfiltering method:
In Controller we have a similar method for filtering numeric expression:
public boolean filterRate(){
List rateFilteredList=this.filterRateExp(reviewReportList);
return true;
}
public List filterRateExp(List iterationList) {
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
reviewReportDTO.setFilteredOut(false);
}
if (this.filter.getExpForRating().length()==0) {
this.setReviewReportListForDisplay(iterationList);
return reviewReportListForDisplay;
}
else{
List filterElements=ServiceUtil.getFilterNumberExpression(this.filter.getExpForRating());
reviewReportListForDisplay = new ArrayList();
if(filterElements!=null && filterElements.size()>0){
FilterElementDTO filterSymbol=(FilterElementDTO)filterElements.get(0);
FilterElementDTO filterFirstValue=(FilterElementDTO)filterElements.get(1);
if(filterElements.size()==2)//has <,<=,>,>=,= and a number
{
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReport=(ReviewReportDTO)iterationList.get(i);
if(filterSymbol.getElement().equals("<")){
if(reviewReport.getRating()< Float.parseFloat(filterFirstValue.getElement())){
//System.out.println("************inside if of case 1:"+reviewReportListForDisplay.size()+"...contains:"+reviewReport.getReviewdate()+".."+reviewReport.getRating()+".."+reviewReportListForDisplay.contains(reviewReport));
if(!reviewReportListForDisplay.contains(reviewReport)){
reviewReportListForDisplay.add(reviewReport);
}
}
else{
//System.out.println("************inside else of case 1:"+reviewReportListForDisplay.size()+".....contains:"+reviewReport.getReviewdate()+".."+reviewReport.getRating()+"...."+reviewReportListForDisplay.contains(reviewReport));
if(reviewReportListForDisplay.size()>0 && reviewReportListForDisplay.contains(reviewReport)){
reviewReportListForDisplay.remove(reviewReport);
}
}
}
else if(filterSymbol.getElement().equals(">")){
if(reviewReport.getRating()> Float.parseFloat(filterFirstValue.getElement())){
if(!reviewReportListForDisplay.contains(reviewReport))
reviewReportListForDisplay.add(reviewReport);
}
else{
if(reviewReportListForDisplay.size()>0)
reviewReportListForDisplay.remove(reviewReport);
}
}
else if(filterSymbol.getElement().equals("<=")){
if(reviewReport.getRating()<= Float.parseFloat(filterFirstValue.getElement())){
if(!reviewReportListForDisplay.contains(reviewReport))
reviewReportListForDisplay.add(reviewReport);
}
else{
if(reviewReportListForDisplay.size()>0)
reviewReportListForDisplay.remove(reviewReport);
}
}
else if(filterSymbol.getElement().equals(">=")){
if(reviewReport.getRating()>= Float.parseFloat(filterFirstValue.getElement())){
if(!reviewReportListForDisplay.contains(reviewReport))
reviewReportListForDisplay.add(reviewReport);
}
else{
if(reviewReportListForDisplay.size()>0)
reviewReportListForDisplay.remove(reviewReport);
}
}
else if(filterSymbol.getElement().equals("=")){
if(reviewReport.getRating()== Float.parseFloat(filterFirstValue.getElement())){
if(!reviewReportListForDisplay.contains(reviewReport))
reviewReportListForDisplay.add(reviewReport);
}
else{
if(reviewReportListForDisplay.size()>0)
reviewReportListForDisplay.remove(reviewReport);
}
}
else{
System.out.println("********diff symbol encountered:"+filterSymbol.getElement()+"...");
}
}
}
else if(filterElements.size()==3){
/**
* has a range of number a-b
*/
FilterElementDTO filterSecondValue=(FilterElementDTO)filterElements.get(2);
if(filterSymbol.getElement().equals("-")){
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReport=(ReviewReportDTO)iterationList.get(i);
//System.out.println("*****range comparision:"+Float.parseFloat(reviewReport.getRating())+".."+Float.parseFloat(filterFirstValue.getElement())+".."+Float.parseFloat(filterSecondValue.getElement()));
if(reviewReport.getRating()>= Float.parseFloat(filterFirstValue.getElement()) &&(reviewReport.getRating())<= Float.parseFloat(filterSecondValue.getElement())){
reviewReportListForDisplay.add(reviewReport);
}else{
if(reviewReportListForDisplay.size()>0)
reviewReportListForDisplay.remove(reviewReport);
}
}
}
//System.out.println("valid search returning true");
this.setReviewReportListForDisplay(reviewReportListForDisplay);
}
}
else{
/**
* search for the string pattern
*/
reviewReportListForDisplay=new ArrayList();
for(int i=0;i<iterationList.size();i++){
ReviewReportDTO reviewReportDTO=(ReviewReportDTO)iterationList.get(i);
//System.out.println("*****range comparision:"+Float.parseFloat(reviewReport.getRating())+".."+Float.parseFloat(filterFirstValue.getElement())+".."+Float.parseFloat(filterSecondValue.getElement()));
String rating=""+reviewReportDTO.getRating();
if(rating.startsWith(this.filter.getExpForRating())){
reviewReportListForDisplay.add(reviewReportDTO);
}else{
if(reviewReportListForDisplay.size()>0)
reviewReportListForDisplay.remove(reviewReportDTO);
}
}
//System.out.println("invalid serch expression returning false");
}
}
return reviewReportListForDisplay;
}
Here ServiceUtil.getFilterNumberExpression(this.filter.getExpForRating()); is a utility method used to validate the input string to accept the input that satisfies the given regular expression.The method goes here:
/**
*
* Description:
* <li>given the filter string,it identifies the symbols encountered,their types,position</li>
* <li>and returns the list of valid FilterElementDTO</li>
* getFilterNumberExpression
* ServiceUtil
* @param exp
* @returns <li>list of FilterElementDTO if satisfies the condition else returns the empty list</li>
* List
* @author:Ramesh Raj Baral
* @since:Nov 18, 2010
*
*/
public static List getFilterNumberExpression(String exp){
List filterElementList = new ArrayList();
String value = "";
int symbolIndex = -1;
String[] validSymbols = { "<=", ">=", "=", "<", ">" };
String patternForRange = "(\\d{1,2})(.\\d{0,2})(-{1})(\\d{1,2})(.\\d{0,2})";// for
// now
// 1.0-15.0
// works
String patternString = "";
Pattern p;
Matcher m;
Matcher m1;
FilterElementDTO filterElement = new FilterElementDTO();
for (int i = 0; i < validSymbols.length; i++) {
/**
* pattern for elements of validSymbols array
*/
patternString = "(" + validSymbols[i] + ")(\\d{1,2})(.\\d{0,1})";
p = Pattern.compile(patternString);
m = p.matcher(exp);
m1=p.matcher(exp+".");
//System.out.println("************comparing:" + exp + "..with pattern:" + validSymbols[i] + ".....matches:" + m.matches());
if (m.matches() ||m1.matches()) {
symbolIndex = i;
value = exp.substring(validSymbols[i].length(), exp.length());
// add symbol
filterElement = new FilterElementDTO();
filterElement.setElement(exp.substring(0, validSymbols[i]
.length()));
filterElement.setElementType("string");
filterElement.setValid(true);
filterElement.setPosition(0);
filterElementList.add(filterElement);
// add number
filterElement = new FilterElementDTO();
filterElement.setElement(value);
filterElement.setElementType("int");
filterElement.setValid(true);
filterElement.setPosition(0);
filterElementList.add(filterElement);
break;
}
}
// if no match found then search for range pattern
if (symbolIndex < 0) {
p = Pattern.compile(patternForRange);
m=p.matcher(exp);
String periodAppendedExp=exp;
//if search expression has a range symbol(-) then append the period operator to it
if(exp.indexOf("-")>-1){
int rangeSymbol=exp.indexOf("-");
String firstNumber=exp.substring(0,rangeSymbol);
if(firstNumber.indexOf(".")<-0)
firstNumber+=".0";
String secondNumber=exp.substring(rangeSymbol,exp.length());
if(secondNumber.indexOf(".")<-0)
secondNumber+=".0";
periodAppendedExp=firstNumber+secondNumber;
//System.out.println("******************comparing for range:"+exp+"..firstnumber:"+firstNumber+"...second:"+secondNumber);
}
m1=p.matcher(periodAppendedExp);
if (m.matches() ||m1.matches()) {
// matched for range pattern,should have three elements in the
// form n.k-m.l
filterElementList = new ArrayList();
String[] values = exp.split("-");
// add the symbol
filterElement = new FilterElementDTO();
filterElement.setElement("-");
filterElement.setElementType("string");
filterElement.setValid(true);
filterElement.setPosition(0);
filterElementList.add(filterElement);
// add first number
filterElement = new FilterElementDTO();
filterElement.setElement(values[0]);
filterElement.setElementType("int");
filterElement.setValid(true);
filterElement.setPosition(0);
filterElementList.add(filterElement);
// add the second number
filterElement = new FilterElementDTO();
filterElement.setElement(values[1]);
filterElement.setElementType("int");
filterElement.setValid(true);
filterElement.setPosition(0);
filterElementList.add(filterElement);
}
}
return filterElementList;
}
The filterElement is simply a pojo with following structure:
package .....
import java.util.ArrayList;
import java.util.List;
/**
*
* FileName:FilterElementDTO.java
* Version:1.0
* @author:Ramesh Raj Baral
* @since:Nov 18, 2010
* Description:
* <li>represents filter expression used in reporting module</li>
* <li>expression can be combination of symbols and values(number or date)</li>
*
*/
public class FilterElementDTO implements DTO {
private String element;
private String elementType;
private int position;
private boolean valid;
public String getElement() {
return element;
}
public void setElement(String element) {
this.element = element;
}
public String getElementType() {
return elementType;
}
public void setElementType(String elementType) {
this.elementType = elementType;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
}
Thanks, Ramesh. |
No comments:
Post a Comment