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     */
016    package net.dpml.cli.builder;
017    
018    import java.util.HashSet;
019    import java.util.Set;
020    
021    import net.dpml.cli.Argument;
022    import net.dpml.cli.Group;
023    import net.dpml.cli.option.Switch;
024    import net.dpml.cli.resource.ResourceConstants;
025    import net.dpml.cli.resource.ResourceHelper;
026    
027    /**
028     * Builds Switch instance.
029     *
030     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
031     * @version 1.0.0
032     */
033    public 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    }