KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > webdocwf > util > xml > XmlReader


1 /*
2     Copyright (C) 2003 Together
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12     Lesser General Public License for more details.
13
14     You should have received a copy of the GNU Lesser General Public
15     License along with this library; if not, write to the Free Software
16     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */

18
19 package org.webdocwf.util.xml;
20
21 //xml imports
22
import org.w3c.dom.Document JavaDoc;
23 import org.w3c.dom.NodeList JavaDoc;
24 import org.w3c.dom.Node JavaDoc;
25 import org.w3c.dom.Element JavaDoc;
26 import org.enhydra.xml.*;
27 import javax.xml.parsers.DocumentBuilder JavaDoc;
28 import javax.xml.parsers.DocumentBuilderFactory JavaDoc;
29
30 import java.sql.*;
31 import java.io.File JavaDoc;
32 import java.util.ArrayList JavaDoc;
33
34 /**
35  * Class load existing XML file, creating DOM from file or creating
36  * new DOM.Class has methods for reading data from XML file.
37  *
38  * @author Zoran Milakovic
39  */

40 public class XmlReader
41 {
42   private String JavaDoc[] columnNames;
43   private String JavaDoc[] columnValues;
44   private String JavaDoc tableName;
45
46   /**
47    * Document made from XML file, and in which will
48    * be made changes.Document will be saved in XML file.
49    */

50   private SearchElement searchDocument;
51   private Document JavaDoc document;
52   /**
53    * Full path of the XML file.
54    */

55   private String JavaDoc fileName;
56   /**
57    * Constructor will build Document from the specified file
58    * if file exist, or will create new Document if file not exist.
59    *
60    * @param fileName full pathname of the XML file
61    * @throws SQLException
62    */

63   public XmlReader(String JavaDoc fileName) throws SQLException {
64     DocumentBuilderFactory JavaDoc factory = DocumentBuilderFactory.newInstance();
65     try {
66         this.fileName = fileName;
67         File JavaDoc file = new File JavaDoc( fileName );
68         DocumentBuilder JavaDoc builder = factory.newDocumentBuilder();
69         try {
70           this.document = builder.parse( file );
71         } catch( Exception JavaDoc e ) {
72           throw new SQLException("Error while parsing XML file ! : "+e.getMessage());
73         }
74         this.searchDocument = (SearchElement)SearchElement.newInstance( document );
75     } catch( Exception JavaDoc e ) { throw new SQLException("Error in creating DOM : "+e.getMessage()); }
76   }
77
78
79
80
81   private ArrayList JavaDoc rset = new ArrayList JavaDoc();
82
83   /**
84    * Gets data from database.Method will fill array list which will be result set.
85    * ArrayList will contain arrays of strings.Every array of string will present
86    * one row in database.
87    *
88    * @param tableName Name of table.
89    * @param columnNames Names of columns from which will be select data.
90    * @param whereColumnNames Names of columns in where conditions.
91    * @param whereColumnValues Values of conditions.
92    * @throws SQLException
93    */

94   public void select(String JavaDoc tableName , String JavaDoc[] columnNames , String JavaDoc[] whereColumnNames , String JavaDoc[] whereColumnValues) throws SQLException {
95    try {
96     NodeList JavaDoc tableRows = searchDocument.getSubElementsByTagName("dml/"+tableName);
97     for(int i = 0; i < tableRows.getLength(); i++) {
98       boolean isMatch = true;
99       if( whereColumnNames != null && whereColumnValues != null ) {
100         for(int k = 0; k < whereColumnNames.length; k++) {
101           NodeList JavaDoc columns = ( (SearchElement)tableRows.item(i) ).getSubElementsByCondition(whereColumnNames[k]+"="+whereColumnValues[k]);
102           if( columns.getLength() == 0 )
103             isMatch = false;
104         }
105       }
106       if( isMatch ) {
107         ArrayList JavaDoc colValuesList = new ArrayList JavaDoc();
108         colValuesList.clear();
109           //columnNames has names of ALL columns, even if some of them are not have tag in xml file.
110
//This is posible because all column names are stored in CREATE TABLE statement
111
for(int k = 0; k < columnNames.length; k++) {
112           NodeList JavaDoc columns = ( (SearchElement)tableRows.item(i) ).getSubElementsByTagName(columnNames[k]);
113              //it is posible that variable columns has zero length,if some column tags are missing
114
//in that case, column has null value
115
if( columns.getLength() != 0 ) {
116             Node JavaDoc column = columns.item(0);
117             Node JavaDoc textNode = column.getFirstChild();
118             if( textNode == null )
119               colValuesList.add( "null" );
120             else
121               colValuesList.add( formatString(textNode.getNodeValue()) );
122           } else {
123             colValuesList.add( "null" );
124           }
125         }
126         rset.add( colValuesList.toArray(new String JavaDoc[0]) );
127         int y = 0;
128       }
129     }
130     }catch(Exception JavaDoc e) {
131       throw new SQLException("Error in select : "+e.getMessage());
132     }
133   }
134
135   /**
136    * Gets table names from database.
137    *
138    * @throws SQLException
139    */

140   public void selectTableNames() throws SQLException {
141     try {
142       ArrayList JavaDoc tableNames = new ArrayList JavaDoc();
143       ArrayList JavaDoc tableNamesAll = new ArrayList JavaDoc();
144
145       NodeList JavaDoc sqlStatements = searchDocument.getSubElementsByTagName("ddl");
146       XmlSqlParser parser = new XmlSqlParser();
147       for( int i = 0; i < sqlStatements.getLength(); i++ ) {
148         Node JavaDoc node = sqlStatements.item(i);
149         parser.parse( node.getFirstChild().toString() );
150         String JavaDoc tableName = parser.getTableName();
151         if ( !tableNamesAll.contains( tableName ) ) {
152           tableNamesAll.add( tableName );
153           tableNames.clear();
154           tableNames.add( tableName );
155           rset.add( tableNames.toArray(new String JavaDoc[0]));
156         }
157       }
158
159       NodeList JavaDoc allRowTableNames = ((Element JavaDoc)( searchDocument.getSubElementsByTagName("dml").item(0) )).getChildNodes();
160       for(int i = 0;i < allRowTableNames.getLength();i++) {
161         if( allRowTableNames.item(i).getNodeType() != 3 ) {
162           String JavaDoc tableName = allRowTableNames.item(i).getNodeName();
163           if( !tableNamesAll.contains( tableName ) ) {
164             tableNamesAll.add( tableName );
165             tableNames.clear();
166             tableNames.add( tableName );
167             rset.add( tableNames.toArray(new String JavaDoc[0]));
168           }
169         }
170       }
171     }catch(Exception JavaDoc e) {
172       throw new SQLException("Error in selectTableNames : "+e.getMessage());
173     }
174   }
175
176   private String JavaDoc formatString(String JavaDoc str) {
177     String JavaDoc retVal = str;
178     retVal = Utils.replaceAll( retVal, XmlSqlParser.equalEscape, "=" );
179     retVal = Utils.replaceAll( retVal, XmlSqlParser.atEscape, "@" );
180     retVal = Utils.replaceAll( retVal, XmlSqlParser.slashEscape, "/" );
181     return retVal;
182   }
183
184   /**
185    *
186    * @return list with results
187    */

188   public ArrayList JavaDoc getResultSet() {
189     return this.rset;
190   }
191
192 }
193
194
Popular Tags