package org.ocpsoft.rewrite.faces; import javax.faces.context.FacesContext; import javax.faces.event.PhaseId; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.ocpsoft.rewrite.config.Configuration; import org.ocpsoft.rewrite.config.ConfigurationBuilder; import org.ocpsoft.rewrite.config.Operation; import org.ocpsoft.rewrite.context.EvaluationContext; import org.ocpsoft.rewrite.event.Rewrite; import org.ocpsoft.rewrite.faces.config.PhaseBinding; import org.ocpsoft.rewrite.faces.config.PhaseOperation; import org.ocpsoft.rewrite.param.Validator; import org.ocpsoft.rewrite.servlet.config.DispatchType; import org.ocpsoft.rewrite.servlet.config.Forward; import org.ocpsoft.rewrite.servlet.config.HttpConfigurationProvider; import org.ocpsoft.rewrite.servlet.config.HttpOperation; import org.ocpsoft.rewrite.servlet.config.Path; import org.ocpsoft.rewrite.servlet.config.Response; import org.ocpsoft.rewrite.servlet.config.SendStatus; import org.ocpsoft.rewrite.servlet.config.bind.RequestBinding; import org.ocpsoft.rewrite.servlet.http.event.HttpServletRewrite; public class PhaseOperationTestConfigurationProvider extends HttpConfigurationProvider { @Override public Configuration getConfiguration(ServletContext context) { Validator<String> validator = new Validator<String>() { @Override public boolean isValid(Rewrite event, EvaluationContext context, String value) { FacesContext facesContext = FacesContext.getCurrentInstance(); if (facesContext == null) { throw new IllegalStateException("FacesContext should be active."); } return "true".equals(value); } }; return ConfigurationBuilder .begin() /* * Perform an operation after restore view. */ .addRule() .when(Path.matches("/empty.xhtml").and(DispatchType.isRequest())) .perform(PhaseOperation.enqueue(new Operation() { @Override public void perform(Rewrite event, EvaluationContext context) { if (PhaseId.RESTORE_VIEW.equals(FacesContext.getCurrentInstance().getCurrentPhaseId())) SendStatus.code(203).perform(event, context); else SendStatus.code(503).perform(event, context); } }).after(PhaseId.RESTORE_VIEW)) /* * Perform before Render Response */ .addRule() .when(Path.matches("/render_response").and(DispatchType.isRequest())) .perform(Forward.to("/empty.xhtml").and(PhaseOperation.enqueue(new Operation() { @Override public void perform(Rewrite event, EvaluationContext context) { if (PhaseId.RENDER_RESPONSE.equals(FacesContext.getCurrentInstance().getCurrentPhaseId())) SendStatus.code(204).perform(event, context); else SendStatus.code(504).perform(event, context); } }).before(PhaseId.RENDER_RESPONSE))) /* * PhaseBinding deferral */ .addRule() .when(Path.matches("/binding/{value}").and(DispatchType.isRequest())) .perform(Forward.to("/empty.xhtml") .and(PhaseOperation.enqueue(new HttpOperation() { @Override public void performHttp(HttpServletRewrite event, EvaluationContext context) { String value = event.getRequest().getParameter("v"); if (value != null) SendStatus.code(505).perform(event, context); } }).before(PhaseId.RESTORE_VIEW)) .and(PhaseOperation.enqueue(new HttpOperation() { @Override public void performHttp(HttpServletRewrite event, EvaluationContext context) { HttpServletRequest request = event.getRequest(); String value = request.getParameter("v"); if (value != null) Response.addHeader("Value", value).and(SendStatus.code(205)).perform(event, context); else SendStatus.code(505).perform(event, context); } }).before(PhaseId.RENDER_RESPONSE))) .where("value").bindsTo(PhaseBinding.to(RequestBinding.parameter("v")).after(PhaseId.RESTORE_VIEW)) /* * Defer validation with binding. */ .addRule() .when(Path.matches("/defer_validation/{value}").and(DispatchType.isRequest())) .perform(Forward.to("/empty.xhtml")) .where("value").bindsTo(PhaseBinding.to(RequestBinding.parameter("v")).validatedBy(validator).after( PhaseId.RESTORE_VIEW)) /* * Perform eager validation. */ .addRule() .when(Path.matches("/eager_validation/{value}")) .perform(Forward.to("/empty.xhtml")) .where("value").validatedBy(validator); } @Override public int priority() { return 0; } }