vmassol     01/07/29 04:48:04

  Modified:    cactus/src/framework/share/org/apache/commons/cactus/server
                        ServletTestRedirector.java
  Log:
  Check at runtime if the needed jars are in the webapp classpath and if not raise an 
exception that explains it
  
  Revision  Changes    Path
  1.3       +85 -62    
jakarta-commons/cactus/src/framework/share/org/apache/commons/cactus/server/ServletTestRedirector.java
  
  Index: ServletTestRedirector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/cactus/src/framework/share/org/apache/commons/cactus/server/ServletTestRedirector.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServletTestRedirector.java        2001/06/17 13:39:45     1.2
  +++ ServletTestRedirector.java        2001/07/29 11:48:04     1.3
  @@ -126,73 +126,96 @@
       {
           logger.entry("doPost(...)");
   
  -        logger.debug("Default buffer size = " + theResponse.getBufferSize());
  -
  -        // Call the correct Service method
  -        String serviceName = 
theRequest.getParameter(ServiceDefinition.SERVICE_NAME_PARAM);
  -        if (serviceName == null) {
  -            throw new ServletException("Missing parameter [" +
  -                ServiceDefinition.SERVICE_NAME_PARAM + "] in HTTP request.");
  -        }
  -
  -        logger.debug("Service called = " + serviceName);
  -
  -        ServletTestCaller caller = new ServletTestCaller();
  -        ServletImplicitObjects objects = new ServletImplicitObjects();
  -        objects.m_Config = getServletConfig();
  -        objects.m_Request = theRequest;
  -        objects.m_Response = theResponse;
  -
  -        // Is it the call test method service ?
  -        if (ServiceEnumeration.CALL_TEST_SERVICE.equals(serviceName)) {
  -
  -            caller.doTest(objects);
  -
  -            // Ugly hack here : The client side need to read all the data
  -            // returned on the servlet output stream. Otherwise the servlet
  -            // engine might do an io block, waiting for the client to read
  -            // more data. Is this happens, then we are stuck because the client
  -            // side is waiting for the test result to be committed but the
  -            // latter will only be committed when all the data has been sent
  -            // on the servlet output stream. So we need to read the data from
  -            // the client side. However, some tests do not return any data and
  -            // thus the read would block ... So we always send at the end of
  -            // the stream a magic keyword so that the returned stream is never
  -            // empty. This magic keyword will be ignored by the client side
  -            // ... ugly, no ?
  -
  -            // This can easily be corrected with the Servlet API 2.3 (by
  -            // doing all the read on the server side instead of the client side
  -            // ). However it does not work on some 2.2 API servlet engines
  -            // (like Tomcat 3.2 ...).
  -
  -            // Send magic keyword ... well at least try ... Yes, you read it
  -            // correctly ! I said 'try' because if the test has done a forward
  -            // for example, then the Writer or OutputStream will have already
  -            // been used and thus it would lead to an error to try to write to
  -            // them ... In that case, we won't write anything back but that
  -            // should be fine as a forward is supposed to return something ...
  +        // If the Cactus user has forgotten to put a needed jar on the server 
  +        // classpath (i.e. in WEB-INF/lib), then the servlet engine Webapp 
  +        // class loader will throw a NoClassDefFoundError exception. As this
  +        // method is the entry point of the webapp, we'll catch all
  +        // NoClassDefFoundError exceptions and report a nice error message
  +        // for the user so that he knows he has forgotten to put a jar in the
  +        // classpath. If we don't do this, the error will be trapped by the
  +        // container and may not result in an ... err ... understandable error
  +        // message (like in Tomcat) ...
  +        try {
  +
  +            // Call the correct Service method
  +            String serviceName = 
theRequest.getParameter(ServiceDefinition.SERVICE_NAME_PARAM);
  +            if (serviceName == null) {
  +                throw new ServletException("Missing parameter [" +
  +                    ServiceDefinition.SERVICE_NAME_PARAM + "] in HTTP request.");
  +            }
       
  -            // Note: There might still be the case where I get a Writer in my
  -            // test case but don't use it ... hum ... To verify ... later ...
  -
  -            // Try sending the magic keyword ...
  -            logger.debug("Sending magic keyword ...");
  -            try {
  -                theResponse.getOutputStream().print(MAGIC_KEYWORD);
  -            } catch (Exception e) {
  -                logger.debug("Failed to to send magic keyword (this is normal)", e);
  -                // It failed ... Do nothing
  +            logger.debug("Service called = " + serviceName);
  +    
  +            ServletTestCaller caller = new ServletTestCaller();
  +            ServletImplicitObjects objects = new ServletImplicitObjects();
  +            objects.m_Config = getServletConfig();
  +            objects.m_Request = theRequest;
  +            objects.m_Response = theResponse;
  +    
  +            // Is it the call test method service ?
  +            if (ServiceEnumeration.CALL_TEST_SERVICE.equals(serviceName)) {
  +    
  +                caller.doTest(objects);
  +    
  +                // Ugly hack here : The client side need to read all the data
  +                // returned on the servlet output stream. Otherwise the servlet
  +                // engine might do an io block, waiting for the client to read
  +                // more data. Is this happens, then we are stuck because the client
  +                // side is waiting for the test result to be committed but the
  +                // latter will only be committed when all the data has been sent
  +                // on the servlet output stream. So we need to read the data from
  +                // the client side. However, some tests do not return any data and
  +                // thus the read would block ... So we always send at the end of
  +                // the stream a magic keyword so that the returned stream is never
  +                // empty. This magic keyword will be ignored by the client side
  +                // ... ugly, no ?
  +    
  +                // This can easily be corrected with the Servlet API 2.3 (by
  +                // doing all the read on the server side instead of the client side
  +                // ). However it does not work on some 2.2 API servlet engines
  +                // (like Tomcat 3.2 ...).
  +    
  +                // Send magic keyword ... well at least try ... Yes, you read it
  +                // correctly ! I said 'try' because if the test has done a forward
  +                // for example, then the Writer or OutputStream will have already
  +                // been used and thus it would lead to an error to try to write to
  +                // them ... In that case, we won't write anything back but that
  +                // should be fine as a forward is supposed to return something ...
  +        
  +                // Note: There might still be the case where I get a Writer in my
  +                // test case but don't use it ... hum ... To verify ... later ...
  +    
  +                // Try sending the magic keyword ...
  +                logger.debug("Sending magic keyword ...");
  +                try {
  +                    theResponse.getOutputStream().print(MAGIC_KEYWORD);
  +                } catch (Exception e) {
  +                    logger.debug("Failed to to send magic keyword (this is 
normal)", e);
  +                    // It failed ... Do nothing
  +                }
  +    
  +            // Is it the get test results service ?
  +            } else if (ServiceEnumeration.GET_RESULTS_SERVICE.equals(serviceName)) {
  +    
  +                caller.doGetResults(objects);
  +    
  +            } else {
  +                throw new ServletException("Unknown service [" + serviceName +
  +                    "] in HTTP request.");
               }
   
  -        // Is it the get test results service ?
  -        } else if (ServiceEnumeration.GET_RESULTS_SERVICE.equals(serviceName)) {
  +        } catch (NoClassDefFoundError e) {
   
  -            caller.doGetResults(objects);
  +            // try to display messages as descriptive as possible !
   
  -        } else {
  -            throw new ServletException("Unknown service [" + serviceName +
  -                "] in HTTP request.");
  +            if (e.getMessage().startsWith("junit/framework")) {
  +                throw new ServletException("You must put the JUnit jar in " +
  +                    "your server classpath (in WEB-INF/lib for example)", e);
  +            } else {
  +                throw new ServletException("You are missing a jar in your " +
  +                    "classpath (class [" + e.getMessage() + "] could not " +
  +                    "be found", e);
  +            }
           }
   
           logger.exit("doPost");
  
  
  

Reply via email to