1 package rydeen;
2
3 import java.util.Iterator;
4 import java.util.LinkedHashMap;
5 import java.util.Map;
6
7 /**
8 * <p>
9 * ある処理器({@link Processor <code>Processor</code>})の処理結果を扱うためのクラスです.
10 * 処理結果を出力するために用いられます.
11 * </p><p>
12 * サマリは複数のエントリから成り,1つのエントリにはキーとそれに対応する値が含まれる.
13 * エントリは追加された順序を保持します.
14 * キーは親子関係があり,階層は.で区切られます.このサマリのトップの階層は
15 * {@link #getProcessorId() <code>getProcessorId</code>}メソッドで
16 * 返される処理器の名前です.
17 * </p><p>
18 * サマリ同士が階層関係を結ぶ場合もあります.
19 * </p>
20 *
21 * @author Haruaki Tamada
22 */
23 public class Summary implements Iterable<Summary.Entry>{
24 private String processorId;
25 private Map<String, Summary.Entry> entries = new LinkedHashMap<String, Summary.Entry>();
26
27 /**
28 * 指定された名前でサマリオブジェクトを作成します.
29 */
30 public Summary(String processorId){
31 setProcessorId(processorId);
32 }
33
34 /**
35 * <p>
36 * 処理器のIdを設定します.
37 * </p><p>
38 * idがnullのNullPointerExceptionが投げられます.
39 * </p>
40 * @param id 処理器のId
41 */
42 public void setProcessorId(String id){
43 if(id == null){
44 throw new NullPointerException();
45 }
46 this.processorId = id;
47 }
48
49 /**
50 * 処理器のidを返します.
51 * @return 処理器のid
52 */
53 public String getProcessorId(){
54 return processorId;
55 }
56
57 /**
58 * <p>サマリに,1つのエントリを追加します.</p>
59 * <p>keyがnullの場合,valueがnullの場合はNullPointerExceptionが投げられます.</p>
60 * @param key 追加するエントリのキー
61 * @param value キーに対応する値
62 */
63 public void putEntry(String key, String value){
64 if(key == null || value == null){
65 throw new NullPointerException();
66 }
67 entries.put(key, new Summary.Entry(key, value));
68 }
69
70 /**
71 * <p>
72 * keyに対応する値を返します.keyに対応する値が存在しない場合はnullが返されます.
73 * </p>
74 * <p>
75 * keyがnullの場合はNullPointerExceptionが投げられます.
76 * </p>
77 * @param key 取得したい値に対応付けられているキー.
78 * @return keyに対応付けられた値.
79 */
80 public String getEntry(String key){
81 if(key == null){
82 throw new NullPointerException();
83 }
84 Entry entry = entries.get(key);
85 String value = null;
86 if(entry != null){
87 value = entry.getValue();
88 }
89 return value;
90 }
91
92 /**
93 * <p>
94 * サマリから指定されたキーを持つエントリを削除します.
95 * keyがnullの場合や,与えられたkeyに値が対応付けられていない場合は何も行いません.
96 * </p>
97 *
98 * @param key 削除するエントリのキー
99 */
100 public void removeEntry(String key){
101 entries.remove(key);
102 }
103
104 /**
105 * このサマリに格納されているエントリの数を返します.
106 * @return このサマリオブジェクトが持つエントリの数.
107 */
108 public int getEntryCount(){
109 return entries.size();
110 }
111
112 /**
113 * このサマリに格納されているエントリの列挙を返します.
114 */
115 @Override
116 public Iterator<Summary.Entry> iterator(){
117 return entries.values().iterator();
118 }
119
120 /**
121 * サマリに追加するエントリを表すクラス.
122 */
123 public static class Entry{
124 private String key;
125 private String value;
126
127 /**
128 * 与えられたキーとそれに対応する値で,
129 * サマリのエントリを構築します.
130 * キーもしくは,値がnullの場合はNullPointerExceptionが投げられます.
131 */
132 public Entry(String key, String value){
133 if(key == null || value == null){
134 throw new NullPointerException();
135 }
136 this.key = key;
137 this.value = value;
138 }
139
140 /**
141 * このエントリのキーを返します.
142 */
143 public String getKey(){
144 return key;
145 }
146
147 /**
148 * このエントリの値を返します.
149 */
150 public String getValue(){
151 return value;
152 }
153 }
154 }