Pre comments:

1. I think KernelParameters should go into a seperate package that other packages (such as kernel) depend on. This will make it easier when creating the bootstrap process.

2. Rename KernelParameters to KernelBean? Everything about it seems to be beenish in nature.


[EMAIL PROTECTED] wrote:


Ok I sat down to start implementing the search policy for kernel parameters and would like to run the default value discovery order by the Avalon folks:

1). First check for parameter value in a merlin.properties file packaged within the same package as this KernelDefaults file.

+1

2). If a merlin installation is found based on a non-null MERLIN_HOME use installation base relative paths to override jar file merlin.properties based values.


+1

3). Check for overriding values in a merlin.properties file anywhere on the classpath. If there is more than one merlin.properties file with a value for the property, then the last path component with a value is used as the effective default property value.


This one sound non-predictable due to the ordering issue. I'm tempted to suggest we exclude this option.


4). Check for overriding values in a dot prefixed (hidden) version of the merlin.properties file (.merlin.properties) within the user's home directory.


+1

5). Check for default override values within the System properties.

+1



These rules once followed may or may not explicitly set a value for each parameter. Obviously null and false will be returned if no value can be found in any property file or env parameter. When the default constructor is used to create a KernelParameters bean instance, the search for parameters occurs and sets the defaults.

Also I can add a method to return a Map representation of the KernelParameters bean if we want that option as well. Should I do that? I will set the property keys (KernelDefaults constants) to reflect the ones used by Steve in previous emails where I can.


I've committed the attched files to a new kernel subproject kernel/loader with the package name org.apache.avalon.merlin.loader.


Cheers, Steve.



Alex




From: <[EMAIL PROTECTED]>
Date: 2003/10/23 Thu PM 12:17:36 EDT
To: <[EMAIL PROTECTED]>
Subject: Embedding and standardizing kernel parameter handling and discovery

Steve,

After doing some research on Merlin for the sake of embedding I've come to some conclusions.

First I see multiple places where kernel parameters are gathered and handled to configure a kernel. Merlin.java, MerlinBean.java, CLIKernelLoader and even in the DefaultEmbeddedKernel. Some kernel parameters are present as properties in beans like the KernelContext and in other places some parameters are put into an associative hash.

Overall I think we need to find a generalized mechanism for providing these parameters and standardize the mechanism everywhere in Merlin (as you already stated). I think you started to do that with these map arguments. This is probably the most flexible means to do so especially when the variables used are in flux but it does not have strict type checking. Conversely, using a bean like a KernelParameters object rather than a map would give you strict type checking.

As I expressed before I think we need to leave parameter gathering up to the embedding application. However there are some default kernel parameter discovery mechanisms that should be provided like getting the MERLIN_HOME parameter from the shell environment.

I've followed your advice to create an Env class that gets operating system and shell specific environment parameters. I'm trying to come up with a parameter discovery process to default populate a KernelParameters bean's members taking the following steps:

1). Check for environment variables first
2). Check for properties files on the path with specific names or in the user's home 
directory to see if we can get some defaults
3). Check the System properties for parameter overrides
4). et cetera.

What do you and the others see for this discovery process?

You already seemed to design the Kernel Loader using the factory or builder pattern. We can stick to the Map approach which gives more flexibility but is less type safe or we can use a bean like the KernelParameters bean which is less flexible but more type safe. Or we could just do both providing alternative create method overloads within the Loader: it's up to you on how to deal with these trade offs.

Now we need to centralize the code that implements the default kernel parameter discovery process and agree on the search order and document it. If we go with the Map approach we might create a default map in a Loader. The Map would contain the defaults and then the API user provided Map argument to the create call would have its properties overlaid onto the defaults Map.

With the KernelParameters bean approach the default constructor can automatically set member properties using the default kernel parameter value discovery policy based class. Whooo that’s a mouth full. Anyway I have some mock classes ready to just look at for the bean based approach.

Personally I think we need to pick one approach and retrofit it to all the classes that build a kernel. IMHO we should not differentiate between embedding the kernel and the CLI based use of the kernel; everything is an embedding situation.

So in conclusion which ever kernel parameter aggregation/passing mechanism we pick (bean based or Map based) we need it to be standardized and well documented. The default value discovery policy also must be well documented and the policy code should be separate and isolated in one place.

I have mocked up a KernelParameters bean and a utility class to start building a policy around it. There is very little code here but I will add it once we agree on a kernel default parameter discovery policy. Attached you'll find the Env variable access utility class and other classes for managing kernel parameters. Excuse the ugly code for the time being - I shall beautify once we decide to go a particular route.

