1:
37:
38: package ;
39:
40: import ;
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48:
49:
54: public class NodeReader {
55:
56: private final BufferedReader br;
57: private String line = "";
58:
59: private final PreferencesFactory factory;
60:
61: public NodeReader(Reader r, PreferencesFactory factory) {
62: if(r instanceof BufferedReader) {
63: br = (BufferedReader) r;
64: } else {
65: br = new BufferedReader(r);
66: }
67: this.factory = factory;
68: }
69:
70: public NodeReader(InputStream is, PreferencesFactory factory) {
71: this(new InputStreamReader(is), factory);
72: }
73:
74: public void importPreferences()
75: throws InvalidPreferencesFormatException, IOException
76: {
77: readPreferences();
78: }
79:
80: private void readPreferences()
81: throws InvalidPreferencesFormatException, IOException
82: {
83:
84: skipTill("<preferences");
85:
86: readRoot();
87:
88:
89: skipTill("</preferences>");
90: }
91:
92: private void readRoot()
93: throws InvalidPreferencesFormatException, IOException
94: {
95:
96: skipTill("<root");
97:
98:
99: skipTill("type=\"");
100: String type = readTill("\"");
101: Preferences root;
102: if ("user".equals(type)) {
103: root = factory.userRoot();
104: } else if ("system".equals(type)) {
105: root = factory.systemRoot();
106: } else {
107: throw new InvalidPreferencesFormatException("Unknown type: "
108: + type);
109: }
110:
111:
112: readMap(root);
113: readNodes(root);
114:
115:
116: skipTill("</root>");
117: }
118:
119: private void readNodes(Preferences node)
120: throws InvalidPreferencesFormatException, IOException
121: {
122: while ("node".equals(nextTag())) {
123: skipTill("<node");
124: skipTill("name=\"");
125: String name = readTill("\"");
126: Preferences subnode = node.node(name);
127: readMap(subnode);
128: readNodes(subnode);
129: skipTill("</node>");
130: }
131:
132: }
133:
134: private void readMap(Preferences node)
135: throws InvalidPreferencesFormatException, IOException
136: {
137:
138: skipTill("<map");
139:
140:
141: if (line.startsWith("/>")) {
142: line = line.substring(2);
143: return;
144: }
145:
146:
147: readEntries(node);
148:
149:
150: skipTill("</map>");
151: }
152:
153: private void readEntries(Preferences node)
154: throws InvalidPreferencesFormatException, IOException
155: {
156: while ("entry".equals(nextTag())) {
157: skipTill("<entry");
158: skipTill("key=\"");
159: String key = readTill("\"");
160: skipTill("value=\"");
161: String value = readTill("\"");
162: node.put(key, value);
163: }
164: }
165:
166: private void skipTill(String s)
167: throws InvalidPreferencesFormatException, IOException
168: {
169: while(true) {
170: if (line == null)
171: throw new InvalidPreferencesFormatException(s + " not found");
172:
173: int index = line.indexOf(s);
174: if (index == -1) {
175: line = br.readLine();
176: } else {
177: line = line.substring(index+s.length());
178: return;
179: }
180: }
181: }
182:
183: private String readTill(String s)
184: throws InvalidPreferencesFormatException
185: {
186: int index = line.indexOf(s);
187: if (index == -1)
188: throw new InvalidPreferencesFormatException(s + " not found");
189:
190: String read = line.substring(0, index);
191: line = line.substring(index+s.length());
192:
193: return read;
194: }
195:
196: private String nextTag()
197: throws InvalidPreferencesFormatException, IOException
198: {
199: while(true) {
200: if (line == null)
201: throw new InvalidPreferencesFormatException("unexpected EOF");
202:
203: int start = line.indexOf("<");
204: if (start == -1) {
205: line = br.readLine();
206: } else {
207:
208: int end = start+1;
209: while (end != line.length()
210: && " \t\r\n".indexOf(line.charAt(end)) == -1) {
211: end++;
212: }
213:
214: String tag = line.substring(start+1,end);
215: line = line.substring(start);
216: return tag;
217: }
218: }
219: }
220:
221: }