001/*
002 * Copyright 2003-2005 The Apache Software Foundation
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package net.dpml.cli.builder;
017
018import java.util.HashSet;
019import java.util.Set;
020
021import net.dpml.cli.Argument;
022import net.dpml.cli.Group;
023import net.dpml.cli.option.Switch;
024import net.dpml.cli.resource.ResourceConstants;
025import net.dpml.cli.resource.ResourceHelper;
026
027/**
028 * Builds Switch instance.
029 *
030 * @author <a href="@PUBLISHER-URL@">@PUBLISHER-NAME@</a>
031 * @version @PROJECT-VERSION@
032 */
033public class SwitchBuilder
034{
035    private final String m_enabledPrefix;
036    private final String m_disabledPrefix;
037    private String m_description;
038    private String m_preferredName;
039    private Set m_aliases;
040    private boolean m_required;
041    private Argument m_argument;
042    private Group m_children;
043    private int m_id;
044    private Boolean m_switchDefault;
045
046    /**
047     * Creates a new SwitchBuilder using defaults.
048     * @see Switch#DEFAULT_ENABLED_PREFIX
049     * @see Switch#DEFAULT_DISABLED_PREFIX
050     */
051    public SwitchBuilder()
052    {
053        this( Switch.DEFAULT_ENABLED_PREFIX, Switch.DEFAULT_DISABLED_PREFIX );
054    }
055
056    /**
057     * Creates a new SwitchBuilder
058     * @param enabledPrefix the prefix to use for enabling the option
059     * @param disabledPrefix the prefix to use for disabling the option
060     * @throws IllegalArgumentException if either prefix is less than 1
061     *                                  character long or the prefixes match
062     */
063    public SwitchBuilder( final String enabledPrefix, final String disabledPrefix )
064      throws IllegalArgumentException
065    {
066        if( ( enabledPrefix == null ) || ( enabledPrefix.length() < 1 ) ) 
067        {
068            throw new IllegalArgumentException(
069              ResourceHelper.getResourceHelper().getMessage(
070                ResourceConstants.SWITCH_ILLEGAL_ENABLED_PREFIX ) );
071        }
072
073        if( ( disabledPrefix == null ) || ( disabledPrefix.length() < 1 ) )
074        {
075            throw new IllegalArgumentException(
076              ResourceHelper.getResourceHelper().getMessage(
077                ResourceConstants.SWITCH_ILLEGAL_DISABLED_PREFIX ) );
078        }
079
080        if( enabledPrefix.equals( disabledPrefix ) )
081        {
082            throw new IllegalArgumentException(
083              ResourceHelper.getResourceHelper().getMessage(
084                ResourceConstants.SWITCH_IDENTICAL_PREFIXES ) );
085        }
086
087        m_enabledPrefix = enabledPrefix;
088        m_disabledPrefix = disabledPrefix;
089        reset();
090    }
091
092    /**
093     * Creates a new Switch instance
094     * @return a new Switch instance
095     */
096    public Switch create()
097    {
098        final Switch option =
099            new Switch(
100              m_enabledPrefix, 
101              m_disabledPrefix, 
102              m_preferredName, 
103              m_aliases, 
104              m_description,
105              m_required, 
106              m_argument, 
107              m_children, 
108              m_id, 
109              m_switchDefault );
110        reset();
111        return option;
112    }
113
114    /**
115     * Resets the builder.
116     * @return the builder
117     */
118    public SwitchBuilder reset() 
119    {
120        m_description = null;
121        m_preferredName = null;
122        m_required = false;
123        m_aliases = new HashSet();
124        m_argument = null;
125        m_children = null;
126        m_id = 0;
127        m_switchDefault = null;
128        return this;
129    }
130
131    /**
132     * Use this option description
133     * @param newDescription the description to use
134     * @return this builder
135     */
136    public SwitchBuilder withDescription( final String newDescription ) 
137    {
138        m_description = newDescription;
139        return this;
140    }
141
142    /**
143     * Use this option name. The first name is used as the preferred
144     * display name for the Command and then later names are used as aliases.
145     *
146     * @param name the name to use
147     * @return this builder
148     */
149    public SwitchBuilder withName( final String name )
150    {
151        if( m_preferredName == null )
152        {
153            m_preferredName = name;
154        } 
155        else
156        {
157            m_aliases.add( name );
158        }
159        return this;
160    }
161
162    /**
163     * Use this optionality
164     * @param newRequired true iff the Option is required
165     * @return this builder
166     */
167    public SwitchBuilder withRequired( final boolean newRequired )
168    {
169        m_required = newRequired;
170        return this;
171    }
172
173    /**
174     * Use this Argument
175     * @param newArgument the argument to use
176     * @return this builder
177     */
178    public SwitchBuilder withArgument( final Argument newArgument )
179    {
180        m_argument = newArgument;
181        return this;
182    }
183
184    /**
185     * Use this child Group
186     * @param newChildren the child Group to use
187     * @return this builder
188     */
189    public SwitchBuilder withChildren( final Group newChildren )
190    {
191        m_children = newChildren;
192        return this;
193    }
194
195    /**
196     * Sets the id
197     *
198     * @param newId the id of the Switch
199     * @return this SwitchBuilder
200     */
201    public final SwitchBuilder withId( final int newId )
202    {
203        m_id = newId;
204        return this;
205    }
206
207    /**
208     * Sets the default state for this switch
209     *
210     * @param newSwitchDefault the default state
211     * @return this SwitchBuilder
212     */
213    public final SwitchBuilder withSwitchDefault( final Boolean newSwitchDefault )
214    {
215        m_switchDefault = newSwitchDefault;
216        return this;
217    }
218}