KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > beehive > netui > tools > testrecorder > server > DefaultFilterData


1 /*
2  * Copyright 2004 The Apache Software Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * $Header:$
17  */

18
19 package org.apache.beehive.netui.tools.testrecorder.server;
20
21 import org.apache.beehive.netui.tools.testrecorder.shared.Constants;
22 import org.apache.beehive.netui.tools.testrecorder.shared.RequestData;
23 import org.apache.beehive.netui.tools.testrecorder.shared.ResponseData;
24 import org.apache.beehive.netui.tools.testrecorder.shared.Logger;
25 import org.apache.beehive.netui.tools.testrecorder.server.state.PlaybackSession;
26 import org.apache.beehive.netui.tools.testrecorder.server.state.SessionFailedException;
27 import org.apache.beehive.netui.tools.testrecorder.server.state.RecordSession;
28 import org.apache.beehive.netui.tools.testrecorder.server.serverAdapter.ServerAdapter;
29
30 // J2EE dependencies.
31
import javax.servlet.http.HttpServletRequest JavaDoc;
32 import javax.servlet.http.HttpServletResponse JavaDoc;
33 import javax.servlet.http.HttpServletRequestWrapper JavaDoc;
34 import javax.servlet.ServletResponse JavaDoc;
35 import javax.servlet.ServletResponseWrapper JavaDoc;
36 import javax.servlet.ServletRequest JavaDoc;
37 import javax.servlet.ServletException JavaDoc;
38
39 import java.rmi.server.UID JavaDoc;
40 import java.util.List JavaDoc;
41 import java.util.ArrayList JavaDoc;
42 import java.io.IOException JavaDoc;
43
44 /**
45  * User: ozzy
46  * Date: Jul 9, 2004
47  * Time: 1:19:14 PM
48  */

