1 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 import javax.servlet.http.HttpServletRequest ; 32 import javax.servlet.http.HttpServletResponse ; 33 import javax.servlet.http.HttpServletRequestWrapper ; 34 import javax.servlet.ServletResponse ; 35 import javax.servlet.ServletResponseWrapper ; 36 import javax.servlet.ServletRequest ; 37 import javax.servlet.ServletException ; 38 39 import java.rmi.server.UID ; 40 import java.util.List ; 41 import java.util.ArrayList ; 42 import java.io.IOException ; 43 44 49 public class DefaultFilterData implements FilterData { 50 51 private static final Logger log = Logger.getInstance( DefaultFilterData.class ); 52 53 private ServletRequest request; 54 private ServletResponse response; 55 private ServerAdapter serverAdapter; 56 protected String reqURI; 57 private ServletResponse newResponse; 59 protected boolean skipFilter = false; 60 protected boolean newRequest = false; 61 protected boolean testException = false; 62 protected String testId; 64 private PlaybackSession playbackSession; 65 private RecordSession recordSession; 68 private RequestData reqData; 69 private ResponseData respData; 70 private List testExceptions; 71 private List sessionExceptions; 72 73 public DefaultFilterData( ServletRequest request, ServletResponse response, ServerAdapter serverAdapter ) { 74 this.request = request; 75 this.response = response; 76 this.serverAdapter = serverAdapter; 77 testExceptions = new ArrayList (); 78 sessionExceptions = new ArrayList (); 79 } 80 81 public void init() throws SessionFailedException { 82 processRequest(); 83 processResponse(); 84 } 85 86 protected void processRequest() throws SessionFailedException { 87 reqURI = ( (HttpServletRequest ) request ).getRequestURI(); 88 89 ServletRequest original = getOriginalRequest(); 90 testNewRequest( original ); 91 testSkipFilter( original ); 92 testForTestId( original ); 93 testForTestException(); 94 95 reqData = RequestData.populate( (HttpServletRequest ) request, new RequestData() ); 97 if ( log.isDebugEnabled() ) { 98 log.debug( "request data( " + reqData + " )" ); 99 } 100 } 101 102 protected void testForTestId( ServletRequest request ) { 103 testId = ( (HttpServletRequest ) request ).getHeader( Constants.TEST_ID_HEADER ); 104 } 105 106 protected void testForTestException() { 107 Boolean val = (Boolean ) getRequest().getAttribute( Constants.REQUEST_EXCEPTION_MARKER_ATTRIBUTE ); 108 if ( val != null ) { 109 testException = val.booleanValue(); 110 } 111 if ( testException ) { 112 val = (Boolean ) 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 request ) { 124 skipFilter = Boolean.valueOf( request.getParameter( Constants.FILTER_SKIP_PARAM ) ).booleanValue(); 125 if ( skipFilter == false ) { 127 Object obj = request.getAttribute( Constants.FILTER_SKIP_PARAM ); 129 if ( obj != null ) { 130 if ( obj instanceof Boolean ) { 131 Boolean bool = (Boolean ) obj; 132 skipFilter = bool.booleanValue(); 133 } 134 } 135 if ( skipFilter == false ) { 136 skipFilter = Boolean.valueOf( ( (HttpServletRequest ) request ).getHeader( 137 Constants.FILTER_SKIP_PARAM ) ).booleanValue(); 138 } 139 } 140 } 141 142 protected void testNewRequest( ServletRequest request ) { 143 UID uid = (UID ) request.getAttribute( Constants.REQUEST_MARKER_ATTRIBUTE ); 144 if ( uid == null ) { 146 request.setAttribute( Constants.REQUEST_MARKER_ATTRIBUTE, new UID () ); 149 newRequest = true; 150 } 151 else { 152 newRequest = false; 153 } 154 } 155 156 protected void processResponse() throws SessionFailedException { 157 ServletResponse original = getOriginalResponse(); 159 if ( original instanceof ResponseWrapper ) { 160 if ( log.isDebugEnabled() ) { 161 log.debug( "instance of ResponseWrapper" ); 162 } 163 if ( isNewRequest() ) { 164 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 throw new SessionFailedException( "test recorder failure, only new requests should be wrapped" ); 177 } 178 setNewResponse( new ResponseWrapper( (HttpServletResponse ) response ) ); 179 } 180 } 181 182 187 protected ServletRequest getOriginalRequest() { 188 ServletRequest original = request; 189 int i = 0; 190 while ( original instanceof HttpServletRequestWrapper ) { 191 original = ( (HttpServletRequestWrapper ) 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 205 protected ServletResponse getOriginalResponse() { 206 ServletResponse original = response; 207 ServletResponse 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 ) && 213 !( original instanceof ResponseWrapper ) ) { 214 temp = ( (ServletResponseWrapper ) 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 e ) { 230 testExceptions.add( e ); 231 } 232 233 public int getTestExceptionCount() { 234 return testExceptions.size(); 235 } 236 237 242 public Throwable getTestException() { 243 if ( getTestExceptionCount() == 0 ) { 244 return null; 245 } 246 return (Throwable ) testExceptions.get( 0 ); 247 } 248 249 public Throwable getTestException( int i ) { 250 return (Throwable ) testExceptions.get( i ); 251 } 252 253 public void addSessionException( Throwable e ) { 254 sessionExceptions.add( e ); 255 } 256 257 public int getSessionExceptionCount() { 258 return sessionExceptions.size(); 259 } 260 261 public Throwable getSessionException( int i ) { 262 return (Throwable ) sessionExceptions.get( i ); 263 } 264 265 271 public void throwTestException() throws IOException , ServletException { 272 Throwable 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 ) { 279 throw (IOException ) ex; 280 } 281 if ( ex instanceof ServletException ) { 282 throw (ServletException ) ex; 283 } 284 if ( ex instanceof RuntimeException ) { 285 throw (RuntimeException ) ex; 286 } 287 String msg = "Unexpected exception type( " + ex.getClass().getName() + " )"; 291 log.error( msg ); 292 assert false; 293 throw new RuntimeException ( 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 getReqURI() { 303 return reqURI; 304 } 305 306 public ServletResponse getNewResponse() { 307 return newResponse; 308 } 309 310 protected void setNewResponse( ServletResponse 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 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 363 public boolean isNewRecording() { 364 if ( isRecording() && isNewRequest() ) { 365 return true; 366 } 367 return false; 368 } 369 370 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 ) 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 getRequest() { 399 return request; 400 } 401 402 public ServletResponse getResponse() { 403 return response; 404 } 405 406 public ServerAdapter getServerAdapter() { 407 return serverAdapter; 408 } 409 410 public String toString() { 411 StringBuffer sb = new StringBuffer ( 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 |