So I was able to get in a state where the code
in Turbine.java:reallyScrewedNow is run.  The problem is
how it handles the exception.  If the exception is thrown
and data is still null, then you get another exception (NullPointer)
which masks the exception that you really care about.

I don't have cvs rights (hopefully someday).  So I am including
the patch.  Also, I took the liberty of factoring out some repeated
code and cleaned up the comments to be consistent.  One of my
two coding pet peeves is code that spills over 80 columns.  So I also 
fixed that.  I hoped this dosen't step on anyone's toes.  
Here's the diff:


--- Turbine.java   Tue Sep  5 17:06:30 2000
+++ /tmp/Turbine.java   Tue Sep  5 17:33:53 2000
@@ -143,9 +143,11 @@
                 props = realPath;
         }
 
-        // Check for errors in locating the props file. if there is
-        // one this method will throw an exception and you should look
-        // in your log file for more information.
+        /*
+         * Check for errors in locating the props file. if there is
+         * one this method will throw an exception and you should look
+         * in your log file for more information.
+         */
         propertyFileErrorCheck(props);
 
         // Setup some defaults from the properties file.
@@ -167,10 +169,10 @@
         firstDoGet = true;
 
         // START SCHEDULER HERE
-        if ( TurbineResources
-            .getBoolean("scheduler.enabled", false) )
+        if (TurbineResources.getBoolean("scheduler.enabled", false))
         {
-            TurbineServices.getInstance().getService(ScheduleService.SERVICE_NAME);
+            TurbineServices.getInstance().getService(
+               ScheduleService.SERVICE_NAME);
         }
 
         log ("Turbine init()!");
@@ -208,7 +210,7 @@
 
             // Get general RunData here...
             // Perform turbine specific initialization below.
-            data = RunDataFactory.getRunData( req, res, getServletConfig() );
+            data = RunDataFactory.getRunData(req, res, getServletConfig());
 
             // If this is the first invocation, perform some
             // intialization.
@@ -229,30 +231,37 @@
             }
 
             // Get the instance of the Session Validator.
