/*
* File : SimpleXMLParserDocumentNodeImpl.java
* Created : 5 Oct. 2003
* By : Parg
*
* Azureus - a Java Bittorrent client
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* 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
*/
package org.gudy.azureus2.pluginsimpl.local.utils.xml.simpleparser;
import java.io.PrintWriter;
import java.util.*;
import org.w3c.dom.*;
import org.gudy.azureus2.plugins.utils.xml.simpleparser.SimpleXMLParserDocumentAttribute;
import org.gudy.azureus2.plugins.utils.xml.simpleparser.SimpleXMLParserDocumentNode;
public class
SimpleXMLParserDocumentNodeImpl
implements SimpleXMLParserDocumentNode
{
protected SimpleXMLParserDocumentImpl document;
protected Node node;
protected SimpleXMLParserDocumentNode[] kids;
// node is an ELEMENT_NODE
protected
SimpleXMLParserDocumentNodeImpl(
SimpleXMLParserDocumentImpl _doc,
Node _node )
{
document = _doc;
node = _node;
}
protected Node
getNode()
{
return( node );
}
public String
getName()
{
return( node.getLocalName());
}
public String
getFullName()
{
return( node.getNodeName());
}
public String
getNameSpaceURI()
{
return( node.getNamespaceURI());
}
public String
getValue()
{
// if ( getChildren().length > 0 ){
//
// return( null);
if ( node.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE ){
return( node.getNodeValue());
}
String res = "";
for (Node child = node.getFirstChild(); child != null;child = child.getNextSibling()){
int type = child.getNodeType();
if ( type == Node.CDATA_SECTION_NODE ||
type == Node.TEXT_NODE ||
type == Node.NOTATION_NODE ){
String str = child.getNodeValue();
res += str;
}
}
return( res );
}
public SimpleXMLParserDocumentAttribute
getAttribute(
String name )
{
SimpleXMLParserDocumentAttribute[] attributes = getAttributes();
for (int i=0;i<attributes.length;i++){
if ( attributes[i].getName().equalsIgnoreCase( name )){
return( attributes[i] );
}
}
return( null );
}
public SimpleXMLParserDocumentAttribute[]
getAttributes()
{
Vector v = new Vector();
// for element nodes the attributes AREN'T child elements, rather they are
// accessed via "getAttributes"
if ( node.getNodeType() == Node.ELEMENT_NODE ){
NamedNodeMap atts = node.getAttributes();
for (int i = 0; i < atts.getLength(); i++){
Node child = atts.item(i);
v.addElement( new SimpleXMLParserDocumentAttributeImpl( child.getNodeName(), child.getNodeValue()));
}
}
for (Node child = node.getFirstChild(); child != null;child = child.getNextSibling()){
int type = child.getNodeType();
if ( type == Node.ATTRIBUTE_NODE ){
v.addElement( new SimpleXMLParserDocumentAttributeImpl( child.getNodeName(), child.getNodeValue()));
}
}
SimpleXMLParserDocumentAttributeImpl[] res = new SimpleXMLParserDocumentAttributeImpl[v.size()];
v.copyInto( res );
return( res );
}
public SimpleXMLParserDocumentNode[]
getChildren()
{
if ( kids == null ){
kids = document.parseNode(node,true);
}
return( kids );
}
public SimpleXMLParserDocumentNode
getChild(
String name )
{
SimpleXMLParserDocumentNode[] kids = getChildren();
for (int i=0;i<kids.length;i++){
if ( kids[i].getName().equalsIgnoreCase( name )){
return( kids[i] );
}
}
return( null );
}
public void
print()
{
PrintWriter pw = new PrintWriter( System.out );
print( pw );
pw.flush();
}
public void
print(
PrintWriter pw )
{
print( pw, "" );
}
protected void
print(
PrintWriter pw,
String indent )
{
String attr_str = "";
SimpleXMLParserDocumentAttribute[] attrs = getAttributes();
for (int i=0;i<attrs.length;i++){
attr_str += (i==0?"":",")+attrs[i].getName() + "=" + attrs[i].getValue();
}
pw.println( indent + getName() + ":" + attr_str + " -> " + getValue());
SimpleXMLParserDocumentNode[] kids = getChildren();
for (int i=0;i<kids.length;i++){
((SimpleXMLParserDocumentNodeImpl)kids[i]).print( pw, indent + " " );
}
}
/*
switch (type) {
case Node.ATTRIBUTE_NODE:
out.print("ATTR:");
printlnCommon(n);
break;
case Node.CDATA_SECTION_NODE:
out.print("CDATA:");
printlnCommon(n);
break;
case Node.COMMENT_NODE:
out.print("COMM:");
printlnCommon(n);
break;
case Node.DOCUMENT_FRAGMENT_NODE:
out.print("DOC_FRAG:");
printlnCommon(n);
break;
case Node.DOCUMENT_NODE:
out.print("DOC:");
printlnCommon(n);
break;
case Node.DOCUMENT_TYPE_NODE:
out.print("DOC_TYPE:");
printlnCommon(n);
// Print entities if any
NamedNodeMap nodeMap = ((DocumentType)n).getEntities();
indent += 2;
for (int i = 0; i < nodeMap.getLength(); i++) {
Entity entity = (Entity)nodeMap.item(i);
echo(entity);
}
indent -= 2;
break;
case Node.ELEMENT_NODE:
out.print("ELEM:");
printlnCommon(n);
// Print attributes if any. Note: element attributes are not
// children of ELEMENT_NODEs but are properties of their
// associated ELEMENT_NODE. For this reason, they are printed
// with 2x the indent level to indicate this.
NamedNodeMap atts = n.getAttributes();
indent += 2;
for (int i = 0; i < atts.getLength(); i++) {
Node att = atts.item(i);
echo(att);
}
indent -= 2;
break;
case Node.ENTITY_NODE:
out.print("ENT:");
printlnCommon(n);
break;
case Node.ENTITY_REFERENCE_NODE:
out.print("ENT_REF:");
printlnCommon(n);
break;
case Node.NOTATION_NODE:
out.print("NOTATION:");
printlnCommon(n);
break;
case Node.PROCESSING_INSTRUCTION_NODE:
out.print("PROC_INST:");
printlnCommon(n);
break;
case Node.TEXT_NODE:
out.print("TEXT:");
printlnCommon(n);
break;
default:
out.print("UNSUPPORTED NODE: " + type);
printlnCommon(n);
break;
}
// Print children if any
indent++;
for (Node child = n.getFirstChild(); child != null;
child = child.getNextSibling()) {
echo(child);
}
indent--;
}
*/
}