Alex

P.S. I made the KernelParameters an interface with the DefaultKernelParameters being the implementation class just in case.





------------------------------------------------------------------------

/*

============================================================================
                  The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, 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", "Apache Avalon", "Avalon Framework" 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 [EMAIL PROTECTED]

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 (INCLU-
DING, 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.avalon.merlin.kernel ;

/**
* This class represents an exhaustive set of kernel parameters in their most * rudimentary/common representation. * * Note I avoided the use of Files or URLs purposely so any value can be * specified and interpreted in any fashion. I left this as general and * flexible as possible.
* * These methods have been gathered from other methods an members witnessed on * the CLIKernelLoader, KernelContext[Default], and KernelBean classes/
* interfaces.
* * @author <a href="mailto:[EMAIL PROTECTED]">Alex Karasulu</a>
* @author $Author$
* @version $Revision$
*/
public interface KernelParameters
{
/**
* Gets whether or not the kernel should operate in server mode.
* * @return true if it operates in server mode, false otherwise
*/
boolean isServer() ;
/**
* Gets whether or not debugging is enabled in the kernel.
* * @return true if debugging is enabled false otherwise
*/
boolean isDebugEnabled() ;
/**
* Gets whether or not informative logging is enabled in the kernel. * @todo determine whether or not this is absolutely necessary and if there
* is mutual exclusion between this method and the debug methods return.
* * @return true if informative logging is enabled false otherwise
*/
boolean isInfoEnabled() ;
/**
* Url of a potentially remote repository used to pull depenendencies into * the other repositories on artifact misses.
* * @return url to the remote repo from where we download jars
*/
String getRemoteRepositoryUrl() ;
/**
* Path to the user repository base directory where the repository * resides. * * @return the user artifact repository path
*/
String getUserRepositoryPath() ;
/**
* Path to the system artifact repository used to bootstrap the kernel. * * @return the system artifact repo path/url
*/
String getSystemRepositoryPath() ;
/**
* Gets the path to an optional directory that is the root anchor for * optional-extension jar files.
* * @return the optional extention jar directory path
*/
String getLibraryPath() ;
/**
* Gets the working home directory path.
* * @return the kernel's working directory path
*/
String getHomePath() ;
/**
* Gets a temporary directory path.
* * @return a temp space path
*/
String getTempPath() ;
/**
* Gets the path/url to alternative configuration overrides: config.xml * file.
* * @return path/url to config overrides
*/
String getConfigUrl() ;


/**
* Gets the paths or urls to block.xml files to load into the kernel.
* * @return paths/urls to the block.xml file
*/
String [] getTargetUrls() ;
/**
* Gets the path/url to the kernel configuration file.
* * @return path/url to the kernel config file
*/
String getKernelUrl() ;
}





------------------------------------------------------------------------

/*

============================================================================
                  The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, 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", "Apache Avalon", "Avalon Framework" 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 [EMAIL PROTECTED]

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 (INCLU-
DING, 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.avalon.merlin.kernel ;


/**
* Maintains algorithms for determining default values to kernel parameters. * This involves searching classpaths, finding variables in the environment in
* an operating system dependent fashion, and finding variables within the * system properties. Basically the policy of finding the values to these
* kernel parameters are maintained here.
* * @author <a href="mailto:[EMAIL PROTECTED]">Alex Karasulu</a>
* @author $Author$
* @version $Revision$
*/
public class KernelDefaults
{
public static final String IS_SERVER_KEY = "merlin.kernel.isserver" ;
public static final String IS_INFO_KEY =
"merlin.kernel.isinfo" ;
public static final String IS_DEBUG_KEY =
"merlin.kernel.isdebug" ;
public static final String REMOTE_REPO_KEY =
"merlin.kernel.remoterepo" ;
public static final String USER_REPO_KEY =
"merlin.kernel.userrepo" ;
public static final String SYSTEM_REPO_KEY =
"merlin.kernel.systemrepo" ;
public static final String HOME_PATH_KEY =
"merlin.kernel.homepath" ;
public static final String CONFIG_URL_KEY =
"merlin.kernel.configurl" ;
public static final String KERNEL_URL_KEY =
"merlin.kernel.kernelurl" ;
public static final String TARGET_URLS_KEY =
"merlin.kernel.targeturls" ;
public static final String TEMP_PATH_KEY =
"merlin.kernel.temppath" ;
public static final String LIBRARY_PATH_KEY =
"merlin.kernel.librarypath" ;


/**
* Gets a default value for the server flag.
* * @see org.apache.avalon.merlin.kernel.KernelParameters#isServer()
*/
public static boolean isServer()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}