-            SessionValidator sessionValidator = 
(SessionValidator)ActionLoader.getInstance().getInstance(
-                TurbineResources.getString("action.sessionvalidator") );
-
-            // Insist that the client starts a session before access
-            // to data is allowed. this is done by redirecting them to
-            // the "screen.homepage" page but you could have them go
-            // to any page as a starter (ie: the homepage)
-            // "data.getResponse()" represents the HTTP servlet
-            // response.
+            SessionValidator sessionValidator; 
+            sessionValidator = 
+                (SessionValidator)ActionLoader.getInstance().getInstance(
+                    TurbineResources.getString("action.sessionvalidator"));
+
+            /*  
+             * Insist that the client starts a session before access
+             * to data is allowed. this is done by redirecting them to
+             * the "screen.homepage" page but you could have them go
+             * to any page as a starter (ie: the homepage)
+             * "data.getResponse()" represents the HTTP servlet
+             * response.
+             */
             if ( sessionValidator.requiresNewSession(data) &&
                  data.getSession().isNew() )
             {
                 DynamicURI duri = new DynamicURI (data, true);
-                String homepage = TurbineResources.getString("screen.homepage", null);
+                String homepage; 
+                homepage = TurbineResources.getString("screen.homepage", null);
                 if (homepage != null)
                 {
                     duri.setScreen(homepage);
                 }
                 // Pass on the sent data in pathinfo.
-                for (Enumeration e = data.getParameters().keys() ; 
e.hasMoreElements() ;)
+                Enumeration e; 
+                for (e = data.getParameters().keys(); e.hasMoreElements(); )
                 {
-                    String key = (String) e.nextElement();
-                    String value = (String) data.getParameters().getString ( key );
-                    duri.addPathInfo((String)key, (String)value );
+                    String key, value;
+                    key   = (String) e.nextElement();
+                    value = (String) data.getParameters().getString ( key );
+                    duri.addPathInfo(key, value );
                 }
 
                 /*
@@ -287,21 +296,23 @@
             // Special case for login, this must happen before the
             // SessionManager is executed in order to allow a user to
             // even login.
-            if ( data.hasAction() &&
+            if (data.hasAction() &&
                 data.getAction().equalsIgnoreCase(TurbineResources
-                                                  .getString("action.login")) )
+                                                  .getString("action.login")))
             {
-                // If a User is logging in, we should refresh the
-                // session here.  Invalidating session and starting a
-                // new session would seem to be a good method, but I
-                // (JDM) could not get this to work well (it always
-                // required the user to login twice).  Maybe related
-                // to JServ?  If we do not clear out the session, it
-                // is possible a new User may accidently (if they
-                // login incorrectly) continue on with information
-                // associated with the previous User.  Currently the
-                // only keys stored in the session are "turbine.user"
-                // and "turbine.acl".
+                /*
+                 * If a User is logging in, we should refresh the
+                 * session here.  Invalidating session and starting a
+                 * new session would seem to be a good method, but I
+                 * (JDM) could not get this to work well (it always
+                 * required the user to login twice).  Maybe related
+                 * to JServ?  If we do not clear out the session, it
+                 * is possible a new User may accidently (if they
+                 * login incorrectly) continue on with information
+                 * associated with the previous User.  Currently the
+                 * only keys stored in the session are "turbine.user"
+                 * and "turbine.acl".
+                 */
                 String[] names = data.getSession().getValueNames();
                 if (names != null)
                 {
@@ -313,39 +324,46 @@
                 ActionLoader.getInstance().exec ( data, data.getAction() );
             }
 
-            // This is where the validation of the Session information
-            // is performed if the user has not logged in yet, then
-            // the screen is set to be Login. This also handles the
-            // case of not having a screen defined by also setting the
-            // screen to Login. If you want people to go to another
-            // screen other than Login, you need to change that within
-            // TurbineResources.properties...screen.homepage; or, you
-            // can specify your own SessionValidator action.
-            ActionLoader.getInstance()
-                .exec( data, TurbineResources.getString("action.sessionvalidator") );
-
-            // Put the Access Control List into the RunData object, so
-            // it is easily available to modules.  It is also placed
-            // into the session for serialization.  Modules can null
-            // out the ACL to force it to be rebuilt based on more
-            // information.
-            ActionLoader.getInstance()
-                .exec(data,TurbineResources.getString("action.accesscontroller"));
-
-            // Start the execution phase. DefaultPage will execute the
-            // appropriate action as well as get the Layout from the
-            // Screen and then execute that. The Layout is then
-            // responsible for executing the Navigation and Screen
-            // modules.
-            //
-            // Note that by default, this cannot be overridden from
-            // parameters passed in via post/query data. This is for
-            // security purposes.  You should really never need more
-            // than just the default page.  If you do, add logic to
-            // DefaultPage to do what you want.
-            PageLoader.getInstance()
-                .exec(data,TurbineResources.getString("page.default"));
-    
+            /*
+             * This is where the validation of the Session information
+             * is performed if the user has not logged in yet, then
+             * the screen is set to be Login. This also handles the
+             * case of not having a screen defined by also setting the
+             * screen to Login. If you want people to go to another
+             * screen other than Login, you need to change that within
+             * TurbineResources.properties...screen.homepage; or, you
+             * can specify your own SessionValidator action.
+             */
+            String action;
+            action = TurbineResources.getString("action.sessionvalidator");
+            ActionLoader.getInstance().exec(data, action);
+
+            /*
+             * Put the Access Control List into the RunData object, so
+             * it is easily available to modules.  It is also placed
+             * into the session for serialization.  Modules can null
+             * out the ACL to force it to be rebuilt based on more
+             * information.
+             */
+            action = TurbineResources.getString("action.accesscontroller");
+            ActionLoader.getInstance().exec(data,action);
+
+            /*
+             * Start the execution phase. DefaultPage will execute the
+             * appropriate action as well as get the Layout from the
+             * Screen and then execute that. The Layout is then
+             * responsible for executing the Navigation and Screen
+             * modules.
+             *
+             * Note that by default, this cannot be overridden from
+             * parameters passed in via post/query data. This is for
+             * security purposes.  You should really never need more
+             * than just the default page.  If you do, add logic to
+             * DefaultPage to do what you want.
+             */
+            Strong page = TurbineResources.getString("page.default");
+            PageLoader.getInstance().exec(data, page);
+
             // If a module has set data.acl = null, remove acl from
             // the session.
             if ( data.acl == null )
@@ -355,24 +373,29 @@
 
             try
             {
-                if ( data.isPageSet() == false && data.isOutSet() == false )
+                if (data.isPageSet() == false && data.isOutSet() == false )
+                {
                     throw new Exception ( "Nothing to output" );
+                }
 
-                // We are all done! if isPageSet() output that way
-                // otherwise, data.getOut() has already been written
-                // to the data.getOut().close() happens below in the
-                // finally.
-                if ( data.isPageSet() && data.isOutSet() == false )
+                /* 
+                 * We are all done! if isPageSet() output that way
+                 * otherwise, data.getOut() has already been written
+                 * to the data.getOut().close() happens below in the
+                 * finally.
+                 */
+                if (data.isPageSet() && data.isOutSet() == false)
                 {
                     // Modules can override this.
-                    data.getResponse().setContentType( data.getContentType() );
+                    data.getResponse().setContentType(data.getContentType());
 
                     // Handle the case where a module may want to send
                     // a redirect.
-                    if ( ( data.getStatusCode() == 301 || data.getStatusCode() ==  
302 )
-                        && data.getRedirectURI() != null )
+                    if ( (data.getStatusCode() == 301 || 
+                          data.getStatusCode() == 302) && 
+                          data.getRedirectURI() != null)
                     {
-                        data.getResponse().sendRedirect ( data.getRedirectURI() );
+                        data.getResponse().sendRedirect(data.getRedirectURI());
                     }
 
                     // Set the status code.
@@ -383,10 +406,11 @@
             }
             catch ( Exception e )
             {
-                // The output stream was probably closed by the client
-                // end of things ie: the client clicked the Stop
-                // button on the browser, so ignore any errors that
-                // result.
+                /*
+                 * The output stream was probably closed by the client
+                 * end of things ie: the client clicked the Stop
+                 * button on the browser, so ignore any errors that result.
+                 */
             }
         }
         catch ( Exception e )
@@ -449,52 +473,47 @@
     public void propertyFileErrorCheck(String props)
         throws ServletException
     {
-        try
+        String error = null;
+        Object params[] = null;
+
+        if (props == null)
         {
-            ErrorResources.init();
-            if ( props == null)
-            {
-                Object params[] = {(Object) INIT_PROPS_KEY};
-                initFailureMessage = ErrorResources.getMessage(
-                       ErrorResources.PROPERTIES_INIT_PARAMETER_NOT_FOUND, params);
-                log(initFailureMessage);
-                Log.error (initFailureMessage);
-                throw new Exception(initFailureMessage);
-            }
-            else if(props.length() == 0)
-            {
-                Object params[] = {(Object) INIT_PROPS_KEY};
-                initFailureMessage = ErrorResources.getMessage(
-                       ErrorResources.PROPERTIES_INIT_PARAMETER_ZERO_LENGTH_STRING,
-                       params);
-                log(initFailureMessage);
-                Log.error (initFailureMessage);
-                throw new Exception(initFailureMessage);
-            }
-            else if(!(new File(props).exists()))
+            params = new Object[]{(Object) INIT_PROPS_KEY};
+            error  = ErrorResources.PROPERTIES_INIT_PARAMETER_NOT_FOUND;
+        }
+        else if(props.length() == 0)
+        {
+            params = new Object[]{(Object) INIT_PROPS_KEY};
+            error  =
+               ErrorResources.PROPERTIES_INIT_PARAMETER_ZERO_LENGTH_STRING;
+        }
+        else if(!(new File(props).exists()))
+        {
+            params = new Object[]{(Object) props, (Object) INIT_PROPS_KEY};
+            error  = ErrorResources.TURBINE_RESOURCE_FILE_DOES_NOT_EXIST;
+        }
+        else if(!(new File(props).canRead()))
+        {
+            params = new Object[]{(Object) props,
+                                  (Object) System.getProperty("user.name")};
+            error  = ErrorResources.TURBINE_RESOURCE_FILE_NOT_READABLE;
+        }
+
+        if (error != null)
+        {
+            try
             {
-                Object params[] = {(Object) props, (Object) INIT_PROPS_KEY};
-                initFailureMessage = ErrorResources.getMessage(
-                       ErrorResources.TURBINE_RESOURCE_FILE_DOES_NOT_EXIST, params);
+                ErrorResources.init();
+                initFailureMessage = ErrorResources.getMessage(error,params);
                 log(initFailureMessage);
                 Log.error (initFailureMessage);
                 throw new Exception(initFailureMessage);
             }
-            else if(!(new File(props).canRead()))
+            catch ( Exception e )
             {
-                Object params[] = {(Object) props, (Object)
-                       System.getProperty("user.name")};
-                initFailureMessage = ErrorResources.getMessage(
-                       ErrorResources.TURBINE_RESOURCE_FILE_NOT_READABLE, params);
-                log(initFailureMessage);
-                Log.error (initFailureMessage);
-                throw new Exception(initFailureMessage);
+                throw new ServletException (e.toString());
             }
         }
-        catch ( Exception e )
-        {
-            throw new ServletException ( e.toString() );
-        }
     }
 
     /**
@@ -522,21 +541,19 @@
             data.stackTrace = StringUtils.stackTrace(e);
             data.stackTraceException = e;
 
-            // setup the screen
             data.setScreen(TurbineResources
                            .getString("screen.error"));
 
             // do more screen setup for template execution if needed
             if (data.getTemplateInfo() != null)
                 data.getTemplateInfo().setScreenTemplate(TurbineResources
-                               .getString("screen.error"));
+                               .getString("screen.error")); 
 
             // Make sure to not execute an action.
             data.setAction ("");
 
             PageLoader.getInstance()
-                .exec(data, TurbineResources
-                      .getString("page.default"));
+                .exec(data, TurbineResources.getString("page.default"));
 
             data.getResponse().setContentType( data.getContentType() );
             data.getResponse().setStatus ( data.getStatusCode() );
@@ -558,22 +575,38 @@
             }
             try
             {
-                data.getOut().print ("java.lang.NoSuchFieldError: Please recompile 
all of your source code.");
+                String msg;
+                msg = "java.lang.NoSuchFieldError: " +
+                      "Please recompile all of your source code.";
+
+                data.getOut().print(msg);
             }
             catch (IOException io)
             {
+               // ignore
             }
             log ( data.stackTrace );
             org.apache.turbine.util.Log.error ( foo );
         }
+
         // Attempt to do *something* at this point...
         catch ( Exception reallyScrewedNow )
         {
             try
             {
+                String msg;
+                if (data != null)
+                {
+                   msg = "Exception: " + data.stackTrace;
+                }
+                else
+                {
+                   msg = "Exception: " + e;
+                }
+
                 res.setContentType( mimeType );
                 res.setStatus ( 200 );
-                res.getWriter().print ("Exception: " + data.stackTrace);
+                res.getWriter().print (msg);
             }
             catch (Exception foob)
             {


------------------------------------------------------------
To subscribe:        [EMAIL PROTECTED]
To unsubscribe:      [EMAIL PROTECTED]
Search: <http://www.mail-archive.com/turbine%40list.working-dogs.com/>
Problems?:           [EMAIL PROTECTED]

Reply via email to