KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > Yasna > forum > database > DbTreeWalker


1 /**
2  * Copyright (C) 2001 Yasna.com. All rights reserved.
3  *
4  * ===================================================================
5  * The Apache Software License, Version 1.1
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in
16  * the documentation and/or other materials provided with the
17  * distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  * if any, must include the following acknowledgment:
21  * "This product includes software developed by
22  * Yasna.com (http://www.yasna.com)."
23  * Alternately, this acknowledgment may appear in the software itself,
24  * if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Yazd" and "Yasna.com" must not be used to
27  * endorse or promote products derived from this software without
28  * prior written permission. For written permission, please
29  * contact yazd@yasna.com.
30  *
31  * 5. Products derived from this software may not be called "Yazd",
32  * nor may "Yazd" appear in their name, without prior written
33  * permission of Yasna.com.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED. IN NO EVENT SHALL YASNA.COM OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of Yasna.com. For more information
51  * on Yasna.com, please see <http://www.yasna.com>.
52  */

53
54 /**
55  * Copyright (C) 2000 CoolServlets.com. All rights reserved.
56  *
57  * ===================================================================
58  * The Apache Software License, Version 1.1
59  *
60  * Redistribution and use in source and binary forms, with or without
61  * modification, are permitted provided that the following conditions
62  * are met:
63  *
64  * 1. Redistributions of source code must retain the above copyright
65  * notice, this list of conditions and the following disclaimer.
66  *
67  * 2. Redistributions in binary form must reproduce the above copyright
68  * notice, this list of conditions and the following disclaimer in
69  * the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3. The end-user documentation included with the redistribution,
73  * if any, must include the following acknowledgment:
74  * "This product includes software developed by
75  * CoolServlets.com (http://www.coolservlets.com)."
76  * Alternately, this acknowledgment may appear in the software itself,
77  * if and wherever such third-party acknowledgments normally appear.
78  *
79  * 4. The names "Jive" and "CoolServlets.com" must not be used to
80  * endorse or promote products derived from this software without
81  * prior written permission. For written permission, please
82  * contact webmaster@coolservlets.com.
83  *
84  * 5. Products derived from this software may not be called "Jive",
85  * nor may "Jive" appear in their name, without prior written
86  * permission of CoolServlets.com.
87  *
88  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
89  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
90  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
91  * DISCLAIMED. IN NO EVENT SHALL COOLSERVLETS.COM OR
92  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
93  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
94  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
95  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
96  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
97  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
98  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
99  * SUCH DAMAGE.
100  * ====================================================================
101  *
102  * This software consists of voluntary contributions made by many
103  * individuals on behalf of CoolServlets.com. For more information
104  * on CoolServlets.com, please see <http://www.coolservlets.com>.
105  */

106
107 package com.Yasna.forum.database;
108
109 import java.sql.*;
110
111 import com.Yasna.forum.*;
112 import com.Yasna.util.*;
113
114 /**
115  * Database implementation of the TreeWalker interface. This class is relatively
116  * inefficient compared to how it will eventually be implemented. However,
117  * a schema change is needed before that optimization is needed (represent
118  * tree structure directly in schema).
119  */

