You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by ha...@apache.org on 2003/01/19 15:22:45 UTC

cvs commit: jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/common AltrmiRuntimeException.java

hammant     2003/01/19 06:22:45

  Modified:    altrmi/src/java/org/apache/excalibur/altrmi/blocks/publishing
                        AbstractPublisher.java
               altrmi/src/java/org/apache/excalibur/altrmi/server
                        ServerException.java
               altrmi/src/java/org/apache/excalibur/altrmi/server/impl/http
                        CustomHttpServer.java
               altrmi/src/java/org/apache/excalibur/altrmi/server/impl/socket
                        AbstractCompleteSocketStreamServer.java
  Added:       altrmi/src/java/org/apache/excalibur/altrmi/common
                        AltrmiRuntimeException.java
  Log:
  Basic client and server dependencies on A-F removed.
  
  Revision  Changes    Path
  1.4       +1 -1      jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/blocks/publishing/AbstractPublisher.java
  
  Index: AbstractPublisher.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/blocks/publishing/AbstractPublisher.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- AbstractPublisher.java	5 Jan 2003 23:24:08 -0000	1.3
  +++ AbstractPublisher.java	19 Jan 2003 14:22:45 -0000	1.4
  @@ -1 +1 @@
  -/*

 * Copyright (C) The Apache Software Foundation. All rights reserved.

 *

 * This software is published under the terms of the Apache Software License

 * version 1.1, a copy of which has been included with this distribution in

 * the LICENSE.txt file.

 */

package org.apache.excalibur.altrmi.blocks.publishing;



import java.io.File;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.StringTokenizer;

import java.util.Vector;

import org.apache.avalon.framework.activity.Initializable;

import org.apache.avalon.framework.activity.Startable;

import org.apache.avalon.framework.configuration.Configurable;

import org.apache.avalon.framework.configuration.Configuration;

import org.apache.avalon.framework.configuration.ConfigurationException;

import org.apache.avalon.framework.context.Context;

import org.apache.avalon.framework.context.Contextualizable;

import org.apache.avalon.framework.logger.AbstractLogEnabled;

import org.apache.avalon.framework.service.ServiceException;

import org.apache.avalon.framework.service.ServiceManager;

import org.apache.avalon.framework.service.Serviceable;

import org.apache.excalibur.altrmi.common.MethodRequest;

import org.apache.excalibur.altrmi.server.Authenticator;

import org.apache.excalibur.altrmi.server.Publisher;

import org.apache.excalibur.altrmi.server.ClassRetriever;

import org.apache.excalibur.altrmi.server.MethodInvocationHandler;

import org.apache.excalibur.altrmi.server.PublicationDescription;

import org.apache.excalibur.altrmi.server.PublicationException;

import org.apache.excalibur.altrmi.server.impl.AbstractServer;

import org.apache.excalibur.altrmi.server.impl.classretrievers.AbstractDynamicGeneratorClassRetriever;

import org.apache.excalibur.altrmi.server.impl.classretrievers.BcelDynamicGeneratorClassRetriever;

import org.apache.excalibur.altrmi.server.impl.classretrievers.JarFileClassRetriever;

import org.apache.excalibur.altrmi.server.impl.classretrievers.NoClassRetriever;

import org.apache.avalon.framework.context.ContextException;



/**

 * Abstract Publisher.

 *

 * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>

 * @author Thomas Kiesgen

 * @version $Revision$

 */

public abstract class AbstractPublisher

    extends AbstractLogEnabled

    implements Publisher, Startable, Serviceable, Contextualizable, Configurable,

    Initializable

