Hi All,

I did some tests, it works great.

You need added phase-listener in jsf config file.

<lifecycle>
   <phase-listener>com.webjabber.net.jsf.datasave
.SaveDataPhaseListener</phase-listener>
</lifecycle>


This is my codes for using it, data saved in the Constructor.
    private List unitList;
    public UnitList(){
        SaveData saveData = DataSaveManager.getSaveData("_UNIT_LIST_DATA");
        if( saveData!=null ){
            System.out.println("Saved list");
            unitList = (List)saveData.getData();
        }else{
            System.out.println("New list");
            unitList = getDataFromDB("UnitList");

            LinkedList possiblePageList = new LinkedList();
            possiblePageList.add("/unitadmin/unitList..jsp");
            possiblePageList.add("/unitadmin/unitEdit.jsp");
            DataSaveManager.saveData("_UNIT_LIST_DATA",unitList,possiblePageList,null);
        }
    }


--
Zhong Li

WebJabber.Net

Files, This mail list doesn't allow attach file, so have to post here
-------------------------------------------DataSaveManager.java-------------------------------------------------------
/*
 * Created on Oct 4, 2005
 *
 */
package com.webjabber.net.jsf.datasave;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;


/**
 * @author zli
 *
 */
public class DataSaveManager {
    public final static String sessionID="_DATA_SAVE_SESSION_ENTRY";
    public static Map getSessionDataMap(){
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext ext = context.getExternalContext();
        Map sessionData = (Map)ext.getSessionMap().get(sessionID);
        if( sessionData ==null ){
            sessionData = new HashMap();
            ext.getSessionMap().put(sessionID,sessionData);
        }
        return sessionData;
    }
  
    /**
     *
     * @param data
     * @param possiblePageList  is LinkedList
     * @param pageRuleList is LinkedList wrap of LinkedList 
     */
    public static void saveData(String dataId, Object data, LinkedList possiblePageList, LinkedList pageRuleList){
        getSessionDataMap().put(dataId,new SaveData(dataId,data, possiblePageList, pageRuleList));
    }
    public static void removeData(String dataId){
        getSessionDataMap().remove(dataId);
    }
    public static SaveData getSaveData(String dataId){
        return (SaveData)getSessionDataMap().get(dataId);
    }

}


-------------------------------------------SaveData.java------------------------------------------------------

/*
 * Created on Oct 4, 2005
 *
 */
package com.webjabber.net.jsf.datasave;

import java.util.LinkedList;

/**
 * @author zli
 *
*/
public class SaveData {
    String dataId;
    Object data;
    LinkedList possiblePageList;
    LinkedList pageRuleList;
    public SaveData(String dataId, Object data, LinkedList possiblePageList, LinkedList pageRuleList){
        this.dataId = dataId;
        this.data = "">         this.possiblePageList = possiblePageList;
        this.pageRuleList = pageRuleList;
    }
    public Object getData(){
        return data;
    }
    public LinkedList getPossiblePageList(){
        return possiblePageList;
    }
    public LinkedList getPageRuleList(){
        return pageRuleList;
    }
    public String getDataId(){
        return dataId;
    }

}

---------------------------------------------SaveDataPhaseListener.java---------------------------------------------------------
/*
 * Created on Oct 4, 2005
 *
 */
package com.webjabber.net.jsf.datasave;

import java.util.LinkedList;
import java.util.Map;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;


import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

/**
 * @author zli
 *
 */
public class SaveDataPhaseListener implements PhaseListener{
    /* (non-Javadoc)
     * @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
     */
    public void afterPhase(PhaseEvent arg0) {
        System.out.println("afterPhase:"+arg0.getPhaseId());
        String viewId = arg0.getFacesContext().getViewRoot().getViewId();
        Map sessionData = DataSaveManager.getSessionDataMap();
        Set removeIds = new HashSet();
        if( sessionData!=null ){
            Iterator itr = sessionData.keySet().iterator();
            while( itr.hasNext() ){
                String dataId = (String)itr.next();
                SaveData saveData = (SaveData)sessionData.get(dataId);
                LinkedList possiblePageList = saveData.getPossiblePageList();
                //we check if the viewId in possible page
                if(possiblePageList!=null && possiblePageList.contains(viewId) ){
                    //we need keep it;
                    continue;
                }
               
                LinkedList pageRuleList =  saveData.getPageRuleList();
                if( pageRuleList!=null ){
                    //we check and consume rules
                    boolean isInRule = false;
                    for( int pi = 0;pi<pageRuleList.size();pi++ ){//consume all rules
                        //try one rule
                        LinkedList rulePath = (LinkedList)pageRuleList.get(pi);
                        if( rulePath.contains(viewId) ){
                            if( viewId.equals(rulePath.get(0)) ){//cosume it
                                rulePath.remove(0);//cosumed.
                                //we need keep it;
                                isInRule = true;
                               
                            }
                        }
                    }
                    if( isInRule )continue;
                   
                }
                //this data is useless, put in removeIds
                removeIds.add(dataId);
            }
            //remove data
            itr = removeIds.iterator();
            while(itr.hasNext()){
                String dataId = (String)itr.next();
                sessionData.remove(dataId);
                System.out.println("clean:"+dataId);
            }
           
        }

    }

    /* (non-Javadoc)
     * @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
     */
    public void beforePhase(PhaseEvent arg0) {
        //System.out.println("beforePhase:"+arg0.getPhaseId());
    }

    /* (non-Javadoc)
     * @see javax.faces.event.PhaseListener#getPhaseId()
     */
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
        //return PhaseId.ANY_PHASE;
    }
}

Reply via email to