Hi, Leif, Berin and all!

Looks like the question of minimizing the stack traces
is still on the table. To me it splits into the following
sub-areas:

1) AbstractContainer throws a CompositeException from
   initialize()

   Good.

   AbstractContainer can be taught not to log
   anything itself. (Or log with level debug).

   Then we would be able to allow the invoker
   to do the logging.

   The invoker may safely omit stack traces
   for certain "safe" exceptions
       ConfigurationException
       ServiceException
       ContextException
   
   and print only the message.

2)
   But for this to be nice, it would be really
   good for every exception in CompositeException
   to carry info on what component caused the
   failure.

   What should this info be? The 'id' should be
   enough. Ok?

   How to pass id along with exception?

3)
   Pack the info into the CompositeException
   it would be very easy to provide a

   public String[] getIds();

   method that would return an array of ids.
   Very easy, but not generic enough IMO.
   
   With lazy initialization for instance
   it will also be nice to pack the id
   of the offending component along with
   the exception but we won't have a CompositeException
   to wrap it into then.

4)
   Pack the id into the Exception itself.
   The cleanest way, isn't it?
   Just what the Exception-s are for.

   <disclaimer>
   Gentlemen, I want to remark in advance
   that I will not feel at all offended if
   I hit a rock and it hurts, if I ask about
   extending some fundamentals of Avalon and
   I meet resistance - so please, no excuses,
   we are mates here -- I just love this word :-)
   so no bad feeling on my side will come - so
   no excuses, please!
   </disclaimer>

   Gentlemen it's beginning to be funny -- but
   again I feel like proposing to extend the Framework! :-)))

   ROTFL :-))

   But I do!

   We need to pack info on the component that caused
   an exception along with the info itself!

   Does it best fit to CascadingException? Or where?

   Okay, it must be too late now for me to decide this,
   but looks like the id should somehow be packed into
   the exception signalling its failure. Perhaps a
   Fortress-private exception

   * ComponentStartupFailed
   * ActivationFailed

   or something like this, it will have the id attached
   and enclose the exception.

5)

   Now the user-developer should be prepared to deal with it.
   Here we continue section 1) of this mail (plz see it again :-)

   I believe the algorithm should be the following:

   StringBuffer sb = new StringBuffer();
   buildMessage( e, sb );

   
   buildMessage( Throwable t, StringBuffer sb )
   {
       if ( e instanceof CompositeException )
       {
           for ( member in e.getExceptions() )
           {
               buildMessage( member, sb )
           }
       }
       else
       {
           eHasId = e carries a component id;
           
           if ( eHasId )
           {
               sb.append( "Activation failed for '" + e.id + "'
                       because of");
           }
           
           if ( eHasId && e is a "safe and envisioned" exception )
           {
               sb.append( getLastPart(e.getClass.getName()) +
                       e.getMessage() );
           }
           else
           {
               /* we did not envision this. give the stack trace
                  and thus force user-user to call the support,
                  something really bad happened */
               sb.append( e.getStackTrace() );
           }
           
           if ( e.getCause() != null )
           {
               sb.append( " caused by\n" );
               buildMessage( e.getCause, sb );
           }
       }
   }
   
Quite a bit of work. And this work is quite standard.
Probably we shouldn't load user with it. But who then?
I guess we should either teach all our loggers to do that
or just to provide an utility method somewhere to do that.
Again: to late an hour for me to make my mind :-)

6)

For this all to work smoothly with in particular
ConfigurationException we should make sure that

a) correct info on what component triggered the exception
   be available (with a stack trace we would deduct
   better or worse from the classname of the component)
   but if we cut the trace we strictly need the id
   
b) the best possible info on the location of the
   offending element inside the configuration file

We have covered a) in section 4.
Lets look closer at b). This info is available
from Configuration.getLocation(). Now we have to hook
it into the ConfigurationException. Currently I just
attach it to the message like
    new ConfigurationException( message + " at " + conf.getLocation())
however we should probably consider extending the
ConfigurationException with the info on location.

(Yes, again, extending the Framework, I must be mad :-)

What experience did you have gentlemen with this info
being kept separate from the message in SAXExcepton?
Good or Bad?

7)

ServiceManager exception. It looks pretty safe
not to print stack if we have the id of the
component that has caused it. We know what
ServiceManager it operates upon.

8)
And, a bit aside from this.
What on earth is a use case for background
activation of components (Fortress)?

Are these these the "active" components.
They do not passive. They do service incoming
servlet requests, they do not serve incoming JMS
messages, nothing.

Instead they are active. They send requests.
They send JMS messages.

Am I right?

If yes, then what should happen to the system
if activation of such component fails.

Nothing? Run okay?

This makes activation=="background"
identical to the notion of "optional" component,
not "optional" that can be configured on not be configured,
but "optional" that may start and may not start.

Was this the intent?

If no, how can we fix this?

If we decide that all the components are required,
then how do we shutdown the system once a "background"
component fails initialization?

And what about lazy initialization?
Do I get correctly that the inability to activate
a lazily-activatable component never will cause the
whole system to shut-down?


Oh, enough for one poor day,
WBR, Anton Tagunov


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to