{

    private AbstractServer m_abstractServer;

    private ClassRetriever m_classRetriever;

    private Authenticator m_altrmiAuthenticator;

    protected File m_baseDirectory;

    private boolean m_isDynamicPublisher = false;



    /**

     *

     * @param configuration

     * @throws ConfigurationException

     */

    public void configure( Configuration configuration )

        throws ConfigurationException

    {

        String classRetrieverType = configuration.getChild( "classRetrieverType" ).getValue();



        if( classRetrieverType.equals( "jarFile" ) )

        {

            StringTokenizer st =

                new StringTokenizer( configuration.getChild( "generatedClassJarURLs" ).getValue(),

                                     "," );

            Vector vector = new Vector();



            while( st.hasMoreTokens() )

            {

                try

                {

                    String url = st.nextToken();



                    if( url.startsWith( "./" ) )

                    {

                        File file = new File( m_baseDirectory, url.substring( 2, url.length() ) );



                        vector.add( file.toURL() );

                    }

                    else

                    {

                        vector.add( new URL( url ) );

                    }

                }

                catch( MalformedURLException e )

                {

                    getLogger()

                        .debug( "Can't create URL from config element 'generatedClassJarURLs'",

                                e );

                }

            }



            URL[] urls = new URL[ vector.size() ];



            vector.copyInto( urls );



            m_classRetriever = new JarFileClassRetriever( urls );

        }

        else if( classRetrieverType.equals( "none" ) )

        {

            m_classRetriever = new NoClassRetriever();

        }

        else if( classRetrieverType.equals( "bcel" ) )

        {

            AbstractDynamicGeneratorClassRetriever generator = new BcelDynamicGeneratorClassRetriever();

            File classGenDir = new File( m_baseDirectory, configuration.getChild( "classGenDir" ).getValue( "" ) );

            generator.setClassGenDir( classGenDir.getAbsolutePath() );

            m_classRetriever = generator;



            m_isDynamicPublisher = true;

            getLogger().debug( "setting classgen dir for generator to " + classGenDir.getAbsolutePath() );

            getLogger().debug( "setting class retriever to bcel dynamic generator" );

        }





        else

        {

            throw new ConfigurationException(

                "classRetrieverType must be 'bcel', 'jarFile' or 'none'" );

        }

    }



    /**

     * contextualize as per Contextualizable interface

     * @param context

     */

    public void contextualize( final Context context ) throws ContextException

    {

        m_baseDirectory = ( File ) context.get("app.home");

    }



    /**

     * Service as per Serviceable interface

     * @param manager a service manager

     * @throws ServiceException if a problem during servicing

     * @phoenix:dependency name="org.apache.excalibur.altrmi.server.Authenticator"

     */

    public void service( ServiceManager manager )

        throws ServiceException

    {

        m_altrmiAuthenticator =

            (Authenticator)manager.lookup( Authenticator.class.getName() );

    }



    /**

     * initialize as per Initializable interface

     * @throws Exception

     */

    public void initialize() throws Exception

    {

        m_abstractServer.setClassRetriever( m_classRetriever );

        m_abstractServer.setAuthenticator( m_altrmiAuthenticator );

    }



    /**

     *

     * @param implementation

     * @param asName

     * @param interfaceToExpose

     * @throws PublicationException

     */

    public void publish( Object implementation, String asName, Class interfaceToExpose )

        throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation

                              + ", interf: "+ interfaceToExpose + "]" );



        if( m_isDynamicPublisher )

        {

            ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, interfaceToExpose, this.getClass().getClassLoader() );

                if( getLogger().isDebugEnabled() )

                {

                    getLogger().debug( "generated dynamic proxy for published interface " + asName );

                }

        }



        m_abstractServer.publish( implementation, asName, interfaceToExpose );

    }



    /**

     * Publish an service

     * @param implementation

     * @param asName

     * @param publicationDescription

     * @throws PublicationException

     */

    public void publish(

        Object implementation, String asName, PublicationDescription publicationDescription )

        throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation + "]" );



        if( m_isDynamicPublisher )

        {

            ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, publicationDescription, this.getClass().getClassLoader() );

                if( getLogger().isDebugEnabled() )

                {

                    getLogger().debug( "generated dynamic proxy for published interface " + asName );

                }

        }







        m_abstractServer.publish( implementation, asName, publicationDescription );

    }



    /**

     *

     * @param object

     * @param asName

     * @throws PublicationException

     */

    public void unPublish( Object object, String asName ) throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Unpublishing object [nane: " + asName + ", impl: " + object + "]" );



        m_abstractServer.unPublish( object, asName );

    }



    /**

     *

     * @param object

     * @param asName

     * @param o1

     * @throws PublicationException

     */

    public void replacePublished( Object object, String asName, Object o1 ) throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Replacing published object [nane: " + asName + ", existing: " + object + ", new: " + o1 + "]" );



        m_abstractServer.replacePublished( object, asName, o1 );

    }



    /**

     *

     * @throws Exception

     */

    public void start() throws Exception

    {

        m_abstractServer.start();

    }



    /**

     *

     * @throws Exception

     */

    public void stop() throws Exception

    {

        m_abstractServer.stop();

    }



    /**

     *

     * @param request

     * @param publishedName

     * @return

     */

    public MethodInvocationHandler getMethodInvocationHandler( MethodRequest request, String publishedName )

    {

        return m_abstractServer.getMethodInvocationHandler( request, publishedName );

    }



    /**

     *

     * @param publishedName

     * @return

     */

    public MethodInvocationHandler getMethodInvocationHandler(String publishedName)

    {

        return m_abstractServer.getMethodInvocationHandler( publishedName );

    }



    /**

     *

     * @return

     */

    protected AbstractServer getAbstractServer()

    {

        return m_abstractServer;

    }



    /**

     *

     * @param abstractServer

     */

    protected void setAbstractServer( AbstractServer abstractServer )

    {

        m_abstractServer = abstractServer;

    }

}

  \ No newline at end of file
  +/*

 * Copyright (C) The Apache Software Foundation. All rights reserved.

 *

 * This software is published under the terms of the Apache Software License

 * version 1.1, a copy of which has been included with this distribution in

 * the LICENSE.txt file.

 */

