View Javadoc

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 }