TreeGroup.java :  » Forum » JForum-2.1.8 » net » jforum » util » Java Open Source

Java Open Source » Forum » JForum 2.1.8 
JForum 2.1.8 » net » jforum » util » TreeGroup.java
/*
 * Copyright (c) JForum Team
 * All rights reserved.

 * Redistribution and use in source and binary forms, 
 * with or without modification, are permitted provided 
 * that the following conditions are met:

 * 1) Redistributions of source code must retain the above 
 * copyright notice, this list of conditions and the 
 * following  disclaimer.
 * 2)  Redistributions in binary form must reproduce the 
 * above copyright notice, this list of conditions and 
 * the following disclaimer in the documentation and/or 
 * other materials provided with the distribution.
 * 3) Neither the name of "Rafael Steil" nor 
 * the names of its contributors may be used to endorse 
 * or promote products derived from this software without 
 * specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT 
 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
 * IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
 * 
 * This file creation date: Mar 3, 2003 / 11:28:25 AM
 * The JForum Project
 * http://www.jforum.net
 */
package net.jforum.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import net.jforum.dao.DataAccessDriver;
import net.jforum.dao.TreeGroupDAO;

/** 
 * Implements a tree hierarchy of groups.
 * This class process all group hierarchy, and each group may have unlimited sub groups.
 * Each group is called <code>node</code> ( <code>net.jforum.model.GroupNode</code> object ), and
 * each node may have sub-nodes. For example, given a table like the folowing:  
 * 
 * <pre>
 * <code>
* +----+----------------+--------+
 * | id | name          | parent |
 * +----+---------------+--------+
 * |  6 | Parent 1      |      0 |
 * |  7 | Sub 1.1       |      6 |
 * |  8 | Sub 1.2       |      6 |
 * |  9 | SubSub 1.2.1  |      8 |
 * | 10 | SubSub 1.2.2  |      8 |
 * | 11 | Parent 2      |      0 |
 * | 12 | Parent 3      |      0 |
 * | 13 | Sub 3.1       |     12 |
 * | 14 | SubSub 3.1.1  |     13 |
 * | 15 | Sub 3.2       |     12 |
 * | 16 | Parent 4      |      0 |
 * +----+---------------+--------+
 * </code>
 * </pre>
 * 
 * results on the folowing hierarchy 
 * <pre>
 * <code>
 * Parent 1
 * ------
 *   |
 *     Sub 1.1
 *   ----------
 *   |
 *   Sub 1.2
 *   ----------
 *     |
 *     SubSub 1.2.1
 *     ------------
 *     |
 *     SubSub 1.2.2
 * Parent 2
 * -----
 * Parent 3
 * -----
 *   |
 *   Sub 3.1
 *   ---------
 *     |
 *     SubSub 3.1.1
 *     ------------
 *   |
 *   Sub 3.2
 *   ---------
 * Parent 4
 * ------
 * </code>
 * </pre>
 *  
 * As is possible to see, we have 4 parent groups, called <code>Parent 1</code>, <code>Parent 2</code>, 
 * <code>Parent 3</code> and <code>Parent 4</code>. <code>Parent 1</code> has 2 sub groups: <code>Sub 1.1</code>
 * and <code>Sub 1.2</code>. <code>Sub 1.2</code> contains 2 subgroups, <code>SubSub 1.2.1</code> and 
 * <code>SubSub 1.2.2</code>. As every group is a node, ( <code>GroupNode</code> object ), and as each node
 * may have sub-nodes, the processing would be as:
 * <p>
 * <li> When the method <code>size()</code> of the <code>Parent 1</code> object is called,  the number 2 will
 * be retorned, because <code>Parent 1</code> has 2 sub groups;
 * <li> when the <code>size()</code> method is called on the object of <code>Sub 1.1</code>, will be returned 0, because
 * <code>Sub 1.1</code> does not have any sub groups;
 * <li> On the other hand, then we call the <code>size()</code> method of the object represented by <code>Sub 1.2</code> object,
 * we wil have a return value of 2, because <code>Sub 1.2</code> has 2 sub groups.
 * <br>
 * The same operation is done to all other groups and its sub groups. 
 * 
 * @author Rafael Steil
 * @version $Id: TreeGroup.java,v 1.10 2006/08/20 22:47:42 rafaelsteil Exp $
 */
public class TreeGroup 
{
  /**
   * Default Constructor
   */
  public TreeGroup() { }

  
  /**
   * Process the group hierarchy.
   * 
   * @return <code>List</code> containing the complete group hierarchy. Each element
   * from the list represents a single <code>GroupNode<code> object.   
   * */
  public List getNodes()
  {
    List nodes = new ArrayList();
    
    TreeGroupDAO tgm = DataAccessDriver.getInstance().newTreeGroupDAO();

    List rootGroups = tgm.selectGroups(0);  
        
    for (Iterator iter = rootGroups.iterator(); iter.hasNext();) {
      GroupNode n = (GroupNode)iter.next();
            
      this.checkExtraNodes(n);
      
      nodes.add(n);
    }
    
    return nodes;
  }
  
  /**
   * Searchs for subgroups of a determined group
   *
     * @param n  GroupNode
     */
  private void checkExtraNodes(GroupNode n)
  {
    TreeGroupDAO tgm = DataAccessDriver.getInstance().newTreeGroupDAO();

    List childGroups = tgm.selectGroups(n.getId());  
        
    for (Iterator iter = childGroups.iterator(); iter.hasNext();) {
      GroupNode f = (GroupNode)iter.next();
      
      this.checkExtraNodes(f);
      
      n.addNode(f);
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.