All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jetspeed.pipeline.JetspeedPipeline Maven / Gradle / Ivy

There is a newer version: 2.3.1
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.jetspeed.pipeline;

import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

import org.apache.jetspeed.pipeline.valve.CleanupValve;
import org.apache.jetspeed.pipeline.valve.Valve;
import org.apache.jetspeed.pipeline.valve.ValveContext;
import org.apache.jetspeed.request.RequestContext;

/**
 * Flexible implementation of a {@link Pipeline}. 



Suggested * order of valves: *

    *
  • ContainerValve
  • *
  • CapabilityValve
  • *
  • UserProfilerValve
  • *
  • PageProfilerValve
  • *
  • ActionValve
  • *
  • LayoutValve
  • *
  • ContentValve
  • *
  • AggregateValve
  • *
  • CleanupValve
  • *
* * @author Jason van Zyl * @author David Sean Taylor * @version $Id: JetspeedPipeline.java 892528 2009-12-19 23:20:32Z rwatler $ */ public class JetspeedPipeline implements Pipeline { /** * Name of this pipeline. */ protected String name; /** * The set of Valves associated with this Pipeline. */ protected Valve[] valves; /** * The set of CleanupValves associated with this Pipeline. */ protected Valve[] cleanupValves; /** * Constructor that provides the descriptor for building the pipeline */ public JetspeedPipeline(String name, List valveList) throws Exception { // split valves into cleanup and normal valves lists List valvesList = new ArrayList(); List cleanupValvesList = new ArrayList(); Iterator valveIter = valveList.iterator(); while (valveIter.hasNext()) { Valve valve = (Valve)valveIter.next(); if (valve instanceof CleanupValve) { cleanupValvesList.add(valve); } else { valvesList.add(valve); } } // configure pipeline valves = (Valve[]) valvesList.toArray(new Valve[valvesList.size()]); cleanupValves = (Valve[]) cleanupValvesList.toArray(new Valve[cleanupValvesList.size()]); setName(name); } public void initialize() throws PipelineException { } /** * Set the name of this pipeline. * * @param name * Name of this pipeline. */ public void setName(String name) { this.name = name; } /** * Get the name of this pipeline. * * @return String Name of this pipeline. */ public String getName() { return name; } public synchronized void addValve(Valve valve) { // Add this Valve to the set associated with this Pipeline if (valve instanceof CleanupValve) { cleanupValves = appendToValveArray(cleanupValves, valve); } else { valves = appendToValveArray(valves, valve); } } public synchronized Valve[] getValves() { return copyValveArray(valves); } public synchronized Valve[] getCleanupValves() { return copyValveArray(cleanupValves); } public synchronized void removeValve(Valve valve) { // Remove this Valve to the set associated with this Pipeline if (valve instanceof CleanupValve) { cleanupValves = removeFromValveArray(cleanupValves, valve); } else { valves = removeFromValveArray(valves, valve); } } public void invoke(RequestContext request) throws PipelineException { try { Invocation invocation; synchronized (this) { invocation = new Invocation(valves); } // Invoke the first Valve in this pipeline for this request invocation.invokeNext(request); } finally { // Invoke all cleanup valves swallowing any thrown exceptions // for this request Valve[] invokeCleanupValves; synchronized (this) { invokeCleanupValves = copyValveArray(cleanupValves); } for (int i = 0; (i < invokeCleanupValves.length); i++) { Invocation cleanupInvocation = new Invocation(invokeCleanupValves[i]); try { cleanupInvocation.invokeNext(request); } catch (Throwable t) { } } } } private static Valve[] copyValveArray(Valve[] array) { Valve[] newArray = new Valve[array.length]; System.arraycopy(array, 0, newArray, 0, array.length); return newArray; } private static Valve[] appendToValveArray(Valve[] array, Valve valve) { Valve[] newArray = new Valve[array.length+1]; System.arraycopy(array, 0, newArray, 0, array.length); newArray[array.length] = valve; return newArray; } private static Valve[] removeFromValveArray(Valve[] array, Valve valve) { int index = -1; for (int i = 0; ((i < array.length) && (index == -1)); i++) { index = ((array[i] == valve) ? i : -1); } if (index != -1) { Valve[] newArray = new Valve[array.length-1]; System.arraycopy(array, 0, newArray, 0, index); System.arraycopy(array, index+1, newArray, index, array.length-index-1); return newArray; } return array; } private static final class Invocation implements ValveContext { private final Valve[] valves; private int at = 0; public Invocation(Valve valve) { this.valves = new Valve[]{valve}; } public Invocation(Valve[] valves) { this.valves = valves; } public void invokeNext(RequestContext request) throws PipelineException { if (at < valves.length) { Valve next = valves[at]; at++; next.invoke(request, this); } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy