package com.sun.faces.application.applicationimpl.events;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import java.util.HashMap;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.event.SystemEvent;
public class ReentrantLisneterInvocationGuard {
public boolean isGuardSet(FacesContext ctx, Class<? extends SystemEvent> systemEventClass) {
Boolean result;
Map<Class<? extends SystemEvent>, Boolean> data = getDataStructure(ctx);
result = data.get(systemEventClass);
return null == result ? false : result;
}
public void setGuard(FacesContext ctx, Class<? extends SystemEvent> systemEventClass) {
Map<Class<? extends SystemEvent>, Boolean> data = getDataStructure(ctx);
data.put(systemEventClass, TRUE);
}
public void clearGuard(FacesContext ctx, Class<? extends SystemEvent> systemEventClass) {
Map<Class<? extends SystemEvent>, Boolean> data = getDataStructure(ctx);
data.put(systemEventClass, FALSE);
}
private Map<Class<? extends SystemEvent>, Boolean> getDataStructure(FacesContext ctx) {
Map<Class<? extends SystemEvent>, Boolean> result = null;
Map<Object, Object> ctxMap = ctx.getAttributes();
final String IS_PROCESSING_LISTENERS_KEY = "com.sun.faces.application.ApplicationImpl.IS_PROCESSING_LISTENERS";
if (null == (result = (Map<Class<? extends SystemEvent>, Boolean>) ctxMap.get(IS_PROCESSING_LISTENERS_KEY))) {
result = new HashMap<>(12);
ctxMap.put(IS_PROCESSING_LISTENERS_KEY, result);
}
return result;
}
}