01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: *
17: * $Header:$
18: */
19: package org.apache.beehive.netui.pageflow.interceptor;
20:
21: import java.util.List;
22: import java.util.LinkedList;
23:
24: /**
25: * <p>
26: * Abstract base class that represents an interceptor chain.
27: * </p>
28: */
29: public abstract class InterceptorChain {
30: private LinkedList/*< Interceptor >*/_chain = new LinkedList/*< Interceptor >*/();
31: private InterceptorContext _context;
32:
33: /**
34: * Create an interceptor chain with the {@link InterceptorContext} and a {@link List} of
35: * interceptors.
36: *
37: * @param context the context
38: * @param interceptors the interceptors
39: */
40: protected InterceptorChain(InterceptorContext context,
41: List/*< Interceptor >*/interceptors) {
42: _context = context;
43: _chain.addAll(interceptors);
44: }
45:
46: /**
47: * Execute the next interceptor in the chain of interceptors.
48: *
49: * @return the object returned when the interceptor is invoked
50: * @throws InterceptorException the exception thrown if an error occurs while invoking the interceptor
51: */
52: public Object continueChain() throws InterceptorException {
53: if (!_chain.isEmpty()) {
54: return invoke((Interceptor) _chain.removeFirst());
55: } else {
56: return null;
57: }
58: }
59:
60: /**
61: * Invoke an interceptor.
62: *
63: * @param interceptor the interceptor to invoke
64: * @return the interceptor's return value
65: * @throws InterceptorException the exception thrown if an error occurs while invoking the interceptor
66: */
67: protected abstract Object invoke(Interceptor interceptor)
68: throws InterceptorException;
69:
70: /**
71: * Get the {@link InterceptorContext}
72: * @return the context
73: */
74: public InterceptorContext getContext() {
75: return _context;
76: }
77:
78: /**
79: * Check to see if the interception chain is empty.
80: * @return <code>true</code> if the chain is empty; <code>false</code> otherwise.
81: */
82: public boolean isEmpty() {
83: return _chain.isEmpty();
84: }
85:
86: /**
87: * Remove the first {@link Interceptor} that is currently the first interceptor in the chain.
88: * This method can be used to advance to the "next" interceptor in the chain when executing
89: * a chain of interceptors.
90: * @return the first interceptor if one exists
91: */
92: protected Interceptor removeFirst() {
93: return (Interceptor) _chain.removeFirst();
94: }
95: }
|