001    /**
002     * Copyright 2003-2004 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     */
017    package net.dpml.cli.builder;
018    
019    import java.util.ArrayList;
020    import java.util.List;
021    
022    import net.dpml.cli.Group;
023    import net.dpml.cli.Option;
024    import net.dpml.cli.option.GroupImpl;
025    
026    /**
027     * Builds Group instances.
028     *
029     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
030     * @version 1.0.0
031     */
032    public class GroupBuilder
033    {
034        private String m_name;
035        private String m_description;
036        private List m_options;
037        private int m_minimum;
038        private int m_maximum;
039    
040        /**
041         * Creates a new GroupBuilder
042         */
043        public GroupBuilder()
044        {
045            reset();
046        }
047    
048        /**
049         * Creates a new Group instance
050         * @return the new Group instance
051         */
052        public Group create()
053        {
054            final GroupImpl group =
055              new GroupImpl(
056                m_options, 
057                m_name, 
058                m_description, 
059                m_minimum, 
060                m_maximum );
061            reset();
062            return group;
063        }
064    
065        /**
066         * Resets the builder
067         * @return this builder
068         */
069        public GroupBuilder reset()
070        {
071            m_name = null;
072            m_description = null;
073            m_options = new ArrayList();
074            m_minimum = 0;
075            m_maximum = Integer.MAX_VALUE;
076            return this;
077        }
078    
079        /**
080         * Use this option description
081         * @param newDescription the description to use
082         * @return this builder
083         */
084        public GroupBuilder withDescription( final String newDescription )
085        {
086            m_description = newDescription;
087            return this;
088        }
089    
090        /**
091         * Use this option name
092         * @param newName the name to use
093         * @return this builder
094         */
095        public GroupBuilder withName( final String newName )
096        {
097            m_name = newName;
098            return this;
099        }
100    
101        /**
102         * A valid group requires at least this many options present
103         * @param newMinimum the minimum Options required
104         * @return this builder
105         */
106        public GroupBuilder withMinimum( final int newMinimum )
107        {
108            m_minimum = newMinimum;
109            return this;
110        }
111    
112        /**
113         * A valid group requires at most this many options present
114         * @param newMaximum the maximum Options allowed
115         * @return this builder
116         */
117        public GroupBuilder withMaximum( final int newMaximum )
118        {
119            m_maximum = newMaximum;
120            return this;
121        }
122    
123        /**
124         * Add this option to the group
125         * @param option the Option to add
126         * @return this builder
127         */
128        public GroupBuilder withOption( final Option option )
129        {
130            m_options.add( option );
131            return this;
132        }
133    }