UseCasePhaseListener.java
// license-header java merge-point
// Generated by andromda-jsf cartridge (utils\UseCasePhaseListener.java.vsl) DO NOT EDIT!
package org.andromda.samples.carrental;
import java.util.Map;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class UseCasePhaseListener implements PhaseListener {
private static final long serialVersionUID = 1879387492374102L;
@Override
public void beforePhase(PhaseEvent event) {
if(event.getPhaseId().equals(PhaseId.RESTORE_VIEW))
{
//Sometimes the useCaseScope is in the Flash but not in the request...
final ExternalContext externalContext=event.getFacesContext().getExternalContext();
final Map<String, Object> requestMap = externalContext.getRequestMap();
if(!requestMap.containsKey(ControllerBase.USE_CASE_SCOPE_KEY))
{
final Flash flash = externalContext.getFlash();
if(flash.containsKey(ControllerBase.USE_CASE_SCOPE_KEY))
{
externalContext.getRequestMap().put(ControllerBase.USE_CASE_SCOPE_KEY,externalContext.getFlash().get(ControllerBase.USE_CASE_SCOPE_KEY));
}
}
}
else if(event.getPhaseId().equals(PhaseId.RENDER_RESPONSE))
{
//forward to the same usecase
final FacesContext facesContext=event.getFacesContext();
final Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap();
final Map<String, Object> viewScope = facesContext.getViewRoot().getViewMap();
//Response: if the current view does not have the scope key but the request has, new view - forward
if(!viewScope.containsKey(ControllerBase.USE_CASE_SCOPE_KEY) &&
requestMap.containsKey(ControllerBase.USE_CASE_SCOPE_KEY))
{
//copy the scope key
viewScope.put(ControllerBase.USE_CASE_SCOPE_KEY,requestMap.get(ControllerBase.USE_CASE_SCOPE_KEY));
}
}
}
@Override
public void afterPhase(PhaseEvent event) {
if(event.getPhaseId().equals(PhaseId.RESTORE_VIEW))
{
final FacesContext facesContext=event.getFacesContext();
final ExternalContext externalContext=facesContext.getExternalContext();
final Map<String, Object> requestMap = externalContext.getRequestMap();
final Map<String, Object> viewScope = facesContext.getViewRoot().getViewMap();
if (viewScope.containsKey(ControllerBase.USE_CASE_SCOPE_KEY))
{
//try to get the value from the viewscope when possible, because in some cases the flash scope fails (many windows/tabs)
requestMap.put(ControllerBase.USE_CASE_SCOPE_KEY,viewScope.get(ControllerBase.USE_CASE_SCOPE_KEY));
}
else if(requestMap.containsKey(ControllerBase.USE_CASE_SCOPE_KEY))
{
//put it in the viewscope too.
viewScope.put(ControllerBase.USE_CASE_SCOPE_KEY,requestMap.get(ControllerBase.USE_CASE_SCOPE_KEY));
}
}
else if(event.getPhaseId().equals(PhaseId.RENDER_RESPONSE))
{
// keep the useCaseScope alive in the next request
event.getFacesContext().getExternalContext().getFlash().keep(ControllerBase.USE_CASE_SCOPE_KEY);
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}