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