001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  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     */
017    package org.apache.commons.cli2.builder;
018    
019    import java.util.HashSet;
020    import java.util.Set;
021    
022    import org.apache.commons.cli2.Argument;
023    import org.apache.commons.cli2.Group;
024    import org.apache.commons.cli2.option.Switch;
025    import org.apache.commons.cli2.resource.ResourceConstants;
026    import org.apache.commons.cli2.resource.ResourceHelper;
027    
028    /**
029     * Builds Switch instance.
030     */
031    public class SwitchBuilder {
032        private final String enabledPrefix;
033        private final String disabledPrefix;
034        private String description;
035        private String preferredName;
036        private Set aliases;
037        private boolean required;
038        private Argument argument;
039        private Group children;
040        private int id;
041        private Boolean switchDefault;
042    
043        /**
044         * Creates a new SwitchBuilder using defaults.
045         * @see Switch#DEFAULT_ENABLED_PREFIX
046         * @see Switch#DEFAULT_DISABLED_PREFIX
047         */
048        public SwitchBuilder() {
049            this(Switch.DEFAULT_ENABLED_PREFIX, Switch.DEFAULT_DISABLED_PREFIX);
050        }
051    
052        /**
053         * Creates a new SwitchBuilder
054         * @param enabledPrefix the prefix to use for enabling the option
055         * @param disabledPrefix the prefix to use for disabling the option
056         * @throws IllegalArgumentException if either prefix is less than 1
057         *                                  character long or the prefixes match
058         */
059        public SwitchBuilder(final String enabledPrefix,
060                             final String disabledPrefix)
061            throws IllegalArgumentException {
062            if ((enabledPrefix == null) || (enabledPrefix.length() < 1)) {
063                throw new IllegalArgumentException(ResourceHelper.getResourceHelper().getMessage(ResourceConstants.SWITCH_ILLEGAL_ENABLED_PREFIX));
064            }
065    
066            if ((disabledPrefix == null) || (disabledPrefix.length() < 1)) {
067                throw new IllegalArgumentException(ResourceHelper.getResourceHelper().getMessage(ResourceConstants.SWITCH_ILLEGAL_DISABLED_PREFIX));
068            }
069    
070            if (enabledPrefix.equals(disabledPrefix)) {
071                throw new IllegalArgumentException(ResourceHelper.getResourceHelper().getMessage(ResourceConstants.SWITCH_IDENTICAL_PREFIXES));
072            }
073    
074            this.enabledPrefix = enabledPrefix;
075            this.disabledPrefix = disabledPrefix;
076            reset();
077        }
078    
079        /**
080         * Creates a new Switch instance
081         * @return a new Switch instance
082         */
083        public Switch create() {
084            final Switch option =
085                new Switch(enabledPrefix, disabledPrefix, preferredName, aliases, description,
086                           required, argument, children, id, switchDefault);
087    
088            reset();
089    
090            return option;
091        }
092    
093        /**
094         * Resets the builder.
095         * @return this builder
096         */
097        public SwitchBuilder reset() {
098            description = null;
099            preferredName = null;
100            required = false;
101            aliases = new HashSet();
102            argument = null;
103            children = null;
104            id = 0;
105            switchDefault = null;
106    
107            return this;
108        }
109    
110        /**
111         * Use this option description
112         * @param newDescription the description to use
113         * @return this builder
114         */
115        public SwitchBuilder withDescription(final String newDescription) {
116            this.description = newDescription;
117    
118            return this;
119        }
120    
121        /**
122         * Use this option name. The first name is used as the preferred
123         * display name for the Command and then later names are used as aliases.
124         *
125         * @param name the name to use
126         * @return this builder
127         */
128        public SwitchBuilder withName(final String name) {
129            if (preferredName == null) {
130                preferredName = name;
131            } else {
132                aliases.add(name);
133            }
134    
135            return this;
136        }
137    
138        /**
139         * Use this optionality
140         * @param newRequired true iff the Option is required
141         * @return this builder
142         */
143        public SwitchBuilder withRequired(final boolean newRequired) {
144            this.required = newRequired;
145    
146            return this;
147        }
148    
149        /**
150         * Use this Argument
151         * @param newArgument the argument to use
152         * @return this builder
153         */
154        public SwitchBuilder withArgument(final Argument newArgument) {
155            this.argument = newArgument;
156    
157            return this;
158        }
159    
160        /**
161         * Use this child Group
162         * @param newChildren the child Group to use
163         * @return this builder
164         */
165        public SwitchBuilder withChildren(final Group newChildren) {
166            this.children = newChildren;
167    
168            return this;
169        }
170    
171        /**
172         * Sets the id
173         *
174         * @param newId
175         *            the id of the Switch
176         * @return this SwitchBuilder
177         */
178        public final SwitchBuilder withId(final int newId) {
179            this.id = newId;
180    
181            return this;
182        }
183    
184        /**
185         * Sets the default state for this switch
186         *
187         * @param newSwitchDefault the default state
188         * @return this SwitchBuilder
189         */
190        public final SwitchBuilder withSwitchDefault(final Boolean newSwitchDefault) {
191            this.switchDefault = newSwitchDefault;
192    
193            return this;
194        }
195    }