1 package rydeen;
2
3 import java.io.Serializable;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.Map;
8
9 /**
10 * 処理器のパラメータを取りまとめるクラスです.
11 * このクラスは複数の{@link Argument <code>Argument</code>}を管理します.
12 *
13 * @see Argument
14 * @author Haruaki Tamada
15 */
16 public class Arguments implements Iterable<Argument>, Serializable{
17 private static final long serialVersionUID = 529727017881875610L;
18
19 private Map<String, Argument> arguments = new HashMap<String, Argument>();
20
21 /**
22 * 空のArgumentを持つオブジェクトを構築します.
23 */
24 public Arguments(){
25 }
26
27 /**
28 * セルフコンストラクタ.引数に与えられたArgumentsが持っている全てのArgument
29 * を保持するオブジェクトを構築します.
30 */
31 public Arguments(Arguments args){
32 for(Argument param: args){
33 arguments.put(param.getName(), param);
34 }
35 }
36
37 /**
38 * 引数に与えられたArgumentを持つオブジェクトを構築します.
39 */
40 public Arguments(Argument[] args){
41 for(Argument param: args){
42 arguments.put(param.getName(), param);
43 }
44 }
45
46 /**
47 * このオブジェクトが持つArgumentの列挙を返します.
48 */
49 @Override
50 public Iterator<Argument> iterator(){
51 return Collections.unmodifiableMap(arguments).values().iterator();
52 }
53
54 /**
55 * 与えられた Arguments とこの Arguments を統合します.両方の Arguments
56 * に同じ名前の異なる値があった場合,このArgumentsにある値が保持されます.
57 *
58 * @see #mergeOverwrite(Arguments)
59 * @param args
60 */
61 public void merge(Arguments args){
62 for(Argument param: args){
63 if(arguments.get(param.getName()) == null){
64 arguments.put(param.getName(), param);
65 }
66 }
67 }
68
69 /**
70 * 与えられた Arguments とこの Arguments を統合します.
71 * 両方の Arguments に同じ名前の異なる値があった場合,
72 * 与えられた Arguments の値でこのArgumentsの値が上書きされます.
73 *
74 * @param args
75 */
76 public void mergeOverwrite(Arguments args){
77 for(Argument param: args){
78 arguments.put(param.getName(), param);
79 }
80 }
81
82 /**
83 * <p>
84 * 与えられた名前のArgumentをこのオブジェクトが持っていれば,trueを返し,
85 * 持っていなければfalseを返します.
86 * オブジェクトを持っているとは,このArgumentsオブジェクトに
87 * 指定された名前を持つ値が設定されていることです.その値がnullの場合もあり得ます.
88 * </p><p>
89 * 引数にnullが与えられれば,NullPointerExceptionが投げられます.
90 * </p>
91 *
92 * @param name 存在を確認する引数の名前
93 * @return 存在していればtrue, 存在していなければ false.
94 */
95 public boolean hasArgument(String name){
96 if(name == null){
97 throw new NullPointerException();
98 }
99 return arguments.get(name) != null;
100 }
101
102 /**
103 * <p>
104 * 与えられた名前に割り当てられたArgumentの値を返します.
105 * </p><p>
106 * nameに引数が設定されていなかった場合(nameに対応する値がnullの場合),
107 * defaultValueを返します.
108 * </p><p>
109 * {@link #hasArgument(String) <code>hasArgument(name)</code>}がfalseを返す場合,
110 * このメソッドはnullを返します.
111 * </p><p>
112 * nameがnullの場合,NullPointerExceptionが投げられます.
113 * </p>
114 *
115 * @param name 値を取得するArgumentの名前
116 * @param defaultValue 指定したArgumentに値が割り当てられていなかった場合に返すデフォルト値
117 * @return Argumentに割り当てられた値.値がnullであれば,第2引数に渡されたdefaultValue.
118 */
119 public String getValue(String name, String defaultValue){
120 String value = null;
121 if(name == null){
122 throw new NullPointerException();
123 }
124 if(arguments.containsKey(name)){
125 Argument param = arguments.get(name);
126 if(param != null){
127 value = param.getValue();
128 }
129 if(value == null){
130 value = defaultValue;
131 }
132 }
133 return value;
134 }
135
136 /**
137 * <p>
138 * 与えられた名前に割り当てられたArgumentの解説を返します.
139 * </p><p>
140 * {@link #hasArgument(String) <code>hasArgument(name)</code>}がfalseを返す場合や,
141 * 解説が設定されていなかった場合はnullを返します.
142 * </p><p>
143 * 引数にnullが与えられた場合,NullPointerExceptionが投げられます.
144 * </p>
145 *
146 * @param name 解説を取得するArgumentの名前
147 * @return 指定されたArgumentの解説.
148 */
149 public String getDescription(String name){
150 String desc = null;
151 if(name == null){
152 throw new NullPointerException();
153 }
154 if(arguments.containsKey(name)){
155 Argument param = arguments.get(name);
156 if(param != null){
157 desc = param.getDescription();
158 }
159 }
160 return desc;
161 }
162
163 /**
164 * <p>
165 * 与えられた名前に割り当てられたArgumentの値を返します.値が存在しなかったり,
166 * {@link #hasArgument(String) <code>hasArgument(name)</code>}
167 * がfalseを返す場合,nullを返します.
168 * </p><p>
169 * {@link #getValue(String, String) <code>getValue(name, null)</code>}.
170 * </p>
171 *
172 * @param name 値を取得するArgumentの名前
173 * @return Argumentの名前に割り当てられた値.
174 */
175 public String getValue(String name){
176 return getValue(name, null);
177 }
178
179 /**
180 * Argumentの解説を設定します.与えられた名前のArgumentが設定されていない場合,
181 * name がnullの場合は NullPointerExceptionが投げられます.
182 *
183 * @param name 解説を設定しようとするArgumentの名前
184 * @param description 新たに設定する解説
185 */
186 public void setDescription(String name, String description){
187 Argument arg = arguments.get(name);
188 if(name == null){
189 throw new NullPointerException("name is null");
190 }
191 else if(arg == null){
192 throw new NullPointerException(name + " is not contained.");
193 }
194 else{
195 arg = new ArgumentImpl(name, arg.getValue(), description);
196 }
197 arguments.put(name, arg);
198 }
199
200 /**
201 * 引数のargを新たなArgumentの1つとして登録します.
202 *
203 * @param arg 新たに登録するArgument.
204 */
205 public void putValue(Argument arg){
206 arguments.put(arg.getName(), arg);
207 }
208
209 /**
210 * <p>
211 * Argumentに値を割り当てます. nameが存在しない場合は新たなArgumentが作成されます.
212 * </p><p>
213 * nameがnullの場合,NullPointerExceptionが投げられます.
214 * valueがnullの場合,Argumentの値がnullとして設定されます.
215 * </p><p>
216 * nameに割り当てられたArgumentが存在した場合,値が変更されるだけで,解説には影響を与えません.
217 * </p>
218 */
219 public void putValue(String name, String value){
220 if(name == null){
221 throw new NullPointerException();
222 }
223 Argument arg = arguments.get(name);
224 if(arg == null){
225 arg = new ArgumentImpl(name, value);
226 }
227 else{
228 arg = new ArgumentImpl(name, value, arg.getDescription());
229 }
230 arguments.put(name, arg);
231 }
232
233 /**
234 * <p>
235 * Argumentに値を割り当てます.
236 * </p><p>
237 * nameがnullの場合,NullPointerExceptionが投げられます.
238 * value,descriptionがnullの場合,nullで上書きされます.
239 * </p>
240 */
241 public void putValue(String name, String value, String description){
242 if(name == null){
243 throw new NullPointerException();
244 }
245 arguments.put(name, new ArgumentImpl(name, value, description));
246 }
247
248 /**
249 * <p>
250 * このオブジェクトが保持するArgumentの数を返します.返される値は必ず0以上になります.
251 * </p>
252 */
253 public int getArgumentCount(){
254 return arguments.size();
255 }
256
257 /**
258 * <p>
259 * nameが表す引数を削除します.
260 * </p><p>
261 * 削除に成功した場合はtrueを返します.
262 * {@link #hasArgument(String) <code>hasArgument(name)</code>}がfalseを返す場合は
263 * このメソッドもfalseを返します.
264 * </p>
265 */
266 public boolean removeArgument(String name){
267 return arguments.remove(name) != null;
268 }
269 }