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 */
017 package net.dpml.cli.builder;
018
019 import java.util.HashSet;
020 import java.util.Set;
021
022 import net.dpml.cli.Argument;
023 import net.dpml.cli.Group;
024 import net.dpml.cli.option.Command;
025 import net.dpml.cli.resource.ResourceConstants;
026 import net.dpml.cli.resource.ResourceHelper;
027
028 /**
029 * Builds Command instances
030 *
031 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
032 * @version 1.0.0
033 */
034 public class CommandBuilder
035 {
036 /** the preferred name of the command */
037 private String m_preferredName;
038
039 /** the description of the command */
040 private String m_description;
041
042 /** the aliases of the command */
043 private Set m_aliases;
044
045 /** whether the command is required or not */
046 private boolean m_required;
047
048 /** the argument of the command */
049 private Argument m_argument;
050
051 /** the children of the command */
052 private Group m_children;
053
054 /** the id of the command */
055 private int m_id;
056
057 /**
058 * Creates a new <code>CommandBuilder</code> instance.
059 */
060 public CommandBuilder()
061 {
062 reset();
063 }
064
065 /**
066 * Creates a new <code>Command</code> instance using the properties of the
067 * <code>CommandBuilder</code>.
068 *
069 * @return the new Command instance
070 */
071 public Command create()
072 {
073 // check we have a valid name
074 if( m_preferredName == null )
075 {
076 throw new IllegalStateException(
077 ResourceHelper.getResourceHelper().getMessage(
078 ResourceConstants.OPTION_NO_NAME ) );
079 }
080
081 // build the command
082 final Command option =
083 new Command(
084 m_preferredName, m_description, m_aliases, m_required, m_argument, m_children, m_id );
085
086 // reset the builder
087 reset();
088 return option;
089 }
090
091 /**
092 * Resets the CommandBuilder to the defaults for a new Command.
093 *
094 * This method is called automatically at the end of the
095 * {@link #create() create} method.
096 * @return this <code>CommandBuilder</code>.
097 */
098 public CommandBuilder reset()
099 {
100 m_preferredName = null;
101 m_description = null;
102 m_aliases = new HashSet();
103 m_required = false;
104 m_argument = null;
105 m_children = null;
106 m_id = 0;
107 return this;
108 }
109
110 /**
111 * Specifies the name for the next <code>Command</code>
112 * that is created. The first name is used as the preferred
113 * display name for the <code>Command</code> and then
114 * later names are used as aliases.
115 *
116 * @param name the name for the next <code>Command</code>
117 * that is created.
118 * @return this <code>CommandBuilder</code>.
119 */
120 public CommandBuilder withName( final String name )
121 {
122 if( m_preferredName == null )
123 {
124 m_preferredName = name;
125 }
126 else
127 {
128 m_aliases.add( name );
129 }
130 return this;
131 }
132
133 /**
134 * Specifies the description for the next <code>Command</code>
135 * that is created. This description is used to produce
136 * help documentation for the <code>Command</code>.
137 *
138 * @param newDescription the description for the next
139 * <code>Command</code> that is created.
140 * @return this <code>CommandBuilder</code>.
141 */
142 public CommandBuilder withDescription( final String newDescription )
143 {
144 m_description = newDescription;
145 return this;
146 }
147
148 /**
149 * Specifies whether the next <code>Command</code> created is
150 * required or not.
151 * @param newRequired whether the next <code>Command</code> created is
152 * required or not.
153 * @return this <code>CommandBuilder</code>.
154 */
155 public CommandBuilder withRequired( final boolean newRequired )
156 {
157 m_required = newRequired;
158 return this;
159 }
160
161 /**
162 * Specifies the children for the next <code>Command</code>
163 * that is created.
164 *
165 * @param newChildren the child options for the next <code>Command</code>
166 * that is created.
167 * @return this <code>CommandBuilder</code>.
168 */
169 public CommandBuilder withChildren( final Group newChildren )
170 {
171 m_children = newChildren;
172 return this;
173 }
174
175 /**
176 * Specifies the argument for the next <code>Command</code>
177 * that is created.
178 *
179 * @param newArgument the argument for the next <code>Command</code>
180 * that is created.
181 * @return this <code>CommandBuilder</code>.
182 */
183 public CommandBuilder withArgument( final Argument newArgument )
184 {
185 m_argument = newArgument;
186 return this;
187 }
188
189 /**
190 * Specifies the id for the next <code>Command</code> that is created.
191 *
192 * @param newId the id for the next <code>Command</code> that is created.
193 * @return this <code>CommandBuilder</code>.
194 */
195 public final CommandBuilder withId( final int newId )
196 {
197 m_id = newId;
198 return this;
199 }
200 }