initial quantum version
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / sql / metadata / MetaDataXMLInterface.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/metadata/MetaDataXMLInterface.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/sql/metadata/MetaDataXMLInterface.java
new file mode 100644 (file)
index 0000000..03cc5e4
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Created on 15/04/2003
+ *
+ */
+package com.quantum.sql.metadata;
+
+import java.util.Vector;
+
+import com.quantum.util.StringMatrix;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+
+/**
+ * @author panic
+ * Handles interface between an ObjectMetaData and XML storage.
+ * It can write an existing metadata object to XML and generate
+ * a new ObjectMetaData from existing XML.
+ */
+public class MetaDataXMLInterface {
+
+       /**
+        * Exports an ObjectMetaData to an XML document, under a root Element
+        * @param metadata The ObjectMetaData to export
+        * @param doc A valid XML document to receive the export
+        * @param root The Element under which all the XML data will be written
+        */
+       public static void metaDataToXML(ObjectMetaData metadata, Document doc, Element root) {
+               StringMatrix columns = metadata.getColumns();
+               if (columns != null)
+                       stringMatrixToXML(columns, doc, root, "COLUMN"); //$NON-NLS-1$
+               StringMatrix primaryKeys = metadata.getPrimaryKeys();
+               if (primaryKeys != null)
+                       stringMatrixToXML(primaryKeys, doc, root, "PRIMARY_KEY_ITEM"); //$NON-NLS-1$
+               StringMatrix foreignKeys = metadata.getForeignKeys();
+               if (foreignKeys != null)
+                       stringMatrixToXML(foreignKeys, doc, root, "FOREIGN_KEY_ITEM"); //$NON-NLS-1$
+               StringMatrix indexInfo = metadata.getIndexInfo();
+               if (indexInfo != null)
+                       stringMatrixToXML(indexInfo, doc, root, "INDEX_ITEM"); //$NON-NLS-1$
+       }
+
+       /**
+        * Imports an  XML element to an ObjectMetaData. The format has to be the same as extracted by
+        * the MetaDataToXML function.
+        * @param metadata The ObjectMetaData to fill up. Usually empty.
+        * @param root The Element having all the XML data
+        */
+       public static void xmlToMetaData(ObjectMetaData metadata, Element root) {
+               StringMatrix columns = new StringMatrix();
+               MetaDataXMLInterface.xmlToStringMatrix(columns, root, "COLUMN"); //$NON-NLS-1$
+               metadata.setColumns(columns);
+               StringMatrix primaryKeys = new StringMatrix();
+               MetaDataXMLInterface.xmlToStringMatrix(primaryKeys, root, "PRIMARY_KEY_ITEM"); //$NON-NLS-1$
+               metadata.setPrimaryKeys(primaryKeys);
+               StringMatrix foreignKeys = new StringMatrix();
+               MetaDataXMLInterface.xmlToStringMatrix(foreignKeys, root, "FOREIGN_KEY_ITEM"); //$NON-NLS-1$
+               metadata.setForeignKeys(foreignKeys);
+               StringMatrix indexInfo = new StringMatrix();
+               MetaDataXMLInterface.xmlToStringMatrix(indexInfo, root, "INDEX_ITEM"); //$NON-NLS-1$
+               metadata.setIndexInfo(indexInfo);
+       }
+
+       /**
+        * Adds a StringMatrix to an XML document
+        * @param matrix The StringMatrix to add
+        * @param doc The XmlDocument to which it will be added
+        * @param root An element of the previous document under which the info will be added
+        * @param sub A key under which each row of the StringMatrix will be added
+        */
+       public static void stringMatrixToXML(StringMatrix matrix, Document doc, Element root, String sub) {
+               for (int i = 0; i < matrix.size(); i++) {
+                       Element localRoot = (Element) root.appendChild(doc.createElement(sub));
+                       for (int j = 0; j < matrix.getNumColumns(); j++) {
+                               String key = matrix.getHeaderColumn(j);
+                               Element tableName = (Element) localRoot.appendChild(doc.createElement(key));
+                               String value = matrix.get(key, i);
+                               if (value != null)
+                                       tableName.appendChild(doc.createTextNode(value));
+                       }
+               }
+       }
+
+       /**
+       * Fills a StringMatrix with the data from XML, usually extracted with the StringMatrixToXML function
+       * @param matrix The matrix to fill up, usually empty.
+       * @param root The Element with all the data in XML DOM
+       * @param sub The String to select the Nodes which interest us. Only the selected nodes will be added
+       * to the StringMatrix.
+       */
+       private static void xmlToStringMatrix(StringMatrix matrix, Element root, String sub) {
+               NodeList columns = root.getElementsByTagName(sub);
+               for (int i = 0; i < columns.getLength(); i++) {
+                       Node column = columns.item(i);
+                       NodeList columnList = column.getChildNodes();
+                       for (int j = 0; j < columnList.getLength(); j++) {
+                               Node node = columnList.item(j);
+                               String header = node.getNodeName();
+                               if (header.equals("#text")) //$NON-NLS-1$
+                                       continue;
+                               String value = null;
+                               if (node != null && node.hasChildNodes()) {
+                                       Node valueNode = node.getFirstChild();
+                                       if (valueNode instanceof Text) {
+                                               value = valueNode.getNodeValue();
+                                       }
+                               }
+                               if (!matrix.contains(header))
+                                       matrix.addHeader(header);
+                               matrix.addAt(header, value, i);
+                       }
+               }
+       }
+       /**
+        * Creates a new Element with a text value
+        * @param root
+        * @param key
+        * @param value
+        * @return
+        */
+       public static Element createElementText(Element root, String key, String value){
+               //      get the XmlDocument for use as a factory
+               Document doc = root.getOwnerDocument();
+               Element newElement = doc.createElement(key);
+       
+               root.appendChild(newElement);
+               if (value != null && value.length() > 0)
+               {
+                  Text valueText = doc.createTextNode(value);
+                  newElement.appendChild(valueText);
+               }
+               return newElement;
+       }
+      
+       public static String getElementText(Element root, String key){
+               return getElementText(root, key, "");
+       }
+       /**
+        * gets the text value from an element or a child of it
+        * @param root element root
+        * @param key key to search
+        * @param defValue default string value if not found
+        * @return
+        */
+       public static String getElementText(Element root, String key, String defValue){
+       //      get the XmlDocument for use as a factory
+               String value = defValue;
+               if (root.getNodeName().equals(key)){
+                       value = extractText(root, defValue);
+               } else {
+                       NodeList children = root.getElementsByTagName(key);
+                       if (children.getLength() > 0) {
+                               Element column = (Element) children.item(0);
+                               value = extractText(column, defValue);
+                       }
+               }
+               return value;
+       }
+
+       private static String extractText(Element node, String defValue){
+               String value = defValue;
+               if (node != null && node.hasChildNodes()) {
+                       Node valueNode = node.getFirstChild();
+                       if (valueNode instanceof Text) {
+                               value = valueNode.getNodeValue();
+                       }
+               }
+               return value;
+       }
+       
+       /**
+        * Gets a Vector with the String values of the keys
+        *  that are children of 'root' and that match 'key'
+        * @param root
+        * @param key
+        * @return
+        */
+       public static Vector getVectorText(Element root, String key) {
+               Vector result = new Vector();
+               NodeList children = root.getElementsByTagName(key);
+               for (int i = 0; i < children.getLength(); i++) {
+                       Element column = (Element) children.item(i);
+                       result.add(extractText(column, ""));
+               }
+               return result;
+       }
+}