Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 15 | arune | 1 | /* |
| 2 | * File created by Jimmy |
||
| 3 | * at 2004-mar-09 13:32:58 |
||
| 4 | */ |
||
| 5 | package Macbeth.Utilities; |
||
| 6 | |||
| 7 | import java.util.HashMap; |
||
| 8 | import java.util.Iterator; |
||
| 9 | import java.util.LinkedList; |
||
| 10 | |||
| 11 | /** |
||
| 12 | * A repository for string data structures. The repository is built upon named data |
||
| 13 | * lists, which can contain list items and/or several levels of sublists. Each list |
||
| 14 | * item contains one or more named string data fields. |
||
| 15 | * @author Jimmy |
||
| 16 | */ |
||
| 17 | public class DataRepository { |
||
| 18 | //a root level list, inside which all other lists and items reside |
||
| 19 | private DataList rootList; |
||
| 20 | //these are used while gradually building up the repository (see methods below) |
||
| 21 | private DataList currentList; |
||
| 22 | private DataListItem currentListItem; |
||
| 23 | |||
| 24 | /** |
||
| 25 | * Creates a new instance of DataRepository. |
||
| 26 | */ |
||
| 27 | public DataRepository() { |
||
| 28 | rootList = new DataList(null); |
||
| 29 | currentList = rootList; |
||
| 30 | currentListItem = null; |
||
| 31 | } |
||
| 32 | |||
| 33 | /** |
||
| 34 | * Begins building a new sublist inside the current list. You |
||
| 35 | * can have any number of sublist. Each list/sublist contains its |
||
| 36 | * own list items and/or other sublists. |
||
| 37 | * @param name The name of the new list. |
||
| 38 | */ |
||
| 39 | public void advancedBuild_BeginList(String name) { |
||
| 40 | //check if another list with the same name already exists inside the current list |
||
| 41 | if (currentList.subLists.containsKey(name)) { |
||
| 42 | //if so, let's use this as our current list (or else it would be overwritten) |
||
| 43 | currentList = (DataList)currentList.subLists.get(name); |
||
| 44 | } |
||
| 45 | //no conflicts...just add the new list |
||
| 46 | else { |
||
| 47 | DataList list = new DataList(currentList); |
||
| 48 | currentList.subLists.put(name, list); |
||
| 49 | currentList = list; |
||
| 50 | } |
||
| 51 | } |
||
| 52 | |||
| 53 | /** |
||
| 54 | * Call this when you have finished adding list items to the |
||
| 55 | * current list. This means that control will return to its |
||
| 56 | * parent list. You need to call endList() the same number |
||
| 57 | * of times as beginList(). |
||
| 58 | */ |
||
| 59 | public void advancedBuild_EndList() { |
||
| 60 | if (currentList!=rootList) { |
||
| 61 | currentList = currentList.parentList; |
||
| 62 | } |
||
| 63 | else { |
||
| 64 | System.err.println("EndList() called too many times!"); |
||
| 65 | } |
||
| 66 | } |
||
| 67 | |||
| 68 | /** |
||
| 69 | * Begins building a new list item inside the current list. Each |
||
| 70 | * list item contains one or more data fields. Note that all data |
||
| 71 | * fields have to be wrapped inside list items, so you cannot add |
||
| 72 | * fields directly to a list. |
||
| 73 | */ |
||
| 74 | public void advancedBuild_BeginListItem() { |
||
| 75 | DataListItem item = new DataListItem(currentList); |
||
| 76 | currentList.items.add(item); |
||
| 77 | currentListItem = item; |
||
| 78 | } |
||
| 79 | |||
| 80 | /** |
||
| 81 | * Call this when you have finished adding data fields to the current |
||
| 82 | * list item. |
||
| 83 | */ |
||
| 84 | public void advancedBuild_EndListItem() { |
||
| 85 | currentListItem = null; |
||
| 86 | } |
||
| 87 | |||
| 88 | /** |
||
| 89 | * Adds a data field to the current list item. |
||
| 90 | * @param name The name of the data field. |
||
| 91 | * @param value The value of the data field. |
||
| 92 | */ |
||
| 93 | public void advancedBuild_PutField(String name, String value) { |
||
| 94 | if (currentListItem!=null) { |
||
| 95 | currentListItem.putField(name, value); |
||
| 96 | } |
||
| 97 | else { |
||
| 98 | //TODO: throw exception when currentListItem==null |
||
| 99 | } |
||
| 100 | } |
||
| 101 | |||
| 102 | /** |
||
| 103 | * Gets a data list from the root. The root list can be |
||
| 104 | * obtained as well by passing null or "root" as name. |
||
| 105 | * @param name The name of the list, or null or "root" |
||
| 106 | * for the root list. |
||
| 107 | * @return The list object. |
||
| 108 | */ |
||
| 109 | public DataList getList(String name) { |
||
| 110 | if (name==null || name.equals("root")) { |
||
| 111 | return rootList; |
||
| 112 | } |
||
| 113 | else { |
||
| 114 | return (DataList)rootList.subLists.get(name); |
||
| 115 | } |
||
| 116 | } |
||
| 117 | |||
| 118 | public Iterator lists() { |
||
| 119 | return rootList.subLists(); |
||
| 120 | } |
||
| 121 | |||
| 122 | /** |
||
| 123 | * Lists the contents in this data repository in a (multi-line) string. |
||
| 124 | * @return A string showing the contents of this data repository. |
||
| 125 | */ |
||
| 126 | public String listContents() { |
||
| 127 | return rootList.listContents(); |
||
| 128 | } |
||
| 129 | |||
| 130 | |||
| 131 | |||
| 132 | public class DataList { |
||
| 133 | public DataList parentList; |
||
| 134 | private LinkedList items; |
||
| 135 | private HashMap subLists; |
||
| 136 | |||
| 137 | public DataList(DataList parentList) { |
||
| 138 | this.parentList = parentList; |
||
| 139 | this.items = new LinkedList(); |
||
| 140 | this.subLists = new HashMap(); |
||
| 141 | } |
||
| 142 | |||
| 143 | public Iterator items() { |
||
| 144 | return items.iterator(); |
||
| 145 | } |
||
| 146 | |||
| 147 | public DataListItem firstItem() { |
||
| 148 | return (DataListItem)items.getFirst(); |
||
| 149 | } |
||
| 150 | |||
| 151 | public Iterator subLists() { |
||
| 152 | return subLists.keySet().iterator(); |
||
| 153 | } |
||
| 154 | |||
| 155 | public DataList getSubList(String name) { |
||
| 156 | return (DataList) subLists.get(name); |
||
| 157 | } |
||
| 158 | |||
| 159 | public String listContents() { |
||
| 160 | String tmp = ""; |
||
| 161 | Iterator it = subLists(); |
||
| 162 | //list contents in all sublists |
||
| 163 | while (it.hasNext()) { |
||
| 164 | String sublist = (String) it.next(); |
||
| 165 | tmp += MySystem.lineBreak + "<LIST: '" + sublist + "'>" + MySystem.lineBreak; |
||
| 166 | tmp += getSubList(sublist).listContents(); |
||
| 167 | tmp += "</LIST>" + MySystem.lineBreak; |
||
| 168 | } |
||
| 169 | //list all items |
||
| 170 | it = items(); |
||
| 171 | while (it.hasNext()) { |
||
| 172 | tmp += " <ITEM>" + MySystem.lineBreak; |
||
| 173 | tmp += ((DataListItem)it.next()).listContents(); |
||
| 174 | tmp += " </ITEM>" + MySystem.lineBreak; |
||
| 175 | } |
||
| 176 | return tmp; |
||
| 177 | } |
||
| 178 | } |
||
| 179 | |||
| 180 | |||
| 181 | public class DataListItem { |
||
| 182 | public DataList parentList; |
||
| 183 | private HashMap fields; |
||
| 184 | |||
| 185 | public DataListItem(DataList parentList) { |
||
| 186 | this.parentList = parentList; |
||
| 187 | this.fields = new HashMap(); |
||
| 188 | } |
||
| 189 | |||
| 190 | public boolean containsField(String name) { |
||
| 191 | return fields.containsKey(name); |
||
| 192 | } |
||
| 193 | |||
| 194 | public String getField(String name) { |
||
| 195 | return (String)fields.get(name); |
||
| 196 | } |
||
| 197 | |||
| 198 | public void putField(String name, String value) { |
||
| 199 | fields.put(name, value); |
||
| 200 | } |
||
| 201 | |||
| 202 | public Iterator fields() { |
||
| 203 | return fields.keySet().iterator(); |
||
| 204 | } |
||
| 205 | |||
| 206 | public String listContents() { |
||
| 207 | String tmp = ""; |
||
| 208 | Iterator it = fields(); |
||
| 209 | while (it.hasNext()) { |
||
| 210 | String field = (String) it.next(); |
||
| 211 | tmp += " '" + field + "' = '" + getField(field) + "'" + MySystem.lineBreak; |
||
| 212 | } |
||
| 213 | return tmp; |
||
| 214 | } |
||
| 215 | } |
||
| 216 | |||
| 217 | } |