package org.apache.excalibur.altrmi.blocks.publishing;



import java.io.File;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.StringTokenizer;

import java.util.Vector;

import org.apache.avalon.framework.activity.Initializable;

import org.apache.avalon.framework.activity.Startable;

import org.apache.avalon.framework.configuration.Configurable;

import org.apache.avalon.framework.configuration.Configuration;

import org.apache.avalon.framework.configuration.ConfigurationException;

import org.apache.avalon.framework.context.Context;

import org.apache.avalon.framework.context.Contextualizable;

import org.apache.avalon.framework.logger.AbstractLogEnabled;

import org.apache.avalon.framework.service.ServiceException;

import org.apache.avalon.framework.service.ServiceManager;

import org.apache.avalon.framework.service.Serviceable;

import org.apache.excalibur.altrmi.common.MethodRequest;

import org.apache.excalibur.altrmi.server.Authenticator;

import org.apache.excalibur.altrmi.server.Publisher;

import org.apache.excalibur.altrmi.server.ClassRetriever;

import org.apache.excalibur.altrmi.server.MethodInvocationHandler;

import org.apache.excalibur.altrmi.server.PublicationDescription;

import org.apache.excalibur.altrmi.server.PublicationException;

import org.apache.excalibur.altrmi.server.impl.AbstractServer;
import org.apache.excalibur.altrmi.server.impl.LogEnabledServerMonitor;

import org.apache.excalibur.altrmi.server.impl.classretrievers.AbstractDynamicGeneratorClassRetriever;

import org.apache.excalibur.altrmi.server.impl.classretrievers.BcelDynamicGeneratorClassRetriever;

import org.apache.excalibur.altrmi.server.impl.classretrievers.JarFileClassRetriever;

import org.apache.excalibur.altrmi.server.impl.classretrievers.NoClassRetriever;

