wro4j-core/src/main/java/ro/isdc/wro/model/resource/locator/support/DispatcherStreamLocator.java
public InputStream getInputStream(final HttpServletRequest request, final HttpServletResponse response,
      final String location)
      throws IOException {
    if (request == null || response == null || location == null) {
      throw new IOException("Cannot get stream for location: " + location
          + " because either request, response or location is not available");
    }

    // where to write the bytes of the stream
    final ByteArrayOutputStream os = new ByteArrayOutputStream();
    boolean warnOnEmptyStream = false;
    try {
      final RequestDispatcher dispatcher = request.getRequestDispatcher(location);
      if (dispatcher != null) {
        // Wrap request
        final ServletRequest servletRequest = getWrappedServletRequest(request, location);
        // Wrap response
        final ServletResponse servletResponse = new RedirectedStreamServletResponseWrapper(os, response);
        LOG.debug("dispatching request to location: {}", location);
        // use dispatcher
        dispatcher.include(servletRequest, servletResponse);
        warnOnEmptyStream = true;
        // force flushing - the content will be written to BytArrayOutputStream.
        // Otherwise exactly 32K of data will be written.
        servletResponse.getWriter().flush();
        os.close();
      }
    } catch (final Exception e) {
      LOG.debug("Could not dispatch request for location {}", location);
      // Not only servletException can be thrown, also dispatch.include can throw NPE when the scheduler runs outside
      // of the request cycle, thus connection is unavailable. This is caused mostly when invalid resources are
      // included.
      return locateExternal(request, location);
    }
    try {
      // fallback to external resource locator if the dispatcher is empty
      if (os.size() == 0) {
        return locateExternal(request, location);
      }
    } finally {
      if (warnOnEmptyStream && os.size() == 0) {
        LOG.debug("Wrong or empty resource with location: {}", location);
      }
    }
    return new ByteArrayInputStream(os.toByteArray());
  }
public InputStream getInputStream(final HttpServletRequest request, final HttpServletResponse response,
      final String location)
      throws IOException {
    if (request == null || response == null || location == null) {
      throw new IOException("Cannot get stream for location: " + location
          + " because either request, response or location is not available");
    }

    // where to write the bytes of the stream
    final ByteArrayOutputStream os = new ByteArrayOutputStream();
    boolean warnOnEmptyStream = false;
    try {
      final RequestDispatcher dispatcher = request.getRequestDispatcher(location);
      if (dispatcher != null) {
        // Wrap request
        final ServletRequest servletRequest = getWrappedServletRequest(request, location);
        // Wrap response
        final ServletResponse servletResponse = new RedirectedStreamServletResponseWrapper(os, response);
        LOG.debug("dispatching request to location: {}", location);
        // use dispatcher
        dispatcher.include(servletRequest, servletResponse);
        warnOnEmptyStream = true;
        // force flushing - the content will be written to BytArrayOutputStream.
        // Otherwise exactly 32K of data will be written.
        servletResponse.getWriter().flush();
        os.close();
      }
    } catch (final Exception e) {
      LOG.debug("Could not dispatch request for location {}", location);
      // Not only servletException can be thrown, also dispatch.include can throw NPE when the scheduler runs outside
      // of the request cycle, thus connection is unavailable. This is caused mostly when invalid resources are
      // included.
      return locateExternal(request, location);
    }
    try {
      // fallback to external resource locator if the dispatcher is empty
      if (os.size() == 0) {
        return locateExternal(request, location);
      }
    } finally {
      if (warnOnEmptyStream && os.size() == 0) {
        LOG.debug("Wrong or empty resource with location: {}", location);
      }
    }
    return new ByteArrayInputStream(os.toByteArray());
  }
public InputStream getInputStream ( final HttpServletRequest request , final HttpServletResponse response , final String location ) throws IOException { if ( request == null || response == null || location == null ) { throw new IOException ( "Cannot get stream for location: " + location + " because either request, response or location is not available" ) ; } // where to write the bytes of the stream
 final ByteArrayOutputStream os = new ByteArrayOutputStream ( ) ; boolean warnOnEmptyStream = false ; try { final RequestDispatcher dispatcher = request . getRequestDispatcher ( location ) ; if ( dispatcher != null ) { // Wrap request
 final ServletRequest servletRequest = getWrappedServletRequest ( request , location ) ; // Wrap response
 final ServletResponse servletResponse = new RedirectedStreamServletResponseWrapper ( os , response ) ; LOG . debug ( "dispatching request to location: {}" , location ) ; // use dispatcher
 dispatcher . include ( servletRequest , servletResponse ) ; warnOnEmptyStream = true ; // force flushing - the content will be written to BytArrayOutputStream.
 // Otherwise exactly 32K of data will be written.
 servletResponse . getWriter ( ) . flush ( ) ; os . close ( ) ; } } catch ( final Exception e ) { LOG . debug ( "Could not dispatch request for location {}" , location ) ; // Not only servletException can be thrown, also dispatch.include can throw NPE when the scheduler runs outside
 // of the request cycle, thus connection is unavailable. This is caused mostly when invalid resources are
 // included.
 return locateExternal ( request , location ) ; } try { // fallback to external resource locator if the dispatcher is empty
 if ( os . size ( ) == 0 ) { return locateExternal ( request , location ) ; } } finally { if ( warnOnEmptyStream && os . size ( ) == 0 ) { LOG . debug ( "Wrong or empty resource with location: {}" , location ) ; } } return new ByteArrayInputStream ( os . toByteArray ( ) ) ; }
/** When using JBoss Portal and it has some funny quirks...actually a portal application have several small web
application behind it. So when it intercepts a requests for portal then it start bombing the the application behind
the portal with multiple threads (web requests) that are combined with threads for wro4j.

@param location
a path to a request relative resource to locate.
@return a valid stream for required location. This method will never return a null.
@throws IOException
if the stream cannot be located at the specified location.
/ ** When using JBoss Portal and it has some funny quirks ... actually a portal application have several small web application behind it . So when it intercepts a requests for portal then it start bombing the the application behind the portal with multiple threads ( web requests ) that are combined with threads for wro4j .