Search in sources :

Example 1 with IPortalRenderingPipeline

use of org.apereo.portal.rendering.IPortalRenderingPipeline in project uPortal by Jasig.

the class RenderingPipelineConfiguration method getPortalRenderingPipeline.

/**
 * This bean is the entry point into the uPortal Rendering Pipeline. It supports {@link
 * RenderingPipelineBranchPoint} beans, which are an extension point for adopters.
 */
@Bean(name = "portalRenderingPipeline")
@Qualifier(value = "main")
public IPortalRenderingPipeline getPortalRenderingPipeline() {
    // Rendering Pipeline Branches (adopter extension point)
    final List<RenderingPipelineBranchPoint> sortedList = (branchPoints != null) ? new LinkedList<>(branchPoints) : Collections.emptyList();
    Collections.sort(sortedList);
    final List<RenderingPipelineBranchPoint> branches = Collections.unmodifiableList(sortedList);
    /*
         * Sanity check:  if you have multiple RenderingPipelineBranchPoint beans, you can specify
         * an 'order' property on some or all of them to control the sequence of processing.
         * Having 2 RenderingPipelineBranchPoint beans with the same order value will produce
         * non-deterministic results and is a likely source of misconfiguration.
         */
    final Set<Integer> usedOderValues = new HashSet<>();
    boolean hasCollision = branches.stream().anyMatch(branchPoint -> {
        final boolean rslt = usedOderValues.contains(branchPoint.getOrder());
        usedOderValues.add(branchPoint.getOrder());
        return rslt;
    });
    if (hasCollision) {
        throw new RenderingPipelineConfigurationException("Multiple RenderingPipelineBranchPoint beans have the same 'order' value, which likely a misconfiguration");
    }
    // "Standard" Pipeline
    final IPortalRenderingPipeline standardRenderingPipeline = getStandardRenderingPipeline();
    return new IPortalRenderingPipeline() {

        @Override
        public void renderState(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            for (RenderingPipelineBranchPoint branchPoint : branches) {
                if (branchPoint.renderStateIfApplicable(req, res)) {
                    /*
                         * Rendering bas been processed by the branch point -- no need to continue.
                         */
                    return;
                }
            }
            /*
                 * Reaching this point means that a branch was not followed; use the "standard"
                 * pipeline.
                 */
            standardRenderingPipeline.renderState(req, res);
        }
    };
}
Also used : IPortalRenderingPipeline(org.apereo.portal.rendering.IPortalRenderingPipeline) HttpServletRequest(javax.servlet.http.HttpServletRequest) RenderingPipelineBranchPoint(org.apereo.portal.rendering.RenderingPipelineBranchPoint) RenderingPipelineConfigurationException(org.apereo.portal.rendering.RenderingPipelineConfigurationException) HttpServletResponse(javax.servlet.http.HttpServletResponse) HashSet(java.util.HashSet) Qualifier(org.springframework.beans.factory.annotation.Qualifier) Bean(org.springframework.context.annotation.Bean)

Aggregations

HashSet (java.util.HashSet)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1 HttpServletResponse (javax.servlet.http.HttpServletResponse)1 IPortalRenderingPipeline (org.apereo.portal.rendering.IPortalRenderingPipeline)1 RenderingPipelineBranchPoint (org.apereo.portal.rendering.RenderingPipelineBranchPoint)1 RenderingPipelineConfigurationException (org.apereo.portal.rendering.RenderingPipelineConfigurationException)1 Qualifier (org.springframework.beans.factory.annotation.Qualifier)1 Bean (org.springframework.context.annotation.Bean)1