001: /*
002: * Created on 17.05.2005 from Linke
003: *
004: */
005: package net.sf.crispy;
006:
007: import java.util.ArrayList;
008: import java.util.Iterator;
009: import java.util.List;
010:
011: /**
012: * Handle Interceptor- and Modify - Events.
013: *
014: * @author Linke
015: *
016: */
017: public final class InterceptorHandler {
018:
019: private List interceptors = new ArrayList();
020: private Modifier modifier = null;
021: private List interceptorFilters = new ArrayList();
022:
023: public InterceptorHandler() {
024: }
025:
026: /**
027: * Add Interceptor.
028: * @return The position of the Interceptor in the list.
029: *
030: */
031: public int addInterceptor(Interceptor pvProxyInterceptor) {
032: interceptors.add(pvProxyInterceptor);
033: return interceptors.indexOf(pvProxyInterceptor);
034: }
035:
036: /** Get Iterator over all registered Interceptors. */
037: public Iterator getInterceptorIterator() {
038: return interceptors.iterator();
039: }
040:
041: /** Get Interceptor by Pos in List. */
042: public Interceptor getInterceptorByPos(int pvPos) {
043: return (Interceptor) interceptors.get(pvPos);
044: }
045:
046: /** Get size from registered Interceptors. */
047: public int getInterceptorSize() {
048: return interceptors.size();
049: }
050:
051: /** Remove a registered Interceptor by position. */
052: public Interceptor removeInterceptorByPos(int pvPos) {
053: return (Interceptor) interceptors.remove(pvPos);
054: }
055:
056: public void removeAllInterceptors() {
057: interceptors.clear();
058: }
059:
060: public Modifier getModifier() {
061: return modifier;
062: }
063:
064: public void setModifier(Modifier pvModifier) {
065: modifier = pvModifier;
066: }
067:
068: public void addInterceptorFilter(InterceptorFilter pvFilter) {
069: interceptorFilters.add(pvFilter);
070: }
071:
072: public int getInterceptorFilterSize() {
073: return interceptorFilters.size();
074: }
075:
076: public InterceptorFilter getInterceptorFilterByPos(int pvPos) {
077: return (InterceptorFilter) interceptorFilters.get(pvPos);
078: }
079:
080: public InterceptorFilter removeInterceptorFilter(int pvPos) {
081: return (InterceptorFilter) interceptorFilters.remove(pvPos);
082: }
083:
084: public void fireBeforeNewInstance(Class pvInterfaceClass) {
085: if (checkInterceptorFilter(pvInterfaceClass)) {
086: int size = interceptors.size();
087: for (int i = 0; i < size; i++) {
088: Interceptor lvProxyInterceptor = (Interceptor) interceptors
089: .get(i);
090: lvProxyInterceptor.beforeNewInstance(pvInterfaceClass);
091: }
092: }
093: }
094:
095: public void fireAfterNewInstance(Class pvInterfaceClass,
096: Object pvProxyObject) {
097: if (checkInterceptorFilter(pvInterfaceClass)) {
098: int size = interceptors.size();
099: for (int i = 0; i < size; i++) {
100: Interceptor lvProxyInterceptor = (Interceptor) interceptors
101: .get(i);
102: lvProxyInterceptor.afterNewInstance(pvInterfaceClass,
103: pvProxyObject);
104: }
105: }
106: }
107:
108: public boolean fireBeforeMethodInvocation(
109: InterceptorContext pvInterceptorContext) {
110: boolean lvInterruptIncocation = false;
111: if (checkInterceptorFilter(pvInterceptorContext)) {
112: int size = interceptors.size();
113: for (int i = 0; i < size; i++) {
114: Interceptor lvProxyInterceptor = (Interceptor) interceptors
115: .get(i);
116: lvProxyInterceptor
117: .beforeMethodInvocation(pvInterceptorContext);
118: if (pvInterceptorContext.getInterruptInvocation()) {
119: lvInterruptIncocation = true;
120: }
121: }
122: }
123: return lvInterruptIncocation;
124: }
125:
126: public void fireAfterMethodInvocation(
127: InterceptorContext pvInterceptorContext) {
128: if (checkInterceptorFilter(pvInterceptorContext)) {
129: int size = interceptors.size();
130: for (int i = 0; i < size; i++) {
131: Interceptor lvProxyInterceptor = (Interceptor) interceptors
132: .get(i);
133: lvProxyInterceptor
134: .afterMethodInvocation(pvInterceptorContext);
135: }
136: }
137: }
138:
139: public void fireOnError(Throwable pvThrowable) {
140: if (checkInterceptorFilter(pvThrowable)) {
141: int size = interceptors.size();
142: for (int i = 0; i < size; i++) {
143: Interceptor lvProxyInterceptor = (Interceptor) interceptors
144: .get(i);
145: lvProxyInterceptor.onError(pvThrowable);
146: }
147: }
148: }
149:
150: public InterceptorContext fireBeforeModifyInvocation(
151: InterceptorContext pvInterceptorContext) {
152: InterceptorContext lvReturn = pvInterceptorContext;
153: if ((modifier != null)
154: && (checkInterceptorFilter(pvInterceptorContext))) {
155: lvReturn = modifier.modifyBeforeInvocation(lvReturn);
156: }
157: return lvReturn;
158: }
159:
160: public InterceptorContext fireAfterModifyInvocation(
161: InterceptorContext pvInterceptorContext) {
162: InterceptorContext lvReturn = pvInterceptorContext;
163: if ((modifier != null)
164: && (checkInterceptorFilter(pvInterceptorContext))) {
165: lvReturn = modifier.modifyAfterInvocation(lvReturn);
166: }
167: return lvReturn;
168: }
169:
170: /**
171: * Test all accept method from registered <code>InterceptorFilter</code>.
172: *
173: * @param pvContext The <code>InterceptorContext</code>.
174: * @return If all registered InterceptorFilter get <code>true</code>, than return <code>true</code>, else return <code>false</code>.
175: */
176: private boolean checkInterceptorFilter(
177: InterceptorFilterContext pvFilterContext) {
178: for (int i = 0; i < interceptorFilters.size(); i++) {
179: InterceptorFilter lvFilter = (InterceptorFilter) interceptorFilters
180: .get(i);
181: if (lvFilter.accept(pvFilterContext) == false) {
182: return false;
183: }
184: }
185: return true;
186: }
187:
188: private boolean checkInterceptorFilter(InterceptorContext pvContext) {
189: InterceptorFilterContext lvFilterContext = new InterceptorFilterContext();
190: lvFilterContext.setArgs(pvContext.getArgs());
191: lvFilterContext.setMethod(pvContext.getMethod());
192: return checkInterceptorFilter(lvFilterContext);
193: }
194:
195: private boolean checkInterceptorFilter(Class pvClass) {
196: InterceptorFilterContext lvFilterContext = new InterceptorFilterContext(
197: pvClass);
198: return checkInterceptorFilter(lvFilterContext);
199: }
200:
201: private boolean checkInterceptorFilter(Throwable pvThrowable) {
202: InterceptorFilterContext lvFilterContext = new InterceptorFilterContext(
203: pvThrowable);
204: return checkInterceptorFilter(lvFilterContext);
205: }
206:
207: }
|