## defs/Defs.java

/* [<][>][^][v][top][bottom][index][help] */

## FUNCTIONS

This source file includes following functions.

1. Defs
2. getValueByEnum
3. getDOM
4. validate
5. printDF_attribute_aliases
6. printDF_attribute_aliases_map
7. printDF_attribute_codes
8. printDF_attribute_enum
9. printDF_attribute_inv_attr_mask
10. printDF_attribute_names
11. printDF_class_aliases
12. printDF_class_aliases_map
13. printDF_class_codes
14. printDF_class_dbase_code_map
15. printDF_class_enum
16. printDF_class_mask
17. printDF_class_names
18. printQI_queries
19. printUD_queries
20. printTemplates
21. printDF_class_templates
22. printDF_class_templates_v
23. printTemplatesV
24. printDiagrams
25. printDF_radix_load
26. writeAttributeInfo
27. printAttributeTab
28. getAttrOfs
29. writeClassInfo
30. printClassTab
31. main

       1 /******************
       2   Copyright (c) 2002                                        RIPE NCC
       3
       4   All Rights Reserved
       5
       6   Permission to use, copy, modify, and distribute this software and its
       7   documentation for any purpose and without fee is hereby granted,
       8   provided that the above copyright notice appear in all copies and that
       9   both that copyright notice and this permission notice appear in
      10   supporting documentation, and that the name of the author not be
      11   used in advertising or publicity pertaining to distribution of the
      12   software without specific, written prior permission.
      13
      14   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
      15   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
      16   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
      17   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
      18   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
      19   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
      20   ***************************************/
      21
      22 import java.io.*;
      23 import java.util.*;
      24 import org.xml.sax.*;
      25 import org.w3c.dom.*;
      26 import javax.xml.parsers.*;
      27
      28 /**
      29  * RIPE classes generated from Data Object Models.
      30  *
      31  * @author ottrey@ripe.net
      32  * @version $Version$
      33  *
      34  */
      35 public class Defs {
         /* [<][>][^][v][top][bottom][index][help] */
      36
      37
      38   // hash of attribute xmlnames to attribute objects
      39   private Hashtable xmlNameToAttribute;
      40   // hash of attribute names to objects
      41   private Hashtable nameToAttribute;
      42   // hash of attribute codes to objects
      43   private Hashtable codeToAttribute;
      44   private Vector ripeAttributes;
      45   private Vector ripeAttributeCodes;
      46   private Vector ripeClasses;
      47   private Vector ripeAttributeAliases;
      48   private Vector ripeAttributeAliasesMap;
      49   private Vector ripeClassAliases;
      50   private Vector ripeClassAliasesMap;
      51   private Vector ripeQueries;
      52   private RPSLSyntax syntaxes;
      53
      54
      55   // -----------------oOo-----------------
      56   //              Constructors
      57   // -----------------oOo-----------------
      58   public Defs(boolean normalize) {
      59     Document syntaxDOM = getDOM("syntax.xml", normalize);
      60     Node syntax_search = syntaxDOM.getFirstChild();
      61     while (syntax_search != null) {
      62         if (syntax_search.getNodeName().equals("rpsl_syntax")) {
      63             syntaxes = new RPSLSyntax(syntax_search);
      64         }
      65         syntax_search = syntax_search.getNextSibling();
      66     }
      67
      68     // Create a normalized DOM from the xml file for the attributes.
      69     Document attrDOM = getDOM("attributes.xml", normalize);
      70
      71     // Initialize.
      72     xmlNameToAttribute = new Hashtable();
      73     nameToAttribute = new Hashtable();
      74     codeToAttribute = new Hashtable();
      75     ripeAttributes = new Vector();
      76     ripeAttributeCodes = new Vector();
      77     ripeAttributeAliases = new Vector();
      78     ripeAttributeAliasesMap = new Vector();
      79     ripeClassAliases = new Vector();
      80     ripeClassAliasesMap = new Vector();
      81     ripeQueries = new Vector();
      82
      83     // Recurse through node tree
      84     NodeList attrNodes = attrDOM.getElementsByTagName("ripe_attribute");
      85     for (int i=0; i < attrNodes.getLength(); i++) {
      86       // (Checking if the attribute is valid)
      87       if (validate("attribute", attrNodes.item(i))) {
      88         AttributeDef ad = new AttributeDef(attrNodes.item(i));
      89
      90         ripeAttributes.addElement(ad);
      91
      92         // and each attribute,
      93         //ripeAttributes.put(ad.getCode(), ad);
      94         xmlNameToAttribute.put(ad.getXmlName(), ad);
      95
      96         //
      97         // only add the information if this is the first time for the attribute
      98         //
      99         if (!nameToAttribute.containsKey(ad.getName()))
     100         {
     101             // add the name of the attribute
     102             nameToAttribute.put(ad.getName(), ad);
     103
     104             // and it's code.
     105             ripeAttributeCodes.addElement(ad.getCode());
     106             codeToAttribute.put(ad.getCode(), ad);
     107
     108             // and it's aliases.
     109             // also map the alias to the attribute index.
     110
     111             // set the index to map to.
     112             Integer mapIndex = new Integer(ripeAttributeCodes.size()-1);
     113
     114             //  first the code.
     115             ripeAttributeAliases.addElement(ad.getCode());
     116             ripeAttributeAliasesMap.addElement(mapIndex);
     117
     118             //  then the name.
     119             ripeAttributeAliases.addElement(ad.getName());
     120             ripeAttributeAliasesMap.addElement(mapIndex);
     121
     122             if (ad.getAltName().length() > 1) {
     123               //  then the altName.
     124               ripeAttributeAliases.addElement(ad.getAltName());
     125               ripeAttributeAliasesMap.addElement(mapIndex);
     126             }
     127         } // endif (!nameToAttribute.containsKey(ad.getName())
     128       }
     129     }
     130
     131     // Create a normalized DOM from the xml file for the classes.
     132     Document objDOM = getDOM("classes.xml", normalize);
     133
     134     // Create a vector to store the classes.
     135     ripeClasses = new Vector();
     136
     137     // Recurse through node tree
     138     NodeList objNodes = objDOM.getElementsByTagName("ripe_class");
     139     for (int i=0; i < objNodes.getLength(); i++) {
     140       // Check if the class is valid
     141       if (validate("class", objNodes.item(i))) {
     142         ClassDef od = new ClassDef(objNodes.item(i), xmlNameToAttribute);
     143
     144         // Add the class.
     145 //        ripeClasses.addElement(od);
     146         if (ripeClasses.size() <= od.getDbaseCode()) {
     147             ripeClasses.setSize(od.getDbaseCode()+1);
     148         }
     149         ripeClasses.setElementAt(od, od.getDbaseCode());
     150
     151         // set the index to map to.
     152 //        Integer mapIndex = new Integer(ripeClasses.size()-1);
     153         Integer mapIndex = new Integer(od.getDbaseCode());
     154
     155         //  first the code.
     156         ripeClassAliases.addElement(od.getCode());
     157 //        ripeClassAliases.setElementAt(od, od.getDbaseCode());
     158         ripeClassAliasesMap.addElement(mapIndex);
     159
     160         //  then the name.
     161         ripeClassAliases.addElement(od.getName());
     162 //        ripeClassAliases.setElementAt(od.getName(), od.getDbaseCode());
     163         ripeClassAliasesMap.addElement(mapIndex);
     164
     165       }
     166     }
     167
     168     // replace class/attribute variables in queries
     169
     170
     171
     172   } // Defs()
     173
     174     public String getValueByEnum(String name) {
         /* [<][>][^][v][top][bottom][index][help] */
     175         Enumeration e = ripeClasses.elements();
     176         for( int i = 0; e.hasMoreElements();  i++) {
     177             ClassDef d = (ClassDef)e.nextElement();
     178             String a = d.getEnum();
     179
     180             //System.out.println( d );
     181
     182             if( name.equals(a) ) {
     183                 return (new Integer(i)).toString();
     184             }
     185         }
     186         System.err.println("ERROR: cannot resolve variable name " + name );
     187         System.exit(-1);
     188
     189         return ""; // bloody idiot, the compiler
     190     }
     191
     192
     193
     194   /**
     195    * Creates a Data Object Model from the RIPE classes defined
     196    * in the XML document.
     197    *
     198    * @author ottrey@ripe.net
     199    * @version $Version$
     200    *
     201    * @param xmlDocName The URI of the XML document.
     202    * @param ripeClass  The class to be created from.
     203    * @param normalize  Return a normalized DOM.
     204    *
     205    */
     206   private Document getDOM(String xmlDocName, boolean normalize) {
         /* [<][>][^][v][top][bottom][index][help] */
     207
     208     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     209     DocumentBuilder db = null;
     210     try {
     211         db = dbf.newDocumentBuilder();
     212     } catch (ParserConfigurationException pce) {
     213         System.err.println(pce);
     214         System.exit(1);
     215     }
     216
     217
     218     Document dom = null;
     219     try {
     220         dom = db.parse(new File(xmlDocName));
     221     } catch (SAXException se) {
     222         System.err.println(se.getMessage());
     223         System.exit(1);
     224     } catch (IOException ioe) {
     225         System.err.println(ioe);
     226         System.exit(1);
     227     }
     228
     229     // Normalize the document.
     230     if (normalize) {
     231       dom.getDocumentElement().normalize();
     232     }
     233
     234     return dom;
     235
     236   } // getDOM()
     237
     238   private boolean validate(String type, Node obj) {
         /* [<][>][^][v][top][bottom][index][help] */
     239     boolean result=false;
     240     String status = obj.getAttributes().getNamedItem("status").getNodeValue();
     241     String name   = obj.getAttributes().getNamedItem("name").getNodeValue();
     242
     243     if (status.equals("valid")) {
     244       result=true;
     245     }
     246     else {
     247       System.err.println("Warning: " + type + " " + name + " is " + status);
     248     }
     249
     250     return result;
     251   } // validClass()
     252
     253
     254   // -----------------oOo-----------------
     255   //              Print Methods
     256   // -----------------oOo-----------------
     257   private void printDF_attribute_aliases() {
         /* [<][>][^][v][top][bottom][index][help] */
     258     System.out.println("char * const Attribute_aliases[] = {");
     259     Enumeration e = ripeAttributeAliases.elements();
     260     while (e.hasMoreElements()) {
     261       String a = (String)e.nextElement();
     262       System.out.println("  \"" + a + "\",");
     263     }
     264     System.out.println("  " + "NULL" + "\n" + "}; /* Attribute_aliases */");
     265   } // printDF_attribute_aliases()
     266
     267   private void printDF_attribute_aliases_map() {
         /* [<][>][^][v][top][bottom][index][help] */
     268     System.out.println("int const Attribute_aliases_map[] = {");
     269     Enumeration e = ripeAttributeAliasesMap.elements();
     270     while (e.hasMoreElements()) {
     271       Integer am = (Integer)e.nextElement();
     272       System.out.println("  " + am + ",");
     273     }
     274     System.out.println("  " + "NULL" + "\n" + "}; /* Attribute_aliases_map */");
     275   } // printDF_attribute_aliases_map()
     276
     277   private void printDF_attribute_codes() {
         /* [<][>][^][v][top][bottom][index][help] */
     278     System.out.println("char * const Attribute_codes[] = {");
     279     Enumeration e = ripeAttributeCodes.elements();
     280     while (e.hasMoreElements()) {
     281       String ac = (String)e.nextElement();
     282       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     283       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     284
     285       // If the attribute has status="valid".
     286       if (ad.getStatus().equals("valid")) {
     287         // Output the attribute code.
     288         System.out.println("  \"" + ad.getCode() + "\",");
     289       }
     290     }
     291     System.out.println("  " + "NULL" + "\n" + "}; /* Attribute_codes */");
     292   } // printDF_attribute_codes()
     293
     294   private void printDF_attribute_enum() {
         /* [<][>][^][v][top][bottom][index][help] */
     295     System.out.println("typedef enum _A_Type_t {");
     296
     297     // Enumerate through the attribute codes.
     298     Enumeration e = ripeAttributeCodes.elements();
     299     while (e.hasMoreElements()) {
     300       String ac = (String)e.nextElement();
     301       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     302       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     303
     304       // If the attribute has status="valid".
     305       if (ad.getStatus().equals("valid")) {
     306         // Output the attribute enum.
     307         System.out.println("  " + ad.getEnum() + ",");
     308       }
     309     }
     310
     311     System.out.println("  " + "A_END" + "\n" + "} A_Type_t;");
     312   } // printDF_attribute_enum()
     313
     314   private void printDF_attribute_inv_attr_mask() {
         /* [<][>][^][v][top][bottom][index][help] */
     315     System.out.print("#define INV_ATTR_MASK ");
     316
     317     // Enumerate through the attribute codes.
     318     Enumeration e = ripeAttributeCodes.elements();
     319     while (e.hasMoreElements()) {
     320       String ac = (String)e.nextElement();
     321       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     322       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     323
     324       // If the attribute has status="valid".
     325       if (ad.getStatus().equals("valid") && ad.getInverse()) {
     326         // Output the attribute enum.
     327         System.out.print(ad.getEnum() + ", ");
     328       }
     329     }
     330
     331     System.out.println("MA_END");
     332   } // printDF_attribute_inv_attr_mask()
     333
     334   private void printDF_attribute_names() {
         /* [<][>][^][v][top][bottom][index][help] */
     335     System.out.println("char * const Attribute_names[] = {");
     336     Enumeration e = ripeAttributeCodes.elements();
     337     while (e.hasMoreElements()) {
     338       String ac = (String)e.nextElement();
     339       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     340       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     341
     342       // If the attribute has status="valid".
     343       if (ad.getStatus().equals("valid")) {
     344         // Output the attribute name.
     345         System.out.println("  \"" + ad.getName() + "\",");
     346       }
     347     }
     348     System.out.println("  " + "NULL" + "\n" + "}; /* Attribute_names */");
     349   } // printDF_attribute_names()
     350
     351   private void printDF_class_aliases() {
         /* [<][>][^][v][top][bottom][index][help] */
     352     System.out.println("char * const Class_aliases[] = {");
     353     Enumeration e = ripeClassAliases.elements();
     354     while (e.hasMoreElements()) {
     355       String a = (String)e.nextElement();
     356       System.out.println("  \"" + a + "\",");
     357     }
     358     System.out.println("  " + "NULL" + "\n" + "}; /* Class_aliases */");
     359   } // printDF_class_aliases()
     360
     361   private void printDF_class_aliases_map() {
         /* [<][>][^][v][top][bottom][index][help] */
     362     System.out.println("int const Class_aliases_map[] = {");
     363     Enumeration e = ripeClassAliasesMap.elements();
     364     while (e.hasMoreElements()) {
     365       Integer am = (Integer)e.nextElement();
     366       System.out.println("  " + am + ",");
     367     }
     368     System.out.println("  " + "NULL" + "\n" + "}; /* Class_aliases_map */");
     369   } // printDF_class_aliases_map()
     370
     371   private void printDF_class_codes() {
         /* [<][>][^][v][top][bottom][index][help] */
     372     System.out.println("char * const Class_codes[] = {");
     373     Enumeration e = ripeClasses.elements();
     374     while (e.hasMoreElements()) {
     375       ClassDef od = (ClassDef)e.nextElement();
     376       System.out.println("  \"" + od.getCode() + "\",");
     377     }
     378     System.out.println("  " + "NULL" + "\n" + "}; /* Class_codes */");
     379   } // printDF_class_codes()
     380
     381   private void printDF_class_dbase_code_map() {
         /* [<][>][^][v][top][bottom][index][help] */
     382     System.out.println("int const Class_dbase_code_map[] = {");
     383     Enumeration e = ripeClasses.elements();
     384     while (e.hasMoreElements()) {
     385       ClassDef cd = (ClassDef)e.nextElement();
     386       System.out.println("  " + cd.getDbaseCode() + ",");
     387     }
     388     System.out.println("  " + "NULL" + "\n" + "}; /* Class_dbase_code_map */");
     389   } // printDF_class_dbase_code_map()
     390
     391   private void printDF_class_enum() {
         /* [<][>][^][v][top][bottom][index][help] */
     392     System.out.println("typedef enum _C_Type_t {");
     393     Enumeration e = ripeClasses.elements();
     394
     395     System.out.println("  C_ANY = -1, ");
     396     while (e.hasMoreElements()) {
     397       ClassDef od = (ClassDef)e.nextElement();
     398       System.out.println("  " + od.getEnum() + ",");
     399     }
     400     System.out.println("  " + "C_END" + "\n" + "} C_Type_t;");
     401   } // printDF_class_enum()
     402
     403   private void printDF_class_mask() {
         /* [<][>][^][v][top][bottom][index][help] */
     404     System.out.print("#define CLASS_MASK ");
     405     Enumeration e = ripeClasses.elements();
     406     while (e.hasMoreElements()) {
     407       ClassDef cd = (ClassDef)e.nextElement();
     408       System.out.print(cd.getEnum() + ", ");
     409     }
     410     System.out.println("MA_END");
     411   } // printDF_class_mask()
     412
     413   private void printDF_class_names() {
         /* [<][>][^][v][top][bottom][index][help] */
     414     System.out.println("char * const Class_names[] = {");
     415     Enumeration e = ripeClasses.elements();
     416     while (e.hasMoreElements()) {
     417       String a = ((ClassDef)e.nextElement()).getName();
     418       System.out.println("  \"" + a + "\",");
     419     }
     420     System.out.println("  " + "NULL" + "\n" + "}; /* Class_names */");
     421   } // printDF_class_names()
     422
     423   private void printQI_queries() {
         /* [<][>][^][v][top][bottom][index][help] */
     424     System.out.println(Query.startDoc());
     425     //Enumeration e1 = ripeAttributes.elements();
     426     Enumeration e1 = nameToAttribute.elements();
     427     while (e1.hasMoreElements()) {
     428       AttributeDef ad = (AttributeDef)e1.nextElement();
     429       Enumeration e2 = ad.getQueries().elements();
     430       while (e2.hasMoreElements()) {
     431         Query q = (Query)e2.nextElement();
     432         System.out.println(q.getStruct("  ", this));
     433       }
     434     }
     435     System.out.println(Query.endDoc());
     436   } // printQI_queries()
     437
     438   private void printUD_queries() {
         /* [<][>][^][v][top][bottom][index][help] */
     439
     440     Enumeration e;
     441
     442     System.out.println("UD_query Insert[] = {");
     443     e = ripeAttributeCodes.elements();
     444     while (e.hasMoreElements()) {
     445       String ac = (String)e.nextElement();
     446       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     447       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     448       System.out.println("  {" + ad.getInsertQ_type() + ", " + "\"" +  ad.getInsert() + "\"},");
     449     }
     450     System.out.println("  " + "{0, NULL}" + "\n" + "}; /* Insert */\n");
     451
     452
     453     System.out.println("UD_query Update[] = {");
     454     e = ripeAttributeCodes.elements();
     455     while (e.hasMoreElements()) {
     456       String ac = (String)e.nextElement();
     457       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     458       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     459       System.out.println("  {" + ad.getUpdateQ_type() + ", " + "\"" +  ad.getUpdate() + "\"},");
     460     }
     461     System.out.println("  " + "{0, NULL}" + "\n" + "}; /* Update */\n");
     462
     463     System.out.println("UD_query Dummy[] = {");
     464     e = ripeAttributeCodes.elements();
     465     while (e.hasMoreElements()) {
     466       String ac = (String)e.nextElement();
     467       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     468       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     469       System.out.println("  {" + ad.getDummyQ_type() + ", " + "\"" +  ad.getDummy() + "\"},");
     470     }
     471     System.out.println("  " + "{0, NULL}" + "\n" + "}; /* Dummy */\n");
     472
     473     System.out.println("UD_query Select[] = {");
     474     e = ripeAttributeCodes.elements();
     475     while (e.hasMoreElements()) {
     476       String ac = (String)e.nextElement();
     477       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     478       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     479       System.out.println("  {" + ad.getSelectQ_type() + ", " + "\"" +  ad.getSelect() + "\"},");
     480     }
     481     System.out.println("  " + "{0, NULL}" + "\n" + "}; /* Select */\n");
     482
     483   } // printUD_queries()
     484
     485   private void printTemplates() {
         /* [<][>][^][v][top][bottom][index][help] */
     486     Enumeration e = ripeClasses.elements();
     487     while (e.hasMoreElements()) {
     488       ClassDef cd = (ClassDef)e.nextElement();
     489       System.out.println(cd.getName() + "\n");
     490       System.out.println(cd.getTemplate(false) + "\n");
     491     }
     492   } // printTemplates()
     493
     494   private void printDF_class_templates() {
         /* [<][>][^][v][top][bottom][index][help] */
     495     Enumeration e = ripeClasses.elements();
     496     System.out.println("const char *Templates[] = {");
     497     while (e.hasMoreElements()) {
     498       ClassDef cd = (ClassDef)e.nextElement();
     499       System.out.print(cd.getTemplate(true));
     500       System.out.println(",");
     501     }
     502     System.out.println("NULL");
     503     System.out.println("}; /* Templates */");
     504   } // printDF_class_templates()
     505
     506   private void printDF_class_templates_v() {
         /* [<][>][^][v][top][bottom][index][help] */
     507     Enumeration e = ripeClasses.elements();
     508     System.out.println("const char *Templates_v[] = {");
     509     while (e.hasMoreElements()) {
     510       ClassDef od = (ClassDef)e.nextElement();
     511       System.out.print(od.getTemplateV(true, syntaxes));
     512       System.out.println(",");
     513     }
     514     System.out.println("NULL");
     515     System.out.println("}; /* Templates_v */");
     516   } // printDF_class_templates_v()
     517
     518   private void printTemplatesV() {
         /* [<][>][^][v][top][bottom][index][help] */
     519     Enumeration e = ripeClasses.elements();
     520     while (e.hasMoreElements()) {
     521       ClassDef od = (ClassDef)e.nextElement();
     522       System.out.println(od.getName() + "\n");
     523       System.out.println(od.getTemplateV(false, syntaxes) + "\n");
     524     }
     525   } // printTemplatesV()
     526
     527   private void printDiagrams() {
         /* [<][>][^][v][top][bottom][index][help] */
     528     int maxWidth=0;  // Widest diagram
     529     Hashtable foreigns = new Hashtable();
     530
     531     Enumeration e1 = ripeClasses.elements();
     532     while (e1.hasMoreElements()) {
     533       ClassDef od = (ClassDef)e1.nextElement();
     534       if (maxWidth < od.getWidth()) {
     535         maxWidth = od.getWidth();
     536       }
     537
     538       Hashtable foreignAttrs = od.getForeignAttrs();
     539       if (foreignAttrs != null) {
     540         Enumeration e2 = foreignAttrs.keys();
     541         while (e2.hasMoreElements()) {
     542           String key = (String)e2.nextElement();
     543           if (!foreigns.containsKey(key)) {
     544             foreigns.put(key, foreignAttrs.get(key));
     545           }
     546         }
     547       }
     548     }
     549
     550     System.out.print("Classes:");
     551     for (int i=0; i < maxWidth; i++) {
     552       System.out.print(" ");
     553     }
     554     System.out.println("Foreign keys:");
     555
     556     Enumeration e3 = ripeClasses.elements();
     557     while (e3.hasMoreElements()) {
     558       ClassDef od = (ClassDef)e3.nextElement();
     559       System.out.print(od.getDiagram(maxWidth, foreigns));
     560     }
     561   } // printDiagrams()
     562
     563   private void printDF_radix_load() {
         /* [<][>][^][v][top][bottom][index][help] */
     564     System.out.print("DF_Load_t DF_radix_load[] = \n{\n");
     565
     566     // Enumerate through the attribute codes.
     567     Enumeration e = ripeAttributeCodes.elements();
     568     while (e.hasMoreElements()) {
     569       String ac = (String)e.nextElement();
     570       //AttributeDef ad = (AttributeDef)ripeAttributes.get(ac);
     571       AttributeDef ad = (AttributeDef)codeToAttribute.get(ac);
     572
     573       // If the attribute has status="valid".
     574       if (ad.getFamily() != null) {
     575           String ip4 = ad.getV4Load() != null
     576               ? "\"" + ad.getV4Load() + "\"" : "NULL";
     577           String ip6 = ad.getV6Load() != null
     578               ? "\"" + ad.getV6Load() + "\"" : "NULL";
     579
     580           System.out.print("  { " +  ad.getEnum()
     581                            + ", "   + ad.getFamily()
     582                            + ",\n\t"  + ip4.replace('\n',' ')
     583                            + ",\n\t"  + ip6.replace('\n',' ')
     584                            + "\n  },\n");
     585       }
     586     } // while more
     587
     588
     589     System.out.println("  { -1, -1, NULL, NULL }\n};");
     590   } // printDF_radix_load()
     591
     592     private void writeAttributeInfo(PrintStream out, AttributeDef ad, int id)
         /* [<][>][^][v][top][bottom][index][help] */
     593     {
     594         out.println("        /* name */");
     595         out.println("        \"" + ad.getName() + "\",");
     596         out.println("        /* id */");
     597         out.println("        " + id + ",");
     598         out.println("        /* altname */");
     599         String altname = ad.getAltName();
     600         if ((altname == null) || (altname.length() == 0)) {
     601             out.println("        NULL,");
     602         } else {
     603             out.println("        \"" + altname + "\",");
     604         }
     605         out.println("        /* xmlname */");
     606         out.println("        \"" + ad.getXmlName() + "\",");
     607         out.println("        /* code */");
     608         out.println("        \"" + ad.getCode() + "\",");
     609         out.println("        /* syntax_offset */");
     610         out.println("        " + syntaxes.getSyntaxOfs(ad.getSyntax()) +
     611                     ",   /* " + ad.getSyntax() + " */");
     612         out.println("        /* is_lookup */");
     613         if (ad.getLookup()) {
     614             out.println("        1,");
     615         } else {
     616             out.println("        0,");
     617         }
     618         out.println("        /* is_inverse */");
     619         if (ad.getInverse()) {
     620             out.println("        1,");
     621         } else {
     622             out.println("        0,");
     623         }
     624         out.println("        /* is_primary */");
     625         if (ad.getPrimary()) {
     626             out.println("        1,");
     627         } else {
     628             out.println("        0,");
     629         }
     630         out.println("        /* is_list */");
     631         if (ad.getList()) {
     632             out.println("        1,");
     633         } else {
     634             out.println("        0,");
     635         }
     636         out.println("        /* is_ripe_list */");
     637         if (ad.getRipeList()) {
     638             out.println("        1,");
     639         } else {
     640             out.println("        0,");
     641         }
     642         out.println("        /* foreign_code */");
     643         String foreign = ad.getForeign();
     644         if ((foreign == null) || (foreign.length() == 0)) {
     645             out.println("        NULL,");
     646         } else {
     647             out.println("        \"" + foreign + "\"");
     648         }
     649     }
     650
     651     // create attribute_tab.h
     652     private void printAttributeTab()
         /* [<][>][^][v][top][bottom][index][help] */
     653     {
     654         PrintStream out = System.out;
     655
     656         out.println("/* generated by 'Defs.java' - DO NOT HAND-EDIT */");
     657         out.println("#ifndef ATTRIBUTE_TAB_H");
     658         out.println("#define ATTRIBUTE_TAB_H");
     659         out.println();
     660         out.println("attribute_t attribute_tab[] = {");
     661
     662         if (!ripeAttributeCodes.isEmpty()) {
     663             Hashtable attributeIds = new Hashtable();
     664
     665             out.println("    {");
     666             //Enumeration e = ripeAttributeCodes.elements();
     667             //String code = (String)e.nextElement();
     668             Enumeration e = ripeAttributes.elements();
     669             //AttributeDef ad = (AttributeDef)ripeAttributes.get(code);
     670             AttributeDef ad = (AttributeDef)e.nextElement();
     671             int id = 0;
     672             writeAttributeInfo(out, ad, id);
     673             attributeIds.put(ad.getName(), new Integer(id));
     674             while (e.hasMoreElements()) {
     675                 out.println("    },");
     676                 out.println("    {");
     677                 //code = (String)e.nextElement();
     678                 //ad = (AttributeDef)ripeAttributes.get(code);
     679                 ad = (AttributeDef)e.nextElement();
     680                 if (attributeIds.containsKey(ad.getName())) {
     681                     // if already have an id for this name, use that
     682                     Integer prevId = (Integer)attributeIds.get(ad.getName());
     683                     writeAttributeInfo(out, ad, prevId.intValue());
     684                 } else {
     685                     // increase id for each unique attribute name
     686                     id++;
     687                     writeAttributeInfo(out, ad, id);
     688                     attributeIds.put(ad.getName(), new Integer(id));
     689                 }
     690             }
     691             out.println("    }");
     692         }
     693
     694         out.println("};");
     695         out.println();
     696         out.println("#endif /* ATTRIBUTE_TAB_H */");
     697         out.close();
     698     }
     699
     700     private int getAttrOfs(String xmlName)
         /* [<][>][^][v][top][bottom][index][help] */
     701     {
     702         for (int i=0; i<ripeAttributes.size(); i++) {
     703             AttributeDef ad = (AttributeDef)ripeAttributes.elementAt(i);
     704             if (ad.getXmlName().equals(xmlName)) {
     705                 return i;
     706             }
     707         }
     708         return -1;
     709     }
     710
     711     private void writeClassInfo(PrintStream out, ClassDef cd, int id)
         /* [<][>][^][v][top][bottom][index][help] */
     712     {
     713         out.println("        /* name */");
     714         out.println("        \"" + cd.getName() + "\",");
     715         out.println("        /* id */");
     716         out.println("        " + id + ",");
     717         out.println("        /* num_attr */");
     718         Vector attributes = cd.getAttributes();
     719         out.println("        " + attributes.size() + ",");
     720         out.println("        /* attr[] */");
     721         out.println("        {");
     722         for (int i=0; i<attributes.size(); i++) {
     723             AttributeDef ad = (AttributeDef)attributes.elementAt(i);
     724             String name = ad.getName();
     725             String xmlName = ad.getXmlName();
     726             out.println("            /* attribute: " + name +
     727                         " (" + xmlName + ") */");
     728             out.println("            {");
     729             int offset = getAttrOfs(xmlName);
     730             out.println("                /* offset */");
     731             out.println("                " + offset + ",");
     732             String choice;
     733             if (ad.getChoice().equals("mandatory")) {
     734                 choice = "ATTR_MANDATORY";
     735             } else if (ad.getChoice().equals("optional")) {
     736                 choice = "ATTR_OPTIONAL";
     737             } else {
     738                 choice = "ATTR_GENERATED";
     739             }
     740             out.println("                /* choice */");
     741             out.println("                " + choice + ",");
     742             String number;
     743             if (ad.getNumber().equals("single")) {
     744                 number = "ATTR_SINGLE";
     745             } else {
     746                 number = "ATTR_MULTIPLE";
     747             }
     748             out.println("                /* number */");
     749             out.println("                " + number);
     750             out.print("            }");
     751             if (i != attributes.size()-1) {
     752                 out.print(",");
     753             }
     754             out.println();
     755         }
     756         out.println("        },");
     757         out.println("        /* attr_hash (set by class_init()) */");
     758         out.println("        NULL");
     759     }
     760
     761     // create class_tab.h
     762     private void printClassTab()
         /* [<][>][^][v][top][bottom][index][help] */
     763     {
     764         PrintStream out = System.out;
     765
     766         out.println("/* generated by 'Defs.java' - DO NOT HAND-EDIT */");
     767         out.println("#ifndef CLASS_TAB_H");
     768         out.println("#define CLASS_TAB_H");
     769         out.println();
     770         out.println("class_t class_tab[] = {");
     771
     772         if (!ripeClasses.isEmpty()) {
     773             out.println("    {");
     774             Enumeration e = ripeClasses.elements();
     775             ClassDef cd = (ClassDef)e.nextElement();
     776             int id = 0;
     777             writeClassInfo(out, cd, id);
     778             while (e.hasMoreElements()) {
     779                 out.println("    },");
     780                 out.println("    {");
     781                 cd = (ClassDef)e.nextElement();
     782                 id++;
     783                 writeClassInfo(out, cd, id);
     784             }
     785             out.println("    }");
     786         }
     787
     788         out.println("};");
     789         out.println();
     790         out.println("#endif /* CLASS_TAB_H */");
     791         out.close();
     792     }
     793
     794   // -----------------oOo-----------------
     795   //            Unit test driver
     796   // -----------------oOo-----------------
     797   public static void main (String argv[]) {
         /* [<][>][^][v][top][bottom][index][help] */
     798     int n=0;
     799     boolean err=true;
     800     boolean normalize=false;
     801
     802     if (argv.length > 0) {
     803       try {
     804         n = Integer.parseInt(argv[0]);
     805         err=false;
     806       }
     807       catch (NumberFormatException e) {
     808       }
     809       if (argv.length == 2) {
     810         if (argv[1].equals("normalize")) {
     811           normalize = true;
     812         }
     813       }
     814     }
     815
     816     if (!err) {
     817       Defs rc = new Defs(normalize);
     818
     819       switch (n) {
     820         case  1: rc.printDF_attribute_aliases();          break;
     821         case  2: rc.printDF_attribute_aliases_map();      break;
     822         case  3: rc.printDF_attribute_codes();            break;
     823         case  4: rc.printDF_attribute_enum();             break;
     824         case  5: rc.printDF_attribute_inv_attr_mask();    break;
     825         case  6: rc.printDF_attribute_names();            break;
     826         case  7: rc.printDF_class_aliases();              break;
     827         case  8: rc.printDF_class_aliases_map();          break;
     828         case  9: rc.printDF_class_codes();                break;
     829         case 10: rc.printDF_class_dbase_code_map();       break;
     830         case 11: rc.printDF_class_enum();                 break;
     831         case 12: rc.printDF_class_mask();                 break;
     832         case 13: rc.printDF_class_names();                break;
     833         case 14: rc.printQI_queries();                    break;
     834         case 15: rc.printUD_queries();                    break;
     835         case 16: rc.printDF_class_templates();            break;
     836         case 17: rc.printDF_class_templates_v();          break;
     837         case 18: rc.printDiagrams();                      break;
     838         case 19: rc.printTemplates();                     break;
     839         case 20: rc.printTemplatesV();                    break;
     840         case 21: rc.printDF_radix_load();                 break;
     841         case 22: rc.printAttributeTab();                  break;
     842         case 23: rc.printClassTab();                      break;
     843         default:
     844           err=true;
     845       }
     846     }
     847
     848     if (err) {
     849       System.err.println("Usage: makedefs n (Where n = a number 1..23)");
     850     }
     851
     852   } // main()
     853   // -----------------oOo-----------------
     854
     855 } // Defs

/* [<][>][^][v][top][bottom][index][help] */