001/*
002 * Copyright 2003-2005 The Apache Software Foundation
003 * Copyright 2005 Stephen McConnell
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package net.dpml.cli;
018
019import java.util.Collections;
020import java.util.Set;
021
022import net.dpml.cli.resource.ResourceHelper;
023
024/**
025 * A problem found while dealing with command line options.
026 *
027 * @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
028 * @version @PROJECT-VERSION@
029 */
030public class OptionException extends Exception
031{
032   /**
033    * The settings used when displaying the related Option.
034    *
035    * @see DisplaySetting
036    */
037    public static final Set HELP_SETTINGS =
038        Collections.unmodifiableSet( 
039          Collections.singleton( DisplaySetting.DISPLAY_PROPERTY_OPTION ) );
040
041    /** resource HELPER instance */
042    private static final ResourceHelper HELPER = ResourceHelper.getResourceHelper();
043
044    /** The Option the exception relates to */
045    private final Option m_option;
046
047    /** The message explaining the Exception */
048    private final String m_message;
049
050    /**
051     * Creates a new OptionException.
052     *
053     * @param option the Option the exception relates to
054     */
055    public OptionException( final Option option )
056    {
057        this( option, null, null );
058    }
059
060    /**
061     * Creates a new OptionException.
062     * @param option the Option the exception relates to
063     * @param messageKey the id of the message to display
064     */
065    public OptionException(
066      final Option option, final String messageKey )
067    {
068        this( option, messageKey, null );
069    }
070
071    /**
072     * Creates a new OptionException.
073     * @param option the Option the exception relates to
074     * @param messageKey the id of the message to display
075     * @param value a value to display with the message
076     */
077    public OptionException(
078      final Option option, final String messageKey, final String value )
079    {
080        m_option = option;
081        if( messageKey != null )
082        {
083            final StringBuffer buffer = new StringBuffer();
084            if( value != null )
085            {
086                buffer.append( HELPER.getMessage( messageKey, value ) );
087            }
088            else
089            {
090                buffer.append( HELPER.getMessage( messageKey ) );
091            }
092            buffer.append( " " );
093            m_option.appendUsage( buffer, HELP_SETTINGS, null );
094            m_message = buffer.toString();
095        }
096        else
097        {
098            m_message = "";
099        }
100    }
101
102    /**
103     * Gets the Option the exception relates to
104     *
105     * @return The related Option
106     */
107    public Option getOption()
108    {
109        return m_option;
110    }
111
112   /**
113    * Return the exception message.
114    * @return the exception message
115    */
116    public String getMessage()
117    {
118        return m_message;
119    }
120}