/**
* Gets a default value for the debug flag.
* * @see org.apache.avalon.merlin.kernel.KernelParameters#isDebugEnabled()
*/
public static boolean isDebugEnabled()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}


/**
* Gets a default value for the info flag.
* * @see org.apache.avalon.merlin.kernel.KernelParameters#isInfoEnabled()
*/
public static boolean isInfoEnabled()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}


/**
* Gets a default value for the remote repo.
* * @see org.apache.avalon.merlin.kernel.KernelParameters#
* getRemoteRepositoryUrl()
*/
public static String getRemoteRepositoryUrl()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}


/**
* * @see org.apache.avalon.merlin.kernel.KernelParameters#
* getUserRepositoryPath()
*/
public static String getUserRepositoryPath()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}


/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#
* getSystemRepositoryPath()
*/
public static String getSystemRepositoryPath()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}


/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#getLibraryPath()
*/
public static String getLibraryPath()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}



/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#getHomePath()
*/
public static String getHomePath()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}



/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#getTempPath()
*/
public static String getTempPath()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}



/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#getConfigUrl()
*/
public static String getConfigUrl()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}



/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#getTargetUrls()
*/
public static String[] getTargetUrls()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}



/**
* @see org.apache.avalon.merlin.kernel.KernelParameters#getKernelUrl()
*/
public static String getKernelUrl()
{
throw new UnsupportedOperationException( "N O T I M P L E M E N T E D Y E T !" ) ;
}
}





------------------------------------------------------------------------

import java.io.BufferedReader ;
import java.io.IOException;
import java.io.InputStreamReader ;

/*

============================================================================
                  The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, 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", "Apache Avalon", "Avalon Framework" 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 [EMAIL PROTECTED]

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 (INCLU-
DING, 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/>.

*/

