defs/AttributeDef.java
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- AttributeDef
- appendQueries
- getTextFromNode
- getNodeRawValue
- getFamily
- getV4Load
- getV6Load
- getCode
- getName
- getAltName
- getStatus
- getDescription
- getFormat
- getEnum
- getChoice
- getNumber
- getKeytype
- getInsert
- getInsertQ_type
- getUpdate
- getUpdateQ_type
- getDummy
- getDummyQ_type
- getSelect
- getSelectQ_type
- getKeytype2
- getKeytype3
- getForeign
- getInverse
- getPrimary
- getQueries
- setChoice
- setNumber
- clone
- toString
1 import java.util.*;
2 import org.w3c.dom.*;
3 import com.sun.xml.tree.*;
4
5 /**
6 * RIPE attribute.
7 *
8 * @author ottrey@ripe.net
9 * @version $Version$
10 *
11 */
12 public class AttributeDef implements Cloneable {
/* [<][>][^][v][top][bottom][index][help] */
13
14 final static int QI_SQL = 1;
15 final static int QI_RADIX = 2;
16
17 private String name;
18 private String altName;
19 private String code;
20 private String status;
21
22 private String description;
23 private String format;
24
25 private boolean lookup;
26 private boolean inverse;
27 private boolean primary;
28 private String foreign;
29 private String keytype;
30
31 private String insert;
32 private String insertQ_type;
33 private String update;
34 private String updateQ_type;
35 private String dummy;
36 private String dummyQ_type;
37 private String select;
38 private String selectQ_type;
39
40 private String choice;
41 private String number;
42
43 // radix tree representation
44 private String family;
45 private String load_ipv4; // query to load the ipv4 tree
46 private String load_ipv6; // query to load the ipv6 tree
47
48 private Vector queries;
49
50 // -----------------oOo-----------------
51 // Constructors
52 // -----------------oOo-----------------
53 /**
54 * Creates a RIPE attribute.
55 *
56 * @author ottrey@ripe.net
57 * @version $Version$
58 *
59 * @param obj The node from which a RIPE attribute is made.
60 *
61 */
62 public AttributeDef(Node obj) {
63 name = obj.getAttributes().getNamedItem("name").getNodeValue();
64 code = obj.getAttributes().getNamedItem("code").getNodeValue();
65 status = obj.getAttributes().getNamedItem("status").getNodeValue();
66
67 // Blindly ask for the optional items.
68 try {
69 altName = obj.getAttributes().getNamedItem("altName").getNodeValue();
70 }
71 catch (NullPointerException e) {
72 altName = new String();
73 // Throw the exception away. :-)
74 }
75
76 // Prepare to walk the tree.
77 TreeWalker tw = new TreeWalker(obj);
78
79 // Get the "description" node.
80 description = getNodeRawValue(tw.getNextElement("description"));
81
82 // Get the "format" node.
83 format = getNodeRawValue(tw.getNextElement("format"));
84
85 // Initialize
86 foreign = new String();
87 lookup = false;
88 inverse = false;
89 primary = false;
90
91 insert = new String();
92 insertQ_type = new String("UD_NULL_");
93 update = new String();
94 updateQ_type = new String("UD_NULL_");
95 dummy = new String();
96 dummyQ_type = new String("UD_NULL_");
97 select = new String();
98 selectQ_type = new String("UD_NULL_");
99
100 queries = new Vector();
101
102 Node rp = tw.getNextElement("representation");
103 if (rp != null) {
104 // Get the insert.
105 Node in = (new TreeWalker(rp)).getNextElement("insert");
106 if (in != null) {
107 insert = getTextFromNode(in);
108 if( insert.length() > 0 ) {
109 insert = " " + insert + " ";
110 }
111 try {
112 insertQ_type = in.getAttributes().getNamedItem("qtype").getNodeValue().toUpperCase();
113 }
114 catch (NullPointerException e) {
115 }
116 }
117
118 // Get the updates.
119 Node un = (new TreeWalker(rp)).getNextElement("update");
120 if (un != null) {
121 update = getTextFromNode(un);
122 if( update.length() > 0 ) {
123 update = " " + update + " ";
124 }
125 try {
126 updateQ_type = un.getAttributes().getNamedItem("qtype").getNodeValue().toUpperCase();
127 }
128 catch (NullPointerException e) {
129 }
130 }
131
132 // Get the dummies.
133 Node dn = (new TreeWalker(rp)).getNextElement("dummy");
134 if (dn != null) {
135 dummy = getTextFromNode(dn);
136 if( dummy.length() > 0 ) {
137 dummy = " " + dummy + " ";
138 }
139 try {
140 dummyQ_type = dn.getAttributes().getNamedItem("qtype").getNodeValue().toUpperCase();
141 }
142 catch (NullPointerException e) {
143 }
144 }
145
146 // Get the selects.
147 Node sn = (new TreeWalker(rp)).getNextElement("select");
148 if (sn != null) {
149 select = getTextFromNode(sn);
150 if( select.length() > 0 ) {
151 select = " " + select + " ";
152 }
153 try {
154 selectQ_type = sn.getAttributes().getNamedItem("qtype").getNodeValue().toUpperCase();
155 }
156 catch (NullPointerException e) {
157 }
158 }
159
160 Node rxtrees = (new TreeWalker(rp)).getNextElement("radixtrees");
161 if (rxtrees != null) {
162 // no protection. It must be defined.
163 family = rxtrees.getAttributes().getNamedItem("family").getNodeValue();
164
165 Node ipv4_n = (new TreeWalker(rxtrees)).getNextElement("IP_V4");
166 if( ipv4_n != null) {
167 load_ipv4 = getTextFromNode(ipv4_n);
168 }
169
170 Node ipv6_n = (new TreeWalker(rxtrees)).getNextElement("IP_V6");
171 if( ipv6_n != null) {
172 load_ipv6 = getTextFromNode(ipv6_n);
173 }
174 } // rxtrees != null
175
176 } // rp!=NULL
177
178 Node kn = tw.getNextElement("keys");
179 if (kn != null) {
180 String searchable = kn.getAttributes().getNamedItem("searchable").getNodeValue();
181 inverse = searchable.equals("inverse");
182 lookup = searchable.equals("lookup");
183
184 TreeWalker fw = new TreeWalker(kn);
185 Node f = fw.getNextElement("foreign");
186 if (f != null) {
187 foreign = f.getAttributes().getNamedItem("value").getNodeValue();
188 }
189
190 TreeWalker pw = new TreeWalker(kn);
191 Node p = pw.getNextElement("primary");
192 if (p != null) {
193 primary = true;
194 }
195
196 // Get the queries.
197 Node qsn = (new TreeWalker(kn)).getNextElement("queries");
198
199 appendQueries(queries, qsn, "sqlquery", code);
200 appendQueries(queries, qsn, "radixquery",code);
201 }
202
203 // Now check cominations.
204 // XXX TODO
205
206 } // AttributeDef()
207
208 private void appendQueries(Vector queries, Node qsn, String qrytype, String attrcode) {
/* [<][>][^][v][top][bottom][index][help] */
209 if (qsn != null) {
210 TreeWalker qsw;
211 Node q;
212 String qryt;
213
214 qsw = new TreeWalker(qsn);
215 while ((q = qsw.getNextElement(qrytype)) != null) {
216 String keytype = q.getAttributes().getNamedItem("keytype").getNodeValue();
217
218 // Blindly get the optional values.
219 String clars = new String();
220 try {
221 clars = q.getAttributes().getNamedItem("class").getNodeValue();
222 }
223 catch (NullPointerException e) {
224 // XXX take the default
225 clars = attrcode;
226 }
227
228 String space = new String();
229 try {
230 space = q.getAttributes().getNamedItem("space").getNodeValue();
231 }
232 catch (NullPointerException e) {
233 }
234
235
236 String sqlQuery = getTextFromNode(q);
237 //System.err.println("sqlquery = " + sqlQuery);
238
239 if ( qrytype.equals("sqlquery") ) {
240 qryt = "SQL";
241 } else {
242 qryt = "RADIX";
243 }
244
245 Query query = new Query(qryt, lookup, keytype, code, clars, sqlQuery);
246 queries.addElement(query);
247 }
248 }
249 } // getQueries()
250
251
252
253 // getting parsed contents of the text node is not simple.
254 // see http://www.developerlife.com/xmljavatutorial1/default.htm
255
256 // it was made simpler by the getNodeValue(Node n) method
257 // defined below, but it operated on raw XML text fragments
258
259 private String getTextFromNode( Node q ) {
/* [<][>][^][v][top][bottom][index][help] */
260 Element query_elem = (Element) q;
261 NodeList list = query_elem.getChildNodes();
262 int size = list.getLength();
263
264 for (int i = 0 ; i < size ; i ++ ){
265 String value =
266 ((Node)list.item( i )).getNodeValue().trim();
267 //System.err.println("i=" + i + " val=" + value );
268
269 if( value.equals("") || value.equals("\r") ){
270 continue; //keep iterating
271 }
272 else{
273 return value;
274 }
275 }
276
277 return "";
278 }
279 /**
280 * Aaaargh I shouldn't have to write this. :-(
281 *
282 * @param node
283 * @return The value of the node.
284 * @see ClassDef
285 *
286 */
287 private String getNodeRawValue(Node node) {
/* [<][>][^][v][top][bottom][index][help] */
288 String nodeStr = node.toString();
289 int startIndex = nodeStr.indexOf('>') + 1;
290 int endIndex = nodeStr.lastIndexOf('<') - 1;
291
292 return nodeStr.substring(startIndex, endIndex);
293 } // getNodeRaw Value()
294
295 public String getFamily() {
/* [<][>][^][v][top][bottom][index][help] */
296 return family;
297 }
298
299 public String getV4Load() {
/* [<][>][^][v][top][bottom][index][help] */
300 return load_ipv4;
301 }
302
303 public String getV6Load() {
/* [<][>][^][v][top][bottom][index][help] */
304 return load_ipv6;
305 }
306
307 public String getCode() {
/* [<][>][^][v][top][bottom][index][help] */
308 return code;
309 } // getCode()
310
311 public String getName() {
/* [<][>][^][v][top][bottom][index][help] */
312 return name;
313 } // getName()
314
315 public String getAltName() {
/* [<][>][^][v][top][bottom][index][help] */
316 return altName;
317 } // getAltName()
318
319 public String getStatus() {
/* [<][>][^][v][top][bottom][index][help] */
320 return status;
321 } // getStatus()
322
323 public String getDescription() {
/* [<][>][^][v][top][bottom][index][help] */
324 return description;
325 } // getDescription()
326
327 public String getFormat() {
/* [<][>][^][v][top][bottom][index][help] */
328 return format;
329 } // getFormat()
330
331 public String getEnum() {
/* [<][>][^][v][top][bottom][index][help] */
332 return new String("A_" + code).toUpperCase();
333 } // getEnum()
334
335 public String getChoice() {
/* [<][>][^][v][top][bottom][index][help] */
336 return choice;
337 } // getChoice()
338
339 public String getNumber() {
/* [<][>][^][v][top][bottom][index][help] */
340 return number;
341 } // getNumber()
342
343 public String getKeytype() {
/* [<][>][^][v][top][bottom][index][help] */
344 return keytype;
345 } // getKeytype()
346
347 public String getInsert() {
/* [<][>][^][v][top][bottom][index][help] */
348 return insert;
349 } // getInsert()
350
351 public String getInsertQ_type() {
/* [<][>][^][v][top][bottom][index][help] */
352 return insertQ_type;
353 } // getInsertQ_type()
354
355 public String getUpdate() {
/* [<][>][^][v][top][bottom][index][help] */
356 return update;
357 } // getUpdate()
358
359 public String getUpdateQ_type() {
/* [<][>][^][v][top][bottom][index][help] */
360 return updateQ_type;
361 } // getUpdateQ_type()
362
363 public String getDummy() {
/* [<][>][^][v][top][bottom][index][help] */
364 return dummy;
365 } // getDummy()
366
367 public String getDummyQ_type() {
/* [<][>][^][v][top][bottom][index][help] */
368 return dummyQ_type;
369 } // getDummyQ_type()
370
371 public String getSelect() {
/* [<][>][^][v][top][bottom][index][help] */
372 return select;
373 } // getSelect()
374
375 public String getSelectQ_type() {
/* [<][>][^][v][top][bottom][index][help] */
376 return selectQ_type;
377 } // getSelectQ_type()
378
379 public String getKeytype2() {
/* [<][>][^][v][top][bottom][index][help] */
380 String result = new String();
381
382 if (!lookup && !inverse && !primary) {
383 result = " ";
384 }
385 else if (!lookup && !inverse && primary) {
386 result = "primary key";
387 }
388 else if (!lookup && inverse && !primary) {
389 result = "inverse key";
390 }
391 else if (!lookup && inverse && primary) {
392 result = "primary/inverse key";
393 }
394 else if ( lookup && !inverse && !primary) {
395 result = "lookup key";
396 }
397 else if ( lookup && !inverse && primary) {
398 result = "primary/look-up key";
399 }
400 else if ( lookup && inverse && !primary) {
401 result = "look-up/inverse key";
402 }
403 else if ( lookup && inverse && primary) {
404 result = "Gimmie a break!";
405 }
406
407 return result;
408 } // getKeytype()
409
410 public String getKeytype3() {
/* [<][>][^][v][top][bottom][index][help] */
411 String result = new String();
412
413 if (primary) {
414 result = "[P]";
415 }
416 else {
417 result = " ";
418 }
419
420 if (inverse) {
421 result += "[I]";
422 }
423 else if (lookup) {
424 result += "[L]";
425 }
426 else {
427 result += " ";
428 }
429
430 return result;
431 } // getKeytype()
432
433 public String getForeign() {
/* [<][>][^][v][top][bottom][index][help] */
434 return foreign;
435 } // getForeign()
436
437 public boolean getInverse() {
/* [<][>][^][v][top][bottom][index][help] */
438 return inverse;
439 } // getInverse()
440
441 public boolean getPrimary() {
/* [<][>][^][v][top][bottom][index][help] */
442 return primary;
443 } // getPrimary()
444
445 public Vector getQueries() {
/* [<][>][^][v][top][bottom][index][help] */
446 return queries;
447 } // getQueries()
448
449 public boolean setChoice(String choice) {
/* [<][>][^][v][top][bottom][index][help] */
450 boolean result=true;
451
452 this.choice = choice;
453
454 return result;
455 } // setChoice()
456
457 public boolean setNumber(String number) {
/* [<][>][^][v][top][bottom][index][help] */
458 boolean result=true;
459
460 this.number = number;
461
462 return result;
463 } // setNumber()
464
465 public Object clone() throws CloneNotSupportedException {
/* [<][>][^][v][top][bottom][index][help] */
466 return (AttributeDef)super.clone();
467 } // clone()
468
469 /*
470 public boolean equals(String code) {
471 return code.equals(code);
472 } // equals()
473 */
474
475 public String toString() {
/* [<][>][^][v][top][bottom][index][help] */
476 return new String("ripe attribute={" +
477 "\n\tname=" + name +
478 "\n\taltName=" + altName +
479 "\n\tcode=" + code +
480 "\n\tstatus=" + status +
481 "\n\tkeytype=" + keytype +
482 "\n\tdescription=" + description +
483 "\n\tformat=" + format +
484 "\n\tchoice=" + choice +
485 "\n\tnumber=" + number +
486 "\n}");
487 } // toString()
488
489
490 } // AttributeDef