1 17 18 19 package org.apache.catalina.core; 20 21 import java.io.IOException ; 22 import java.io.PrintWriter ; 23 import java.security.AccessController ; 24 import java.security.PrivilegedActionException ; 25 import java.security.PrivilegedExceptionAction ; 26 27 import javax.servlet.RequestDispatcher ; 28 import javax.servlet.Servlet ; 29 import javax.servlet.ServletException ; 30 import javax.servlet.ServletOutputStream ; 31 import javax.servlet.ServletRequest ; 32 import javax.servlet.ServletRequestWrapper ; 33 import javax.servlet.ServletResponse ; 34 import javax.servlet.ServletResponseWrapper ; 35 import javax.servlet.UnavailableException ; 36 import javax.servlet.http.HttpServletRequest ; 37 import javax.servlet.http.HttpServletResponse ; 38 39 import org.apache.catalina.Context; 40 import org.apache.catalina.Globals; 41 import org.apache.catalina.InstanceEvent; 42 import org.apache.catalina.Wrapper; 43 import org.apache.catalina.connector.ClientAbortException; 44 import org.apache.catalina.connector.Request; 45 import org.apache.catalina.connector.RequestFacade; 46 import org.apache.catalina.connector.Response; 47 import org.apache.catalina.connector.ResponseFacade; 48 import org.apache.catalina.util.InstanceSupport; 49 import org.apache.catalina.util.StringManager; 50 import org.apache.commons.logging.Log; 51 import org.apache.commons.logging.LogFactory; 52 53 66 67 final class ApplicationDispatcher 68 implements RequestDispatcher { 69 70 71 protected class PrivilegedForward implements PrivilegedExceptionAction { 72 private ServletRequest request; 73 private ServletResponse response; 74 75 PrivilegedForward(ServletRequest request, ServletResponse response) 76 { 77 this.request = request; 78 this.response = response; 79 } 80 81 public Object run() throws java.lang.Exception { 82 doForward(request,response); 83 return null; 84 } 85 } 86 87 protected class PrivilegedInclude implements PrivilegedExceptionAction { 88 private ServletRequest request; 89 private ServletResponse response; 90 91 PrivilegedInclude(ServletRequest request, ServletResponse response) 92 { 93 this.request = request; 94 this.response = response; 95 } 96 97 public Object run() throws ServletException , IOException { 98 doInclude(request,response); 99 return null; 100 } 101 } 102 103 105 106 123 public ApplicationDispatcher 124 (Wrapper wrapper, String requestURI, String servletPath, 125 String pathInfo, String queryString, String name) { 126 127 super(); 128 129 this.wrapper = wrapper; 131 this.context = (Context) wrapper.getParent(); 132 this.requestURI = requestURI; 133 this.servletPath = servletPath; 134 this.origServletPath = servletPath; 135 this.pathInfo = pathInfo; 136 this.queryString = queryString; 137 this.name = name; 138 if (wrapper instanceof StandardWrapper) 139 this.support = ((StandardWrapper) wrapper).getInstanceSupport(); 140 else 141 this.support = new InstanceSupport(wrapper); 142 143 if ( log.isDebugEnabled() ) 144 log.debug("servletPath=" + this.servletPath + ", pathInfo=" + 145 this.pathInfo + ", queryString=" + queryString + 146 ", name=" + this.name); 147 148 } 149 150 151 153 private static Log log = LogFactory.getLog(ApplicationDispatcher.class); 154 155 158 private ServletRequest appRequest = null; 159 160 161 164 private ServletResponse appResponse = null; 165 166 167 170 private Context context = null; 171 172 173 176 private boolean including = false; 177 178 179 182 private static final String info = 183 "org.apache.catalina.core.ApplicationDispatcher/1.0"; 184 185 186 189 private String name = null; 190 191 192 195 private ServletRequest outerRequest = null; 196 197 198 201 private ServletResponse outerResponse = null; 202 203 204 207 private String pathInfo = null; 208 209 210 213 private String queryString = null; 214 215 216 219 private String requestURI = null; 220 221 224 private String servletPath = null; 225 226 private String origServletPath = null; 227 228 231 private static final StringManager sm = 232 StringManager.getManager(Constants.Package); 233 234 235 239 private InstanceSupport support = null; 240 241 242 246 private Wrapper wrapper = null; 247 248 249 252 private ServletRequest wrapRequest = null; 253 254 255 258 private ServletResponse wrapResponse = null; 259 260 261 263 264 267 public String getInfo() { 268 269 return (info); 270 271 } 272 273 274 276 277 288 public void forward(ServletRequest request, ServletResponse response) 289 throws ServletException , IOException ![JavaDoc](../../../../../cmn/javadoc.gif) 290 { 291 if (System.getSecurityManager() != null) { 292 try { 293 PrivilegedForward dp = new PrivilegedForward(request,response); 294 AccessController.doPrivileged(dp); 295 } catch (PrivilegedActionException pe) { 296 Exception e = pe.getException(); 297 if (e instanceof ServletException ) 298 throw (ServletException ) e; 299 throw (IOException ) e; 300 } 301 } else { 302 doForward(request,response); 303 } 304 } 305 306 private void doForward(ServletRequest request, ServletResponse response) 307 throws ServletException , IOException ![JavaDoc](../../../../../cmn/javadoc.gif) 308 { 309 310 if (response.isCommitted()) { 312 if ( log.isDebugEnabled() ) 313 log.debug(" Forward on committed response --> ISE"); 314 throw new IllegalStateException ![JavaDoc](../../../../../cmn/javadoc.gif) 315 (sm.getString("applicationDispatcher.forward.ise")); 316 } 317 try { 318 response.resetBuffer(); 319 } catch (IllegalStateException e) { 320 if ( log.isDebugEnabled() ) 321 log.debug(" Forward resetBuffer() returned ISE: " + e); 322 throw e; 323 } 324 325 setup(request, response, false); 327 328 if (Globals.STRICT_SERVLET_COMPLIANCE) { 329 checkSameObjects(); 331 } 332 333 HttpServletRequest hrequest = null; 335 if (request instanceof HttpServletRequest ) 336 hrequest = (HttpServletRequest ) request; 337 HttpServletResponse hresponse = null; 338 if (response instanceof HttpServletResponse ) 339 hresponse = (HttpServletResponse ) response; 340 341 if ((hrequest == null) || (hresponse == null)) { 343 344 if ( log.isDebugEnabled() ) 345 log.debug(" Non-HTTP Forward"); 346 347 processRequest(hrequest,hresponse); 348 349 } 350 351 else if ((servletPath == null) && (pathInfo == null)) { 353 354 if ( log.isDebugEnabled() ) 355 log.debug(" Named Dispatcher Forward"); 356 357 ApplicationHttpRequest wrequest = 358 (ApplicationHttpRequest) wrapRequest(); 359 wrequest.setRequestURI(hrequest.getRequestURI()); 360 wrequest.setContextPath(hrequest.getContextPath()); 361 wrequest.setServletPath(hrequest.getServletPath()); 362 wrequest.setPathInfo(hrequest.getPathInfo()); 363 wrequest.setQueryString(hrequest.getQueryString()); 364 365 processRequest(request,response); 366 367 wrequest.recycle(); 368 unwrapRequest(); 369 370 } 371 372 else { 374 375 if ( log.isDebugEnabled() ) 376 log.debug(" Path Based Forward"); 377 378 ApplicationHttpRequest wrequest = 379 (ApplicationHttpRequest) wrapRequest(); 380 String contextPath = context.getPath(); 381 382 if (hrequest.getAttribute(Globals.FORWARD_REQUEST_URI_ATTR) == null) { 383 wrequest.setAttribute(Globals.FORWARD_REQUEST_URI_ATTR, 384 hrequest.getRequestURI()); 385 wrequest.setAttribute(Globals.FORWARD_CONTEXT_PATH_ATTR, 386 hrequest.getContextPath()); 387 wrequest.setAttribute(Globals.FORWARD_SERVLET_PATH_ATTR, 388 hrequest.getServletPath()); 389 wrequest.setAttribute(Globals.FORWARD_PATH_INFO_ATTR, 390 hrequest.getPathInfo()); 391 wrequest.setAttribute(Globals.FORWARD_QUERY_STRING_ATTR, 392 hrequest.getQueryString()); 393 } 394 395 wrequest.setContextPath(contextPath); 396 wrequest.setRequestURI(requestURI); 397 wrequest.setServletPath(servletPath); 398 wrequest.setPathInfo(pathInfo); 399 if (queryString != null) { 400 wrequest.setQueryString(queryString); 401 wrequest.setQueryParams(queryString); 402 } 403 404 processRequest(request,response); 405 406 wrequest.recycle(); 407 unwrapRequest(); 408 409 } 410 411 if ( log.isDebugEnabled() ) 413 log.debug(" Disabling the response for futher output"); 414 415 if (response instanceof ResponseFacade) { 416 ((ResponseFacade) response).finish(); 417 } else { 418 if (log.isDebugEnabled()){ 421 log.debug( " The Response is vehiculed using a wrapper: " 422 + response.getClass().getName() ); 423 } 424 425 try { 427 PrintWriter writer = response.getWriter(); 428 writer.close(); 429 } catch (IllegalStateException e) { 430 try { 431 ServletOutputStream stream = response.getOutputStream(); 432 stream.close(); 433 } catch (IllegalStateException f) { 434 ; 435 } catch (IOException f) { 436 ; 437 } 438 } catch (IOException e) { 439 ; 440 } 441 } 442 443 } 444 445 446 447 455 private void processRequest(ServletRequest request, 456 ServletResponse response) 457 throws IOException , ServletException { 458 459 Integer disInt = (Integer ) request.getAttribute 460 (ApplicationFilterFactory.DISPATCHER_TYPE_ATTR); 461 if (disInt != null) { 462 if (disInt.intValue() != ApplicationFilterFactory.ERROR) { 463 outerRequest.setAttribute 464 (ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR, 465 origServletPath); 466 outerRequest.setAttribute 467 (ApplicationFilterFactory.DISPATCHER_TYPE_ATTR, 468 Integer.valueOf(ApplicationFilterFactory.FORWARD)); 469 invoke(outerRequest, response); 470 } else { 471 invoke(outerRequest, response); 472 } 473 } 474 475 } 476 477 478 479 490 public void include(ServletRequest request, ServletResponse response) 491 throws ServletException , IOException ![JavaDoc](../../../../../cmn/javadoc.gif) 492 { 493 if (System.getSecurityManager() != null) { 494 try { 495 PrivilegedInclude dp = new PrivilegedInclude(request,response); 496 AccessController.doPrivileged(dp); 497 } catch (PrivilegedActionException pe) { 498 Exception e = pe.getException(); 499 500 if (e instanceof ServletException ) 501 throw (ServletException ) e; 502 throw (IOException ) e; 503 } 504 } else { 505 doInclude(request,response); 506 } 507 } 508 509 private void doInclude(ServletRequest request, ServletResponse response) 510 throws ServletException , IOException ![JavaDoc](../../../../../cmn/javadoc.gif) 511 { 512 setup(request, response, true); 514 515 if (Globals.STRICT_SERVLET_COMPLIANCE) { 516 checkSameObjects(); 518 } 519 520 ServletResponse wresponse = wrapResponse(); 523 524 if (!(request instanceof HttpServletRequest ) || 526 !(response instanceof HttpServletResponse )) { 527 528 if ( log.isDebugEnabled() ) 529 log.debug(" Non-HTTP Include"); 530 request.setAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR, 531 Integer.valueOf(ApplicationFilterFactory.INCLUDE)); 532 request.setAttribute(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR, origServletPath); 533 invoke(request, outerResponse); 534 } 535 536 else if (name != null) { 538 539 if ( log.isDebugEnabled() ) 540 log.debug(" Named Dispatcher Include"); 541 542 ApplicationHttpRequest wrequest = 543 (ApplicationHttpRequest) wrapRequest(); 544 wrequest.setAttribute(Globals.NAMED_DISPATCHER_ATTR, name); 545 if (servletPath != null) 546 wrequest.setServletPath(servletPath); 547 wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR, 548 Integer.valueOf(ApplicationFilterFactory.INCLUDE)); 549 wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR, origServletPath); 550 invoke(outerRequest, outerResponse); 551 552 wrequest.recycle(); 553 } 554 555 else { 557 558 if ( log.isDebugEnabled() ) 559 log.debug(" Path Based Include"); 560 561 ApplicationHttpRequest wrequest = 562 (ApplicationHttpRequest) wrapRequest(); 563 String contextPath = context.getPath(); 564 if (requestURI != null) 565 wrequest.setAttribute(Globals.INCLUDE_REQUEST_URI_ATTR, 566 requestURI); 567 if (contextPath != null) 568 wrequest.setAttribute(Globals.INCLUDE_CONTEXT_PATH_ATTR, 569 contextPath); 570 if (servletPath != null) 571 wrequest.setAttribute(Globals.INCLUDE_SERVLET_PATH_ATTR, 572 servletPath); 573 if (pathInfo != null) 574 wrequest.setAttribute(Globals.INCLUDE_PATH_INFO_ATTR, 575 pathInfo); 576 if (queryString != null) { 577 wrequest.setAttribute(Globals.INCLUDE_QUERY_STRING_ATTR, 578 queryString); 579 wrequest.setQueryParams(queryString); 580 } 581 582 wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_TYPE_ATTR, 583 Integer.valueOf(ApplicationFilterFactory.INCLUDE)); 584 wrequest.setAttribute(ApplicationFilterFactory.DISPATCHER_REQUEST_PATH_ATTR, origServletPath); 585 invoke(outerRequest, outerResponse); 586 587 wrequest.recycle(); 588 } 589 590 } 591 592 593 595 596 611 private void invoke(ServletRequest request, ServletResponse response) 612 throws IOException , ServletException { 613 614 ClassLoader oldCCL = Thread.currentThread().getContextClassLoader(); 618 ClassLoader contextClassLoader = context.getLoader().getClassLoader(); 619 620 if (oldCCL != contextClassLoader) { 621 Thread.currentThread().setContextClassLoader(contextClassLoader); 622 } else { 623 oldCCL = null; 624 } 625 626 HttpServletRequest hrequest = (HttpServletRequest ) request; 628 HttpServletResponse hresponse = (HttpServletResponse ) response; 629 Servlet servlet = null; 630 IOException ioException = null; 631 ServletException servletException = null; 632 RuntimeException runtimeException = null; 633 boolean unavailable = false; 634 635 if (wrapper.isUnavailable()) { 637 wrapper.getLogger().warn( 638 sm.getString("applicationDispatcher.isUnavailable", 639 wrapper.getName())); 640 long available = wrapper.getAvailable(); 641 if ((available > 0L) && (available < Long.MAX_VALUE)) 642 hresponse.setDateHeader("Retry-After", available); 643 hresponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, sm 644 .getString("applicationDispatcher.isUnavailable", wrapper 645 .getName())); 646 unavailable = true; 647 } 648 649 try { 651 if (!unavailable) { 652 servlet = wrapper.allocate(); 653 } 654 } catch (ServletException e) { 655 wrapper.getLogger().error(sm.getString("applicationDispatcher.allocateException", 656 wrapper.getName()), StandardWrapper.getRootCause(e)); 657 servletException = e; 658 servlet = null; 659 } catch (Throwable e) { 660 wrapper.getLogger().error(sm.getString("applicationDispatcher.allocateException", 661 wrapper.getName()), e); 662 servletException = new ServletException ![JavaDoc](../../../../../cmn/javadoc.gif) 663 (sm.getString("applicationDispatcher.allocateException", 664 wrapper.getName()), e); 665 servlet = null; 666 } 667 668 ApplicationFilterFactory factory = ApplicationFilterFactory.getInstance(); 670 ApplicationFilterChain filterChain = factory.createFilterChain(request, 671 wrapper,servlet); 672 try { 674 String jspFile = wrapper.getJspFile(); 675 if (jspFile != null) 676 request.setAttribute(Globals.JSP_FILE_ATTR, jspFile); 677 else 678 request.removeAttribute(Globals.JSP_FILE_ATTR); 679 support.fireInstanceEvent(InstanceEvent.BEFORE_DISPATCH_EVENT, 680 servlet, request, response); 681 if ((servlet != null) && (filterChain != null)) { 683 filterChain.doFilter(request, response); 684 } 685 request.removeAttribute(Globals.JSP_FILE_ATTR); 687 support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, 688 servlet, request, response); 689 } catch (ClientAbortException e) { 690 request.removeAttribute(Globals.JSP_FILE_ATTR); 691 support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, 692 servlet, request, response); 693 ioException = e; 694 } catch (IOException e) { 695 request.removeAttribute(Globals.JSP_FILE_ATTR); 696 support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, 697 servlet, request, response); 698 wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException", 699 wrapper.getName()), e); 700 ioException = e; 701 } catch (UnavailableException e) { 702 request.removeAttribute(Globals.JSP_FILE_ATTR); 703 support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, 704 servlet, request, response); 705 wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException", 706 wrapper.getName()), e); 707 servletException = e; 708 wrapper.unavailable(e); 709 } catch (ServletException e) { 710 request.removeAttribute(Globals.JSP_FILE_ATTR); 711 support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, 712 servlet, request, response); 713 Throwable rootCause = StandardWrapper.getRootCause(e); 714 if (!(rootCause instanceof ClientAbortException)) { 715 wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException", 716 wrapper.getName()), rootCause); 717 } 718 servletException = e; 719 } catch (RuntimeException e) { 720 request.removeAttribute(Globals.JSP_FILE_ATTR); 721 support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT, 722 servlet, request, response); 723 wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException", 724 wrapper.getName()), e); 725 runtimeException = e; 726 } 727 728 try { 730 if (filterChain != null) 731 filterChain.release(); 732 } catch (Throwable e) { 733 log.error(sm.getString("standardWrapper.releaseFilters", 734 wrapper.getName()), e); 735 } 737 738 try { 740 if (servlet != null) { 741 wrapper.deallocate(servlet); 742 } 743 } catch (ServletException e) { 744 wrapper.getLogger().error(sm.getString("applicationDispatcher.deallocateException", 745 wrapper.getName()), e); 746 servletException = e; 747 } catch (Throwable e) { 748 wrapper.getLogger().error(sm.getString("applicationDispatcher.deallocateException", 749 wrapper.getName()), e); 750 servletException = new ServletException ![JavaDoc](../../../../../cmn/javadoc.gif) 751 (sm.getString("applicationDispatcher.deallocateException", 752 wrapper.getName()), e); 753 } 754 755 if (oldCCL != null) 757 Thread.currentThread().setContextClassLoader(oldCCL); 758 759 unwrapRequest(); 762 unwrapResponse(); 763 764 if (ioException != null) 766 throw ioException; 767 if (servletException != null) 768 throw servletException; 769 if (runtimeException != null) 770 throw runtimeException; 771 772 } 773 774 775 783 private void setup(ServletRequest request, ServletResponse response, 784 boolean including) { 785 786 this.appRequest = request; 787 this.appResponse = response; 788 this.outerRequest = request; 789 this.outerResponse = response; 790 this.including = including; 791 792 } 793 794 795 798 private void unwrapRequest() { 799 800 if (wrapRequest == null) 801 return; 802 803 ServletRequest previous = null; 804 ServletRequest current = outerRequest; 805 while (current != null) { 806 807 if ((current instanceof Request ) 809 || (current instanceof RequestFacade)) 810 break; 811 812 if (current == wrapRequest) { 814 ServletRequest next = 815 ((ServletRequestWrapper ) current).getRequest(); 816 if (previous == null) 817 outerRequest = next; 818 else 819 ((ServletRequestWrapper ) previous).setRequest(next); 820 break; 821 } 822 823 previous = current; 825 current = ((ServletRequestWrapper ) current).getRequest(); 826 827 } 828 829 } 830 831 832 835 private void unwrapResponse() { 836 837 if (wrapResponse == null) 838 return; 839 840 ServletResponse previous = null; 841 ServletResponse current = outerResponse; 842 while (current != null) { 843 844 if ((current instanceof Response ) 846 || (current instanceof ResponseFacade)) 847 break; 848 849 if (current == wrapResponse) { 851 ServletResponse next = 852 ((ServletResponseWrapper ) current).getResponse(); 853 if (previous == null) 854 outerResponse = next; 855 else 856 ((ServletResponseWrapper ) previous).setResponse(next); 857 break; 858 } 859 860 previous = current; 862 current = ((ServletResponseWrapper ) current).getResponse(); 863 864 } 865 866 } 867 868 869 873 private ServletRequest wrapRequest() { 874 875 ServletRequest previous = null; 877 ServletRequest current = outerRequest; 878 while (current != null) { 879 if ("org.apache.catalina.servlets.InvokerHttpRequest". 880 equals(current.getClass().getName())) 881 break; if (!(current instanceof ServletRequestWrapper )) 883 break; 884 if (current instanceof ApplicationHttpRequest) 885 break; 886 if (current instanceof ApplicationRequest) 887 break; 888 if (current instanceof Request ) 889 break; 890 previous = current; 891 current = ((ServletRequestWrapper ) current).getRequest(); 892 } 893 894 ServletRequest wrapper = null; 896 if ((current instanceof ApplicationHttpRequest) || 897 (current instanceof Request ) || 898 (current instanceof HttpServletRequest )) { 899 HttpServletRequest hcurrent = (HttpServletRequest ) current; 901 boolean crossContext = false; 902 if ((outerRequest instanceof ApplicationHttpRequest) || 903 (outerRequest instanceof Request ) || 904 (outerRequest instanceof HttpServletRequest )) { 905 HttpServletRequest houterRequest = 906 (HttpServletRequest ) outerRequest; 907 Object contextPath = houterRequest.getAttribute 908 (Globals.INCLUDE_CONTEXT_PATH_ATTR); 909 if (contextPath == null) { 910 contextPath = houterRequest.getContextPath(); 912 } 913 crossContext = !(context.getPath().equals(contextPath)); 914 } 915 wrapper = new ApplicationHttpRequest 916 (hcurrent, context, crossContext); 917 } else { 918 wrapper = new ApplicationRequest(current); 919 } 920 if (previous == null) 921 outerRequest = wrapper; 922 else 923 ((ServletRequestWrapper ) previous).setRequest(wrapper); 924 wrapRequest = wrapper; 925 return (wrapper); 926 927 } 928 929 930 934 private ServletResponse wrapResponse() { 935 936 ServletResponse previous = null; 938 ServletResponse current = outerResponse; 939 while (current != null) { 940 if (!(current instanceof ServletResponseWrapper )) 941 break; 942 if (current instanceof ApplicationHttpResponse) 943 break; 944 if (current instanceof ApplicationResponse) 945 break; 946 if (current instanceof Response ) 947 break; 948 previous = current; 949 current = ((ServletResponseWrapper ) current).getResponse(); 950 } 951 952 ServletResponse wrapper = null; 954 if ((current instanceof ApplicationHttpResponse) || 955 (current instanceof Response ) || 956 (current instanceof HttpServletResponse )) 957 wrapper = 958 new ApplicationHttpResponse((HttpServletResponse ) current, 959 including); 960 else 961 wrapper = new ApplicationResponse(current, including); 962 if (previous == null) 963 outerResponse = wrapper; 964 else 965 ((ServletResponseWrapper ) previous).setResponse(wrapper); 966 wrapResponse = wrapper; 967 return (wrapper); 968 969 } 970 971 private void checkSameObjects() throws ServletException { 972 ServletRequest originalRequest = 973 ApplicationFilterChain.getLastServicedRequest(); 974 ServletResponse originalResponse = 975 ApplicationFilterChain.getLastServicedResponse(); 976 977 if (originalRequest == null || originalResponse == null) { 979 return; 980 } 981 982 boolean same = false; 983 ServletRequest dispatchedRequest = appRequest; 984 985 while (!same) { 986 if (originalRequest.equals(dispatchedRequest)) { 987 same = true; 988 } 989 if (!same && dispatchedRequest instanceof ServletRequestWrapper ) { 990 dispatchedRequest = 991 ((ServletRequestWrapper ) dispatchedRequest).getRequest(); 992 } else { 993 break; 994 } 995 } 996 if (!same) { 997 throw new ServletException (sm.getString( 998 "applicationDispatcher.specViolation.request")); 999 } 1000 1001 same = false; 1002 ServletResponse dispatchedResponse = appResponse; 1003 1004 while (!same) { 1005 if (originalResponse.equals(dispatchedResponse)) { 1006 same = true; 1007 } 1008 1009 if (!same && dispatchedResponse instanceof ServletResponseWrapper ) { 1010 dispatchedResponse = 1011 ((ServletResponseWrapper ) dispatchedResponse).getResponse(); 1012 } else { 1013 break; 1014 } 1015 } 1016 1017 if (!same) { 1018 throw new ServletException (sm.getString( 1019 "applicationDispatcher.specViolation.response")); 1020 } 1021 } 1022} 1023 | Popular Tags |