Project

General

Profile

1 22 jones
/**
2
 *        Name: ReaderElement.java
3
 *     Purpose: A Class that represents an XML element and its contents,
4
 *              and can build itself from a database connection
5 35 jones
 *   Copyright: 2000 Regents of the University of California and the
6
 *              National Center for Ecological Analysis and Synthesis
7 22 jones
 *     Authors: Matt Jones
8
 *
9
 *     Version: '$Id$'
10
 */
11
12 51 jones
package edu.ucsb.nceas.metacat;
13 22 jones
14
import java.sql.*;
15
import java.io.IOException;
16 23 jones
import java.util.Vector;
17 22 jones
import java.util.Enumeration;
18
19 31 jones
/**
20
 * A Class that represents an XML element and its contents,
21
 * and can build itself from a database connection
22
 */
23 22 jones
public class ReaderElement extends BasicElement {
24
25 23 jones
    private Connection	conn;
26
    private Vector	children;
27 22 jones
28 31 jones
    /**
29
     * Construct a new ReaderElement instance
30
     *
31
     * @param conn the database connection to use to initialize
32
     */
33 24 jones
    public ReaderElement (Connection conn) {
34
      this.conn = conn;
35
      this.children = new Vector();
36
    }
37
38 31 jones
    /**
39
     * Construct a new ReaderElement instance
40
     *
41
     * @param conn the database connection to use to initialize
42
     * @param nodeid the element_id for the node to be created
43
     */
44 22 jones
    public ReaderElement (Connection conn, long nodeid) {
45 24 jones
      this(conn);
46 22 jones
47
      //Lookup data for self
48 24 jones
      setElementInfo(nodeid);
49 22 jones
50 24 jones
      //Create child nodes (elements or attributes)
51
      setChildrenNodes(nodeid);
52
    }
53 22 jones
54 31 jones
    /**
55
     * Construct a new ReaderElement instance
56
     *
57
     * @param conn the database connection to use to initialize
58
     * @param nodeid the element_id for the node to be created
59
     * @param parentnodeid the id of the parent node
60
     * @param nodename the name of the element
61
     * @param nodedata the text content of the node
62
     */
63 24 jones
    public ReaderElement (Connection conn, long nodeid, long parentnodeid,
64
                          String nodename, String nodedata) {
65
      this(conn);
66
      setElementID(nodeid);
67
      setParentID(parentnodeid);
68
      setTagName(nodename);
69
      appendContent(nodedata);
70
71
      // Create child nodes (elements or attributes)
72
      setChildrenNodes(nodeid);
73 22 jones
    }
74 23 jones
75 24 jones
    /** Look up the info needed to construct this element from the DB */
76
    private void setElementInfo(long nodeid) {
77 23 jones
      long element_id=0;
78
      long parentnodeid=0;
79
      String nodetype=null;
80
      String nodename=null;
81
      String nodedata=null;
82
83
      PreparedStatement pstmt;
84
      try {
85
        pstmt =
86 96 jones
          conn.prepareStatement("SELECT nodeid,parentnodeid,nodetype,nodename,"+
87
               "replace(" +
88
               "replace(" +
89
               "replace(nodedata,'&','&') " +
90
               ",'<','&lt;') " +
91
               ",'>','&gt;') " +
92
               "FROM xml_nodes WHERE nodeid = ?");
93 23 jones
        // Bind the values to the query
94
        pstmt.setLong(1, nodeid);
95
96
        pstmt.execute();
97
        try {
98
          ResultSet rs = pstmt.getResultSet();
99
          try {
100
            boolean tableHasRows = rs.next();
101
            if (tableHasRows) {
102
              try {
103
                element_id = rs.getLong(1);
104
                parentnodeid = rs.getLong(2);
105
                nodetype = rs.getString(3);
106
                nodename = rs.getString(4);
107
                nodedata = rs.getString(5);
108
              } catch (SQLException e) {
109
                System.out.println("Error with getInt: " + e.getMessage());
110
              }
111
            }
112
          } catch (SQLException e) {
113
            System.out.println("Error with next: " + e.getMessage());
114
          }
115
        } catch (SQLException e) {
116
          System.out.println("Error with getrset: " + e.getMessage());
117
        }
118
        pstmt.close();
119
      } catch (SQLException e) {
120
        System.out.println("Error getting id: " + e.getMessage());
121
      }
122
123
      if (nodetype.equals("ELEMENT")) {
124
        setElementID(element_id);
125
        setParentID(parentnodeid);
126
        setTagName(nodename);
127 24 jones
        appendContent(nodedata);
128 23 jones
      }
129
    }
130 24 jones
131
    /** Look up each child node from the DB and and create it */
132
    private void setChildrenNodes(long nodeid) {
133
      long element_id=0;
134
      long parentnodeid=0;
135
      String nodetype=null;
136
      String nodename=null;
137
      String nodedata=null;
138
139
      PreparedStatement pstmt;
140
      try {
141
        pstmt =
142
          conn.prepareStatement("SELECT nodeid,parentnodeid,nodetype, " +
143 96 jones
                  "nodename, " +
144
                  "replace(" +
145
                  "replace(" +
146
                  "replace(nodedata,'&','&amp;')" +
147
                  ",'<','&lt;') " +
148
                  ",'>','&gt;') " +
149
                  "FROM xml_nodes WHERE parentnodeid = ?");
150 24 jones
        // Bind the values to the query
151
        pstmt.setLong(1, nodeid);
152
153
        pstmt.execute();
154
        try {
155
          ResultSet rs = pstmt.getResultSet();
156
          try {
157
            boolean tableHasRows = rs.next();
158
            while (tableHasRows) {
159
              try {
160
                element_id = rs.getLong(1);
161
                parentnodeid = rs.getLong(2);
162
                nodetype = rs.getString(3);
163
                nodename = rs.getString(4);
164
                nodedata = rs.getString(5);
165
166
                if (nodetype.equals("ELEMENT")) {
167
                  ReaderElement child = new ReaderElement(conn,
168
                                element_id,parentnodeid,nodename,nodedata);
169
                  children.add(child);
170
                } else if (nodetype.equals("ATTRIBUTE")) {
171
                  setAttribute(nodename,nodedata);
172
                }
173
174
              } catch (SQLException e) {
175
                System.out.println("Error with getInt: " + e.getMessage());
176
              }
177
178
              // Advance to the next record in the cursor
179
              tableHasRows = rs.next();
180
            }
181
          } catch (SQLException e) {
182
            System.out.println("Error with next: " + e.getMessage());
183
          }
184
        } catch (SQLException e) {
185
          System.out.println("Error with getrset: " + e.getMessage());
186
        }
187
        pstmt.close();
188
      } catch (SQLException e) {
189
        System.out.println("Error getting id: " + e.getMessage());
190
      }
191
192
    }
193
194 31 jones
    /**
195
     * String representation for display purposes (recursively descends through
196
     * children to create an XML subtree)
197
     */
198 24 jones
    public String toString ()
199
    {
200
        StringBuffer value = new StringBuffer();
201
        value.append('<');
202
        value.append(getTagName());
203
        value.append(getAttributes().toString());
204
        value.append('>');
205
206
        // Process children recursively here
207
        // Or do it in ReaderElement using a stack so we don;t have the
208
        // whole thing in memory at once?
209
        ReaderElement child = null;
210
        Enumeration e = children.elements();
211
        while (e.hasMoreElements()) {
212
          child = (ReaderElement)e.nextElement();
213
          value.append(child);
214
        }
215
216
        String cont = getContent();
217
        if (!cont.equals("null")) {
218
          value.append(cont);
219
        }
220
221
        value.append("</");
222
        value.append(getTagName());
223
        value.append('>');
224
        return value.toString();
225
    }
226 22 jones
}