import org.apache.avalon.framework.context.ContextException;



/**

 * Abstract Publisher.

 *

 * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>

 * @author Thomas Kiesgen

 * @version $Revision$

 */

public abstract class AbstractPublisher

    extends AbstractLogEnabled

    implements Publisher, Startable, Serviceable, Contextualizable, Configurable,

    Initializable

{

    private AbstractServer m_abstractServer;

    private ClassRetriever m_classRetriever;

    private Authenticator m_altrmiAuthenticator;

    protected File m_baseDirectory;

    private boolean m_isDynamicPublisher = false;



    /**

     *

     * @param configuration

     * @throws ConfigurationException

     */

    public void configure( Configuration configuration )

        throws ConfigurationException

    {

        String classRetrieverType = configuration.getChild( "classRetrieverType" ).getValue();



        if( classRetrieverType.equals( "jarFile" ) )

        {

            StringTokenizer st =

                new StringTokenizer( configuration.getChild( "generatedClassJarURLs" ).getValue(),

                                     "," );

            Vector vector = new Vector();



            while( st.hasMoreTokens() )

            {

                try

                {

                    String url = st.nextToken();



                    if( url.startsWith( "./" ) )

                    {

                        File file = new File( m_baseDirectory, url.substring( 2, url.length() ) );



                        vector.add( file.toURL() );

                    }

                    else

                    {

                        vector.add( new URL( url ) );

                    }

                }

                catch( MalformedURLException e )

                {

                    getLogger()

                        .debug( "Can't create URL from config element 'generatedClassJarURLs'",

                                e );

                }

            }



            URL[] urls = new URL[ vector.size() ];



            vector.copyInto( urls );



            m_classRetriever = new JarFileClassRetriever( urls );

        }

        else if( classRetrieverType.equals( "none" ) )

        {

            m_classRetriever = new NoClassRetriever();

        }

        else if( classRetrieverType.equals( "bcel" ) )

        {

            AbstractDynamicGeneratorClassRetriever generator = new BcelDynamicGeneratorClassRetriever();

            File classGenDir = new File( m_baseDirectory, configuration.getChild( "classGenDir" ).getValue( "" ) );

            generator.setClassGenDir( classGenDir.getAbsolutePath() );

            m_classRetriever = generator;



            m_isDynamicPublisher = true;

            getLogger().debug( "setting classgen dir for generator to " + classGenDir.getAbsolutePath() );

            getLogger().debug( "setting class retriever to bcel dynamic generator" );

        }





        else

        {

            throw new ConfigurationException(

                "classRetrieverType must be 'bcel', 'jarFile' or 'none'" );

        }

    }



    /**

     * contextualize as per Contextualizable interface

     * @param context

     */

    public void contextualize( final Context context ) throws ContextException

    {

        m_baseDirectory = ( File ) context.get("app.home");

    }



    /**

     * Service as per Serviceable interface

     * @param manager a service manager

     * @throws ServiceException if a problem during servicing

     * @phoenix:dependency name="org.apache.excalibur.altrmi.server.Authenticator"

     */

    public void service( ServiceManager manager )

        throws ServiceException

    {

        m_altrmiAuthenticator =

            (Authenticator)manager.lookup( Authenticator.class.getName() );

    }



    /**

     * initialize as per Initializable interface

     * @throws Exception

     */

    public void initialize() throws Exception

    {

        m_abstractServer.setClassRetriever( m_classRetriever );

        m_abstractServer.setAuthenticator( m_altrmiAuthenticator );

    }



    /**

     *

     * @param implementation

     * @param asName

     * @param interfaceToExpose

     * @throws PublicationException

     */

    public void publish( Object implementation, String asName, Class interfaceToExpose )

        throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation

                              + ", interf: "+ interfaceToExpose + "]" );



        if( m_isDynamicPublisher )

        {

            ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, interfaceToExpose, this.getClass().getClassLoader() );

                if( getLogger().isDebugEnabled() )

                {

                    getLogger().debug( "generated dynamic proxy for published interface " + asName );

                }

        }



        m_abstractServer.publish( implementation, asName, interfaceToExpose );

    }



    /**

     * Publish an service

     * @param implementation

     * @param asName

     * @param publicationDescription

     * @throws PublicationException

     */

    public void publish(

        Object implementation, String asName, PublicationDescription publicationDescription )

        throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Publishing object [as: " + asName + ", impl: " + implementation + "]" );



        if( m_isDynamicPublisher )

        {

            ( ( AbstractDynamicGeneratorClassRetriever ) m_classRetriever ).generate( asName, publicationDescription, this.getClass().getClassLoader() );

                if( getLogger().isDebugEnabled() )

                {

                    getLogger().debug( "generated dynamic proxy for published interface " + asName );

                }

        }







        m_abstractServer.publish( implementation, asName, publicationDescription );

    }



    /**

     *

     * @param object

     * @param asName

     * @throws PublicationException

     */

    public void unPublish( Object object, String asName ) throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Unpublishing object [nane: " + asName + ", impl: " + object + "]" );



        m_abstractServer.unPublish( object, asName );

    }



    /**

     *

     * @param object

     * @param asName

     * @param o1

     * @throws PublicationException

     */

    public void replacePublished( Object object, String asName, Object o1 ) throws PublicationException

    {

        if( getLogger().isDebugEnabled() )

            getLogger().debug( "Replacing published object [nane: " + asName + ", existing: " + object + ", new: " + o1 + "]" );



        m_abstractServer.replacePublished( object, asName, o1 );

    }



    /**

     *

     * @throws Exception

     */

    public void start() throws Exception

    {

        m_abstractServer.start();

    }



    /**

     *

     * @throws Exception

     */

    public void stop() throws Exception

    {

        m_abstractServer.stop();

    }



    /**

     *

     * @param request

     * @param publishedName

     * @return

     */

    public MethodInvocationHandler getMethodInvocationHandler( MethodRequest request, String publishedName )

    {

        return m_abstractServer.getMethodInvocationHandler( request, publishedName );

    }



    /**

     *

     * @param publishedName

     * @return

     */

    public MethodInvocationHandler getMethodInvocationHandler(String publishedName)

    {

        return m_abstractServer.getMethodInvocationHandler( publishedName );

    }



    /**

     *

     * @return

     */

    protected AbstractServer getAbstractServer()

    {

        return m_abstractServer;

    }



    /**

     *

     * @param abstractServer

     */

    protected void setAbstractServer( AbstractServer abstractServer )

    {
        m_abstractServer = abstractServer;
        LogEnabledServerMonitor sm = new LogEnabledServerMonitor();
        sm.enableLogging(getLogger());
        m_abstractServer.setServerMonitor(sm);
    }

}

  \ No newline at end of file
  
  
  
  1.3       +15 -4     jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/server/ServerException.java
  
  Index: ServerException.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/server/ServerException.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServerException.java	11 Jan 2003 16:10:08 -0000	1.2
  +++ ServerException.java	19 Jan 2003 14:22:45 -0000	1.3
  @@ -7,7 +7,6 @@
    */
   package org.apache.excalibur.altrmi.server;
   
  -import org.apache.avalon.framework.CascadingException;
   
   /**
    * Class ServerException
  @@ -16,9 +15,11 @@
    * @author Paul Hammant <a href="mailto:Paul_Hammant@yahoo.com">Paul_Hammant@yahoo.com</a>
    * @version $Revision$
    */
  -public class ServerException extends CascadingException
  +public class ServerException extends Exception
   {
   
  +    Throwable m_throwable;
  +
       /**
        * Construct an ServerException with a message
        *
  @@ -41,8 +42,18 @@
        */
       public ServerException(String message, Throwable throwable)
       {
  -        super(message, throwable);
  +        super(message);
  +        m_throwable = throwable;
       }
   
  +    /**
  +     * Retrieve root cause of the exception.
  +     *
  +     * @return the root cause
  +     */
  +    public final Throwable getCause()
  +    {
  +        return m_throwable;
  +    }
   
   }
  
  
  
  1.5       +1 -2      jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/server/impl/http/CustomHttpServer.java
  
  Index: CustomHttpServer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/server/impl/http/CustomHttpServer.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- CustomHttpServer.java	19 Jan 2003 11:10:01 -0000	1.4
  +++ CustomHttpServer.java	19 Jan 2003 14:22:45 -0000	1.5
  @@ -7,7 +7,6 @@
    */
   package org.apache.excalibur.altrmi.server.impl.http;
   
  -import org.apache.avalon.framework.logger.ConsoleLogger;
   import org.apache.excalibur.altrmi.server.ServerException;
   import org.apache.excalibur.altrmi.server.impl.AbstractServer;
   import org.apache.excalibur.altrmi.server.impl.ServerCustomStreamReadWriter;
  
  
  
  1.12      +4 -4      jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/server/impl/socket/AbstractCompleteSocketStreamServer.java
  
  Index: AbstractCompleteSocketStreamServer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/server/impl/socket/AbstractCompleteSocketStreamServer.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- AbstractCompleteSocketStreamServer.java	19 Jan 2003 11:10:01 -0000	1.11
  +++ AbstractCompleteSocketStreamServer.java	19 Jan 2003 14:22:45 -0000	1.12
  @@ -14,7 +14,7 @@
   import org.apache.excalibur.altrmi.server.impl.AbstractServer;
   import org.apache.excalibur.altrmi.server.impl.ServerStreamReadWriter;
   import org.apache.excalibur.altrmi.server.impl.adapters.InvocationHandlerAdapter;
  -import org.apache.avalon.framework.CascadingRuntimeException;
  +import org.apache.excalibur.altrmi.common.AltrmiRuntimeException;
   
   
   /**
  @@ -150,14 +150,14 @@
       {
   
           setState(SHUTTINGDOWN);
  -        
  +
           try
           {
               m_serverSocket.close();
           }
           catch ( IOException ioe )
           {
  -            throw new CascadingRuntimeException("Error stopping Complete Socket server", ioe);
  +            throw new AltrmiRuntimeException("Error stopping Complete Socket server", ioe);
           }
           killAllConnections();
           getThread().interrupt();
  
  
  
  1.1                  jakarta-avalon-excalibur/altrmi/src/java/org/apache/excalibur/altrmi/common/AltrmiRuntimeException.java
  
  Index: AltrmiRuntimeException.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1997-2002 The Apache Software Foundation. All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *    "This product includes software developed by the
   *    Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software
   *    itself, if and wherever such third-party acknowledgments
   *    normally appear.
   *
   * 4. The names "Jakarta", "Avalon", and "Apache Software Foundation"
   *    must not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation. For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.excalibur.altrmi.common;
  
  /**
   * RumtimeException with cascade features.
   * Allows recording of nested exceptions.
   *
   * @author <a href="mailto:avalon-dev@jakarta.apache.org">Avalon Development Team</a>
   */
  public class AltrmiRuntimeException
      extends RuntimeException
  {
      private final Throwable m_throwable;
  
      /**
       * Construct a new <code>CascadingRuntimeException</code> instance.
       *
       * @param message The detail message for this exception.
       * @param throwable the root cause of the exception
       */
      public AltrmiRuntimeException( final String message, final Throwable throwable )
      {
          super( message );
          m_throwable = throwable;
      }
  
      /**
       * Retrieve root cause of the exception.
       *
       * @return the root cause
       */
      public final Throwable getCause()
      {
          return m_throwable;
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>