120 public class DbTreeWalker implements TreeWalker {
121
122     /** DATABASE QUERIES **/
123     private static final String JavaDoc GET_CHILD =
124         "SELECT yazdMessageTree.childID, yazdMessage.creationDate FROM " +
125         "yazdMessageTree, yazdMessage WHERE " +
126         "yazdMessageTree.childID=yazdMessage.messageID AND " +
127         "yazdMessageTree.parentID=? ORDER BY yazdMessage.creationDate";
128     private static final String JavaDoc CHILD_COUNT =
129         "SELECT count(*) FROM yazdMessageTree WHERE parentID=?";
130     private static final String JavaDoc INDEX_OF_CHILD =
131         "SELECT yazdMessageTree.childID, yazdMessage.creationDate " +
132         "FROM yazdMessageTree, yazdMessage WHERE yazdMessageTree.childID=yazdMessage.messageID " +
133         "AND yazdMessageTree.parentID=? ORDER BY yazdMessage.creationDate";
134
135     private DbForumThread thread;
136     private DbForumFactory factory;
137
138     public DbTreeWalker(DbForumThread thread, DbForumFactory factory) {
139         this.thread = thread;
140         this.factory = factory;
141     }
142
143     /**
144      * Returns the root of the tree. Returns null only if the tree has no nodes.
145      *
146      * @returns the root of the tree
147      */

148     public ForumMessage getRoot() {
149         return thread.getRootMessage();
150     }
151
152     /**
153      * Returns the child of parent at index index in the parent's child array.
154      * This should not return null if index is a valid index for parent (that
155      * is index >= 0 && index < getChildCount(parent)).
156      *
157      * @param parent the parent message.
158      * @param index the index of the child.
159      * @returns the child of parent at index.
160      */

161     public ForumMessage getChild(ForumMessage parent, int index) {
162         ForumMessage message = null;
163         Connection con = null;
164         PreparedStatement pstmt = null;
165         try {
166             con = DbConnectionManager.getConnection();
167             pstmt = con.prepareStatement(GET_CHILD);
168             pstmt.setInt(1, parent.getID());
169             ResultSet rs = pstmt.executeQuery();
170             while (rs.next() && index > 0) {
171                 index--;
172             }
173             if (index == 0) {
174                 int messageID = rs.getInt(1);
175                 message = thread.getMessage(messageID);
176             }
177         }
178         catch (Exception JavaDoc e) {
179             System.err.println("Error in DbMessageTreeWalker:getChild("
180                 + index + ")-" + e);
181             e.printStackTrace();
182         }
183         finally {
184             try { pstmt.close(); }
185             catch (Exception JavaDoc e) { e.printStackTrace(); }
186             try { con.close(); }
187             catch (Exception JavaDoc e) { e.printStackTrace(); }
188         }
189         return message;
190     }
191
192     /**
193      * Returns the number of children of parent. Returns 0 if the node is a
194      * leaf or if it has no children.
195      *
196      * @param parent a node in the tree, obtained from this data source.
197      * @returns the number of children of the node parent.
198      */

199     public int getChildCount(ForumMessage parent) {
200         int childCount = 0;
201         Connection con = null;
202         PreparedStatement pstmt = null;
203         try {
204             con = DbConnectionManager.getConnection();
205             pstmt = con.prepareStatement(CHILD_COUNT);
206             pstmt.setInt(1, parent.getID());
207             ResultSet rs = pstmt.executeQuery();
208             rs.next();
209             childCount = rs.getInt(1);
210         }
211         catch (Exception JavaDoc e) {
212             System.err.println("Error in DbTreeWalker:getChildCount()-"
213                 + e);
214             e.printStackTrace();
215         }
216         finally {
217             try { pstmt.close(); }
218             catch (Exception JavaDoc e) { e.printStackTrace(); }
219             try { con.close(); }
220             catch (Exception JavaDoc e) { e.printStackTrace(); }
221         }
222         return childCount;
223     }
224
225     /**
226      * Returns the total number of recursive children of a parent. Returns 0
227      * if there are no children. This method is not intended to aid in
228      * navigation of a Thread but is included as an added utility.
229      */

230     public int getRecursiveChildCount(ForumMessage parent) {
231         int numChildren = 0;
232         int num = getChildCount(parent);
233         numChildren += num;
234         for (int i=0; i<num; i++) {
235             ForumMessage child = getChild(parent,i);
236             if (child != null) {
237                 numChildren += getRecursiveChildCount(child);
238             }
239         }
240         return numChildren;
241     }
242
243     /**
244      * Returns the index of child in parent.
245      */

246     public int getIndexOfChild(ForumMessage parent, ForumMessage child) {
247         int index = 0;
248         Connection con = null;
249         PreparedStatement pstmt = null;
250         ResultSet rs = null;
251         try {
252             con = DbConnectionManager.getConnection();
253             pstmt = con.prepareStatement(INDEX_OF_CHILD);
254             pstmt.setInt(1, parent.getID());
255             rs = pstmt.executeQuery();
256             while (rs.next()) {
257                 if (rs.getInt(1) == child.getID()) {
258                     break;
259                 }
260                 index++;
261             }
262         }
263         catch (Exception JavaDoc e) {
264             System.err.println("Error in DbTreeWalker:getIndexOfChild()-" + e);
265         }
266         finally {
267             try { pstmt.close(); }
268             catch (Exception JavaDoc e) { e.printStackTrace(); }
269             try { con.close(); }
270             catch (Exception JavaDoc e) { e.printStackTrace(); }
271         }
272         return index;
273     }
274
275     /**
276      * Returns true if node is a leaf. A node is a leaf when it has no children
277      * messages.
278      *
279      * @param node a node in the tree, obtained from this data source
280      * @returns true if node is a leaf
281      */

282     public boolean isLeaf(ForumMessage node) {
283         return (getChildCount(node) == 0);
284     }
285 }
286
Popular Tags