package net.firstpartners.nounit.utility; 
 
/** 
 * Title:        NoUnit - Identify Classes that are not being unit Tested 
 * 
 * Copyright (C) 2001  Paul Browne , FirstPartners.net 
 * 
 * 
 * This program is free software; you can redistribute it and/or  
 * modify it under the terms of the GNU General Public License 
 * as published by the Free Software Foundation; either version 2 
 * of the License, or (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
 * 
 * @author Paul Browne 
 * @version 0.6 
 */ 
 
import java.io.*; 
import java.util.*; 
import java.util.zip.*; 
 
import org.jdom.*; 
import org.jdom.output.*; 
import org.jdom.input.*; 
 
 
/** 
 * General XML Utility Functions 
 */ 
public class XmlUtil { 
     
  /** 
   * indexes the nodes in the document that is passed in , via a HashMap mapping 
   * mapping is in the format <index> as String , handle to <element> of node<BR> 
   * Strings are used as they are better lookup in the hashmap. 
   * @param inXmlDocument to generated the hashmap from 
   * @param uniqueAttribute to do the index on (i.e. key in HashMap). Examples 
   *        of uniqueAttributes are id's or names. 
   * @return HashMap containing mappings 
   */ 
  public static HashMap getNodeIndex(Document inXmlDocument,  
                                        String uniqueAttribute) { 
 
    //Internal Variables 
    int stackPointer=0; 
    String locationId =null; 
    Attribute tmpAttribute=null; 
    Element thisElement=null; 
    ListIterator deepestList=null; 
 
    HashMap mappings = new HashMap(); 
    List stack = new Vector(); 
 
    //Get the list information for the entire document 
    stack.add(inXmlDocument.getContent().listIterator()); 
 
    //Loop though the elements on list 
    while (!stack.isEmpty()){ 
 
      //Get the last list on the stack 
      deepestList = (ListIterator)stack.get(stack.size()-1); 
 
      //Does this list have more elements? 
      if (deepestList.hasNext()) { 
 
        //if so Get Next element from this list 
        thisElement = (Element)deepestList.next(); 
 
        //Add Mapping for this element to hashtable 
        tmpAttribute = thisElement.getAttribute(uniqueAttribute); 
 
        //Attibute can be null for non folder elements (e.g. root element) - if so ignore 
        if (tmpAttribute!=null) { 
          locationId= tmpAttribute.getValue(); 
          if ((locationId!=null)&&(locationId!="")) { 
             mappings.put(locationId.toString(),thisElement); 
 
          } 
        } //end add mapping 
 
        //does this list have children ? 
        if(thisElement.hasChildren()){ 
 
          //if so add to the stack 
          stackPointer++; 
          stack.add(thisElement.getChildren().listIterator()); 
        } 
      } 
      else 
      { 
        //if not , remove this list from the stack 
        stack.remove(stackPointer); 
        stackPointer--; 
 
      } // end if stack has more elements 
 
    } 
 
    return mappings; 
  } 
 
  /** 
   * gets all elements in the XML Document Being Passed in <BR> 
   * @param inXmlDocument to generated the hashmap from 
   * @return nodeList containing nodes 
   */ 
  public static HashSet getAllNodes(Document inXmlDocument) { 
 
    //Internal Variables 
    int stackPointer=0; 
    int index=1; 
    String locationId=null; 
    Element currentElement=null; 
    Element parentElement=null; 
    Element thisElement=null; 
    Attribute tmpAttribute=null; 
    List elementList=null; 
    ListIterator deepestList=null; 
 
    HashMap mappings = new HashMap(); 
    HashSet nodeList = new HashSet(); 
    List stack = new Vector();              //Implements list interface 
 
    //Get the list information for the entire document - kick start loop 
    stack.add(inXmlDocument.getContent().listIterator()); 
 
    //Loop though the elements on list 
    while (!stack.isEmpty()){ 
 
      //Get the last list on the stack 
      deepestList = (ListIterator)stack.get(stack.size()-1); 
 
      //Does this list have more elements? 
      if (deepestList.hasNext()) { 
 
        //if so Get Next element from this list 
        thisElement = (Element)deepestList.next(); 
 
        // add this element to the list 
        nodeList.add(thisElement); 
  
        //does this list have children ? 
        if(thisElement.hasChildren()){ 
 
          //if so add to the stack 
          stackPointer++; 
          stack.add(thisElement.getChildren().listIterator()); 
        } 
      } 
      else 
      { 
        //if not , remove this list from the stack 
        stack.remove(stackPointer); 
        stackPointer--; 
 
      } // end if stack has more elements 
 
    } 
 
    return nodeList; 
  } 
   
  /** 
   * Search for Nodes within Jdom Document<BR> 
   * @param inDocumentToSearch XML-JDOM Document   
   * @param  uniqueIdentifierName we can use to index the document (unique 
   *    attribute like id or name present on the node we are searching for) 
   * @param uniqueIdentifierToFind in the indexed document 
   */ 
   public static Element findNode(Document inDocumentToSearch  
                            , String uniqueIdentifierName 
                            , String uniqueIdentifierToFind) { 
        
        // index document                         
        HashMap index = getNodeIndex(inDocumentToSearch,  
                                     uniqueIdentifierName); 
                                         
        // Now get required element from index 
        return (Element)index.get(uniqueIdentifierToFind); 
                                 
                         
   } 
} 
 
    
  
  |