/*
* `gnu.iou.dom'
* Copyright (C) 2006 John Pritchard.
*
* 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
*/
package gnu.iou.dom.impl;
import gnu.iou.chbuf;
/**
*
* @author jdp
*/
public class Document
extends Node
implements gnu.iou.dom.Document
{
private gnu.iou.dom.DocumentType document_doctype;
private gnu.iou.dom.DOMImplementation document_domimplementation;
private gnu.iou.dom.Builder document_builder;
private gnu.iou.dom.NodeList document_children;
private gnu.iou.dom.io.Source document_source;
private java.lang.String document_uri;
public Document(){
super(DOC_NIL,new Name(org.w3c.dom.Node.DOCUMENT_NODE,STR_NIL,"Document"));
}
public Document(org.w3c.dom.Document owner, gnu.iou.dom.Name nname){
super(DOC_NIL,nname);
}
public void destroy(){
if (this.hasChildNodes()){
org.w3c.dom.NodeList children = this.getChildNodes();
gnu.iou.dom.Node child;
for (int cc = 0, len = children.getLength(); cc < len; cc++){
child = (gnu.iou.dom.Node)children.item(cc);
if (this == child.getParentNode())
child.destroy();
}
}
this.document_children = null;
if (null != this.document_source){
this.document_source.destroy();
this.document_source = null;
}
super.destroy();
}
public final gnu.iou.dom.io.Source getSource(){
return this.document_source;
}
public final void setSource(gnu.iou.dom.io.Source src){
this.document_source = src;;
}
protected gnu.iou.dom.NodeList newChildNodes(){
return new NodeList(this);
}
public final gnu.iou.dom.NodeList getChildNodes2(){
if (null == this.document_children)
this.document_children = this.newChildNodes();
return this.document_children;
}
public final boolean hasChildNodes(){
return (null != this.document_children && 0 < this.document_children.getLength());
}
public final void builderExit(){
if (null != this.document_builder)
try {
this.document_builder.destroy();
}
finally {
this.document_builder = null;
}
}
public final gnu.iou.dom.Builder.Sax builderEnterSax(){
if (null != this.document_builder)
throw new gnu.iou.dom.Error.State();
else
return (gnu.iou.dom.Builder.Sax)(this.document_builder = new Builder.Sax(this));
}
public final gnu.iou.dom.Builder.Sax builderSax(boolean exc){
gnu.iou.dom.Builder re = this.builder(exc);
if (re instanceof gnu.iou.dom.Builder.Sax)
return (gnu.iou.dom.Builder.Sax)re;
else if (exc)
throw new gnu.iou.dom.Error.State();
else
return null;
}
public final gnu.iou.dom.Builder builder(boolean exc){
if (null != this.document_builder)
return this.document_builder;
else if (exc)
throw new gnu.iou.dom.Error.State();
else
return null;
}
public final org.w3c.dom.DocumentType getDoctype(){
return this.document_doctype;
}
public final void setDoctype(gnu.iou.dom.DocumentType doctype){
this.document_doctype = doctype;
}
public final org.w3c.dom.DOMImplementation getImplementation(){
return this.document_domimplementation;
}
public final void setImplementation(gnu.iou.dom.DOMImplementation impl){
this.document_domimplementation = impl;
}
public final org.w3c.dom.Element createElement(String qn)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.Element elem = (gnu.iou.dom.Element)this.create(org.w3c.dom.Node.ELEMENT_NODE,STR_NIL,qn);
return elem;
}
public final gnu.iou.dom.Element createElement(gnu.iou.dom.Name name){
gnu.iou.dom.Element elem = (gnu.iou.dom.Element)this.create(org.w3c.dom.Node.ELEMENT_NODE,name.getNamespace(),name.getQname());
return elem;
}
public final org.w3c.dom.Element createElementNS(String ns, String qn)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.Element elem = (gnu.iou.dom.Element)this.create(org.w3c.dom.Node.ELEMENT_NODE,ns,qn);
return elem;
}
public final org.w3c.dom.DocumentFragment createDocumentFragment(){
return (org.w3c.dom.DocumentFragment)this.create(org.w3c.dom.Node.DOCUMENT_FRAGMENT_NODE,STR_NIL,STR_NIL);
}
public final org.w3c.dom.Text createTextNode(String text){
gnu.iou.dom.Text node =
(gnu.iou.dom.Text)this.create(org.w3c.dom.Node.TEXT_NODE,STR_NIL,STR_NIL);
if (null != text)
node.setData(text);
return node;
}
public final org.w3c.dom.Comment createComment(String text){
gnu.iou.dom.Comment node =
(gnu.iou.dom.Comment)this.create(org.w3c.dom.Node.COMMENT_NODE,STR_NIL,STR_NIL);
if (null != text)
node.setData(text);
return node;
}
public final org.w3c.dom.CDATASection createCDATASection(String text)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.CDATASection node =
(gnu.iou.dom.CDATASection)this.create(org.w3c.dom.Node.CDATA_SECTION_NODE,STR_NIL,STR_NIL);
if (null != text)
node.setData(text);
return node;
}
public final org.w3c.dom.ProcessingInstruction createProcessingInstruction(String target, String data)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.ProcessingInstruction pi =
(gnu.iou.dom.ProcessingInstruction)this.create(org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE,STR_NIL,STR_NIL);
pi.setTarget(target);
pi.setData(data);
return pi;
}
public final org.w3c.dom.Attr createAttribute(String name)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.Attr attr =
(gnu.iou.dom.Attr)this.create(org.w3c.dom.Node.ATTRIBUTE_NODE,STR_NIL,name);
return attr;
}
public final org.w3c.dom.Attr createAttributeNS(String ns, String qn)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.Attr attr =
(gnu.iou.dom.Attr)this.create(org.w3c.dom.Node.ATTRIBUTE_NODE,ns,qn);
return attr;
}
public final org.w3c.dom.EntityReference createEntityReference(String name)
throws org.w3c.dom.DOMException
{
gnu.iou.dom.EntityReference entref =
(gnu.iou.dom.EntityReference)this.create(org.w3c.dom.Node.ENTITY_REFERENCE_NODE,STR_NIL,name);
return entref;
}
public final gnu.iou.dom.Node create(short type, String ns, String qn){
gnu.iou.dom.Name nname = new gnu.iou.dom.impl.Name(type,ns,qn);
gnu.iou.dom.Builder builder = this.builder(false);
gnu.iou.dom.Builder.Binding builder_bind = null;
if (null != builder)
builder_bind = builder.lastBinding();
return this.create(nname,builder_bind);
}
public final gnu.iou.dom.Node create(gnu.iou.dom.Name nname, gnu.iou.dom.Builder.Binding bind){
if (null == nname || 1 > nname.getType())
throw new gnu.iou.dom.Error.Argument("Bad name");
//
if (bind instanceof gnu.iou.dom.Builder.Binding.Map){
String clan = ((gnu.iou.dom.Builder.Binding.Map)bind).map(nname);
if (null != clan){
try {
return this.instantiateNode(clan,nname);
}
catch (java.lang.ClassNotFoundException cnf){
java.lang.IllegalStateException ilst = new gnu.iou.dom.Error.State(clan);
ilst.initCause(cnf);
throw ilst;
}
}
}
//
if (bind instanceof gnu.iou.dom.Builder.Binding.Override){
/*
* Override node binding
*/
String pkgn = ((gnu.iou.dom.Builder.Binding.Override)bind).overridePrefix();
String clan = nname.getClassname(pkgn);
try {
return this.instantiateNode(clan,nname);
}
catch (java.lang.ClassNotFoundException cnf){
try {
switch (nname.getType()){
case ELEMENT_NODE:
clan = chbuf.cat(pkgn,"Element");
return this.instantiateNode(clan,nname);
case ATTRIBUTE_NODE:
clan = chbuf.cat(pkgn,"Attr");
return this.instantiateNode(clan,nname);
default:
break;
}
}
catch (java.lang.ClassNotFoundException cnf2){
}
catch (java.lang.IllegalStateException ilst){
}
}
catch (java.lang.IllegalStateException ilst){
}
}
try {
/*
* Normal node binding
*/
String clan = nname.getClassname();
return this.instantiateNode(clan,nname);
}
catch (java.lang.ClassNotFoundException cnf){
}
catch (java.lang.IllegalStateException ilst){
}
catch (java.lang.IllegalArgumentException clan){
}
if (bind instanceof gnu.iou.dom.Builder.Binding.Special){
String pkgn = ((gnu.iou.dom.Builder.Binding.Special)bind).specialPrefix();
String clan = nname.getClassname(pkgn);
try {
/*
* Special node binding
*/
return this.instantiateNode(clan,nname);
}
catch (java.lang.ClassNotFoundException cnf){
try {
switch (nname.getType()){
case ELEMENT_NODE:
clan = chbuf.cat(pkgn,"Element");
return this.instantiateNode(clan,nname);
case ATTRIBUTE_NODE:
clan = chbuf.cat(pkgn,"Attr");
return this.instantiateNode(clan,nname);
default:
break;
}
}
catch (java.lang.ClassNotFoundException cnf2){
}
catch (java.lang.IllegalStateException ilst){
}
}
catch (java.lang.IllegalStateException ilst){
}
}
/*
* Default node binding
*/
switch(nname.getType()){
case ATTRIBUTE_NODE:
return new Attr(this,nname);
case CDATA_SECTION_NODE:
return new CDATASection(this,nname);
case COMMENT_NODE:
return new Comment(this,nname);
case DOCUMENT_NODE:
return new Document(this,nname);
case DOCUMENT_FRAGMENT_NODE:
return new DocumentFragment(this,nname);
case DOCUMENT_TYPE_NODE:
return new DocumentType(this,nname);
case ELEMENT_NODE:
return new Element(this,nname);
case ENTITY_NODE:
return new Entity(this,nname);
case ENTITY_REFERENCE_NODE:
return new EntityReference(this,nname);
case NOTATION_NODE:
return new Notation(this,nname);
case PROCESSING_INSTRUCTION_NODE:
return new ProcessingInstruction(this,nname);
case TEXT_NODE:
return new Text(this,nname);
default:
throw new gnu.iou.dom.Error.State(String.valueOf(nname.getType()));
}
}
public final gnu.iou.dom.Node instantiateNode(String classname,
gnu.iou.dom.Name nname)
throws java.lang.ClassNotFoundException
{
if (null == classname || 1 > classname.length())
throw new gnu.iou.dom.Error.Argument("Bad class name");
else if (null == nname || 1 > nname.getType())
throw new gnu.iou.dom.Error.Argument("Bad node name");
else {
Object[] argv = {
this,
nname
};
java.lang.Class clas = java.lang.Class.forName(classname);
switch(nname.getType()){
case ATTRIBUTE_NODE:
if (AttrClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case CDATA_SECTION_NODE:
if (CDATASectionClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case COMMENT_NODE:
if (CommentClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case DOCUMENT_NODE:
if (DocumentClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case DOCUMENT_FRAGMENT_NODE:
if (DocumentFragmentClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case DOCUMENT_TYPE_NODE:
if (DocumentTypeClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case ELEMENT_NODE:
if (ElementClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case ENTITY_NODE:
if (EntityClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case ENTITY_REFERENCE_NODE:
if (EntityReferenceClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case NOTATION_NODE:
if (NotationClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case PROCESSING_INSTRUCTION_NODE:
if (ProcessingInstructionClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
case TEXT_NODE:
if (TextClass.isAssignableFrom(clas))
return (Node)NewInstance(clas,argv);
else
break;
default:
throw new gnu.iou.dom.Error.State(String.valueOf(nname.getType()));
}
throw new gnu.iou.dom.Error.State(classname);
}
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final String getInputEncoding()
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final String getXmlEncoding()
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final boolean getXmlStandalone()
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final void setXmlStandalone(boolean xmlStandalone)
throws org.w3c.dom.DOMException
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final String getXmlVersion()
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final void setXmlVersion(String xmlVersion)
throws org.w3c.dom.DOMException
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final boolean getStrictErrorChecking()
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final void setStrictErrorChecking(boolean strictErrorChecking)
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final String getDocumentURI()
{
return this.document_uri;
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final void setDocumentURI(String documentURI)
{
this.document_uri = documentURI;
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final org.w3c.dom.Node adoptNode(org.w3c.dom.Node source)
throws org.w3c.dom.DOMException
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final org.w3c.dom.DOMConfiguration getDomConfig()
{
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final void normalizeDocument()
{
}
/**
* @since DOM Level 3
* @since Java 1.5
*/
public final org.w3c.dom.Node renameNode(org.w3c.dom.Node node,
String ns,
String qn)
throws org.w3c.dom.DOMException
{
// if (node instanceof gnu.iou.dom.Node){
// gnu.iou.dom.Node gnode = (gnu.iou.dom.Node)node;
// gnu.iou.dom.Name oname = gnode.getNodeName2();
// gnu.iou.dom.Name nname = new gnu.iou.dom.impl.Name(node.getNodeType(),ns,qn);
// gnu.iou.dom.Node parent = gnode.getParentNode2();
// parent.renameChild2(nname,oname,gnode);
// return node;
// }
// else
// throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.WRONG_DOCUMENT_ERR,node.getClass().getName());
throw new org.w3c.dom.DOMException(org.w3c.dom.DOMException.NOT_SUPPORTED_ERR,null);
}
}