49 public class DefaultFilterData implements FilterData {
50
51     private static final Logger log = Logger.getInstance( DefaultFilterData.class );
52
53     private ServletRequest JavaDoc request;
54     private ServletResponse JavaDoc response;
55     private ServerAdapter serverAdapter;
56     protected String JavaDoc reqURI;
57     // wrapper
58
private ServletResponse JavaDoc newResponse;
59     protected boolean skipFilter = false;
60     protected boolean newRequest = false;
61     protected boolean testException = false;
62     // playback variables
63
protected String JavaDoc testId;
64     private PlaybackSession playbackSession;
65     // is this method call handling a record transaction?
66
// this indicates that we are in record mode.
67
private RecordSession recordSession;
68     private RequestData reqData;
69     private ResponseData respData;
70     private List JavaDoc testExceptions;
71     private List JavaDoc sessionExceptions;
72
73     public DefaultFilterData( ServletRequest JavaDoc request, ServletResponse JavaDoc response, ServerAdapter serverAdapter ) {
74         this.request = request;
75         this.response = response;
76         this.serverAdapter = serverAdapter;
77         testExceptions = new ArrayList JavaDoc();
78         sessionExceptions = new ArrayList JavaDoc();
79     }
80
81     public void init() throws SessionFailedException {
82         processRequest();
83         processResponse();
84     }
85
86     protected void processRequest() throws SessionFailedException {
87         reqURI = ( (HttpServletRequest JavaDoc) request ).getRequestURI();
88
89         ServletRequest JavaDoc original = getOriginalRequest();
90         testNewRequest( original );
91         testSkipFilter( original );
92         testForTestId( original );
93         testForTestException();
94
95         // capture request data, this may not be necessary if we aren't recording or playing back.
96
reqData = RequestData.populate( (HttpServletRequest JavaDoc) request, new RequestData() );
97         if ( log.isDebugEnabled() ) {
98             log.debug( "request data( " + reqData + " )" );
99         }
100     }
101
102     protected void testForTestId( ServletRequest JavaDoc request ) {
103         testId = ( (HttpServletRequest JavaDoc) request ).getHeader( Constants.TEST_ID_HEADER );
104     }
105
106     protected void testForTestException() {
107         Boolean JavaDoc val = (Boolean JavaDoc) getRequest().getAttribute( Constants.REQUEST_EXCEPTION_MARKER_ATTRIBUTE );
108         if ( val != null ) {
109             testException = val.booleanValue();
110         }
111         if ( testException ) {
112             val = (Boolean JavaDoc) getRequest().getAttribute( Constants.REQUEST_NEW_EXCEPTION_MARKER_ATTRIBUTE );
113             if ( val != null ) {
114                 newRequest = val.booleanValue();
115                 if ( newRequest ) {
116                     getRequest().setAttribute( Constants.REQUEST_NEW_EXCEPTION_MARKER_ATTRIBUTE,
117                             Boolean.valueOf( false ) );
118                 }
119             }
120         }
121     }
122
123     protected void testSkipFilter( ServletRequest JavaDoc request ) {
124         skipFilter = Boolean.valueOf( request.getParameter( Constants.FILTER_SKIP_PARAM ) ).booleanValue();
125         // check to see if the skip request attribute is set
126
if ( skipFilter == false ) {
127             // or the skip may be set as an attribute when using a forward
128
Object JavaDoc obj = request.getAttribute( Constants.FILTER_SKIP_PARAM );
129             if ( obj != null ) {
130                 if ( obj instanceof Boolean JavaDoc ) {
131                     Boolean JavaDoc bool = (Boolean JavaDoc) obj;
132                     skipFilter = bool.booleanValue();
133                 }
134             }
135             if ( skipFilter == false ) {
136                 skipFilter = Boolean.valueOf( ( (HttpServletRequest JavaDoc) request ).getHeader(
137                         Constants.FILTER_SKIP_PARAM ) ).booleanValue();
138             }
139         }
140     }
141
142     protected void testNewRequest( ServletRequest JavaDoc request ) {
143         UID JavaDoc uid = (UID JavaDoc) request.getAttribute( Constants.REQUEST_MARKER_ATTRIBUTE );
144         // the request should not have been wrapped either if it goes here
145
if ( uid == null ) {
146             // this is the first time this request has been seen in the filter.
147
// set the marker attribute
148
request.setAttribute( Constants.REQUEST_MARKER_ATTRIBUTE, new UID JavaDoc() );
149             newRequest = true;
150         }
151         else {
152             newRequest = false;
153         }
154     }
155
156     protected void processResponse() throws SessionFailedException {
157         // create a response wrapper for capturing response data.
158
ServletResponse JavaDoc original = getOriginalResponse();
159         if ( original instanceof ResponseWrapper ) {
160             if ( log.isDebugEnabled() ) {
161                 log.debug( "instance of ResponseWrapper" );
162             }
163             if ( isNewRequest() ) {
164                 // sanity check, new requests should not have an existing response wrapper
165
throw new SessionFailedException(
166                         "test recorder failure, requests deemed 'new' should not have previous response wrapper" );
167             }
168             setNewResponse( response );
169         }
170         else {
171             if ( log.isDebugEnabled() ) {
172                 log.debug( "NOT instance of ResponseWrapper" );
173             }
174             if ( !isNewRequest() ) {
175                 // sanity check, only new requests should need to have the response wrapped
176
throw new SessionFailedException( "test recorder failure, only new requests should be wrapped" );
177             }
178             setNewResponse( new ResponseWrapper( (HttpServletResponse JavaDoc) response ) );
179         }
180     }
181
182     /**
183      * return the original request. if necessary work back through request wrappers to obtain original.
184      *
185      * @return
186      */

187     protected ServletRequest JavaDoc getOriginalRequest() {
188         ServletRequest JavaDoc original = request;
189         int i = 0;
190         while ( original instanceof HttpServletRequestWrapper JavaDoc ) {
191             original = ( (HttpServletRequestWrapper JavaDoc) original ).getRequest();
192             i++;
193         }
194         if ( log.isDebugEnabled() ) {
195             log.debug( "number of servlet request wrappers( " + i + " )" );
196         }
197         return original;
198     }
199
200     /**
201      * Return the original response or the test recorder wrapper around the original if it exists.
202      *
203      * @return
204      */

205     protected ServletResponse JavaDoc getOriginalResponse() {
206         ServletResponse JavaDoc original = response;
207         ServletResponse JavaDoc temp = response;
208         if ( log.isDebugEnabled() ) {
209             log.debug( "response.getClass().getName()( " + original.getClass().getName() + " )" );
210         }
211         while ( temp != null &&
212                 ( original instanceof javax.servlet.ServletResponseWrapper JavaDoc ) &&
213                 !( original instanceof ResponseWrapper ) ) {
214             temp = ( (ServletResponseWrapper JavaDoc) original ).getResponse();
215             if ( temp != null ) {
216                 original = temp;
217             }
218             if ( log.isDebugEnabled() ) {
219                 log.debug( "response.getClass().getName()( " + original.getClass().getName() + " )" );
220             }
221         }
222         if ( log.isDebugEnabled() ) {
223             log.debug( "final: (" + System.identityHashCode( original ) + ") response.getClass().getName()( " +
224                     original.getClass().getName() + " )" );
225         }
226         return original;
227     }
228
229     public void addTestException( Throwable JavaDoc e ) {
230         testExceptions.add( e );
231     }
232
233     public int getTestExceptionCount() {
234         return testExceptions.size();
235     }
236
237     /**
238      * return the first test exception if one exists.
239      *
240      * @return the first test exception or null
241      */

242     public Throwable JavaDoc getTestException() {
243         if ( getTestExceptionCount() == 0 ) {
244             return null;
245         }
246         return (Throwable JavaDoc) testExceptions.get( 0 );
247     }
248
249     public Throwable JavaDoc getTestException( int i ) {
250         return (Throwable JavaDoc) testExceptions.get( i );
251     }
252
253     public void addSessionException( Throwable JavaDoc e ) {
254         sessionExceptions.add( e );
255     }
256
257     public int getSessionExceptionCount() {
258         return sessionExceptions.size();
259     }
260
261     public Throwable JavaDoc getSessionException( int i ) {
262         return (Throwable JavaDoc) sessionExceptions.get( i );
263     }
264
265     /**
266      * rethrow the first test exception if it exists.
267      *
268      * @throws IOException
269      * @throws ServletException
270      */

271     public void throwTestException() throws IOException JavaDoc, ServletException JavaDoc {
272         Throwable JavaDoc ex = getTestException();
273         if ( ex != null ) {
274             if ( log.isWarnEnabled() ) {
275                 log.warn( "rethrowing container exception( " + ex + " )", ex );
276             }
277             markTestException();
278             if ( ex instanceof IOException JavaDoc ) {
279                 throw (IOException JavaDoc) ex;
280             }
281             if ( ex instanceof ServletException JavaDoc ) {
282                 throw (ServletException JavaDoc) ex;
283             }
284             if ( ex instanceof RuntimeException JavaDoc ) {
285                 throw (RuntimeException JavaDoc) ex;
286             }
287             // this shouldn't happen but this protects us from just returning from the method
288
// in the event of a progamming error.
289
// log and bail out the container interface has changed.
290
String JavaDoc msg = "Unexpected exception type( " + ex.getClass().getName() + " )";
291             log.error( msg );
292             assert false;
293             throw new RuntimeException JavaDoc( msg, ex );
294         }
295     }
296
297     protected void markTestException() {
298         getRequest().setAttribute( Constants.REQUEST_EXCEPTION_MARKER_ATTRIBUTE, Boolean.valueOf( true ) );
299         getRequest().setAttribute( Constants.REQUEST_NEW_EXCEPTION_MARKER_ATTRIBUTE, Boolean.valueOf( true ) );
300     }
301
302     public String JavaDoc getReqURI() {
303         return reqURI;
304     }
305
306     public ServletResponse JavaDoc getNewResponse() {
307         return newResponse;
308     }
309
310     protected void setNewResponse( ServletResponse JavaDoc newResponse ) {
311         this.newResponse = newResponse;
312     }
313
314     public boolean isSkipFilter() {
315         return skipFilter;
316     }
317
318     public boolean isNewRequest() {
319         return newRequest;
320     }
321
322     public boolean isTestException() {
323         return testException;
324     }
325
326     public String JavaDoc getTestId() {
327         return testId;
328     }
329
330     public boolean isPlayback() {
331         if ( getPlaybackSession() != null ) {
332             return true;
333         }
334         return false;
335     }
336
337     public PlaybackSession getPlaybackSession() {
338         return playbackSession;
339     }
340
341     public void setPlaybackSession( PlaybackSession playbackSession ) {
342         this.playbackSession = playbackSession;
343     }
344
345     public RecordSession getRecordingSession() {
346         return recordSession;
347     }
348
349     public void setRecordingSession( RecordSession recordSession ) {
350         this.recordSession = recordSession;
351     }
352
353     public void clearRecording() {
354         this.recordSession = null;
355     }
356
357
358     /**
359      * Indicates that the filter is in record mode and this is considered a new request.
360      *
361      * @return true if this is a new record request, false otherwise.
362      */

363     public boolean isNewRecording() {
364         if ( isRecording() && isNewRequest() ) {
365             return true;
366         }
367         return false;
368     }
369
370     /**
371      * Indicates that the filter is in record mode for this request.
372      *
373      * @return true if this is a record request, false otherwise.
374      */

375     public boolean isRecording() {
376         if ( recordSession != null ) {
377             return true;
378         }
379         return false;
380     }
381
382     public RequestData getReqData() {
383         return reqData;
384     }
385
386     public ResponseData getRespData() {
387         return respData;
388     }
389
390     public void setRespData( boolean replaceSessionId ) throws SessionFailedException {
391         respData = ResponseWrapper.populate( (HttpServletResponse JavaDoc) newResponse,
392                 new ResponseData( request.getServerName(), request.getServerPort() ) );
393         if ( replaceSessionId && respData.getBody() != null ) {
394             respData.setBody( serverAdapter.replaceSessionID( respData.getBody() ) );
395         }
396     }
397
398     public ServletRequest JavaDoc getRequest() {
399         return request;
400     }
401
402     public ServletResponse JavaDoc getResponse() {
403         return response;
404     }
405
406     public ServerAdapter getServerAdapter() {
407         return serverAdapter;
408     }
409
410     public String JavaDoc toString() {
411         StringBuffer JavaDoc sb = new StringBuffer JavaDoc( 256 );
412         sb.append( "[ " );
413         sb.append( "reqURI( " + getReqURI() + " )" );
414         sb.append( ", skipFilter( " + isSkipFilter() + " )" );
415         sb.append( ", newRequest( " + isNewRequest() + " )" );
416         sb.append( ", isTestException( " + isTestException() + " )" );
417         sb.append( ", recording( " + isRecording() + " )" );
418         sb.append( ", testId( " + getTestId() + " )" );
419         sb.append( ", playbackSession( " + getPlaybackSession() + " )" );
420         sb.append( ", exception( " + getTestException() + " )" );
421         sb.append( " ]" );
422         return sb.toString();
423     }
424
425 }
426
Popular Tags