I have a column displaying author name and a command link "Show Documents". I want to expand the row on click of Show Documents command Link as happens on clicking detailStamp facet icon.
Here comes the JSFF code:
<af:table var="row" rowBandingInterval="0" id="rohitT"
value="#{pageFlowScope.parseData.AList}" rowSelection="multiple"
binding="#{pageFlowScope.parseData.dataTable}"
disclosedRowKeys="#{pageFlowScope.parseData.disclosedKeys}">
<af:column sortable="false" headerText="Author" id="c3">
<af:outputText value="#{row.author}" id="ot5"/>
<af:commandLink text="Show Documents" id="sd"
actionListener="#{pageFlowScope.parseData.prepareLOV}" partialSubmit="true" >
</af:commandLink>
<af:outputText value="Disclosed Key::#{pageFlowScope.parseData.disclosedKeys}"
id="ot6"/>
</af:column>
<af:column sortable="false" headerText="Subject area" id="c2">
<af:outputText value="#{row.subjectArea}" id="ot4"/>
</af:column>
<af:column sortable="false" headerText="Select" id="c1">
<af:selectBooleanCheckbox id="sbc1" selected="false" autoSubmit="true"
disabled="#{pageFlowScope.optionSelected ne 'Default' and pageFlowScope.optionSelected ne 'One'}" valueChangeListener="#{pageFlowScope.parseData.onChange}"/>
<af:outputText value="PageFlow::#{pageFlowScope.optionSelected}"
id="ot3"/></af:column>
<f:facet name="detailStamp" >
<af:group id="g1">
<af:selectOneListbox label="Label 1" id="sol1"
value="#{pageFlowScope.parseData.selectedValues}">
<f:selectItems value="#{pageFlowScope.parseData.allValuesList}"
id="si2"/>
</af:selectOneListbox>
</af:group>
</f:facet>
</af:table>
Here comes the managed bean code:
List selectedValues;
private RowKeySetImpl disclosedKeys=null;
List<SelectItem> allValuesList;
public void setDisclosedKeys(RowKeySetImpl disclosedKeys) {
this.disclosedKeys = disclosedKeys;
}
public void setAllValuesList(List<SelectItem> allValuesList) {
this.allValuesList = allValuesList;
}
public List<SelectItem> getAllValuesList() {
if (allValuesList == null) {
allValuesList = new ArrayList<SelectItem>();
allValuesList.add(new SelectItem(1, "India"));
allValuesList.add(new SelectItem(2, "Australia"));
allValuesList.add(new SelectItem(3, "America"));
allValuesList.add(new SelectItem(4, "United Kingdom"));
}
return allValuesList;
}
public void setSelectedValues(List selectedValues) {
this.selectedValues = selectedValues;
}
public List getSelectedValues() {
if (selectedValues == null) {
selectedValues = new ArrayList();
selectedValues.add(1);
selectedValues.add(3);
System.out.println("List is-" + selectedValues);
}
return selectedValues;
}
public void setDisclosedKeys(RowKeySetImpl disclosedKeys) {
this.disclosedKeys = disclosedKeys;
}
public RowKeySetImpl getDisclosedKeys() {
return disclosedKeys;
}
public void prepareLOV(ActionEvent actionEvent) {
disclosedKeys =null;
callDetailStamp();
RowKeySetImpl testDisclosedKey=getDisclosedKeys();
System.out.println("testDisclosedKey before refresh::"+testDisclosedKey);
AdfFacesContext.getCurrentInstance().addPartialTarget(getDataTable());
}
private void callDetailStamp() {
RowKeySet rks = getDataTable().getSelectedRowKeys();
Key currentKey = null;
Object objKey=null;
Iterator rksIter = rks.iterator();
while (rksIter.hasNext())
{
System.out.println("Entered Loop");
objKey=(Object)rksIter.next();
System.out.println("Obj Key::"+objKey);
}
if (rks.size()>0) {
System.out.println("Setting disclosed keys");
disclosedKeys = new RowKeySetImpl();
if (getDataTable() != null) {
ArrayList newKeys = new ArrayList();
ArrayList temp = new ArrayList();
temp.add(0,objKey);
newKeys.add(temp);
disclosedKeys.addAll(newKeys);
}
}
else
{
disclosedKeys = new RowKeySetImpl();
}
System.out.println("Disclosed Key::"+disclosedKeys.toString());
setDisclosedKeys(disclosedKeys);
}
I think I am able to set disclosedRowKeys property as I am able to print its value in output text. Whatever row I select, I get the disclosedKeyValue as an Array of index of the particular selected row. Clicking on link sets disclosedKeys value and refreshes the table but not expanding the row. Am I missing out something here ?
Related
I am new to stackoverflow and to Java. I am trying to fetch the data from the database then display it in a JSF page.
For the table I have a model : BusesInfo.java that contains getters and setters for the attributes of the table.
then I also have BusesDao that fetches the data from DB and stores it in an array list. BusesInfoBean that links these data to the JSF page. The connection to the database is success. the JSF page contains a table that calls BusesInfobean.busesInfo in the columns i call BusesInfo.attribute
Please I need your help! Below you can find sample codes:
package beans;
import daos.BusesDao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import models.BusesInfo;
#ViewScoped
public class BusesInfoBean implements Serializable {
private final BusesDao busesDao = new BusesDao();
private ArrayList<BusesInfo> busesInfo;
public BusesInfoBean(){}
#PostConstruct
public void init(){
try {
busesInfo = busesDao.buildBusesInfo();
} catch (Exception ex) {
Logger.getLogger(ManageEventsBean.class.getName()).log(Level.SEVERE, null, ex);
}
}
public ArrayList<BusesInfo> getBusesInfo() {
return busesInfo;
}
public void setBusesInfo(ArrayList<BusesInfo> busesInfo) {
this.busesInfo = busesInfo;
}
}
BusesDao.java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import models.BusesInfo;
import java.util.logging.Logger;
import java.util.logging.Level;
public class BusesDao extends ConnectionDao {
public ArrayList<BusesInfo> buildBusesInfo() throws Exception {
ArrayList<BusesInfo> list = new ArrayList<>();
Connection conn = getConnection();
try {
String sql = "SELECT * FROM BUSES_INFO";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
list.add(populateBusesInfo(rs));
}
rs.close();
ps.close();
return list;
} catch (SQLException e) {
throw new SQLException(e.getMessage());
}
}
private BusesInfo populateBusesInfo(ResultSet rs) throws SQLException {
BusesInfo busesInfo = new BusesInfo();
busesInfo.setBusID(rs.getInt("BUS_ID"));
busesInfo.setDriverID(rs.getInt("DRIVER_ID"));
busesInfo.setDepartureTime(rs.getString("DEPARTURE_TIME"));
busesInfo.setArrivalTime(rs.getString("ARRIVAL_TIME"));
busesInfo.setRouteEn(rs.getString("ROUTE_EN"));
busesInfo.setRouteAr(rs.getString("ROUTE_AR"));
busesInfo.setLicensePlate(rs.getString("LICENSE_PLATE"));
busesInfo.setCapacity(rs.getInt("CAPACITY"));
return busesInfo;
}
public static void main(String [] args){
try {
BusesDao busesDao = new BusesDao();
ArrayList<BusesInfo> busesInfo = busesDao.buildBusesInfo();
} catch (Exception ex) {
Logger.getLogger(EventsDao.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
the model class BusesInfo only contains getters and setters:
public class BusesInfo implements Serializable {
private int busID;
private int driverID;
private String departureTime;
private String arrivalTime;
private String routeEn;
private String routeAr;
private String licensePlate;
private int capacity;
public BusesInfo(){}
/**
*
* #param busID
* #param driverID
* #param departureTime
* #param arrivalTime
* #param routeEn
* #param routeAr
* #param licensePlate
* #param capacity
*/
public BusesInfo(int busID, int driverID, String departureTime, String arrivalTime, String routeEn, String routeAr, String licensePlate, int capacity) {
this.busID = busID;
this.driverID = driverID;
this.departureTime = departureTime;
this.arrivalTime = arrivalTime;
this.routeEn = routeEn;
this.routeAr = routeAr;
this.licensePlate = licensePlate;
this.capacity = capacity;
}
public int getBusID() {
return busID;
}
public void setBusID(int busID) {
this.busID = busID;
}
public int getDriverID() {
return driverID;
}
public void setDriverID(int driverID) {
this.driverID = driverID;
}
public String getDepartureTime() {
return departureTime;
}
public void setDepartureTime(String departureTime) {
this.departureTime = departureTime;
}
public String getArrivalTime() {
return arrivalTime;
}
public void setArrivalTime(String arrivalTime) {
this.arrivalTime = arrivalTime;
}
public String getRouteEn() {
return routeEn;
}
public void setRouteEn(String routeEn) {
this.routeEn = routeEn;
}
public String getRouteAr() {
return routeAr;
}
public void setRouteAr(String routeAr) {
this.routeAr = routeAr;
}
public String getLicensePlate() {
return licensePlate;
}
public void setLicensePlate(String licensePlate) {
this.licensePlate = licensePlate;
}
public int getCapacity() {
return capacity;
}
public void setCapacity(int capacity) {
this.capacity = capacity;
}
}
JSF page:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>#{msgs.buses}</title>
</h:head>
<h:body>
<div>
<ui:decorate template="/app_templates/app_template.xhtml">
<h:form id="bus_info_form">
<p:dataTable
id="bus_info_tbl"
value = "#{busesInfoBean.busesInfo}"
class = "dataTable"
var="event"
rows="2"
dir="#{langBean.dir}"
emptyMessage="#{msgs.no_buses}"
paginator="true"
paginatorPosition="top"
paginatorTemplate="#{langBean.isEnglish? '{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}' : '{RowsPerPageDropdown} {LastPageLink} {NextPageLink} {PageLinks} {PreviousPageLink} {FirstPageLink}'}"
>
<p:ajax event="rowSelectRadio"
update=":bus_info_form:bus_info_tbl"/>
<f:facet name="header" id="header">
#{msgs.buses}
</f:facet>
<p:column selectionMode="single" style="width:5%"/>
<p:column headerText="#{msgs.bus_id}"
style="width:15%"
sortBy="#{busesInfo.busID}">
<h:outputText value="#{busesInfo.busID}"/>
</p:column>
<p:column headerText="#{msgs.driver_id}"
style="width:15%"
sortBy="#{busesInfo.driverID}">
<h:outputText value="#{busesInfo.driverID}"/>
</p:column>
<p:column headerText="#{msgs.departure_time}"
style="width:15%"
sortBy="#{busesInfo.departureTime}">
<h:outputText value="#{busesInfo.departureTime}"/>
</p:column>
<p:column headerText="#{msgs.arrival_time}"
style="width:15%"
sortBy="#{busesInfo.arrivalTime}">
<h:outputText value="#{busesInfo.arrivalTime}"/>
</p:column>
<p:column headerText="#{msgs.route}"
style="width:20%"
filterBy="#{langBean.isEnglish?busesInfo.routeEn:busesInfo.routeAr}"
filterMatchMode="contains"
sortBy="#{langBean.isEnglish?busesInfo.routeEn:busesInfo.routeAr}">
<h:outputText value="#{langBean.isEnglish?busesInfo.routeEn:busesInfo.routeAr}"/>
</p:column>
<p:column headerText="#{msgs.license_plate}"
style="width:15%"
sortBy="#{busesInfo.licensePlate}">
<h:outputText value="#{busesInfo.licensePlate}"/>
</p:column>
<p:column headerText="#{msgs.capacity}"
style="width:15%"
sortBy="#{busesInfo.capacity}">
<h:outputText value="#{busesInfo.capacity}"/>
</p:column>
</p:dataTable>
</h:form>
</ui:decorate>
</div>
</h:body>
</html>
I have a SelectManyChecbox on my jsff which is bound to a list in the managed bean.
Now my issues is that when i click on certain radio button, some of the check boxes should get removed, ie the list should be updated to have lesser number of check boxes.
Now when i have selected lets say 5 out of the 10 check boxes, and now when i update the list, it leaves me with only 2 options in the check boxes...and at this point ADF faces raise an issue that the selection should be limited and all.
please tell me how to reset the checkboxes to default/unselected state before updating the list.
or is there any other way to get rid of this error
Here is my example, and it works:
<f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
<af:document title="main.jsf" id="d1">
<af:form id="f1">
<af:panelGroupLayout id="pgl1">
<af:selectOneRadio label="setValues" id="sor1" autoSubmit="true"
valueChangeListener="#{viewScope.test.onSetValues}" value="#{viewScope.test.values}">
<af:selectItem label="5 values" value="0" id="si2"/>
<af:selectItem label="3 values" value="1" id="si3"/>
</af:selectOneRadio>
<af:selectManyChoice label="selectManyCheckBox" id="smc1" binding="#{viewScope.test.comp}">
<f:selectItems value="#{viewScope.test.list}" id="si1"/>
</af:selectManyChoice>
</af:panelGroupLayout>
</af:form>
</af:document>
public class TestBean {
private ArrayList<SelectItem> list;
private long values;
private RichSelectManyChoice comp;
public TestBean() {
super();
list = new ArrayList<SelectItem>();
restoreList();
}
private void restoreList() {
list.clear();
list.add(new SelectItem(false, "value 1"));
list.add(new SelectItem(false, "value 2"));
list.add(new SelectItem(false, "value 3"));
list.add(new SelectItem(false, "value 4"));
list.add(new SelectItem(false, "value 5"));
}
private void cutList() {
list.clear();
list.add(new SelectItem(false, "value 1"));
list.add(new SelectItem(false, "value 2"));
list.add(new SelectItem(false, "value 3"));
}
public void setList(ArrayList<SelectItem> list) {
this.list = list;
}
public ArrayList<SelectItem> getList() {
return list;
}
public void onSetValues(ValueChangeEvent valueChangeEvent) {
if ((Long)valueChangeEvent.getNewValue() == 0)
restoreList();
else {
cutList();
}
comp.setValue(null);
comp.processUpdates(FacesContext.getCurrentInstance());
AdfFacesContext.getCurrentInstance().addPartialTarget(comp);
}
public void setValues(long values) {
this.values = values;
}
public long getValues() {
return values;
}
public void setComp(RichSelectManyChoice comp) {
this.comp = comp;
}
public RichSelectManyChoice getComp() {
return comp;
}
I am using Primefaces 4.0 with jsf2.2.
When I use dataTable with checkbox, it won't send back any record whenever I select records.
It supposed to send back the record once I click the checkbox.
I remove extra stuff and make my code simple to test it:
There is a polling printing selected items every second, so that I can check is there something sent back.
And after doing this, I found there's nothing sent back.
Here's my code:
Page:
<h:head>
<title>System Monitor</title>
</h:head>
<h:body>
<h:form>
<p:poll interval="1" listener="#{indexBean.printSelect()}"/>
</h:form>
<h:form>
<p:dataTable id='data' var="proc" value="#{indexBean.procStatus}"
rowKey="#{proc.pid}" selection="#{indexBean.selectedProcs}">
<p:column>
<f:facet name='header'>
<h:outputText value='Process Name'/>
</f:facet>
<h:outputText styleClass="outputCell" id="pname" value='#{proc.name}'/>
</p:column>
<p:column selectionMode="multiple"/>
</p:dataTable>
</h:form>
</h:body>
Backing Bean:
#ManagedBean(name = "indexBean")
#ViewScoped
public class indexBean implements Serializable {
private ProcStatDataModel procStatus;
private SingleProcess[] selectedProcs;
#PostConstruct
public void loadProcStat() {
List<SingleProcess> temp = new ArrayList<>();
temp.add(new SingleProcess("test1"));
temp.add(new SingleProcess("test2"));
temp.add(new SingleProcess("test3"));
procStatus = new ProcStatDataModel(temp);
}
public void printSelect() {
if (selectedProcs != null) {
String str = "";
for (SingleProcess sp : selectedProcs) {
str += sp.getName() + "_";
}
System.out.print(str);
} else {
System.out.println("selectedProcs is null");
}
}
public ProcStatDataModel getProcStatus() {
return procStatus;
}
public SingleProcess[] getSelectedProcs() {
return selectedProcs;
}
public void setSelectedProcs(SingleProcess[] selectedProcs) {
this.selectedProcs = selectedProcs;
}
}
I've tried attaching rowCheckListener like this before but in vain.
Also, I tried adding f:view contentType="text/html" like this and it was not help.
It's weird because I do the same thing with the case of primefaces show case and it acts as I think. So I think this approach is OK, there should be something wrong in my code.
Any help is appreciated. Thanks in advance.
I made a few changes and it worked. Not sure, which one is the solution.
1) Changed all the ' to ".
2) Datatable's value="#{indexBean.procStatus}" is wrong i think. I changed it to the name of the ArrayList inside the class. So, it became value="#{indexBean.procStatus.mylist}"
3) Added an ajax listener, like the one you mentioned in the question. <p:ajax event="rowSelectCheckbox" listener="#{indexBean.check}" />.
4) Added pid to the constructor which will be our rowKey.
5) Now, the poll prints the array.
Resultin xhtml is as follows:
<h:head>
<title>System Monitor</title>
</h:head>
<h:body>
<h:form>
<p:poll interval="1" listener="#{indexBean.printSelect()}"/>
</h:form>
<h:form>
<p:dataTable id="data" var="proc" value="#{indexBean.procStatus.mylist}"
rowKey="#{proc.pid}" selection="#{indexBean.selectedProcs}">
<p:ajax event="rowSelectCheckbox" listener="#{indexBean.check}" />
<p:column>
<f:facet name="header">
<h:outputText value="Process Name"/>
</f:facet>
<h:outputText styleClass="outputCell" id="pname" value="#{proc.name}"/>
</p:column>
<p:column selectionMode="multiple"/>
</p:dataTable>
</h:form>
</h:body>
</ui:composition>
Bean:
#ManagedBean(name = "indexBean")
#ViewScoped
public class indexBean implements Serializable {
private ProcStatDataModel procStatus;
private SingleProcess[] selectedProcs;
#PostConstruct
public void loadProcStat() {
List<SingleProcess> temp = new ArrayList<SingleProcess>();
temp.add(new SingleProcess("test1",1));
temp.add(new SingleProcess("test2",2));
temp.add(new SingleProcess("test3",3));
procStatus = new ProcStatDataModel(temp);
}
public void printSelect() {
if (selectedProcs != null) {
String str = "";
for (SingleProcess sp : selectedProcs) {
str += sp.getName() + "_";
}
System.out.print(str);
} else {
System.out.println("selectedProcs is null");
}
}
public ProcStatDataModel getProcStatus() {
return procStatus;
}
public SingleProcess[] getSelectedProcs() {
return selectedProcs;
}
public void setSelectedProcs(SingleProcess[] selectedProcs) {
this.selectedProcs = selectedProcs;
}
public void check(SelectEvent event) {
System.out.println("in check");
}
}
I'm learning ADF and have a question. I have an ADF TreeTable that I want to temporarly populate with static data. I'm using a bean for this, but the TreeTable is not being populated. Can someone check the code I have and tell me if I'm doing something wrong?
My treeTable
<af:treeTable rowBandingInterval="0" id="tt1" width="100%" value="#{viewScope.MyBean.treeData}">
<f:facet name="nodeStamp">
<af:column sortable="false" headerText="" id="c4">
<af:outputText value="#{row.col1}" id="ot2"/>
</af:column>
</f:facet>
<af:column sortable="false" headerText="Score" align="center" id="c5">
<af:outputText value="#{row.col2}" id="ot6"/>
</af:column>
<af:column sortable="false" headerText="Verified by " align="center" id="c3">
<af:outputText value="#{row.col3}" id="ot1"/>
</af:column>
<af:column sortable="false" headerText="On" align="center" id="c1">
<af:outputText value="#{row.col4}" id="ot5"/>
</af:column>
</af:treeTable>
RowMaker.class
public List row() {
List<rowModel> ls = new ArrayList<rowModel>();
for (int i = 0; i < 10; i++) {
rowModel tr = new rowModel("+","92%","Person X","14 Feb 2013");
ls.add(tr);
}
return ls;
}
RowModel.class
public class rowModel {
String col1, col2, col3, col4;
public rowModel(String col1, String col2, String col3, String col4) {
this.col1 = col1;
this.col2 = col2;
this.col3 = col3;
this.col4 = col4;
}
public String getCol1() {
return col1;
}
public String getCol2() {
return col2;
}
public String getCol3() {
return col3;
}
public String getCol4() {
return col4;
}
}
Managed Bean
<managed-bean id="__7">
<managed-bean-name id="__5">MyBean</managed-bean-name>
<managed-bean-class id="__8">com.im.popup.view.rowMaker</managed-bean-class>
<managed-bean-scope id="__6">view</managed-bean-scope>
</managed-bean>
The TreeTable would expect data of this form:
Manager1
|-Employee1
|-Employee2
Manager2
|-Employee3
|-Employee4
In your above example RowModel class doesn't have any children associated with it. I will take a very generic Employee example and show you how you can work with TreeTable:
class Employee{
private String firstName;
private String lastName;
private List<Employee> directs;
Employee(String fName, String lName){
firstName = fName;
lastName = lName;
directs = new ArrayList<Employee>();
}
//Getters and setters for above
public void addDirect(Employee emp){
directs.add(emp);
}
}
Lets look at creating the data for the TreeTable:
class TreeTablePageModel{
List<Employee> managers = new ArrayList<Employee>();
ChildPropertyTreeModel treeModel;
public TreeTablePageModel(){
Employee mgr1 = new Employee("First","Manager");
Employee mgr2 = new Employee("Second","Manager");
Employee mgr3 = new Employee("Third","Manager");
Employee emp = new Employee("First","Sub_1");
mgr1.addDirect(emp);
emp = new Employee("First","Sub_2");
mgr1.addDirect(emp);
emp = new Employee("Second","Sub_1");
mgr2.addDirect(emp);
emp = new Employee("Second","Sub_2");
mgr2.addDirect(emp);
emp = new Employee("Third","Sub_1");
mgr3.addDirect(emp);
emp = new Employee("Third","Sub_2");
mgr3.addDirect(emp);
treeModel = new ChildPropertyTreeModel(managers,"directs");
}
public ChildPropertyTreeModel getTreeModel(){
return treeModel;
}
}
In the code above I am wrapping the List of my Employee objects into a ChildPropertyTreeModel and also passing it the name of the attribute using which the ADF component can obtain the values of its children. And in the JSP I would access the data as:
<af:treeTable rowBandingInterval="0" id="tt1" width="100%" value="#{viewScope.pageData.treeModel}">
<!-- add columns here -->
</af:treeTable>
And my managed bean declaration would be:
<managed-bean id="__7">
<managed-bean-name id="__5">pageData</managed-bean-name>
<managed-bean-class id="__8">com.im.popup.view.TreeTablePageModel</managed-bean-class>
<managed-bean-scope id="__6">view</managed-bean-scope>
</managed-bean>
Base on the sample from:
http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=dataTable&sample=dataTableEdit&skin=blueSky
I did a bit modify on the xhtml page and CarBean to include a button to display the result. Result display as expected but the popup panel not working (ie. no popup).
Software version I use:
richface 4.3.0 Final
GAE 1.7.2
Note: It work fine on my local notebook and problem mention above apply when deploy online.
Here the online url
http://cloudenterpriseapps.appspot.com/public/test/testPopup5.jsf
Any help?
[CarsBean.java]
package test.faces.bean;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.richfaces.demo.common.data.RandomHelper;
import org.richfaces.demo.tables.model.cars.InventoryItem;
import org.richfaces.demo.tables.model.cars.InventoryVendorItem;
import org.richfaces.demo.tables.model.cars.InventoryVendorList;
#ManagedBean(name = "carsBean2")
#SessionScoped
public class CarsBean2 implements Serializable {
/**
*
*/
private static final long serialVersionUID = -3832235132261771583L;
private static final int DECIMALS = 1;
private static final int CLIENT_ROWS_IN_AJAX_MODE = 15;
private static final int ROUNDING_MODE = BigDecimal.ROUND_HALF_UP;
private List<InventoryItem> allInventoryItems = null;
private List<InventoryVendorList> inventoryVendorLists = null;
private int currentCarIndex;
private InventoryItem editedCar;
private int page = 1;
private int clientRows;
public void switchAjaxLoading(ValueChangeEvent event) {
this.clientRows = (Boolean) event.getNewValue() ? CLIENT_ROWS_IN_AJAX_MODE : 0;
}
public void remove() {
allInventoryItems.remove(allInventoryItems.get(currentCarIndex));
}
public void store() {
allInventoryItems.set(currentCarIndex, editedCar);
}
public List<SelectItem> getVendorOptions() {
List<SelectItem> result = new ArrayList<SelectItem>();
result.add(new SelectItem("", ""));
for (InventoryVendorList vendorList : getInventoryVendorLists()) {
result.add(new SelectItem(vendorList.getVendor()));
}
return result;
}
public List<String> getAllVendors() {
List<String> result = new ArrayList<String>();
for (InventoryVendorList vendorList : getInventoryVendorLists()) {
result.add(vendorList.getVendor());
}
return result;
}
public List<InventoryVendorList> getInventoryVendorLists() {
synchronized (this) {
if (inventoryVendorLists == null) {
inventoryVendorLists = new ArrayList<InventoryVendorList>();
List<InventoryItem> inventoryItems = getAllInventoryItems();
Collections.sort(inventoryItems, new Comparator<InventoryItem>() {
public int compare(InventoryItem o1, InventoryItem o2) {
return o1.getVendor().compareTo(o2.getVendor());
}
});
Iterator<InventoryItem> iterator = inventoryItems.iterator();
InventoryVendorList vendorList = new InventoryVendorList();
vendorList.setVendor(inventoryItems.get(0).getVendor());
while (iterator.hasNext()) {
InventoryItem item = iterator.next();
InventoryVendorItem newItem = new InventoryVendorItem();
itemToVendorItem(item, newItem);
if (!item.getVendor().equals(vendorList.getVendor())) {
inventoryVendorLists.add(vendorList);
vendorList = new InventoryVendorList();
vendorList.setVendor(item.getVendor());
}
vendorList.getVendorItems().add(newItem);
}
inventoryVendorLists.add(vendorList);
}
}
return inventoryVendorLists;
}
private void itemToVendorItem(InventoryItem item, InventoryVendorItem newItem) {
newItem.setActivity(item.getActivity());
newItem.setChangePrice(item.getChangePrice());
newItem.setChangeSearches(item.getChangeSearches());
newItem.setDaysLive(item.getDaysLive());
newItem.setExposure(item.getExposure());
newItem.setInquiries(item.getInquiries());
newItem.setMileage(item.getMileage());
newItem.setMileageMarket(item.getMileageMarket());
newItem.setModel(item.getModel());
newItem.setPrice(item.getPrice());
newItem.setPriceMarket(item.getPriceMarket());
newItem.setPrinted(item.getPrinted());
newItem.setStock(item.getStock());
newItem.setVin(item.getVin());
}
public String queryRec(){
String result = "";
synchronized (this) {
getAllInventoryItems();
}
return result;
}
public String initQuery(){
String result = "";
synchronized (this) {
allInventoryItems = null;
}
return result;
}
public List<InventoryItem> getInventoryItems() {
return allInventoryItems;
}
public List<InventoryItem> getAllInventoryItems() {
synchronized (this) {
if (allInventoryItems == null) {
allInventoryItems = new ArrayList<InventoryItem>();
for (int k = 0; k <= 5; k++) {
try {
switch (k) {
case 0:
allInventoryItems.addAll(createCar("Chevrolet", "Corvette", 5));
allInventoryItems.addAll(createCar("Chevrolet", "Malibu", 8));
allInventoryItems.addAll(createCar("Chevrolet", "Tahoe", 6));
break;
case 1:
allInventoryItems.addAll(createCar("Ford", "Taurus", 12));
allInventoryItems.addAll(createCar("Ford", "Explorer", 11));
break;
case 2:
allInventoryItems.addAll(createCar("Nissan", "Maxima", 9));
allInventoryItems.addAll(createCar("Nissan", "Frontier", 6));
break;
case 3:
allInventoryItems.addAll(createCar("Toyota", "4-Runner", 7));
allInventoryItems.addAll(createCar("Toyota", "Camry", 15));
allInventoryItems.addAll(createCar("Toyota", "Avalon", 13));
break;
case 4:
allInventoryItems.addAll(createCar("GMC", "Sierra", 8));
allInventoryItems.addAll(createCar("GMC", "Yukon", 10));
break;
case 5:
allInventoryItems.addAll(createCar("Infiniti", "G35", 6));
allInventoryItems.addAll(createCar("Infiniti", "EX35", 5));
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return allInventoryItems;
}
public List<InventoryItem> createCar(String vendor, String model, int count) {
ArrayList<InventoryItem> iiList = null;
try {
int arrayCount = count;
InventoryItem[] demoInventoryItemArrays = new InventoryItem[arrayCount];
for (int j = 0; j < demoInventoryItemArrays.length; j++) {
InventoryItem ii = new InventoryItem();
ii.setVendor(vendor);
ii.setModel(model);
ii.setStock(RandomHelper.randomstring(6, 7));
ii.setVin(RandomHelper.randomstring(17, 17));
ii.setMileage(new BigDecimal(RandomHelper.rand(5000, 80000)).setScale(DECIMALS, ROUNDING_MODE));
ii.setMileageMarket(new BigDecimal(RandomHelper.rand(25000, 45000)).setScale(DECIMALS, ROUNDING_MODE));
ii.setPrice(new Integer(RandomHelper.rand(15000, 55000)));
ii.setPriceMarket(new BigDecimal(RandomHelper.rand(15000, 55000)).setScale(DECIMALS, ROUNDING_MODE));
ii.setDaysLive(RandomHelper.rand(1, 90));
ii.setChangeSearches(new BigDecimal(RandomHelper.rand(0, 5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setChangePrice(new BigDecimal(RandomHelper.rand(0, 5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setExposure(new BigDecimal(RandomHelper.rand(0, 5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setActivity(new BigDecimal(RandomHelper.rand(0, 5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setPrinted(new BigDecimal(RandomHelper.rand(0, 5)).setScale(DECIMALS, ROUNDING_MODE));
ii.setInquiries(new BigDecimal(RandomHelper.rand(0, 5)).setScale(DECIMALS, ROUNDING_MODE));
demoInventoryItemArrays[j] = ii;
}
iiList = new ArrayList<InventoryItem>(Arrays.asList(demoInventoryItemArrays));
} catch (Exception e) {
e.printStackTrace();
}
return iiList;
}
public int getCurrentCarIndex() {
return currentCarIndex;
}
public void setCurrentCarIndex(int currentCarIndex) {
this.currentCarIndex = currentCarIndex;
}
public InventoryItem getEditedCar() {
return editedCar;
}
public void setEditedCar(InventoryItem editedCar) {
this.editedCar = editedCar;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getClientRows() {
return clientRows;
}
public void setClientRows(int clientRows) {
this.clientRows = clientRows;
}
}
[testPopup5.xhtml]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:composition>
<h:head>
<title>RichFaces Showcase</title>
</h:head>
<h:body>
<h:outputStylesheet>
a.no-decor>img {
border: none;
}
</h:outputStylesheet>
<a4j:status onstart="#{rich:component('statPane')}.show()"
onstop="#{rich:component('statPane')}.hide()" />
<h:form>
<h:panelGrid columns="2">
<a4j:commandButton id="search" action="#{carsBean2.queryRec}"
value="Search" render="table" />
<a4j:commandButton id="reset" action="#{carsBean2.initQuery}"
value="Reset" type="reset" render="table" />
</h:panelGrid>
</h:form>
<h:form>
<rich:dataTable value="#{carsBean2.inventoryItems}" var="car"
id="table" rows="5">
<rich:column>
<f:facet name="header">Model</f:facet>
<h:outputText value="#{car.model}" />
</rich:column>
<rich:column>
<f:facet name="header">Price</f:facet>
<h:outputText value="#{car.price}" />
</rich:column>
<rich:column>
<a4j:commandLink styleClass="no-decor" render="editGrid"
execute="#this" oncomplete="#{rich:component('editPanel')}.show()">
<h:graphicImage value="/images/icons/common/edit.gif" alt="edit" />
<f:setPropertyActionListener target="#{carsBean2.editedCar}"
value="#{car}" />
</a4j:commandLink>
</rich:column>
</rich:dataTable>
<rich:popupPanel id="statPane" autosized="true" rendered="true">
<h:graphicImage value="/images/common/ai.gif" alt="ai" />
Please wait...
</rich:popupPanel>
<rich:popupPanel header="Edit Car Details" id="editPanel">
<h:panelGrid columns="3" id="editGrid">
<h:outputText value="Model" />
<h:outputText value="#{carsBean2.editedCar.model}" />
<h:panelGroup />
<h:outputText value="Price" />
<h:outputText value="#{carsBean2.editedCar.price}" />
<h:panelGroup />
</h:panelGrid>
<a4j:commandButton value="Cancel"
onclick="#{rich:component('editPanel')}.hide(); return false;" />
</rich:popupPanel>
</h:form>
</h:body>
</ui:composition>
</html>
Using firebug, I manage discover few diff between local and online GAE version.
1) editPanel # local change it style stage from 'visibility hidden' to 'display none' and then 'display block' when click on edit icon.
However editPanel # GAE still remain unchange with 'visibility hidden'
[Local]
<div id="j_idt9:editPanel" style="visibility: hidden;">
<div id="j_idt9:editPanel" style="display: none;">
<div id="j_idt9:editPanel" style="display: block;">
[GAE]
<div id="j_idt9:editPanel" style="visibility: hidden;">
2) under , local version contain value in table tag
3) Shown in firebug's script tab, when click on edit link, local version display as: and follow by table values.
However online version display it as and without any table values
p/s: Online: http://cloudenterpriseapps.appspot.com/public/test/testPopup5.jsf
By the way the GAE display below warning when page first load. Don't know is related to the problem or not.
[s~cloudenterpriseapps/0.365021621033424561].: SystemId Unknown; Line #57; Column #31; Failed calling setMethod method
[FireBug Script tab, Local. Click on edit link]
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="j_idt9:editGrid"><![CDATA[<table id="j_idt9:editGrid">
<tbody>
<tr>
<td>Model</td>
<td>Corvette</td>
<td></td>
</tr>
<tr>
<td>Price</td>
<td>47405</td>
<td></td>
</tr>
</tbody>
</table>
]]></update><update id="javax.faces.ViewState"><![CDATA[H4sIAAAAAAEUTEh...EUXAkFAAA]]></update></changes><extension id="org.richfaces.extension"><complete>RichFaces.$('j_idt9:editPanel').show();</complete><render>j_idt9:editGrid</render></extension></partial-response>
[FireBug Script tab, GAE. Click on edit link]
<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="javax.faces.ViewState"><![CDATA[H4sIAAAAAAAAANVYbW....KBTUkFAAA]]></update></changes></partial-response>
Solved after upgrade JSF api and implementation jar from 2.0 to 2.1