/**
* Encapsulates operating system specific access to environment variables.
* * @todo Add more methods that allow access to path and library parameters in a
* platform neutral fashion.
* * @see List of operating system specific System property values * <a href="http://www.tolstoy.com/samizdat/sysprops.html";>here</a>.
* @author <a href="mailto:[EMAIL PROTECTED]">Alex Karasulu</a>
* @author $Author$
* @version $Revision$
*/
public class Env
{
/**
* Gets the value of a shell environment variable.
* * @param a_name the name of variable * @return the String representation of an environment variable value
* @throws Exception if there is a problem accessing the environment */
public static String getVariable( String a_name )
throws EnvAccessException
{
String l_osName = System.getProperty( "os.name" ) ;
if ( -1 != l_osName.indexOf( "Linux" ) || -1 != l_osName.indexOf( "Solaris" ) ||
-1 != l_osName.indexOf( "MPE/iX" ) ||
-1 != l_osName.indexOf( "AIX" ) ||
-1 != l_osName.indexOf( "FreeBSD" ) ||
-1 != l_osName.indexOf( "Irix" ) ||
-1 != l_osName.indexOf( "Digital Unix" ) ||
-1 != l_osName.indexOf( "HP-UX" ) )
{
return getUnixVariable( a_name ) ;
}
else if ( -1 != l_osName.indexOf( "Windows" ) ) {
return getWindowsVariable( a_name ) ;
}
throw new EnvAccessException( a_name, "Unrecognized operating system: " + l_osName ) ;
}
/**
* Gets a UNIX shell environment parameter by forking a call to echo. This
* should work on all UNIX shells like sh, ksh, csh, zsh and bash.
* * @param a_name the name of the variable accessed
* @return the value of the variable * @throws EnvAccessException if there is an error accessing the value
*/
private static String getUnixVariable( String a_name )
throws EnvAccessException
{
String l_value = null ;
Process l_proc = null ;
BufferedReader l_in = null ;
StringBuffer l_cmd = new StringBuffer() ;
String l_osName = System.getProperty( "os.name" ) ;
l_cmd.append( "echo $" ) ;
l_cmd.append( a_name ) ;


// fire up the shell and get echo'd results on stdout
try
{
l_proc = Runtime.getRuntime().exec( l_cmd.toString() ) ;
l_proc.waitFor() ;
l_in = new BufferedReader( new InputStreamReader( l_proc.getInputStream() ) ) ;
l_value = l_in.readLine() ;
l_in.close() ;
}
catch( Throwable t )
{
throw new EnvAccessException( a_name, t ) ;
}
finally
{
l_proc.destroy() ;
try
{
if ( null != l_in )
{ l_in.close() ;
}
}
catch( IOException e )
{
}
}
if ( 0 == l_proc.exitValue() )
{
// Handle situations where the env property does not exist.
if ( l_value.trim().equals( "" ) )
{
return null ;
}
return l_value ;
}
throw new EnvAccessException( a_name, "Environment process failed with "
+ "non-zero exit code of " + l_proc.exitValue() ) ;
}
/**
* Gets the value for a windows command shell environment variable.
* * @param a_name the name of the variable
* @return the value of the variable
* @throws EnvAccessException if there is an error accessing the value
*/
private static String getWindowsVariable( String a_name )
throws EnvAccessException
{
String l_value = null ;
Process l_proc = null ;
BufferedReader l_in = null ;
StringBuffer l_cmd = new StringBuffer() ;
String l_osName = System.getProperty( "os.name" ) ;


// build the the command based on the shell used: cmd.exe or command.exe if ( -1 != l_osName.indexOf( "98" ) || -1 != l_osName.indexOf( "95" ) )
{
l_cmd.append( "command.exe /C echo %" ) ;
}
else
{
l_cmd.append( "cmd.exe /C echo %" ) ;
}
l_cmd.append( a_name ) ;
l_cmd.append( '%' ) ;


// fire up the shell and get echo'd results on stdout
try
{
l_proc = Runtime.getRuntime().exec( l_cmd.toString() ) ;
l_proc.waitFor() ;
l_in = new BufferedReader( new InputStreamReader( l_proc.getInputStream() ) ) ;
l_value = l_in.readLine() ;
l_in.close() ;
}
catch( Throwable t )
{
throw new EnvAccessException( a_name, t ) ;
}
finally
{
l_proc.destroy() ;
try
{
if ( null != l_in )
{ l_in.close() ;
}
}
catch( IOException e )
{
}
}
if ( 0 == l_proc.exitValue() )
{
// Handle situations where the env property does not exist.
if ( l_value.startsWith( "%") && l_value.endsWith( "%" ) )
{
return null ;
}
return l_value ;
}
throw new EnvAccessException( a_name, "Environment process failed with "
+ "non-zero exit code of " + l_proc.exitValue() ) ;
}
}





------------------------------------------------------------------------

/*

============================================================================
                  The Apache Software License, Version 1.1
============================================================================

Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without modifica-
tion, 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", "Apache Avalon", "Avalon Framework" 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 [EMAIL PROTECTED]

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 (INCLU-
DING, 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/>.

*/

/**
* A simple wrapper exception around exceptions that could occur while accessing
* environment parameters.
* * @author <a href="mailto:[EMAIL PROTECTED]">Alex Karasulu</a>
* @author $Author$
* @version $Revision$
*/
public class EnvAccessException extends Exception
{
/** the environment variable name if available */
public final String m_variable ;
/**
* Creates an exception denoting a failure while attempting to access an * environment variable within an operating system and shell specific * environment that is caused by another exception.
* * @param a_variable the variable whose value was to be accessed
* @param a_message the reason for the access failure * @param a_cause the underlying exception that caused the failure
*/
EnvAccessException( final String a_variable, final Throwable a_cause )
{
super( a_cause ) ;
m_variable = a_variable ;
}



/**
* Creates an exception denoting a failure while attempting to access an * environment variable within an operating system and shell specific * environment.
* * @param a_variable the variable whose value was to be accessed
* @param a_message the reason for the access failure * @param a_cause the underlying exception that caused the failure
*/
EnvAccessException( final String a_variable, final String a_message )
{
super( a_message ) ;
m_variable = a_variable ;
}



/**
* Gets the variable that was to be accessed.
* * @return the value of the variable */
public String getVariable()
{
return m_variable ;
}



/**
* Prepends variable name to the base message.
* * @see java.lang.Throwable#getMessage()
*/
public String getMessage()
{
String l_base = super.getMessage() ;
if ( null == l_base )
{ return "Failed to access " + m_variable + " environment variable" ;
}
return "Failed to access " + m_variable + " environment variable - " + l_base ;
}
}






------------------------------------------------------------------------

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



------------------------------------------------------------------------

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


--


Stephen J. McConnell
mailto:[EMAIL PROTECTED]




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



Reply via email to