JSF Phase Event to CDI bridge
nickarls Nov 23, 2009 9:11 AMHere is a quickie for JSF phase event propagation
public class PhaseEventListener implements PhaseListener {
private BeanManager beanManager;
private enum When {
BEFORE, AFTER
};
public PhaseEventListener() {
try {
beanManager = (BeanManager) new InitialContext().lookup("java:app/BeanManager");
} catch (NamingException e) {
e.printStackTrace();
}
}
@SuppressWarnings("serial")
private void handlePhase(When when, PhaseEvent e) {
Annotation whenAnnotation = null;
Annotation phaseAnnotation = null;
switch (when) {
case BEFORE:
whenAnnotation = new AnnotationLiteral<Before>() {
};
break;
case AFTER:
whenAnnotation = new AnnotationLiteral<After>() {
};
break;
}
if (e.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) {
phaseAnnotation = new AnnotationLiteral<ApplyRequestValues>() {
};
} else if (e.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
phaseAnnotation = new AnnotationLiteral<InvokeApplication>() {
};
} else if (e.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) {
phaseAnnotation = new AnnotationLiteral<ProcessValidations>() {
};
} else if (e.getPhaseId() == PhaseId.RENDER_RESPONSE) {
phaseAnnotation = new AnnotationLiteral<RenderResponse>() {
};
} else if (e.getPhaseId() == PhaseId.RESTORE_VIEW) {
phaseAnnotation = new AnnotationLiteral<RestoreView>() {
};
} else if (e.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) {
phaseAnnotation = new AnnotationLiteral<UpdateModelValues>() {
};
}
beanManager.fireEvent(e, new Annotation[] { whenAnnotation, phaseAnnotation });
}
public void afterPhase(PhaseEvent e) {
handlePhase(When.AFTER, e);
}
public void beforePhase(PhaseEvent e) {
handlePhase(When.BEFORE, e);
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
and the qualifiers
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Before {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface After {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface ApplyRequestValues {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface InvokeApplication {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface ProcessValidations {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface RenderResponse {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface RestoreView {}
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface UpdateModelValues {}
Then you should be able to do
public void jsf(@Observes @Before @RenderResponse PhaseEvent e) {
System.out.println("before response " + e);
}
Notes:
- Register it yourself in faces-config
- Use correct JNDI name for bean manager if not on JBoss 5.2+ ;-)
- System events not included yet